Viernes 15 de junio de 2018

Gunnar Wolf

Gunnar Wolf
Gunnar Wolf

«Understanding the Digital World» — By Brian Kernighan

I came across Kernighan's 2017 book, Understanding the Digital World — What You Need to Know about Computers, the Internet, Privacy, and Security. I picked it up thanks to a random recommendation I read somewhere I don't recall. And it's really a great read.
Of course, basically every reader that usually comes across this blog will be familiar with Kernighan. Be it because his most classic books from the 1970s, The Unix Programming Environment or The C Programming Language, or from the much more recent The Practice of Programming or The Go Programming Language, Kernighan is a world-renowned authority for technical content, for highly technical professionals at the time of their writing — And they tend to define the playing field later on.
But this book I read is... For the general public. And it is superb at that.
Kernighan states in his Preface that he teaches a very introductory course at Princeton (a title he admits to be too vague, Computers in our World) to people in the social sciences and humanities field. And this book shows how he explains all sorts of scary stuff to newcomers.
As it's easier than doing a full commentary on it, I'll just copy the table of contents (only to the section level, it gets just too long if I also list subsections). The list of contents is very thorough (and the book is only 238 pages long!), but take a look at basically every chapter... And picture explaining those topics to computing laymen. An admirable feat!

  • Part I: Hardware
    • 1. What's in a computer?
      • Logical construction
      • Physical construction
      • Moore's Law
      • Summary
    • 2. Bits, Bytes, and Representation of Information
      • Analog versus Digital
      • Analog-Digital Conversion
      • Bits, Bytes and Binary
      • Summary
    • 3. Inside the CPU
      • The Toy Computer
      • Real CPUs
      • Caching
      • Other Kinds of Computers
      • Summary

    Wrapup on Hardware

  • Part II: Software
    • 4. Algorithms
      • Linear Algorithms
      • Binary Search
      • Sorting
      • Hard Problems and Complexity
      • Summary
    • 5. Programming and Programming Languages
      • Assembly Language
      • High Level Languages
      • Software Development
      • Intellectual Property
      • Standards
      • Open Source
      • Summary
    • 6. Software Systems
      • Operating Systems
      • How an Operating System works
      • Other Operating Systems
      • File Systems
      • Applications
      • Layers of Software
      • Summary
    • 7. Learning to Program
      • Programming Language Concepts
      • A First JavaScript Example
      • A Second JavaScript Example
      • Loops
      • Conditionals
      • Libraries and Interfaces
      • How JavaScript Works
      • Summary

    Wrapup on Software

  • Part III: Communications
    • 8. Networks
      • Telephones and Modems
      • Cable and DSL
      • Local Area Networks and Ethernet
      • Wireless
      • Cell Phones
      • Bandwidth
      • Compression
      • Error Detection and Correction
      • Summary
    • The Internet
      • An Internet Overview
      • Domain Names and Addresses
      • Routing
      • TCP/IP protocols
      • Higher-Level Protocols
      • Copyright on the Internet
      • The Internet of Things
      • Summary
    • 10. The World Wide Web
      • How the Web works
      • HTML
      • Cookies
      • Active Content in Web Pages
      • Active Content Elsewhere
      • Viruses, Worms and Trojan Horses
      • Web Security
      • Defending Yourself
      • Summary
    • 11. Data and Information
      • Search
      • Tracking
      • Social Networks
      • Data Mining and Aggregation
      • Cloud Computing
      • Summary
    • 12. Privacy and Security
      • Cryptography
      • Anonymity
      • Summary
    • 13. Wrapping up

I must say, I also very much enjoyed learning of my overall ideological alignment with Brian Kernighan. I am very opinionated, but I believe he didn't make me do a even mild scoffing — and he goes to many issues I have strong feelings about (free software, anonymity, the way the world works...)
So, maybe I enjoyed this book so much because I enjoy teaching, and it conveys great ways to teach the topics I'm most passionate about. But, anyway, I have felt for several days the urge to share this book with the group of people that come across my blog ☺

Jueves 14 de junio de 2018

Marco Islas

Marco Islas
Marco Islas

Rainy time, coffee time

Who wants a cup?
Gustavo Rubio

Gustavo Rubio
Ahí vamos

¿Por qué amamos odiar a Microsoft (y su compra de GitHub)?

Recuerdo bien la primera vez que intenté instalar Linux en el otoño del año 2000: una de esas revistas que compraba, alguna especia de PC

Sábado 09 de junio de 2018

Marco Islas

Marco Islas
Marco Islas

What time is it??

Jueves 07 de junio de 2018

Gustavo Rubio

Gustavo Rubio
Ahí vamos

El (triste) estado de la privacidad de datos en México

Seguramente en las últimas semanas has recibido, al igual que la mayoría de usuarios de casi cualquier servicio de Internet, decenas (o hasta cientos, literalmente)

Lunes 04 de junio de 2018

Marco Islas

Marco Islas
Marco Islas

GIMP now hosted by GNOME on GitLab

Jueves 31 de mayo de 2018

Gustavo Rubio

Gustavo Rubio
Ahí vamos

Mi (no tan) reciente amor por los relojes

Todos tenemos “hobbies” e intereses distintos y a veces muy particulares. Hay quienes coleccionan cosas por puro gusto como monedas, vehículos a escala, estampas, etc.

Viernes 18 de mayo de 2018

Miguel de Icaza

Miguel de Icaza
Miguel de Icaza

Startup Improvements in Xamarin.Forms on Android

With Xamarin.Forms 3.0 in addition to the many new feature work that we did, we have been doing some general optimizations across the board, from compile times to startup times and wanted to share some recent results on the net effect on one of our larger sample apps.

These are the results when doing a cold start for the SmartHotel360 application on Android when compiled for 32bits (armeabi-v7a) on a Google Pixel (1st gen).

Release Release/AOT Release/AOT+LLVM
Forms 2.5.0 6.59s 1.66s 1.61s
Forms 3.0.0 3.52s 1.41s 1.38s

This is independent of the work that we are doing to improve Android's startup speed, that both brings additional benefits today, and will bring additional benefits in the future.

One of the areas that we are investing on for Android is to remove any dynamic code execution at startup to integrate with the Java runtime, instead all of this is being statically computed, similar to what we are doing on Mac and iOS where we completely eliminated reflection and code generation from startup.

Miércoles 16 de mayo de 2018

Planeta Gruslic: Max Valdez: Amnistía a los narcos ?
Alcance Libre: Cambios en ALDOS 1.4

Jueves 10 de mayo de 2018

The boots theory

Or why the rich are rich…

“The reason that the rich were so rich, Vimes reasoned, was because they managed to spend less money.

Take boots, for example. He earned thirty-eight dollars a month plus allowances. A really good pair of leather boots cost fifty dollars. But an affordable pair of boots, which were sort of OK for a season or two and then leaked like hell when the cardboard gave out, cost about ten dollars. Those were the kind of boots Vimes always bought, and wore until the soles were so thin that he could tell where he was in Ankh-Morpork on a foggy night by the feel of the cobbles.

But the thing was that good boots lasted for years and years. A man who could afford fifty dollars had a pair of boots that’d still be keeping his feet dry in ten years’ time, while the poor man who could only afford cheap boots would have spent a hundred dollars on boots in the same time and would still have wet feet.

This was the Captain Samuel Vimes ‘Boots’ theory of socioeconomic unfairness.”

― Terry Pratchett, Men at Arms: The Play

Same apply for knives, tools and cloth for winter and rainy seasons, and it’s totally true, I learned the hard way after buying two cheap boots that not even ended the rainy season, and my good pair that continues to this day.

Domingo 29 de abril de 2018

Alex Callejas

Alex Callejas

FLISoL 2018 – La fiesta del software libre

Compartir el conocimiento es generar riqueza intelectual – Richard Stallman

Hace unos días tuve el agrado de presentarme una vez más, en el mayor evento de difusión del Software Libre: El Festival Latinoamericano de Instalación de Software Libre (FLISoL). En esta edición, me invitaron al Centro Cultural “El Rule” y a la Fes Acatlán:

En donde presente mi plática sobre la 3a Ley del SysAdmin (Automatización) además de un taller de Administración de Sistemas y otro más de SELinux.

Pueden descargar ambas presentaciones aquí:

Las fotos del evento las pueden checar en est post del facebook del blog: FLISoL 2018.

Les dejo también el vídeo de la presentación:

Ver en Youtube

Gracias a todos los organizadores por la invitación, en especial a Wendy, Charly, Diego y Emilio, lo disfrute muchísimo!! 🙂




Sábado 28 de abril de 2018

Alcance Libre: Disponible ALDOS 1.4.13

Viernes 27 de abril de 2018

Planeta Gruslic: Max Valdez: La elección del 2018: Neri Vela lo dijo como yo quisiera decirlo

Jueves 26 de abril de 2018

Planeta Gruslic: Max Valdez: #MeToo #IsAfraid

Viernes 20 de abril de 2018

Gunnar Wolf

Gunnar Wolf
Gunnar Wolf


Gregor's post made me think...

And yes! On April 15, I passed the 15-year-mark as a Debian Developer.

So, today I am 15.010958904109589041 years old in the project, give or take some seconds.

And, quoting my dear and admired friend, I deeply feel I belong to this community. Being part of Debian has defined the way I have shaped my career, has brought me beautiful friendships I will surely keep for many many more years, has helped me decide in which direction I should push to improve the world. I feel welcome and very recognized among people I highly value and admire, and that's the best collective present I could get.

Debian has grown and matured tremendously since the time I decided to join, and I'm very proud to be a part of that process.

Thanks, and lets keep it going for the next decade.

Miércoles 18 de abril de 2018

Instalar Let’s Encrypt SSL en CentOS 7 con Apache

Let’s Encrypt es una autoridad de certificacion (CA) gratuita, automatizada y abierta:Let's Encrypt Logo

Let’s Encrypt is a free, automated, and open certificate authority (CA), run for the public’s benefit. It is a service provided by the Internet Security Research Group (ISRG).

Para el propósito de esta guía usaremos el dominio y será referenciado de ahora en adelante.


Paso 1 – Instalando el software necesario

Nos conectamos a nuestro servidor e instalamos los paquetes mod_ssl y certbot-apache. El primero es una dependencia para poder hacer uso de los certificados.

perengano@elrond:~$ ssh vpsmikel.ds
Last login: Tue Apr 17 03:08:56 2018 from
[perengano@B8GUsg ~]$ sudo su -
[sudo] password for perengano:
Último inicio de sesión:mar abr 17 03:09:03 EDT 2018en pts/0
[root@B8GUsg ~]# yum install mod_ssl
[root@B8GUsg ~]# yum install certbot-apache
Loaded plugins: fastestmirror
base | 3.6 kB 00:00:00
epel/x86_64/metalink | 29 kB 00:00:00
extras | 3.4 kB 00:00:00
remi-php70 | 2.9 kB 00:00:00
remi-php72 | 2.9 kB 00:00:00
remi-safe | 2.9 kB 00:00:00
updates | 3.4 kB 00:00:00
vz-base | 951 B 00:00:00
vz-updates | 951 B 00:00:00
updates/7/x86_64/primary_db | 6.9 MB 00:00:01
Loading mirror speeds from cached hostfile
* base:
* epel:
* extras:
* remi-php70:
* remi-php72:
* remi-safe:
* updates:
Resolving Dependencies
--> Running transaction check
---> Package python2-certbot-apache.noarch 0:0.22.2-1.el7 will be installed
--> Processing Dependency: certbot >= 0.21.1 for package: python2-certbot-apache-0.22.2-1.el7.noarch
--> Processing Dependency: python2-certbot >= 0.21.1 for package: python2-certbot-apache-0.22.2-1.el7.noarch
--> Processing Dependency: python-augeas for package: python2-certbot-apache-0.22.2-1.el7.noarch
--> Running transaction check
---> Package certbot.noarch 0:0.22.2-1.el7 will be installed
--> Processing Dependency: /usr/sbin/semanage for package: certbot-0.22.2-1.el7.noarch
---> Package python-augeas.noarch 0:0.5.0-2.el7 will be installed
--> Processing Dependency: augeas-libs for package: python-augeas-0.5.0-2.el7.noarch
---> Package python2-certbot.noarch 0:0.22.2-1.el7 will be installed
--> Processing Dependency: python2-acme > 0.21.1 for package: python2-certbot-0.22.2-1.el7.noarch
--> Processing Dependency: python-configobj for package: python2-certbot-0.22.2-1.el7.noarch
--> Processing Dependency: python-parsedatetime for package: python2-certbot-0.22.2-1.el7.noarch
--> Processing Dependency: python-setuptools for package: python2-certbot-0.22.2-1.el7.noarch
--> Processing Dependency: python-zope-component for package: python2-certbot-0.22.2-1.el7.noarch
--> Processing Dependency: python-zope-interface for package: python2-certbot-0.22.2-1.el7.noarch
--> Processing Dependency: python2-configargparse for package: python2-certbot-0.22.2-1.el7.noarch
--> Processing Dependency: python2-cryptography for package: python2-certbot-0.22.2-1.el7.noarch
--> Processing Dependency: python2-future for package: python2-certbot-0.22.2-1.el7.noarch
--> Processing Dependency: python2-josepy for package: python2-certbot-0.22.2-1.el7.noarch
--> Processing Dependency: python2-mock for package: python2-certbot-0.22.2-1.el7.noarch
--> Processing Dependency: python2-pyrfc3339 for package: python2-certbot-0.22.2-1.el7.noarch
--> Processing Dependency: pytz for package: python2-certbot-0.22.2-1.el7.noarch
--> Running transaction check
---> Package augeas-libs.x86_64 0:1.4.0-2.el7_4.2 will be installed
---> Package policycoreutils-python.x86_64 0:2.5-17.1.el7 will be installed
--> Processing Dependency: setools-libs >= 3.3.8-1 for package: policycoreutils-python-2.5-17.1.el7.x86_64
--> Processing Dependency: libsemanage-python >= 2.5-5 for package: policycoreutils-python-2.5-17.1.el7.x86_64
--> Processing Dependency: audit-libs-python >= 2.1.3-4 for package: policycoreutils-python-2.5-17.1.el7.x86_64
--> Processing Dependency: python-IPy for package: policycoreutils-python-2.5-17.1.el7.x86_64
--> Processing Dependency: for package: policycoreutils-python-2.5-17.1.el7.x86_64
--> Processing Dependency: for package: policycoreutils-python-2.5-17.1.el7.x86_64
--> Processing Dependency: libcgroup for package: policycoreutils-python-2.5-17.1.el7.x86_64
--> Processing Dependency: for package: policycoreutils-python-2.5-17.1.el7.x86_64
--> Processing Dependency: checkpolicy for package: policycoreutils-python-2.5-17.1.el7.x86_64
--> Processing Dependency: for package: policycoreutils-python-2.5-17.1.el7.x86_64
--> Processing Dependency: for package: policycoreutils-python-2.5-17.1.el7.x86_64
---> Package python-configobj.noarch 0:4.7.2-7.el7 will be installed
---> Package python-setuptools.noarch 0:0.9.8-7.el7 will be installed
--> Processing Dependency: python-backports-ssl_match_hostname for package: python-setuptools-0.9.8-7.el7.noarch
---> Package python-zope-component.noarch 1:4.1.0-3.el7 will be installed
--> Processing Dependency: python-zope-event for package: 1:python-zope-component-4.1.0-3.el7.noarch
---> Package python-zope-interface.x86_64 0:4.0.5-4.el7 will be installed
---> Package python2-acme.noarch 0:0.22.2-1.el7 will be installed
--> Processing Dependency: pyOpenSSL >= 0.13 for package: python2-acme-0.22.2-1.el7.noarch
--> Processing Dependency: python-ndg_httpsclient for package: python2-acme-0.22.2-1.el7.noarch
--> Processing Dependency: python2-pyasn1 for package: python2-acme-0.22.2-1.el7.noarch
--> Processing Dependency: python2-requests for package: python2-acme-0.22.2-1.el7.noarch
--> Processing Dependency: python2-six for package: python2-acme-0.22.2-1.el7.noarch
---> Package python2-configargparse.noarch 0:0.11.0-1.el7 will be installed
---> Package python2-cryptography.x86_64 0:1.7.2-1.el7_4.1 will be installed
--> Processing Dependency: python-six >= 1.4.1 for package: python2-cryptography-1.7.2-1.el7_4.1.x86_64
--> Processing Dependency: python-idna >= 2.0 for package: python2-cryptography-1.7.2-1.el7_4.1.x86_64
--> Processing Dependency: python-cffi >= 1.4.1 for package: python2-cryptography-1.7.2-1.el7_4.1.x86_64
--> Processing Dependency: python-ipaddress for package: python2-cryptography-1.7.2-1.el7_4.1.x86_64
--> Processing Dependency: python-enum34 for package: python2-cryptography-1.7.2-1.el7_4.1.x86_64
---> Package python2-future.noarch 0:0.16.0-6.el7 will be installed
---> Package python2-josepy.noarch 0:1.0.1-1.el7 will be installed
---> Package python2-mock.noarch 0:1.0.1-9.el7 will be installed
---> Package python2-parsedatetime.noarch 0:2.4-5.el7 will be installed
---> Package python2-pyrfc3339.noarch 0:1.0-2.el7 will be installed
---> Package pytz.noarch 0:2016.10-2.el7 will be installed
--> Running transaction check
---> Package audit-libs-python.x86_64 0:2.7.6-3.el7 will be installed
---> Package checkpolicy.x86_64 0:2.5-4.el7 will be installed
---> Package libcgroup.x86_64 0:0.41-13.el7 will be installed
---> Package libsemanage-python.x86_64 0:2.5-8.el7 will be installed
---> Package pyOpenSSL.x86_64 0:0.13.1-3.el7 will be installed
---> Package python-IPy.noarch 0:0.75-6.el7 will be installed
---> Package python-backports-ssl_match_hostname.noarch 0: will be installed
--> Processing Dependency: python-backports for package: python-backports-ssl_match_hostname-
---> Package python-cffi.x86_64 0:1.6.0-5.el7 will be installed
--> Processing Dependency: python-pycparser for package: python-cffi-1.6.0-5.el7.x86_64
---> Package python-enum34.noarch 0:1.0.4-1.el7 will be installed
---> Package python-idna.noarch 0:2.4-1.el7 will be installed
---> Package python-ipaddress.noarch 0:1.0.16-2.el7 will be installed
---> Package python-ndg_httpsclient.noarch 0:0.3.2-1.el7 will be installed
---> Package python-six.noarch 0:1.9.0-2.el7 will be installed
---> Package python-zope-event.noarch 0:4.0.3-2.el7 will be installed
---> Package python2-pyasn1.noarch 0:0.1.9-7.el7 will be installed
---> Package python2-requests.noarch 0:2.6.0-0.el7 will be installed
--> Processing Dependency: python-requests >= 2.6.0 for package: python2-requests-2.6.0-0.el7.noarch
---> Package python2-six.noarch 0:1.9.0-0.el7 will be installed
---> Package setools-libs.x86_64 0:3.3.8-1.1.el7 will be installed
--> Running transaction check
---> Package python-backports.x86_64 0:1.0-8.el7 will be installed
---> Package python-pycparser.noarch 0:2.14-1.el7 will be installed
--> Processing Dependency: python-ply for package: python-pycparser-2.14-1.el7.noarch
---> Package python-requests.noarch 0:2.6.0-1.el7_1 will be installed
--> Processing Dependency: python-urllib3 >= 1.10.2-1 for package: python-requests-2.6.0-1.el7_1.noarch
--> Running transaction check
---> Package python-ply.noarch 0:3.4-11.el7 will be installed
---> Package python-urllib3.noarch 0:1.10.2-3.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

Package Arch Version Repository Size
python2-certbot-apache noarch 0.22.2-1.el7 epel 214 k
Installing for dependencies:
audit-libs-python x86_64 2.7.6-3.el7 base 73 k
augeas-libs x86_64 1.4.0-2.el7_4.2 updates 355 k
certbot noarch 0.22.2-1.el7 epel 21 k
checkpolicy x86_64 2.5-4.el7 base 290 k
libcgroup x86_64 0.41-13.el7 base 65 k
libsemanage-python x86_64 2.5-8.el7 base 104 k
policycoreutils-python x86_64 2.5-17.1.el7 base 446 k
pyOpenSSL x86_64 0.13.1-3.el7 base 133 k
python-IPy noarch 0.75-6.el7 base 32 k
python-augeas noarch 0.5.0-2.el7 base 25 k
python-backports x86_64 1.0-8.el7 base 5.8 k
python-backports-ssl_match_hostname noarch base 12 k
python-cffi x86_64 1.6.0-5.el7 base 218 k
python-configobj noarch 4.7.2-7.el7 base 117 k
python-enum34 noarch 1.0.4-1.el7 base 52 k
python-idna noarch 2.4-1.el7 base 94 k
python-ipaddress noarch 1.0.16-2.el7 base 34 k
python-ndg_httpsclient noarch 0.3.2-1.el7 epel 43 k
python-ply noarch 3.4-11.el7 base 123 k
python-pycparser noarch 2.14-1.el7 base 104 k
python-requests noarch 2.6.0-1.el7_1 base 94 k
python-setuptools noarch 0.9.8-7.el7 base 397 k
python-six noarch 1.9.0-2.el7 base 29 k
python-urllib3 noarch 1.10.2-3.el7 base 101 k
python-zope-component noarch 1:4.1.0-3.el7 epel 227 k
python-zope-event noarch 4.0.3-2.el7 epel 79 k
python-zope-interface x86_64 4.0.5-4.el7 base 138 k
python2-acme noarch 0.22.2-1.el7 epel 135 k
python2-certbot noarch 0.22.2-1.el7 epel 481 k
python2-configargparse noarch 0.11.0-1.el7 epel 30 k
python2-cryptography x86_64 1.7.2-1.el7_4.1 updates 502 k
python2-future noarch 0.16.0-6.el7 epel 799 k
python2-josepy noarch 1.0.1-1.el7 epel 86 k
python2-mock noarch 1.0.1-9.el7 epel 92 k
python2-parsedatetime noarch 2.4-5.el7 epel 78 k
python2-pyasn1 noarch 0.1.9-7.el7 base 100 k
python2-pyrfc3339 noarch 1.0-2.el7 epel 13 k
python2-requests noarch 2.6.0-0.el7 epel 2.9 k
python2-six noarch 1.9.0-0.el7 epel 2.9 k
pytz noarch 2016.10-2.el7 base 46 k
setools-libs x86_64 3.3.8-1.1.el7 base 612 k

Transaction Summary
Install 1 Package (+41 Dependent packages)

Total download size: 6.5 M
Installed size: 28 M
Is this ok [y/d/N]: y
Downloading packages:
(1/42): audit-libs-python-2.7.6-3.el7.x86_64.rpm | 73 kB 00:00:00
(2/42): libsemanage-python-2.5-8.el7.x86_64.rpm | 104 kB 00:00:00
(3/42): libcgroup-0.41-13.el7.x86_64.rpm | 65 kB 00:00:00
(4/42): augeas-libs-1.4.0-2.el7_4.2.x86_64.rpm | 355 kB 00:00:00
(5/42): python-IPy-0.75-6.el7.noarch.rpm | 32 kB 00:00:00
(6/42): pyOpenSSL-0.13.1-3.el7.x86_64.rpm | 133 kB 00:00:00
(7/42): checkpolicy-2.5-4.el7.x86_64.rpm | 290 kB 00:00:00
(8/42): python-augeas-0.5.0-2.el7.noarch.rpm | 25 kB 00:00:00
(9/42): python-backports-1.0-8.el7.x86_64.rpm | 5.8 kB 00:00:00
(10/42): python-configobj-4.7.2-7.el7.noarch.rpm | 117 kB 00:00:00
(11/42): certbot-0.22.2-1.el7.noarch.rpm | 21 kB 00:00:00
(12/42): python-enum34-1.0.4-1.el7.noarch.rpm | 52 kB 00:00:00
(13/42): python-cffi-1.6.0-5.el7.x86_64.rpm | 218 kB 00:00:00
(14/42): python-ipaddress-1.0.16-2.el7.noarch.rpm | 34 kB 00:00:00
(15/42): python-ndg_httpsclient-0.3.2-1.el7.noarch.rpm | 43 kB 00:00:00
(16/42): python-ply-3.4-11.el7.noarch.rpm | 123 kB 00:00:00
(17/42): python-pycparser-2.14-1.el7.noarch.rpm | 104 kB 00:00:00
(18/42): python-requests-2.6.0-1.el7_1.noarch.rpm | 94 kB 00:00:00
(19/42): python-idna-2.4-1.el7.noarch.rpm | 94 kB 00:00:00
(20/42): python-six-1.9.0-2.el7.noarch.rpm | 29 kB 00:00:00
(21/42): python-urllib3-1.10.2-3.el7.noarch.rpm | 101 kB 00:00:00
(22/42): python-backports-ssl_match_hostname- | 12 kB 00:00:00
(23/42): policycoreutils-python-2.5-17.1.el7.x86_64.rpm | 446 kB 00:00:00
(24/42): python-setuptools-0.9.8-7.el7.noarch.rpm | 397 kB 00:00:00
(25/42): python-zope-component-4.1.0-3.el7.noarch.rpm | 227 kB 00:00:00
(26/42): python-zope-event-4.0.3-2.el7.noarch.rpm | 79 kB 00:00:00
(27/42): python2-acme-0.22.2-1.el7.noarch.rpm | 135 kB 00:00:00
(28/42): python-zope-interface-4.0.5-4.el7.x86_64.rpm | 138 kB 00:00:00
(29/42): python2-certbot-0.22.2-1.el7.noarch.rpm | 481 kB 00:00:00
(30/42): python2-certbot-apache-0.22.2-1.el7.noarch.rpm | 214 kB 00:00:00
(31/42): python2-configargparse-0.11.0-1.el7.noarch.rpm | 30 kB 00:00:00
(32/42): python2-future-0.16.0-6.el7.noarch.rpm | 799 kB 00:00:00
(33/42): python2-cryptography-1.7.2-1.el7_4.1.x86_64.rpm | 502 kB 00:00:00
(34/42): python2-josepy-1.0.1-1.el7.noarch.rpm | 86 kB 00:00:00
(35/42): python2-mock-1.0.1-9.el7.noarch.rpm | 92 kB 00:00:00
(36/42): python2-parsedatetime-2.4-5.el7.noarch.rpm | 78 kB 00:00:00
(37/42): python2-pyrfc3339-1.0-2.el7.noarch.rpm | 13 kB 00:00:00
(38/42): python2-requests-2.6.0-0.el7.noarch.rpm | 2.9 kB 00:00:00
(39/42): python2-six-1.9.0-0.el7.noarch.rpm | 2.9 kB 00:00:00
(40/42): pytz-2016.10-2.el7.noarch.rpm | 46 kB 00:00:00
(41/42): python2-pyasn1-0.1.9-7.el7.noarch.rpm | 100 kB 00:00:00
(42/42): setools-libs-3.3.8-1.1.el7.x86_64.rpm | 612 kB 00:00:00
Total 4.4 MB/s | 6.5 MB 00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : python-six-1.9.0-2.el7.noarch 1/42
Installing : python2-pyasn1-0.1.9-7.el7.noarch 2/42
Installing : pyOpenSSL-0.13.1-3.el7.x86_64 3/42
Installing : pytz-2016.10-2.el7.noarch 4/42
Installing : python2-pyrfc3339-1.0-2.el7.noarch 5/42
Installing : python2-future-0.16.0-6.el7.noarch 6/42
Installing : python-zope-interface-4.0.5-4.el7.x86_64 7/42
Installing : python2-parsedatetime-2.4-5.el7.noarch 8/42
Installing : python2-six-1.9.0-0.el7.noarch 9/42
Installing : setools-libs-3.3.8-1.1.el7.x86_64 10/42
Installing : python-enum34-1.0.4-1.el7.noarch 11/42
Installing : checkpolicy-2.5-4.el7.x86_64 12/42
Installing : audit-libs-python-2.7.6-3.el7.x86_64 13/42
Installing : augeas-libs-1.4.0-2.el7_4.2.x86_64 14/42
Installing : python-augeas-0.5.0-2.el7.noarch 15/42
Installing : python-ipaddress-1.0.16-2.el7.noarch 16/42
Installing : python-zope-event-4.0.3-2.el7.noarch 17/42
Installing : 1:python-zope-component-4.1.0-3.el7.noarch 18/42
Installing : python-configobj-4.7.2-7.el7.noarch 19/42
Installing : python2-mock-1.0.1-9.el7.noarch 20/42
Installing : python-ply-3.4-11.el7.noarch 21/42
Installing : python-pycparser-2.14-1.el7.noarch 22/42
Installing : python-cffi-1.6.0-5.el7.x86_64 23/42
Installing : python-backports-1.0-8.el7.x86_64 24/42
Installing : python-backports-ssl_match_hostname- 25/42
Installing : python-setuptools-0.9.8-7.el7.noarch 26/42
Installing : python-ndg_httpsclient-0.3.2-1.el7.noarch 27/42
Installing : python-urllib3-1.10.2-3.el7.noarch 28/42
Installing : python-requests-2.6.0-1.el7_1.noarch 29/42
Installing : python2-requests-2.6.0-0.el7.noarch 30/42
Installing : libsemanage-python-2.5-8.el7.x86_64 31/42
Installing : python-idna-2.4-1.el7.noarch 32/42
Installing : python2-cryptography-1.7.2-1.el7_4.1.x86_64 33/42
Installing : python2-josepy-1.0.1-1.el7.noarch 34/42
Installing : python2-acme-0.22.2-1.el7.noarch 35/42
Installing : libcgroup-0.41-13.el7.x86_64 36/42
Installing : python-IPy-0.75-6.el7.noarch 37/42
Installing : policycoreutils-python-2.5-17.1.el7.x86_64 38/42
Installing : python2-configargparse-0.11.0-1.el7.noarch 39/42
Installing : python2-certbot-0.22.2-1.el7.noarch 40/42
Installing : certbot-0.22.2-1.el7.noarch 41/42
ValueError: SELinux policy is not managed or store cannot be accessed.
Installing : python2-certbot-apache-0.22.2-1.el7.noarch 42/42
Verifying : python-augeas-0.5.0-2.el7.noarch 1/42
Verifying : python-backports-ssl_match_hostname- 2/42
Verifying : python2-configargparse-0.11.0-1.el7.noarch 3/42
Verifying : python-zope-interface-4.0.5-4.el7.x86_64 4/42
Verifying : python-ndg_httpsclient-0.3.2-1.el7.noarch 5/42
Verifying : 1:python-zope-component-4.1.0-3.el7.noarch 6/42
Verifying : python2-future-0.16.0-6.el7.noarch 7/42
Verifying : policycoreutils-python-2.5-17.1.el7.x86_64 8/42
Verifying : python-setuptools-0.9.8-7.el7.noarch 9/42
Verifying : python2-acme-0.22.2-1.el7.noarch 10/42
Verifying : python2-cryptography-1.7.2-1.el7_4.1.x86_64 11/42
Verifying : python2-certbot-apache-0.22.2-1.el7.noarch 12/42
Verifying : certbot-0.22.2-1.el7.noarch 13/42
Verifying : python2-pyrfc3339-1.0-2.el7.noarch 14/42
Verifying : python2-six-1.9.0-0.el7.noarch 15/42
Verifying : pytz-2016.10-2.el7.noarch 16/42
Verifying : python-urllib3-1.10.2-3.el7.noarch 17/42
Verifying : python-IPy-0.75-6.el7.noarch 18/42
Verifying : libcgroup-0.41-13.el7.x86_64 19/42
Verifying : python-six-1.9.0-2.el7.noarch 20/42
Verifying : python2-certbot-0.22.2-1.el7.noarch 21/42
Verifying : python-idna-2.4-1.el7.noarch 22/42
Verifying : libsemanage-python-2.5-8.el7.x86_64 23/42
Verifying : python2-requests-2.6.0-0.el7.noarch 24/42
Verifying : python-backports-1.0-8.el7.x86_64 25/42
Verifying : python-cffi-1.6.0-5.el7.x86_64 26/42
Verifying : python-ply-3.4-11.el7.noarch 27/42
Verifying : pyOpenSSL-0.13.1-3.el7.x86_64 28/42
Verifying : python2-parsedatetime-2.4-5.el7.noarch 29/42
Verifying : python-pycparser-2.14-1.el7.noarch 30/42
Verifying : python2-mock-1.0.1-9.el7.noarch 31/42
Verifying : python-configobj-4.7.2-7.el7.noarch 32/42
Verifying : python-requests-2.6.0-1.el7_1.noarch 33/42
Verifying : python-zope-event-4.0.3-2.el7.noarch 34/42
Verifying : python-ipaddress-1.0.16-2.el7.noarch 35/42
Verifying : augeas-libs-1.4.0-2.el7_4.2.x86_64 36/42
Verifying : python2-pyasn1-0.1.9-7.el7.noarch 37/42
Verifying : audit-libs-python-2.7.6-3.el7.x86_64 38/42
Verifying : python2-josepy-1.0.1-1.el7.noarch 39/42
Verifying : checkpolicy-2.5-4.el7.x86_64 40/42
Verifying : python-enum34-1.0.4-1.el7.noarch 41/42
Verifying : setools-libs-3.3.8-1.1.el7.x86_64 42/42

python2-certbot-apache.noarch 0:0.22.2-1.el7

Dependency Installed:
audit-libs-python.x86_64 0:2.7.6-3.el7 augeas-libs.x86_64 0:1.4.0-2.el7_4.2 certbot.noarch 0:0.22.2-1.el7
checkpolicy.x86_64 0:2.5-4.el7 libcgroup.x86_64 0:0.41-13.el7 libsemanage-python.x86_64 0:2.5-8.el7
policycoreutils-python.x86_64 0:2.5-17.1.el7 pyOpenSSL.x86_64 0:0.13.1-3.el7 python-IPy.noarch 0:0.75-6.el7
python-augeas.noarch 0:0.5.0-2.el7 python-backports.x86_64 0:1.0-8.el7 python-backports-ssl_match_hostname.noarch 0:
python-cffi.x86_64 0:1.6.0-5.el7 python-configobj.noarch 0:4.7.2-7.el7 python-enum34.noarch 0:1.0.4-1.el7
python-idna.noarch 0:2.4-1.el7 python-ipaddress.noarch 0:1.0.16-2.el7 python-ndg_httpsclient.noarch 0:0.3.2-1.el7
python-ply.noarch 0:3.4-11.el7 python-pycparser.noarch 0:2.14-1.el7 python-requests.noarch 0:2.6.0-1.el7_1
python-setuptools.noarch 0:0.9.8-7.el7 python-six.noarch 0:1.9.0-2.el7 python-urllib3.noarch 0:1.10.2-3.el7
python-zope-component.noarch 1:4.1.0-3.el7 python-zope-event.noarch 0:4.0.3-2.el7 python-zope-interface.x86_64 0:4.0.5-4.el7
python2-acme.noarch 0:0.22.2-1.el7 python2-certbot.noarch 0:0.22.2-1.el7 python2-configargparse.noarch 0:0.11.0-1.el7
python2-cryptography.x86_64 0:1.7.2-1.el7_4.1 python2-future.noarch 0:0.16.0-6.el7 python2-josepy.noarch 0:1.0.1-1.el7
python2-mock.noarch 0:1.0.1-9.el7 python2-parsedatetime.noarch 0:2.4-5.el7 python2-pyasn1.noarch 0:0.1.9-7.el7
python2-pyrfc3339.noarch 0:1.0-2.el7 python2-requests.noarch 0:2.6.0-0.el7 python2-six.noarch 0:1.9.0-0.el7
pytz.noarch 0:2016.10-2.el7 setools-libs.x86_64 0:3.3.8-1.1.el7

[root@B8GUsg ~]#

yum install certbotcertbot installed


Paso 2 – Reglas del firewall

Si están usando firewalld o iptables para tener abiertos sólo los servicios que se ocupen, necesitamos agregar reglas para los puertos 80 y 443.

Si usan firewalld, con los siguientes comandos:

[root@B8GUsg ~]# firewall-cmd --add-service=http
[root@B8GUsg ~]# firewall-cmd --add-service=https
[root@B8GUsg ~]# firewall-cmd --runtime-to-permanent

En el caso de que estemos usando iptables, ejecutamos lo siguiente:

[root@B8GUsg ~]# iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
[root@B8GUsg ~]# iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT

Paso 3 – Solicitando un Certificado SSL de Let’s Encrypt

Ya que tenemos esto listo, podemos solicitar un certificado SSL para nuestro dominio.

Generar el certificado SSL para Apache usando el cliente para Let’s Encrypt certbot es muy sencillo. El cliente obtendrá e instalará automáticamente un nuevo certificado SSL válido para los dominios proporcionados como parámetros.

[root@B8GUsg ~]# certbot --apache -d -d
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
Starting new HTTPS connection (1):

Please read the Terms of Service at You must
agree in order to register with the ACME server at
(A)gree/(C)ancel: A

Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'
d like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
(Y)es/(N)o: Y
Starting new HTTPS connection (1):
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for
http-01 challenge for
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/httpd/sites-available/
Deploying Certificate to VirtualHost /etc/httpd/sites-available/
Enabling site /etc/httpd/sites-available/ by adding Include to root configuration
Deploying Certificate to VirtualHost /etc/httpd/sites-available/

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server'
s configuration.
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Redirecting vhost in /etc/httpd/sites-enabled/ to ssl vhost in /etc/httpd/sites-available/

Congratulations! You have successfully enabled and

You should test your configuration at:

- Congratulations! Your certificate and chain have been saved at:
Your key file has been saved at:
Your cert will expire on 2018-07-16. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt:
Donating to EFF:

[root@B8GUsg ~]#

certbot domain


Paso 4 – Habilitando SSL en nuestro Apache

Aunque estamos usando CentOS, cuando se hizo la instalación de Apache, fueron creados dos directorios para el uso de los VirtualHost y de esta manera sea más sencillo su uso. Esta forma es habitual en Debian, y son sites-available y sites-enabled.

[root@B8GUsg ~]# cd /etc/httpd/
[root@B8GUsg httpd]# ls -l
total 20
drwxr-xr-x 2 root root 4096 Apr 17 14:40 conf
drwxr-xr-x 2 root root 4096 Apr 17 14:40 conf.d
drwxr-xr-x 2 root root 4096 Apr 17 03:10 conf.modules.d
lrwxrwxrwx 1 root root 19 Apr 13 11:18 logs -> ../../var/log/httpd
lrwxrwxrwx 1 root root 29 Apr 13 11:18 modules -> ../../usr/lib64/httpd/modules
lrwxrwxrwx 1 root root 10 Apr 13 11:18 run -> /run/httpd
drwxr-xr-x 2 root root 4096 Apr 17 14:41 sites-available
drwxr-xr-x 2 root root 4096 Apr 17 14:49 sites-enabled
[root@B8GUsg httpd]#

El archivo de configuración de nuestro dominio con su certificado está en: /etc/httpd/sites-available/, y necesitamos crear un enlace simbólico en sites-enabled para que Apache lo tome en cuenta.

[root@B8GUsg httpd]# ln -s /etc/httpd/sites-available/ /etc/httpd/sites-enabled/


Paso 5 – Añadiendo seguridad extra a la configuración SSL de Apache

La configuración por defecto de CentOS 7 del Apache que está disponible está un poco desactualizada en cuanto a configuración se refiere, al mismo tiempo que es vulnerable a ataques y técnicas recientes.

Se recomienda deshabilitar los siguientes valores en el archivo /etc/httpd/conf.d/ssl.conf así que creamos una copia de seguridad como primer paso:

[root@B8GUsg httpd]# cd conf.d/
[root@B8GUsg conf.d]# cp ssl.conf /root/
[root@B8GUsg conf.d]# nano ssl.conf

Una vez hecho eso, es momento de editar dicho archivo y comentar SSLProtocol y SSLCipherSuite:

. . .
# SSLProtocol all -SSLv2
. . .
. . .

Copiamos lo siguiente después del fin del bloque VirtualHost, que en este caso está al final del archivo:

# Begin copied text
# from
# and

SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
# Disable preloading HSTS for now. You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
# SSLSessionTickets Off

Verificamos que la configuración de Apache no tenga ningún error:

[root@B8GUsg conf.d]# apachectl configtest
Syntax OK
[root@B8GUsg conf.d]#

Si obtenemos Syntax OK, quiere decir que todo está bien, así que reiniciamos el servicio de Apache:

[root@B8GUsg conf.d]# systemctl restart httpd
[root@B8GUsg conf.d]#


Paso 6 – Verificando el estado de tu Certificado

Si se fijaron, al final de la obtención del certificado venía el siguiente texto, así que podemos usar esa URL para comprobarlo:

You should test your configuration at:
[cc lang="bash"]
Paso 7 - Configurando la auto-renovación del Certificado</h1>
<p style="text-align: justify;">Los certificados de <strong>Let's Encrypt</strong> son válidos durante 90 días, por lo que es recomendable que se renueven cada 60 días. En este ejemplo se ejecutará cada día 15 de cada mes a las 2:30hrs. Editamos <strong>Crontab</strong>:</p>
[cc lang="bash"]
[root@B8GUsg conf.d]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab

Añadimos el siguiente contenido:

[root@B8GUsg conf.d]#
# Ejecutar los 15 de cada mes a las 2:30
30 2 15 * * /usr/bin/certbot renew &gt;&gt; /var/log/le-renew.log

En esta guía vimos como instalar un Certificado SSL gratuito de Let’s Encrypt para tener un sitio seguro en Apache en un servidor CentOS 7.


La entrada Instalar Let’s Encrypt SSL en CentOS 7 con Apache se publicó primero en hbautista's blog.

Martes 17 de abril de 2018

Configurando y usando OpenSSH en CentOS 7

SSH LogoEl escenario es el siguiente, CentOS 7 recién instalado con OpenSSH instalado y configurado por default y SELinux desactivado.

Aunque usemos contraseñas con 20 o 30 caracteres usando caracteres especiales y todo eso, siempre es mejor el uso de llaves y cambiar algunos valores en el servidor al que nos queremos conectar.

Para generar una clave SSH en Linux usando el comando ssh-keygen deberías ejecutarlo usando la línea de comandos, esto se hace desde el cliente:

perengao@elrond:~$ ssh-keygen -t rsa -b 4096 -C ""
Generating public/private rsa key pair.
Enter file in which to save the key (/home/perengano/.ssh/id_rsa):
Created directory '/home/perengano/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/perengano/.ssh/id_rsa.
Your public key has been saved in /home/perengano/.ssh/
The key fingerprint is:
The key's randomart image is:
+---[RSA 4096]----+
|.+ . .... .B/%|
|o + . . .. . ++=O|
| . . .. . . =++|
| . . . o.*.|
| . S .o o|
| . . .. . |
| . +. . |
| . . .+. |
| ..o...E.. |
perengano@elrond:~$ cat .ssh/

En este ejemplo no estoy usando una passphrase, pero se aconseja usar una.

Una vez que la llave ha sido generada, podemos copiarla al servidor destino usando el siguiente comando:

ssh-copy-id user@serverip

También pueden hacerlo usando copiar y pegar, subiendo el archivo con scp, etc.

perengano@elrond:~$ ssh-copy-id perengano@vpsmikel.ds
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/perengano/.ssh/"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
perengano@vpsmikel.ds's password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh '
and check to make sure that only the key(s) you wanted were added.


Ahora nos toca realizar lo siguiente del lado del servidor, primeramente dejar los permisos para que OpenSSH no nos de lata:

perengano@elrond:~$ ssh perengano@vpsmikel.ds
perengano@vpsmikel.ds's password:
Last login: Mon Apr 10 19:22:07 2018 from
[perengano@B8GUsg ~]$ chmod 700 .ssh
[perengano@B8GUsg ~]$ chmod 600 .ssh/authorized_keys
[perengano@B8GUsg ~]$

OpenSSH es muy quisquilloso con los permisos tanto del directorio como del archivo, en mi caso había hecho el segundo comando, pero no el primero y no me permitía loguearme con las llaves.

[perengano@B8GUsg ~]$ sudo su -
[sudo] password for perengano:
Último inicio de sesión:lun abr 16 21:40:02 EDT 2018en pts/0
Último inicio de sesión fallido:lun abr 16 22:47:05 EDT 2018de ssh:notty
Hubo 2 intentos de logueo fallidos desde el último logueo exitoso.
[root@B8GUsg ~]#

Ya como root, hacemos una copia de seguridad del archivo de configuración original y editamos:

[root@B8GUsg ~]# cp /etc/ssh/sshd_config /etc/ssh/orig.sshd_config
[root@B8GUsg ~]# nano /etc/ssh/sshd_config

Y los valores que hay que cambiar son los siguientes

# Desactivamos que root pueda loguearse usando ssh
PermitRootLogin no

# Estos valores nos permiten usar SSH keys en lugar de passwords
RSAAuthentication yes
PubkeyAuthentication yes

# Desactivamos las contraseñas
PasswordAuthentication no

Reiniciamos el servicio:

[root@B8GUsg ~]# systemctl restart sshd.service

Nota: Abrir una segunda terminal o pestaña de terminal y desde ahí hacer pruebas, no te desconectes en caso de que algo no funcione como debe:

perengano@elrond:~$ ssh vpsmikel.ds
Last login: Mon Apr 16 21:52:28 2018 from
[perengano@B8GUsg ~]$

Con eso deben tener todo listo para poder hacer uso de las llaves. Sin embargo, si quieren usar un cliente como Filezilla para copiar archivos y todo eso, necesitamos exportar nuestra llave. Esto lo podemos hacer usando puttygen.exe

Creo un directorio con los archivos generados al inicio:

perengano@elrond:~$ mkdir keys
perengano@elrond:~$ cp .ssh/id_rsa keys
perengano@elrond:~$ cp .ssh/ keys

Vamos a usar Wine, si no lo tienen pueden instalarlo:

perengano@elrond:~$ sudo apt install wine wine-utils
perengano@elrond:~$ cd keys
perengano@elrond:~$ wine ../Descargas/puttygen.exe
it looks like wine32 is missing, you should install it.
as root, please execute "apt-get install wine32"

PuttygenImport keyPuttygen WarningPuttygen save key

Después de hacerlo, podemos ver los archivos que tenemos:

perengano@elrond:~/keys$ ls -la
total 20
drwxr-xr-x 2 perengano perengano 4096 abr 16 23:21 .
drwxr-xr-x 49 perengano perengano 4096 abr 16 17:51 ..
-rw-r--r-- 1 perengano perengano 3244 abr 16 23:15 id_rsa
-rw-r--r-- 1 perengano perengano 755 abr 16 23:15
-rw-r--r-- 1 perengano perengano 2701 abr 16 23:21 perengano.ppk

Ahora sí, podemos añadir nuestro archivo .ppk a Filezilla

FilezillaFilezilla warningFilezilla connected

Y eso sería todo.



La entrada Configurando y usando OpenSSH en CentOS 7 se publicó primero en hbautista's blog.

Lunes 16 de abril de 2018

Emerson Posadas

Emerson Posadas
toxickore BLOG

OpenVPN with easy rsa 3

Jueves 12 de abril de 2018

Miguel de Icaza

Miguel de Icaza
Miguel de Icaza

How we doubled Mono’s Float Speed

My friend Aras recently wrote the same ray tracer in various languages, including C++, C# and the upcoming Unity Burst compiler. While it is natural to expect C# to be slower than C++, what was interesting to me was that Mono was so much slower than .NET Core.

The numbers that he posted did not look good:

  • C# (.NET Core): Mac 17.5 Mray/s,
  • C# (Unity, Mono): Mac 4.6 Mray/s,
  • C# (Unity, IL2CPP): Mac 17.1 Mray/s,

I decided to look at what was going on, and document possible areas for improvement.

As a result of this benchmark, and looking into this problem, we identified three areas of improvement:

  • First, we need better defaults in Mono, as users will not tune their parameters
  • Second, we need to better inform the world about the LLVM code optimizing backend in Mono
  • Third, we tuned some of the parameters in Mono.

The baseline for this test, was to run Aras ray tracer on my machine, since we have different hardware, I could not use his numbers to compare. The results on my iMac at home were as follows for Mono and .NET Core:

Runtime Results MRay/sec
.NET Core 2.1.4, debug build dotnet run 3.6
.NET Core 2.1.4, release build, dotnet run -c Release 21.7
Vanilla Mono, mono Maths.exe 6.6
Vanilla Mono, with LLVM and float32 15.5

During the process of researching this problem, we found a couple of problems, which once we fixed, produced the following results:

Runtime Results MRay/sec
Mono with LLVM and float32 15.5
Improved Mono with LLVM, float32 and fixed inline 29.6


Chart visualizing the results of the table above

Just using LLVM and float32 your code can get almost a 2.3x performance improvement in your floating point code. And with the tuning that we added to Mono’s as a result of this exercise, you can get 4.4x over running the plain Mono - these will be the defaults in future versions of Mono.

This blog post explains our findings.

32 and 64 bit Floats

Aras is using 32-bit floats for most of his math (the float type in C#, or System.Single in .NET terms). In Mono, decades ago, we made the mistake of performing all 32-bit float computations as 64-bit floats while still storing the data in 32-bit locations.

My memory at this point is not as good as it used to be and do not quite recall why we made this decision.

My best guess is that it was a decision rooted in the trends and ideas of the time.

Around this time there was a positive aura around extended precision computations for floats. For example the Intel x87 processors use 80-bit precision for their floating point computations, even when the operands are doubles, giving users better results.

Another theme around that time was that the Gnumeric spreadsheet, one of my previous projects, had implemented better statistical functions than Excel had, and this was well received in many communities that could use the more correct and higher precision results.

In the early days of Mono, most mathematical operations available across all platforms only took doubles as inputs. C99, Posix and ISO had all introduced 32-bit versions, but they were not generally available across the industry in those early days (for example, sinf is the float version of sin, fabsf of fabs and so on).

In short, the early 2000’s were a time of optimism.

Applications did pay a heavier price for the extra computation time, but Mono was mostly used for Linux desktop application, serving HTTP pages and some server processes, so floating point performance was never an issue we faced day to day. It was only noticeable in some scientific benchmarks, and those were rarely the use case for .NET usage in the 2003 era.

Nowadays, Games, 3D applications image processing, VR, AR and machine learning have made floating point operations a more common data type in modern applications. When it rains, it pours, and this is no exception. Floats are no longer your friendly data type that you sprinkle in a few places in your code, here and there. They come in an avalanche and there is no place to hide. There are so many of them, and they won’t stop coming at you.

The “float32” runtime flag

So a couple of years ago we decided to add support for performing 32-bit float operations with 32-bit operations, just like everyone else. We call this runtime feature “float32”, and in Mono, you enable this by passing the --O=float32 option to the runtime, and for Xamarin applications, you change this setting on the project preferences.

This new flag has been well received by our mobile users, as the majority of mobile devices are still not very powerful and they rather process data faster than they need the precision. Our guidance for our mobile users has been both to turn on the LLVM optimizing compiler and float32 flag at the same time.

While we have had the flag for some years, we have not made this the default, to reduce surprises for our users. But we find ourselves facing scenarios where the current 64-bit behavior is already surprises to our users, for example, see this bug report filed by a Unity user.

We are now going to change the default in Mono to be float32, you can track the progress here:

In the meantime, I went back to my friend Aras project. He has been using some new APIs that were introduced in .NET Core. While .NET core always performed 32-bit float operations as 32-bit floats, the System.Math API still forced some conversions from float to double in the course of doing business. For example, if you wanted to compute the sine function of a float, your only choice was to call Math.Sin (double) and pay the price of the float to double conversion.

To address this, .NET Core has introduced a new System.MathF type, which contains single precision floating point math operations, and we have just brought this [System.MathF]( to Mono now.

While moving from 64 bit floats to 32 bit floats certainly improves the performance, as you can see in the table below:

Runtime and Options Mrays/second
Mono with System.Math 6.6
Mono with System.Math, using -O=float32 8.1
Mono with System.MathF 6.5
Mono with System.MathF, using -O=float32 8.2

So using float32 really improves things for this test, the MathF had a small effect.

Tuning LLVM

During the course of this research, we discovered that while Mono’s Fast JIT compiler had support for float32, we had not added this support to the LLVM backend. This meant that Mono with LLVM was still performing the expensive float to double conversions.

So Zoltan added support for float32 to our LLVM code generation engine.

Then he noticed that our inliner was using the same heuristics for the Fast JIT than it was using for LLVM. With the Fast JIT, you want to strike a balance between JIT speed and execution speed, so we limit just how much we inline to reduce the work of the JIT engine.

But when you are opt into using LLVM with Mono, you want to get the fastest code possible, so we adjusted the setting accordingly. Today you can change this setting via an environment variable MONO_INLINELIMIT, but this really should be baked into the defaults.

With the tuned LLVM setting, these are the results:

Runtime and Options Mrays/seconds
Mono with System.Math --llvm -O=float32 16.0
Mono with System.Math --llvm -O=float32 fixed heuristics 29.1
Mono with System.MathF --llvm -O=float32 fixed heuristics 29.6

Next Steps

The work to bring some of these improvements was relatively low. We had some on and off discussions on Slack which lead to these improvements. I even managed to spend a few hours one evening to bring System.MathF to Mono.

Aras RayTracer code was an ideal subject to study, as it was self-contained, it was a real application and not a synthetic benchmark. We want to find more software like this that we can use to review the kind of bitcode that we generate and make sure that we are giving LLVM the best data that we can so LLVM can do its job.

We also are considering upgrading the LLVM that we use, and leverage any new optimizations that have been added.


The extra precision has some nice side effects. For example, recently, while reading the pull requests for the Godot engine, I saw that they were busily discussing making floating point precision for the engine configurable at compile time (

I asked Juan why anyone would want to do this, I thought that games were just content with 32-bit floating point operations.

Juan explained to that while floats work great in general, once you “move away” from the center, say in a game, you navigate 100 kilometers out of the center of your game, the math errors start to accumulate and you end up with some interesting visual glitches. There are various mitigation strategies that can be used, and higher precision is just one possibility, one that comes with a performance cost.

Shortly after our conversation, this blog showed up on my Twitter timeline showing this problem:

A few images show the problem. First, we have a sports car model from the pbrt-v3-scenes **distribution. Both the camera and the scene are near the origin and everything looks good.

** (Cool sports car model courtesy Yasutoshi Mori.) Next, we’ve translated both the camera and the scene 200,000 units from the origin in xx, yy, and zz. We can see that the car model is getting fairly chunky; this is entirely due to insufficient floating-point precision.

** (Thanks again to Yasutoshi Mori.) If we move 5×5× farther away, to 1 million units from the origin, things really fall apart; the car has become an extremely coarse voxelized approximation of itself—both cool and horrifying at the same time. (Keanu wonders: is Minecraft chunky purely because everything’s rendered really far from the origin?)

** (Apologies to Yasutoshi Mori for what has been done to his nice model.)

Miércoles 11 de abril de 2018

Alcance Libre: Cambios importantes que hay que realizar tras actualizar a ClamAV 0.100.0.
Gunnar Wolf

Gunnar Wolf
Gunnar Wolf

DRM, DRM, oh how I hate DRM...

I love flexibility. I love when the rules of engagement are not set in stone and allow us to lead a full, happy, simple life. (Apologies to Felipe and Marianne for using their very nice sculpture for this rant. At least I am not desperately carrying a brick! ☺)

I have been very, very happy after I switched to a Thinkpad X230. This is the first computer I have with an option for a cellular modem, so after thinking it a bit, I got myself one:

After waiting for a couple of weeks, it arrived in a nonexciting little envelope straight from Hong Kong. If you look closely, you can even appreciate there's a line (just below the smaller barcode) that reads "Lenovo"). I soon found how to open this laptop (kudos to Lenovo for a very sensible and easy opening process, great documentation... So far, it's the "openest" computer I have had!) and installed my new card!

The process was decently easy, and after patting myself in the back, I eagerly turned on my computer... Only to find the BIOS to halt with the following message:

1802: Unauthorized network card is plugged in - Power off and remove the miniPCI network card (1199/6813).

System is halted

So... Got everything back to its original state. Stupid DRM in what I felt the openest laptop I have ever had. Gah.

Anyway... As you can see, I have a brand new cellular modem. I am willing to give it to the first person that offers me a nice beer in exchange, here in Mexico or wherever you happen to cross my path (just tell me so I bring the little bugger along!)

Of course, I even tried to get one of the nice volunteers to install Libreboot in my computer now that I was to Libreplanet, which would have solved the issue. But they informed me that Libreboot is supported only in the (quite a bit older) X200 machines, not in the X230.

IMG_20180409_225503.jpg1003.02 KB
IMG_20180409_225835.jpg1.77 MB
IMG_20180409_230000.jpg113.36 KB
IMG_20180409_225835.jpg1.77 MB
IMG_20180408_085157.jpg3.44 MB

Martes 10 de abril de 2018

Emerson Posadas

Emerson Posadas
toxickore BLOG

easy-rsa 3

So this is now the way to use easy-rsa on version 3

Jueves 05 de abril de 2018

Firefox Quantum en Debian Stretch

New Tab

Firefox Quantum es la nueva versión de Firefox que viene completamente renovada. Desafortunadamente no lo encontramos en los repositorios de Debian Stretch ni en Backports. Aunque si esta en Sid, lo podríamos instalar usando APT Pinning, lo cual no es muy recomendable, y en lo personal me causaba muchos conflictos.

Firefox QuantumLo primero que hay que hacer es descargar el archivo comprimido desde el sitio oficial de Mozilla, y una vez descargado realizamos los siguientes pasos como root:

root@elrond:~# tar xjfv /home/hbautista/Descargas/firefox-59.0.1.tar.bz2 -C /opt/

En mi caso y dado que no necesito Mozilla Firefox ESR, que al momento de escribir esto es la versión 52.7.2esr-1~deb9u1, decidí quitar.

root@elrond:~# apt remove firefox-esr

Necesitamos es crear su acceso directo, que es un archivo .desktop y se puede crear con tu editor de texto favorito, en mi caso estoy usando nano:

root@elrond:~# nano /usr/share/applications/firefox-quantum.desktop

Debe contener lo siguiente:

[Desktop Entry]
Name=Firefox Quantum
Comment=Web Browser
GenericName=Web Browser
X-GNOME-FullName=Firefox Quantum Web Browser
Exec=/opt/firefox/firefox %u

Para guardar y cerrar presiona CTRL + O y para salir CTRL + X

Le damos permiso de ejecución al acceso directo:

root@elrond:~# chmod +x /usr/share/applications/firefox-quantum.desktop

Creamos un enlace simbólico para que cualquier usuario pueda ejecutarlo:

root@elrond:~# ln -s /opt/firefox/firefox /usr/lib/

Firefox & Mate en Debian Stretch
Actualización manual de Mozilla Firefox

Si por alguna razón, no se actualiza de forma automática, siempre se puede hacer manualmente. Descargar el archivo .bz2 desde el sitio de Mozilla Firefox y hacer lo siguiente:

Eliminamos todo el contenido en /opt:

root@elrond:~# rm -Rf /opt/firefox/

Y volvemos a descomprimir:

root@elrond:~# tar xjfv /home/hbautista/Descargas/firefox-59.0.2.tar.bz2 -C /opt/

La entrada Firefox Quantum en Debian Stretch se publicó primero en hbautista's blog.

Miguel de Icaza

Miguel de Icaza
Miguel de Icaza

Fixing Screenshots in MacOS

This was driving me insane. For years, I have been using Command-Shift-4 to take screenshots on my Mac. When you hit that keypress, you get to select a region of the screen, and the result gets placed on your ~/Desktop directory.

Recently, the feature stopped working.

I first blamed Dropbox settings, but that was not it.

I read every article on the internet on how to change the default location, restart the SystemUIServer.

The screencapture command line tool worked, but not the hotkey.

Many reboots later, I disabled System Integrity Protection so I could use iosnoop and dtruss to figure out why screencapture was not logging. I was looking at the logs right there, and saw where things were different, but could not figure out what was wrong.

Then another one of my Macs got infected. So now I had two Mac laptops that could not take screenshots.

And then I realized what was going on.

When you trigger Command-Shift-4, the TouchBar lights up and lets you customize how you take the screenshot, like this:

And if you scroll it, you get these other options:

And I had recently used these settings.

If you change your default here, it will be preserved, so even if the shortcut is Command-Shift-4 for take-screenshot-and-save-in-file, if you use the TouchBar to make a change, this will override any future uses of the command.

Martes 03 de abril de 2018

Alex Callejas

Alex Callejas

#MeetArmy – Cómo monitorear recursos sin morir en el intento

You know, there are 20 million guys out of work in Manhattan alone just waiting for my job and yours too | Tu sabes, hay 20 millones de hombres sin trabajo en Manhattan solo esperando mi trabajo y el tuyo también – Detective Robert Thorn (Soylent Green – 1973)

El pasado 12  y 28 de Marzo tuve la fortuna de poder presentar la plática Cómo monitorear recursos sin morir en el intento durante el #MeetupArmy y el Meetup de GDG UNAM. Muchas gracias a ambos por la oportunidad!!

Durante la plática, les conté algunas experiencias en cuanto al monitoreo de recursos y las herramientas más comúnes y básicas para estas actividades.

También les presenté el video basado en la película Soylent Green:

Ver en YouTube

Les dejo la presentación aquí.

Espero les sirva…

Martes 27 de marzo de 2018

Eduardo Ruiz Duarte

Eduardo Ruiz Duarte
Beck's blog

Matemáticas, música y recuerdos

Hoy, en mi trabajo por alguna razón mientras trataba de entender algo un poco abstracto en álgebra, me acordé de mi maestro de piano cuando era niño (1993) y tuve una emoción un poco filosófica y nostálgica. Intenté buscarlo en internet para ver si existía algún registro de él, una foto o una grabación... no tuve éxito. Él vivía de dar conciertos en salones pequeños y de dar clases de canto y piano a niños y adultos en su casa ubicada en el barrio de Coyoacán. No era un virtuoso pero era muy trabajador, muy apasionado y una persona muy noble y pura. Él perfeccionaba cualquier pieza si se lo proponía. Tenía cuatro pianos de cola en su casa. Siempre sacaba piezas nuevas para interpretarlas en conciertos y salones locales en Coyoacán como la Sala Rodolfo Usigli y otros lugares. En su casa tenía una foto de Dolores del Río, era fanático de su belleza. Recuerdo que un sábado por la tarde de un 13 de octubre (era el día de San Eduardo por eso lo recuerdo), después de yo llegar de los "boy scouts", entré a mi casa en la calle de Malintzin en la colonia Del Carmen en Coyoacán y me topé con la sorpresa de que había un piano para mí (de hecho era una pianola). Las clases las tomaba antes de este piano en su casa. Mi madre y él lo escogieron muy cuidadosamente ya que "tenían que estar en perfectísimo estado los martinetes" para darme la gran sorpresa y por fin poder practicar en un instrumento de verdad, lo cual les agradezco infinitamente tanto a mi madre María G. Duarte como a él.
Él me entrenó para entrar a la Escuela Nacional de Música de la UNAM donde estudié piano desde 1996 hasta la huelga (2000). Pude pasar sin ningún problema gracias a que perfeccioné con él el Minueto en Sol Mayor de Johann Sebastian Bach que presenté en mi examen de admisión siendo un niño. Mi maestro tenía un sueño un poco peculiar, que era ir a la casa de Beethoven en Bonn, Alemania. Ahora que lo analizo, iré a Bonn este sábado, entonces tal vez me acordé hoy de mi maestro ya que siempre me decía: "Tú eres bueno en matemáticas porque te gusta tocar el piano" (noten la lógica). Otra anécdota es que solía decír que yo tenía muy "buen oído" y le encantaba al final de mi clase tocar acordes mientras yo miraba hacia otro lado y preguntarme cuáles notas eran las que él estaba tocando. Gracias a él pude interpretar varias melodías de Beethoven, (Sonata Opus 27 no. 2 fue a la que más tiempo le dedicamos), Preludios de Chopin, Mazurkas y varios arreglos de Mozart. Yo siempre era rebelde y quería tocar cosas "modernas". Recuerdo que le insistía en que tocáramos a Di Blassio o Richard Clayderman y él sólo se reía como diciéndome "no seas naco" (obvio él no decía eso pero seguro tenía la intención). Le agradezco mucho el haberme mostrado la belleza de la música clásica. Mi madre siempre le sugirió que vendiera uno de sus grandes pianos para poder viajar a Bonn y conocer a su héroe, pero él los amaba y jamás se quiso deshacer de alguno de ellos.
Falleció en la primavera del 2000 de cáncer prostático, justo cuando ya no podía pagar su casa y mantener sus pianos por culpa de su enfermdad. Había abandonado su casa de Coyoacán para ir a un pequeño departamento en Acoxpa. Como ya no tenía espacio en su nueva casa nos regaló sus macetas de jazmines que florecieron por muchos años.
Su nombre era Aurelio de Alba, era originario de Durango, mi emoción surgió al no encontrar absolutamente nada en internet. No tuvo hijos y sólo tenía un hermano de edad similar que era maestro particular de inglés. Ambos ya no viven. Mi maestro murió primero que su hermano quien vendió todos los pianos ya que no había más qué hacer con ellos. Qué difícil y triste es pensar en el hecho de que ya nadie se acuerde de él más que mi madre y yo; que no haya un sólo registro de sus bellas melodías. ¿Cuántos humanos así han dejado de existir en la mente de todos los que están vivos hoy en día?. Les dejo la melodía que él más amaba y que decenas de veces lo escuché interpretar (Intermezzo de Manuel María Ponce).
Que en Paz descanse maestro Aurelio.


Itzcoalt Alvarez Moreno

Itzcoalt Alvarez Moreno
Itzcoalt (itz) Álvarez



Después de un tiempo de pensarlo, he tomado la decisión de montar un nodo de bitcoind y electrumx.

Electrumx permite actuar de intermediario entre la cartera del mismo nombre y el blockchain de bitcoin  (bitcoind), permitiendo que los usuarios no tengan que descargar toda la cadena, operar y sobre todo, conservar sus llaves en su poder.

Esto es importante, por que le da una mayor versatilidad a las operaciones de bitcoin.

De al forma, si lo usan, pueden conectarse a :




Domingo 25 de marzo de 2018

Alejandro Acosta

Alejandro Acosta

Another year, another great Linux conference – Scale16x

From March 8th to  11th, 2018 the Southern California Linux Expo (SCaLE) took place in beautiful Pasadena for the third year in a row, previous edition were held in hotels near LAX. This was the 16th edition of the conference -hence the #Scale16x hashtag that flooded social media those days- and my personal 8th.

I’ve been saying it for a while now that I think that the conference is just getting better by every year, but this year I heard several comments that this is one of the best and most important community driven conferences in the world. Rough estimations tell that there were around 3,000 attendees this year.

As a long time tradition now, the Fedora community held some activities in the conference, as well as a booth in the exhibition floor. This year, I had the privilege and pleasure of  promoting Fedora, answer question from people that showed interest in  (or are already users of) Fedora or simply saluting people that stopped by. I have to say that it pleasantly surprised me the growing number of spanish-speaking people that attended this year. I was accompanied in booth duty with long time Fedora contributors -but above all great Friends- Perry Rivera, Scott Williams and my newest Fedora friend Michael Singh. Unofficialy, but always willing to help, RedHat’s Tom ‘Spot’ Callaway was also supporting our booth and we always appreciate it and thank him for his work.



Speaking of Red Hat -if you were unaware, it is the company that sponsors our community- they also had a booth and some talks in the conference, so it was a great pleasure to say hello to old RedHatters Jen Madriaga, Karsten Quaid and Brian Proffit, just to mention some of the ones that I know for a while now.

By the way, thank you Jen for the photo 🙂

Thank you also to my new friend Jennifer, who took this picture randomly and later that day I casually met her, as she was with a long time Scale attending group from Tijuana.



Also, it is always satisfactory to say hello to contributors and friends from  other RedHat sponsored communities like

There was for sure a pretty interesting schedule of talks and events for the conference, it can be reviewed here.  Unfortunatelly, we had few time to attend a lot of talks due to booth duty -not complaining about it though- but we still manage to attend a few that would not interfere with it. Of course, we couldn’t have missed RedHat’s Langdon White talk titled “Fedora Modularity: Lessons Learned, Next Steps & Demo“.  Langdon presented a new modular model for distributing applications that is getting maturity and will be available in future Fedora releases. After the talk, later that night we had a small discussion group with people interested in the subject.

The full presentation can be reviewed in the following link, around 5:08:00


Personally, I also had the opportunity to attend a Kubernetes Bird of Feathers with a bunch of interesting guys from top kubernetes contributing companies like Google, RedHat and Samsung. It was for sure a delightful and enricher experience.


Words never seem to be enough, SCaLE is such an important event for Free and Open Source Software and communities. I am so glad I had a chance to participate and I cannot stress enough how happy and proud I’m to be part of Fedora and I can’t wait for upcoming editions of the conference.





Jueves 15 de marzo de 2018

PXE boot server on a Raspberry Pi

Right now, I’m configuring a Homelab, to start practicing with OpenStack, VMware, Docker, and Kubernetes.

So, to install the Operative System from Network, I will implement a PXE boot server on a Raspberry Pi.

The main idea is to be capable of installing CentOS7, ESXi 6.5 and Ubuntu 17.04 from the network using the PXE boot server on a Raspberry Pi.

What I used: Raspberry Pi Model 2 CentOS7 ISO image ESXi 6.5 ISO image Ubuntu 17.04 ISO image

Variables to use: Raspberry Pi’s IP address: DHCP server gateway: subnet: domain name: hostname: pxeboot

I assume that Raspian is already installed on the Raspberry Pi, if not you can follow the official installation guide.

Installing and Configuring HTTP server

We’re going to configure the HTTP server to server the installation files:

Edit the /etc/hosts file. Append the following line: pxeboot
Install the HTTP server and curl (to test the HTTP server):
sudo aptitude install apache2 curl

By default, HTTP server should be running immediately after the install. You can confirm by running the command:

sudo systemctl apache2 status
Now we’re going to create a virtual host. To create the document root directory for our virtual host:
sudo mkdir -p /var/www/vhosts/pxeboot/{centos7,ubuntu1704}
Apply appropriate permissions to the subdirectories:
sudo chmod -R 755 /var/www
To create the configuration file for our new virtual host, let’s just copy the uncommented lines from the default website config file, 000-default.conf to file:
grep -v ‘#’ /etc/apache2/sites-available/000-default.conf | sudo tee /etc/apache2/sites-available/
Modify the “ServerName” variable:
Modify the “DocumentRoot” line to point to the new directory:
DocumentRoot /var/www/vhosts/pxeboot/
Restart the HTTP server:
sudo systemctl restart apache2.service
Download media ISOs
sudo mkdir -p /tmp/isos/
sudo wget -O /tmp/isos/centos7.iso
sudo wget -O /tmp/isos/ubuntu1704.iso
Mount the images to the /media directory:

sudo mkdir -p /media/{centos7,ubuntu1704} sudo mount -o loop /tmp/isos/centos7.iso /media/centos7 sudo mount -o loop /tmp/isos/ubuntu1704.iso /media/ubuntu1704

Now, recursively copy all the contents from each iso in the correspondent directory

sudo rsync -artuv /media/ /var/www/vhosts/pxeboot/

Before moving on, you’d have to disable the default website due to lack of name resolver in our environment. This can be done with the command:

sudo a2dissite 000-default.conf sudo systemctl restart apache2.service

Installing and Configuring DHCP/TFTP server

Install the DHCP/TFTP server: sudo apt-get install dnsmasq

First, make sure you backup this file in case you need to review it later and, then, create a new blank configuration file:

mv /etc/dnsmasq.conf /etc/dnsmasq.conf.backup vim /etc/dnsmasq.conf

Copy and paste the following configuration:

interface=enxb827eb7c4aa2,lo #bind-interfaces

DHCP range-leases

dhcp-range= enxb827eb7c4aa2,,,,1h






dhcp-option=6,, server=

Broadcast Address


NTP Server

dhcp-option=42, pxe-prompt=“Press F8 for menu.”, 30 pxe-service=x86PC, “PXEBOOT from server:”, pxeboot enable-tftp tftp-root=/var/lib/tftpboot

For other advanced options concerning configuration file feel free to read dnsmasq manual.

Install SYSLINUX Bootloaders

Copy the syslinux-version-arch.rpm package from the document root directory to the ‘/tmp directory’. We’re going to get the files needed for successful PXE boot:


sudo cp /var/www/ /tmp You’d need to install the rpm2cpio package to extract the syslinux package:


sudo apt-get install rpm2cpio Now change to ‘/tmp’ directory and extract the syslinux package:

1 2

cd /tmp sudo rpm2cpio syslinux-4.05-12.el7.x86_64.rpm | cpio -idmv

My First Contribution to OpenStack project

OpenStack Logo

I been working since last year using Ansible for fun and to trying to get prepared to become a DevOps, so I found an excelent OpenStack project called ARA Records Ansible.

Ansible Logo Ansible Logo

Basically it is a project from the OpenStack community that makes it easier to understand and troubleshoot your Ansible roles and playbooks.
If you want more information, please refer to the Documentation Page.

Anyhow, I just found a little bug on the Ansible Role to install ARA ansible-role-ara on Debian based distros and just send the patch to fixit.

Here is the link to my contribution.

And, as I am proud of my first commit on a big project here is the screenshot too:

My First OpenStack Contribution

I feel happy and motivated to still learn about this Open Source project and a lot more.

Miércoles 14 de marzo de 2018

Emerson Posadas

Emerson Posadas
toxickore BLOG

s3 backend for terraform

Si al usar terraform piensan utilizar el s3 backend para sus terraform state files. Aquí les tengo un consejo: No utilicen una variable para especificar el bucket name en su backend description.

terraform {
    backend "s3" {
        bucket = "${var.s3bucket}"
        key    = "some/key/path/terraform.tfstate"
        region = "eu-central-1"

terraform {
    backend "s3" {
        bucket = "s3-backend-bucket"
        key    = "some/key/path/terraform.tfstate"
        region = "eu-central-1"

Se ahorrarán unos minutos de su vida intentando figurarse por que falla el provisionamiento.

Martes 13 de marzo de 2018

Héctor Daniel Cortés

Héctor Daniel Cortés
'Aztec Eagle' Turbo

Verificando los arreglos de discos

Aplicar la siguiente orden de vez en cuando:

for f in $(awk '/^md/ {print $1}' /proc/mdstat | shuf)
do echo check > /sys/block/$f/md/sync_action

Miércoles 07 de marzo de 2018

crear particion con parted

Por lo general siempre que he creado particiones las he creado con fdisk, pero bueno el fdisk ya no nos permite crear particiones tan grandes, otra por que en la chamba ya no quieren que usemos fdisk si no parted 😛 y a parte con formato gpt, ya no msdos para soporte de mbr 😛 bueno asi que veamos como crear una particion sencilla con parted


~]# parted -a optimal /dev/xvdc
GNU Parted 2.1
Using /dev/xvdc
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) help                                                             
  align-check TYPE N                        check partition N for TYPE(min|opt) alignment
  check NUMBER                             do a simple check on the file system
  cp [FROM-DEVICE] FROM-NUMBER TO-NUMBER   copy file system to another partition
  help [COMMAND]                           print general help, or help on COMMAND
  mklabel,mktable LABEL-TYPE               create a new disklabel (partition table)
  mkfs NUMBER FS-TYPE                      make a FS-TYPE file system on partition NUMBER
  mkpart PART-TYPE [FS-TYPE] START END     make a partition
  mkpartfs PART-TYPE FS-TYPE START END     make a partition with a file system
  move NUMBER START END                    move partition NUMBER
  name NUMBER NAME                         name partition NUMBER as NAME
  print [devices|free|list,all|NUMBER]     display the partition table, available devices, free space, all found partitions, or a particular
  quit                                     exit program
  rescue START END                         rescue a lost partition near START and END
  resize NUMBER START END                  resize partition NUMBER and its file system
  rm NUMBER                                delete partition NUMBER
  select DEVICE                            choose the device to edit
  set NUMBER FLAG STATE                    change the FLAG on partition NUMBER
  toggle [NUMBER [FLAG]]                   toggle the state of FLAG on partition NUMBER
  unit UNIT                                set the default unit to UNIT
  version                                  display the version number and copyright information of GNU Parted
(parted) mklabel gpt                                                      
(parted) print                                                            
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdc: 215GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start  End  Size  File system  Name  Flags

(parted) print free                                                       
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdc: 215GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End    Size   File system  Name  Flags
        17.4kB  215GB  215GB  Free Space

(parted) help unit
  unit UNIT                                set the default unit to UNIT

	UNIT is one of: s, B, kB, MB, GB, TB, compact, cyl, chs, %, kiB, MiB, GiB, TiB
(parted) unit GiB                                                         
(parted) print free
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdc: 200GiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start    End     Size    File system  Name  Flags
        0.00GiB  200GiB  200GiB  Free Space

(parted) mkpart primary 0 200                                             
(parted) name 1 u01                                                       
(parted) print                                                            
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdc: 200GiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start    End     Size    File system  Name  Flags
 1      0.00GiB  200GiB  200GiB               u01

(parted) quit                                                             
Information: You may need to update /etc/fstab.      

     ~]# mkfs.ext4 /dev/xvdc1
mke2fs 1.43-WIP (20-Jun-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
13107200 inodes, 52428288 blocks
2621414 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
1600 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done  

~]# vi /etc/fstab

Montamos la particion  y si le damos un df en este caso ya etara vible nuestra particion de /dev/xvdc1  

Lunes 05 de marzo de 2018

Deployment de un sitio estatico con Hugo y Git Hooks

1. Motivación

Estoy intentando escribir un poco más en mi blog, ya que noté que muchas veces no lo hacia muy a menudo por que al llegar a la consola de administración de Wordpress, habia que dar bastantes clicks para llegar al menu de “Posts”, además de que cada vez que entraba había un plugin diferente que actualizar, y verificar que nada se rompiera con las nuevas actualizaciónes, en pocas palabras hay que darle bastante mantenimiento a un sitio con Wordpress, y además de eso había que dedicarse a escribir el post.

Otra razón por lo que opté hacer el cambio de plataforma, es que al estar tratando de convertirme en DevOps, es necesario, desde mi punto de vista; tratar automatizar/scriptear la mayoria de tus tareas que realizas día a día, y con Hugo considero que se puede realizar este objetivo también.

1.1 Consideraciones

Una vez que decidí migrarme de Wordpress, el siguiente paso era decidir a que plataforma mudarme. De entrada la plataforma que queria probar era un Static Site Generator, aqui otro link de por que usar un Static Site Generator.

Partiendo de lo anterior, las opciones que me parecieron interesantes fueron:

Cada una de las opciones tiene diferentes caracteristicas, que no vamos a discutir en este post, sin embargo las carteristicas que me convencieron de usar Hugo por encima de las otras alternativas fueron:

  • Consta solamente de un binario, que comparado con las otras posibilidades hay que instalar todo un ambiente de desarrollo/producción.
  • Es bastante rápido.
  • Es Multi-plataforma
  • Tiene diversos temas

2. Instruciones

2.1 Consideraciones técnicas

El ambiente consta de: - 1 servidor productivo donde esta instalado hugo, git y un servidor web (apache o nginx) , haremos todos los deployments usando el usuario admin, ojo que no es el usuario root. - 1 servidor/equipo de desarrollo, de igual forma que cuenta con hugo y git, en mi caso, es mi computadora personal y mi usuario es luiscachog. - 1 cuenta de

2.2 Autenticación mediante llaves SSH

El primer paso es realizar el intercambio de llaves SSH entre el equipo de desarrollo y el equipo productivo. Para ello seguimos los siguientes pasos:

  1. Generar la llave SSH, tendrás que contestar algunas preguntas, entre las cuales está si quieres ponerle un password, a lo cual deberas dejarlo en blanco para que no te pida contraseña.
luiscachog@dev-server:~$ ssh-keygen
  1. Copiar la llave SSH hacia el equipo productivo:
luiscachog@dev-server:~$ ssh-copy-id admin@IP_servidor_productivo
  1. Verificar que te puedas conectar desde tu servidor de desarrollo, con tu usuario al servidor productivo, con el usuario que realizará los deployments.
luiscachog@dev-server:~$ ssh admin@ hostname

En este caso, debera de mostrarte el hostname del servidor productivo sin pedirte el password.

2.3 Configuración sitio con Hugo

El siguiente paso es configurar nuestro ambiente de desarrollo con Hugo y Git.

  1. Para instalar ambos en Ubuntu o derivados debes de ejecutar:

    luiscachog@dev-server:~$ sudo apt install hugo git

    Para tener la version más actualizada de hugo puedes seguir los pasos descritos en este link

  2. Vamos a crear un directorio de trabajo para nuestro sitio estatico

    luiscachog@dev-server:~$ mkdir ~/sites
    luiscachog@dev-server:~$ cd ~/sites
  3. Crearemos un nuevo sitio usando el comando hugo

    luiscachog@dev-server:~$ hugo new site
    Congratulations! Your new Hugo site is created in /home/luiscachog/sites/
    Just a few more steps and you're ready to go:
    1.- Download a theme into the same-named folder.
        Choose a theme from, or
        create your own with the "hugo new theme <THEMENAME>" command.
    2.- Perhaps you want to add some content. You can add single files
        with "hugo new <SECTIONNAME>/<FILENAME>.<FORMAT>".
    3.- Start the built-in live server via "hugo server".
    Visit for quickstart guide and full documentation.
  4. Cuando termine de correr el comando se podra apreciar los siguientes directorios y archivos

    luiscachog@dev-server:~$ cd
    luiscachog@dev-server:~$ ls
    archetypes  config.toml  content  data  layouts  static  themes
    luiscachog@dev-server:~$ tree 
    ├── archetypes
    │   └──
    ├── config.toml
    ├── content
    ├── data
    ├── layouts
    ├── static
    └── themes
    6 directories, 2 files
  5. El siguiente paso es agregar un tema, puedes encontrar uno que te guste en

    git init
    git submodule add themes/ananke
    # Edit your config.toml configuration file
    # and add the new theme.
    echo 'theme = "ananke"' >> config.toml

    Como recomandación adicional en este paso, puedes realizar un fork del tema que te guste en github para poder realizar modificaciones y proponer cambios al mismo, contribuyendo de esa forma a su desarrollo, para hacerlo, sigue los pasos:

    1. Realizar un fork del tema, sigue esta guia para hacerlo.
    2. Al realizar el fork, tendras en tus repositorios de github el tema que quieras, por lo que tendras que ejecutar los mismos comandos del punto anterior, pero el repositorio del tema apuntara a tu usario en github
    git init
    git submodule add themes/ananke
    # Edit your config.toml configuration file
    # and add the new theme.
    echo 'theme = "ananke"' >> config.toml
  6. Vamos a crear un post de prueba para verificar que todo esta funcionando correctamente

    hugo new posts/
    echo "Hola Mundo" >> content/posts/

    El comando anterior creara un archivo en la ruta content/posts/, y el contenido será:

    title: "My First Post"
    date: 2018-02-28T12:02:38-06:00
    draft: true
    Hola Mundo!!!
  7. Finalmente, probaremos que nuestro sitio estatico con nuestro post se muestren de manera local, en nuestro servidor de desarrollo. Cabe mencionar, que por defecto el comando ‘hugo server’ no mostrará los posts que tengan la opción ‘draft: true’, por ello se agrega la bandera -D

    luiscachog@dev-server:~$ hugo server -D

2.4 Configuración del repositorio Git en el servidor de desarrollo 1ra parte

En el paso pasado, realizamos la inicialización del repositorio dentro del directorio del sitio estatico:

luiscachog@dev-server:~$ pwd
luiscachog@dev-server:~$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   .gitmodules
    new file:   themes/ananke

Untracked files:
  (use "git add <file>..." to include in what will be committed)


Ahora, para tener el repositorio publico, tenemos que crear el repositorio en y configurarlo como un repositorio remoto

luiscachog@dev-server:~$ git add *
luiscachog@dev-server:~$ git commit -m "First commit"
luiscachog@dev-server:~$ git remote add origin
luiscachog@dev-server:~$ git push -u origin master

2.5 Configuración del repositorio Git en el servidor productivo

Para poder ocupar los hooks de git es necesario hacer una primera copia inicial del repositorio en el que vamos a trabajar, con la particularidad de que el repositorio clonado debe ser del tipo bare.

En nuestro servidor productivo haremos:

admin@prod-server:~$ mkdir sites
admin@prod-server:~$ cd sites
admin@prod-server:~$ git clone --bare

2.5.1 Configuración del hook

  1. Ya que tenemos nuestro repositorio tipo bare en el servidor productivo vamos a crear el script que mandará a llamar el hook de git.

    admin@prod-server:~$ cd sites/
    admin@prod-server:~$ vim post-update
  2. Y agregamos algo asi:

    set -e
    rsync -aqz $PUBLIC_WWW/ $BACKUP_WWW
    trap "echo 'A problem occurred.  Reverting to backup.'; rsync -aqz --del $BACKUP_WWW/ $PUBLIC_WWW; rm -rf $WORKING_DIRECTORY" EXIT
    mkdir -p $WORKING_DIRECTORY/themes
    rm -rf $PUBLIC_WWW/*
    /home/admin/bin/hugo -v -s $WORKING_DIRECTORY -d $PUBLIC_WWW -b "http://${MY_DOMAIN}"
    trap - EXIT
  3. Damos permisos de ejecución al script

    admin@prod-server:~$ chmod +x post-update
  4. Probamos que nuestro script funcione adecuadamente:

    admin@prod-server:~$ ~/sites/
    Cloning into '/var/www/vhosts/'...
    0 draft content
    0 future content 
    4 pages created
    0 paginator pages created
    0 tags created
    1 categories created
    in 26 ms
  5. Podras verificar tu nuevo post en la URL de su sitio:


2.6 Configuración del repositorio Git en el servidor de desarrollo 2da parte

Una vez tenemos configurado nuestro repositorio en el servidor de producción, procedemos a agregarlo como repositorio remoto en nuestro servidor de desarrollo

luiscachog@dev-server:~$ cd /home/luiscachog/sites/
luiscachog@dev-server:~$ git remote add prod
luiscachog@dev-server:~$ git ls-remote prod
d1b0b73528ab3117170ef74e133d0194dd2bc88a    HEAD
d1b0b73528ab3117170ef74e133d0194dd2bc88a    refs/heads/master

Puedes verificar los repositorios remotos con el comando:

luiscachog@dev-server:~$ git remote -v
origin (fetch)
origin (push)
prod (fetch)
prod (push)

Ahora cada vez que realizemos un push hacia el remote llamado ‘prod’ se llamara la función del hook.

luiscachog@dev-server:~$ cd /home/luiscachog/sites/
luiscachog@dev-server:~$ hugo new posts/
luiscachog@dev-server:~$ echo "Deployment Test" >> content/posts/
luiscachog@dev-server:~$ git add *
luiscachog@dev-server:~$ git commit -m 'Deployment test with git hooks'

Este es el comando que hace la magia:

luiscachog@dev-server:~$ git push prod master
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 310 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Cloning into '/var/www/vhosts/'...
remote: done.
remote: Cloning into '/var/www/vhosts/'...
remote: INFO 2018/03/01 03:12:34 Using config file: /var/www/vhosts/
remote: Building sites … INFO 2018/03/01 03:12:34 syncing static files to /var/www/vhosts/
remote:                    | EN  
remote: +------------------+----+
remote:   Pages            | 10
remote:   Paginator pages  |  0  
remote:   Non-page files   |  0  
remote:   Static files     |  3  
remote:   Processed images |  0  
remote:   Aliases          |  1  
remote:   Sitemaps         |  1  
remote:   Cleaned          |  0  
remote: Total in 44 ms
   d5b0671..cvc4dee  master -> master

Listo ya podemos probar nuestro sitio

Con esto el siguiente paso que realizare es hacer el deployment de mi servidor para el blog usando Ansible.

Nos Vemos!!!

Sources: Digital Ocean

Sábado 03 de marzo de 2018

Conectarse remotamente usando llaves publicas y privadas




ssh un protocolo de comunicación que encontramos en la capa de aplicación del protocolo de comunicación TCP/IP, ssh nos sirve para establecer conexiones de manera remota y de manera segura entre servidores.

Por lo general cuando usamos ssh siempre a la hora de hacer la conexión del lado del servidor nos preguntara un usuario y un passwd. Así mismo cuando tenemos muchos servidores pues es algo engorroso tener un montón de passwds. en otras ocaciones las políticas de passwd son algo complejas de equis número de caracteres, números, caracteres especiales, mayusculas y minúsculas.


Una imagen para medio explicar como funciona el protocolo de comunicación de SSH



No se ustedes pero en lo personal no me aprenderia tantisimas contraseñas.

entonces lo que podemos hacer es generar nuestra llave y subirla a los servidores a donde necesitamos ingresar y ya sea que usemos una llave con alguna frase mas sencilla o dejarla sin frase.

Hacemos lo siguiente si mi usuarios es xanatos y quiero ingresar a mi maquina vmclase001 sin tener que usar passwd haremos lo siguiente.


ssh-keygen -t rsa -b 4096 -C ""
Generating public/private rsa key pair.
Enter file in which to save the key (/home/xanatos/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/xanatos/.ssh/id_rsa.
Your public key has been saved in /home/xanatos/.ssh/
The key fingerprint is:
The key's randomart image is:
+---[RSA 4096]----+
|                 |
|     .. o        |
|  . o+.= E       |
| . .+oX .        |
|. ++.X.+S        |
|. o*=o=+         |
|.ooo..o..        |
|+o+ *o.          |
|.=BO.+o.         |

como podemos ver ejecutamos el ssh-keygen se genera nuestra llave publica y privada dentro de nuestro home directory y en el subdirectorio .ssh y genera mis archivo id_rsa e

Copiamos nuestra llave pulica al server al archivo authorized_keys

en el server si no existe el archivo lo creamos

touch authorized_keys
vi authorized_keys

$ cat authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqF4X5322/2MbloaZAIKXLvfqz7ZxSJYmdYlXluNZqZvPZ7W4qF78/kL7n+N2EUrGR1oPkd0kJaAZuQvJyPiYO2L+GaraS5IRJoWbqbM1yAP0htAhsuSx1Gj+DBe2H8IcANGQ9aG9nmlouykAWcut2bEPdvglOI2hjPi71OJvJbh10AXL4leaBuJbFOkxSqwoH15RAo6kPgcZhhyNkhKcS0qv0FPQ9F46LLuQuAcBfZCOzTYjlfMt418GQaL61LjGIK48l3Tl7Yo1RwJMRZrwWJUvmNsDXmovmkhfcbVVJGXsVR21X22AVq+8l1F9yXUUAKNeqT3BLTrThlGZc0PiLANaqYm60m/okDdy+UT8NCYxy6TCggQxpIsOuQaPfQfWEzNDBf7+dTL9VudECcHyPAHdXEOMnBvRXI/Vk9IKng3j7fILtDsfkkSp8Hd1z50ascpmam7fgInghz1RY/YmhPPqsIUiWkvHM24+o08pbiyrL6BjGldcuBAyRsFzuB573+vldp9i9LQxPjK5FuIUN2bc12w6TatS/VUkMDPyjcFPzENvccdB9aQ3odSw1QLPcIqyGw5S/azE6Ay4kwak6hblBzT1ztIKiI9v873f0CjOmOjYzT4DkBZOmbc7sld5XMmeNdFOP/kbcDj+ggCyEOBx7tPixD81Qia6AWm7FjQ==

Ahora ya subimos nuestra llave y en teoría ya podemos entrar al server sin necesitad de una centraseña!


~$ ssh
The authenticity of host ' (' can't be established.
ECDSA key fingerprint is SHA256:igQgIOtrN74YqwH+uCQONWfTwyCItXgXspFUBaVY8PI.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ',' (ECDSA) to the list of known hosts.'s password:

Nos damos cuenta que nos sigue pidiendo passwd, necesitaremos revisar los permisos y tenemos que tener los archivos con los siguientes permisos


~/.ssh$ ls -ltr
total 16
-rw-r--r-- 1 xanatos xanatos  750 mar  3 11:14
-rw------- 1 xanatos xanatos 3243 mar  3 11:14 id_rsa
-rw------- 1 xanatos xanatos  750 mar  3 11:21 authorized_keys
-rw-r--r-- 1 xanatos xanatos  444 mar  3 11:25 known_hosts


Volvemos a intentar y ahora si podemos entrar sin necesidad de poner una contraseña y solo co nuestra llave.

:~/.ssh$ cd
xanatos@vmclase001:~$ ssh
Last login: Sat Mar  3 17:32:13 2018 from
[xanatos@vmX ~]$


Ahora si ya existe el usuario y tenemos el acceso a las llaves usaremos nuestra llave privada para poder acceder al usuario

aquí tenemos las llaves del usuario clasex1 y haremos lo siguiente

xanatos@vmclase001:~$ ls -ltr |grep id
drwxr-xr-x 2 xanatos xanatos 4096 feb 21 21:28 Videos
-rw------- 1 xanatos xanatos 3243 mar  3 08:34 id_rsa_clasex1
-rw------- 1 xanatos xanatos  744 mar  3 08:34

xanatos@vmclase001:~$ ssh -i id_rsa_clasex1
Last login: Sat Mar  3 16:44:09 2018 from
[clasex1@vmX ~]$


Ahora solo usamos nuestra llave privada que fue con anterioridad compartida para con nosotros. :p

Martes 27 de febrero de 2018

Alex Callejas

Alex Callejas

#SysArmyMX Challenge

Talk is cheap. Show me the code | Hablar es fácil. Enséñame el código

Linus Torvalds


El pasado 12 de febrero tuvimos MeetArmy donde realizamos una dinámica diferente: #SysArmyMx Challenge

El reto consistía en modificar el nombre de unos archivos, que en la parte central tenía un timestamp, adelantando un segundo ese registro de tiempo, resguardando los archivos originales y el formato proporcionado.

Los premios para este reto fueron:

1er lugar: Poster del código fuente 0.01 del kernel de Linux

2o lugar: Playera de SysArmy

Participantes: Stickers oficiales de SysArmy

Les comparto la presentación del reto, así como los scripts ganadores:

1er lugar: – script en Python por Alex

2o lugar: – script en Bash por Neto

Además de mi solución para el reto: sysarmy_challenge.shBash One-Liner

Galería de fotos del evento:

Si están interesados en participar de estos Meetup’s y aún no se han unido a la comunidad, denle clic a la imagen:

Espero les sirva… 🙂

Nota: Pueden checar el antecedente de este problema en una publicación anterior.

Jueves 22 de febrero de 2018

Robotips Mi Alegría

En entrada anteriores escribí mis alegrías y desencuentros con los juegos de róbotica y energía solar de Mi Alegría, casi un año después en su canal de youtube se publico este video y yo casi una año después lo pongo acá con todo y que lo vi como a mitad del año pasado, en todo caso más vale tarde que nunca, en el mismo se incluyen algunos consejos que escribí en su momento y que permiten evitar los problemas con los que me encontré y seguro otros más que ni se me ocurrieron, en todo caso lo pego acá porque son buenos y veo que tienen nuevos modelos.

Hoy estando disponible Arduino por un bajo precio y otras cosas a veces creo que los kits de Mi Alegría podrían incluir uno o varios para utilizar el mismo… no creo que subiese demasiado el costo, pero si requeriría de un manual bastante mas extenso… en todo caso el kit de electronica ecológica sigue siendo mi favorito.

Lunes 12 de febrero de 2018

Rusia y la red TOR

Rusia no es conocida como un lugar muy democrático, la mayoría conocerá la red TOR [1][2] y al menos sabrá que de quienes han propuesto el colocar nodos de salida en casa en México ha sido Gunnar Wolf [3][4], bueno en Rusia varios operadores de nodos de salida han sido arrestados [5] el ultimo caso el de Dmitry Klepikov del que ni siquiera hay noticias que estén en ingles o español, mayormente la información todavía en ruso no ha permeado este lado del mundo y sera interesante el difundir[6][7] ya que en el caso del operador anterior también Dmitry Bogatov fue acusado por contenido que se genero y fue rastreado a su salida de TOR, pero que no fue generado por él que es de lo que se le acusó, ahora el caso más nuevo es un tanto más interesante ya que Klepikov además de ser operador de TOR esta registrado como observador electoral, lo cual se antoja como una coincidencia demasiado grande.


Jueves 08 de febrero de 2018

Se vende Maleta para Laptop

5.11 Tactical Side Trip Briefcase Especialmente diseñada para negocios y oficina, hasta 32 litros de almacenamiento, compartimentos para libretas, papeles, laptops de hasta 17 pulgadas, bolsas laterales de 1 litro de capacidad y además meter ropa. Hecha de Nylon texturizado 1000D, cuenta con funda impermeable y varios compartimentos secretos. Tiene 1 año promedio de uso, sin ningún desperfecto ni desgaste. Forma de Conseguirla Me pueden contactar por los medios habituales, con los siguientes precios:

Viernes 02 de febrero de 2018

Itzcoalt Alvarez Moreno

Itzcoalt Alvarez Moreno
Itzcoalt (itz) Álvarez

Stop loss en Bitso


Bitso es un portal que permite la compra de algunas monedas virtuales mediante la transferencia de pesos.


Adicionalmente, permite realizar transacciones de compra/venta de estas monedas, el portal funciona bien, sin embargo, solo permite colocar ordenes de compra o venta de manera fija.


En el mercado existe un concepto llamado STOP LOSS, el cual implica que cuando el valor del activo en el cual se invirtió, llega a un limite inferior previamente definido, se coloque una orden de compra.


Esta operación permite detener las perdidas (he ahí la relación del nombre) de una manera ordenada y con un riesgo calculado.


Bitso no ofrece la posibilidad de programar ordenes de tipo STOP LOSS, las cuales son muy útiles.


En un tiempo de ocio, desarrolle una pequeña aplicación de consola que permite realizar esta programación de ordenes.


Su uso es muy sencillo, solo es necesario definir los siguientes parámetros:

  • Libro sobre el cual se realiza la operación
  • Precio de compra de la orden
  • Porcentaje de perdida aceptable
  • Monto en la moneda virtual a vender
  • Tiempo en segundos para consultar la cotización de la moneda a verificar.


Ahora bien, como funciona:


Con el precio de compra y el porcentaje de perdida aceptable se calcula el precio que la moneda debe tener para realizar la orden de venta, de tal forma, cuando la cotización en tiempo real de la moneda esta por debajo de este valor, se crea una orden de venta por el monto definido, al último valor cotizado.


Aun así, es posible que la venta no logre concretarse, por lo que también es capaz de esperar un tiempo definido en minutos y verificar si la orden ya fue cerrada o sigue abierta, en caso de seguir abierta, se eliminará y se creará una orden a precio de mercado.


Esa herramienta permite ayudar en la definición de las estrategias de inversión y evitar el estar al tanto del valor del activo constantemente.


Mayor información, visite la página de bitsoStopLoss.


Viernes 26 de enero de 2018

Fco. de la Torre Inguanzo

Fco. de la Torre Inguanzo
Linux y Software Libre – LinuxmanR4

Mejorar el tiempo de arranque de Manjaro

LinuxmanR4 - Historias sobre Linux, Manjaro, Elastix, software libre, afeitado y barbas clásicas.

Ayer estaba leyendo esta nota en la Mirada del Replicante: Canonical quiere que Ubuntu arranque más rápido ¡Y yo también!, pero existe el problema de que yo no utilizo Ubuntu desde hace varios años. En su lugar tengo instalado Manjaro como mi distro linuxera de cabecera para mis equipos de uso personal.

No es que mi equipo arranque lento, generalmente enciendo el equipo, me voy a preparar un café y cuando llego ya esta la pantalla que me pide iniciar sesión. Unos minutos después ya estoy listo para empezar a trabajar.

De hecho vino a mi memoria un momento en el que Ubuntu arrancaba endemoniadamente rápido, pero no era con systemd así que ese dato no me era útil.

updatedb y man-db.

Investigando di con otro artículo de La mirada del replicante: Analizar el tiempo de arranque de tu sistema con systemd-analize . Ahí fue donde conocí el comando systemd-analyze.

Al ejecutar el comando systemd-analyze blame en la terminal me di cuenta de dos procesos que en conjunto ocupaban ¡más de 5 minutos del arranque!.

Estos son los culpables:

  • updatedb.service
  • man-db.service

El servicio updatedb se encarga actualizar una base de datos que sirve para localizar archivos (es parte del paquete mlocate).

man-db se utiliza para inicializar o actualizar las cachés de la base de datos que normalmente son mantenidas por man (que muestra las ayudas de los comandos de la terminal).

Updatedb le agregaba en mi caso más de 4 minutos al proceso de arranque, man-db sólo 1, pero comparado con los demás procesos que se inician durante el arranque que duran segundos simplemente era demasiado.

Tuneando systemd.

Me di cuenta que no era el único con este problema. Después de buscar un poco en Google di con una solución sencilla que fue indicarle a systemd que ejecutara esos servicios a cierta hora o mucho después de iniciado el proceso de arranque.

Para eso es necesario crear estos archivos.

Nota: Las carpetas man-db.timer.d y updatedb.timer.d no existen hay que crearlos desde la terminal.

# /etc/systemd/system/man-db.timer.d/man-db.timer.conf

# /etc/systemd/system/updatedb.timer.d/updatedb.timer.conf


Claro que estos valores son ajustables. De esta forma logré disminuir mi tiempo de arranque a tan solo 1 minuto y medio, que no esta nada mal cuando se requiere un arranque veloz.

Espero que este artículo les sea de utilidad.

Enlaces de interés.

Mejorar el tiempo de arranque de Manjaro

Lunes 15 de enero de 2018

Cristian Trujillo

Filtrado de contenido

El internet es parte inherente del negocio. Ahora se dice que el negocio es internet.

Es decir, todo lo relacionando con el negocio esta ligado a las redes. Con ello llegaron muchos aspectos en seguridad. Uno de ellos es lo que pueden navegar los usuarios dentro de la empresa.

Los usuarios al interior de la empresa pueden tener la sensación de estar en el anonimato, dentro de una mampara, cubículo u oficina.

Unas de las justificaciones para tener filtrado de contenido  es la productividad.

Los usuarios pueden llegar a perder demasiado tiempo en paginas que no estan relacionadas con el negocio. Incluso pueden estar descargando pirateria. Que pudiera llegar a comprometer directamente a la empresa.

Aunado a que usuarios que si requieren ancho de banda lo vean disminuido por usuario que lo consumen en ocio.

Las soluciones van desde lo mas laborioso hasta lo mas industrual.

Ediitar el archivo de hosts, los sistemas operativos pueden ser enga;anados al medifical la tabla de DNS local. Haciendo una relacion falsa entre un dominio poco productivo hacia alguna direccion interna o cualquier otra.

Instalando un antivirus. Algunos de estos productos ya cuentan con filtrado de contenido administrado con contrase;a para evitar que el usuario tenga acceso a modificar.

Instalando un servidor proxy. Queda en el punto intermedio entre la red de los usuarios y la nube de internet. Es la solucion mas ampliamente utilizada. Se puede administrar de forma centralizada.

Instalando hardware especializado.

Integrando servicios de la nube.

Jueves 11 de enero de 2018

Fco. de la Torre Inguanzo

Fco. de la Torre Inguanzo
Linux y Software Libre – LinuxmanR4

Convertir imágenes de formato HEIC a JPG con Linux

LinuxmanR4 - Historias sobre Linux, Manjaro, Elastix, software libre, afeitado y barbas clásicas.

Hace unos días tuve un problema muy interesante. Les cuento, ustedes saben que buena parte del negocio de Apple es aumentar el tamaño del espacio de almacenamiento rentado en iCloud.

Me parece que de inicio dan 5 GB que es claramente insuficiente y se llena con mucha facilidad. Es por eso que muchas personas optan por comprar un plan de almacenamiento que varía un poco de país en país.

Planes de almacenamiento de iCloudPrecios a Enero del 2018.

Un compañero llegó a mi por una advertencia de que su espacio en iCloud ya estaba lleno. Le expliqué que si quería almacenar sus fotos en iCloud tendría que pagar a menos que …

Google Fotos

Se que existe una versión de Google Fotos para iOS, solo se necesita una cuenta de Google para que empiece a almacenar las fotos que se toman en el iPhone o en el iPad y se sincronizan automáticamente.

Tengo entendido que el espacio es ilimitado si se guardan en formato de alta calidad, pero no muy alta calidad (estos aparatos nuevos abusan).

Mi compañero me dijo que no importaba, solo quería tener un respaldo de sus fotos por si algún dispositivo se pierde o descompone.

Y funcionó muy bien !!! De inmediato las fotos se empezaron a subir a la nube de Google, lo mejor es que también tiene acceso mediante el sitio web así que todo era miel sobre hojuelas hasta que un día …

HEIC ¿Qué demonios es eso?

Un buen día quiso descargar un álbum de imágenes selectas y ¡Oh sorpresa! nos dimos cuenta de que los archivos tenían una extensión extraña, todos las imágenes tenían la extensión .heic .

Pues resulta que HEIC (High Efficiency Image File Format) es el nuevo formato que utilizan los dispositivos Apple, creo que a partir de iOS 11. Y por lo visto todavía no es muy conocido y algunos no están muy contentos con “la novedad” (léase HEIC file format is Unwelcomed!).

Google Fotos no tiene problemas para mostrar los archivos, pero al descargarlos lo hace en su formato original y actualmente no es muy conocido. Ninguno de mis programas para visualizar imágenes en Linux lo reconocía ¡Ni siquiera GIMP! y eso amigos, eso si que es un problema.

Intenté un cambio de formato con ImageMagick pero tampoco. Así que era tiempo de buscar opciones.


Afortunadamente me encontré en GitHub con un programa muy verde pero que en mi caso funcionó muy bien llamado tifig.

Tuve que instalarlo a mano, porque todavía no existe un paquete en AUR para este programa. Hay un repositorio para Ubuntu, pero en mi caso tuve que instalar algunos programas dependientes.

En la misma página del proyecto se ofrecen las distintas opciones de instalación.

De HEIC a JPG por montones

Una vez instalado tifig todo es más sencillo.

Forma de uso:

Converts iOS 11 HEIC images to practical formats
  tifig [OPTION...] input_file [output_file]

  -i, --input arg            Input HEIF image
  -o, --output arg           Output image path
  -q, --quality [=arg(=90)]  Output JPEG quality (default: 90)
  -v, --verbose              Verbose output
  -w, --width arg            Width of output image
  -h, --height arg           Height of output image
  -c, --crop                 Smartcrop image to fit given size
  -p, --parallel             Decode tiles in parallel
  -t, --thumbnail            Use embedded thumbnail
      --version              Show tifig version 

Sin embargo, ejecutar un comando por cada archivo es tardado y tedioso. Al principio pensé en alguna solución con Bash, pero luego apareció parallel como una alternativa más eficiente.

Por ejemplo, esta instrucción convierte todos los archivos .heic del directorio actual a jpg y además los redimensiona a 1200 pixeles de ancho.

parallel -j 3 --eta tifig -w 1200 '{}' '{.}.jpg' ::: *.heic

A parallel le indiqué que utilizara 3 núcleos del microprocesador con -j 3 (tengo un microprocesador de 4 núcleos) y que me mostrara un tiempo aproximado de finalización con –eta.

De este modo la conversión es mucho más veloz.

La solución web

Existe una página que ofrece la conversión de heic a jpg que se llama que hace un excelente trabajo.

HeictojpgHeic to JPG para trabajos pequeños.

El único problema es que esta limitado a 50 imágenes por lote.

Supongo que con el tiempo el formato heic se agregará a los formatos soportados por los principales programas de edición gráfica. Pero por el momento esto es lo que hay.

¡Felices conversiones!.

Imagen destacada de Medhat Dawoud en Unsplash

Convertir imágenes de formato HEIC a JPG con Linux

Miércoles 03 de enero de 2018

Se vende Maleta para Laptop

5.11 Tactical Side Trip Briefcase Especialmente diseñada para negocios y oficina, hasta 32 litros de almacenamiento, compartimentos para libretas, papeles, laptops de hasta 17 pulgadas, bolsas laterales de 1 litro de capacidad y además meter ropa. Hecha de Nylon texturizado 1000D, cuenta con funda impermeable y varios compartimentos secretos. Tiene 1 año promedio de uso, sin ningún desperfecto ni desgaste. Forma de Conseguirla Me pueden contactar por los medios habituales, con los siguientes precios:

Domingo 03 de diciembre de 2017

Se vende Maleta para Laptop

5.11 Tactical Side Trip Briefcase Especialmente diseñada para negocios y oficina, hasta 32 litros de almacenamiento, compartimentos para libretas, papeles, laptops de hasta 17 pulgadas, bolsas laterales de 1 litro de capacidad y además meter ropa. Hecha de Nylon texturizado 1000D, cuenta con funda impermeable y varios compartimentos secretos. Tiene 1 año promedio de uso, sin ningún desperfecto ni desgaste. Forma de Conseguirla Me pueden contactar por los medios habituales, con los siguientes precios:

Viernes 01 de diciembre de 2017

Héctor Daniel Cortés

Héctor Daniel Cortés
'Aztec Eagle' Turbo

Rumbo al Mundial 2018

Cada Mundial de futbol nos quejamos del sorteo y los equipos que nos tocaron. Ob-vi-o. Acostumbrados a la mediocridad de la CONCACAF...

Pero ¿realmente nos tocó un grupo difícil? Veamos los grupos acompañados del raking mundial de la FIFA . Frente a cada grupo un par ordenado con el promedio del ranking y la desviación estándar del grupo correspondiente.

Grupo C: (17.75,14.22)
[9] Francia
[11] Perú
[12] Dinamarca
[39] Australia

Grupo E: (18.25,16,13)
[2] Brasil
[8] Suiza
[26] Costa Rica
[37] Serbia

Grupo B: (20.25,18.52)
[3] Portugal
[6] España
[32] Irán
[40] Marruecos

Grupo D: (23.25,19.38)[4] Argentina
[17] Croacia
[22] Islandia
[50] Nigeria

Grupo F: (23.5,24.85)
[1] Alemania
[16] México
[18] Suecia
[59] Korea

Grupo H: (24.5,21.38)
[7] Polonia
[13] Colombia
[23] Senegal
[55] Japón

Grupo G: (25.75,22.08)
[5] Bélgica
[15] Inglaterra
[27] Túnez
[56] Panamá

Grupo A: (45,22.33)
[21] Uruguay
[31] Egipto
[63] Arabia Saudí
[65] Rusia 

Podemos suponer que los grupos con promedios más altos, y menor desviación son los grupos más difíciles. Por el contrario, los grupos con promedios más bajos y mayor desviación serían los más fáciles.

Si además consideramos que la casa siempre tiene ventaja, no es de extrañar que Rusia se encuentre en el grupo más fácil: el grupo A. Junto con Uruguay podrían pasar a la siguiente ronda.

El grupo C sería el más difćil: cualquiera de los tres, Francia, Perú y Dinamarca podría pasar a la siguente ronda.

Los grupos E, B y G comparten una distribución de rankings parecida: los dos primeros son mucho más fuertes que los demás, así que podríamos esperar por parte del grupo E a Brasil y Suiza, por el grupo B a Portugal y España, y por el grupo G a Bélgica e Inglaterra.

Por último, en los grupos F, D y H, se podría esperar en la segunda vuelta al equipo con el mejor ranking: Alemania, Argentina y Polonia respectivamente, dejando a dos equipos pelear por el segundo puesto: entre México y Suecia, Croacia e Islandia, y Colombia con Senegal.

En cuanto al quinto partido de la Selección Nacional Mexicana, por el momento mejor ni hablamos.

Sábado 25 de noviembre de 2017

Excel 2013, convertir mes en texto a numero

Si tienes un mes en formato ENERO este lo cambiara a 02, funciona en la versión de Excel 2013, solo se tienen que reemplazar J2 por la celda que contenga el mes en formato de texto, espero que le sea de ayuda a alguien.


Miércoles 22 de noviembre de 2017

Mover ‘logical volume’ de un disco a otro con pvmove en línea

Hace meses decidi eliminar completamente Windows de mi laptop de trabajo, despues de eliminar Windows y sus particiones tuve ganas de probar ZFS, por lo que tuve la necesidad de reacomodar datos en el disco pero no queria reinstalar y como afortunadamente siempre uso Volume Groups pues decidi mover algunos LV aka Logical Volume, el procedimiento que voy a realizar solo voy a mover datos dentro de un mismo disco a diferente particion, pero sirve para mover datos entre discos.

Layout de Particiones actual

  • /dev/sda1 -> 40MB (diag)
  • /dev/sda2 -> 16GB (Recovery)
  • /dev/sda3 -> 100GB (NTFS Windows c:\)
  • /dev/sda4 -> 350GB (Particion Extendida)
    • /dev/sda5 -> 150GB (el Volume Group vg_DragonBorn, con 4 LV)
    • /dev/sda6 -> 200GB (NTFS Windows d:\)

El Volume Group esta distribuido de la siguiente forma

  • lv_root -> 37GB para /
  • lv_swap -> 10GB para SWAP
  • lv_home -> 50GB para /home
  • lv_opt -> 50GB para /opt


La idea es que la particion /dev/sda3 contenga el volume group, eliminar la particion extendida /dev/sda4 y crear una particion para ZFS y ahi poner /opt

Primeros Pasos

Despues de eliminar las particiones windows asi se veian en gparted

Estado actual de particionesEstado actual de particiones

Procedemos a crear una particón, en la primer sección de sin asignar

Crear nueva particiónCrear nueva partición

Seleccionamos tipo lvm2 en sistema de archivos y le damos a añadir

Seleccionamos tipo lvm


Despues damos en aplicar cambios en gparted

aplicar cambios

con lo anterior se ha cread /dev/sda3 por lo que procedemos a cerrar gparted y abrir una consola y primero inicializamos la partición /dev/sda3 para el uso con LVM.

Incializacion de particion o disco

Si tu deseas mover de disco y no de particion como es mi caso, reemplazar /dev/sda3 por tu nuevo disco, si es el disco completo no requiere una particion podrias incializar por completo el disco

sudo pvcreate /dev/sda3

pvcreate /dev/sda3

Extendemos el volume group con la nueva particion inicializada

sudo vgextend vg_DragonBorn /dev/sda3

vgextend vg_DragonBorn /dev/sda3

Mover los datos con pvmove

Mi primer logical volume a mover es lv_swap,

sudo pvmove -v (verbose) -n (nombre de logical volume) /disco/fuente /disco/destino

sudo pvmove -v -n lv_swap /dev/sda5 /dev/sda3

Despues de unos minutos u horas dependiendo del tamaño del logical volume o de los discos a mover, veremos una pantalla simliar

pvmove success

Hacer esto por los volumenes logicos que se quieran migrar


Viernes 10 de noviembre de 2017

José Oviedo

José Oviedo

Certificados SSL Gratis con Let’s Encrypt

Let’s Encrypt es un esfuerzo, impulsado por la Fundación Linux, para crear una entidad certificadora que ofrezca certificados SSL abiertos, libres, gratuitos y automáticos.

Para instalar Let’s Encrypt en nuestra distribución Ubuntu/Debian ejecutamos lo siguiente:

apt install letsencrypt
apt install python-letsencrypt-apache

Y después para iniciar la configuración de nuestros dominios ponemos:

letsencrypt –apache –redirect -d DOMINIO.COM

Y listo!!.., con eso tenemos redireccionamiento desde HTTP > HTTPS y el HTTPS configurado correctamente.

Lo único es que el certificado no dura 1 año, pero para renovarlo ejecutar este comando:

letsencrypt renew

Pueden ponerlo en el CRON y listo otra vez

Sí su distribución no cuenta con el programa letsencrypt pueden utilizar otro llamado certbot, las instrucciones son las mismas:

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get install python-certbot-apache
sudo certbot –apache -d DOMINIO.COM


Fco. de la Torre Inguanzo

Fco. de la Torre Inguanzo
Linux y Software Libre – LinuxmanR4

Impresora compartida con samba pide usuario y contraseña

LinuxmanR4 - Historias sobre Linux, Manjaro, Elastix, software libre, afeitado y barbas clásicas.

A lo mejor el título de este artículo no es muy claro. Voy a intentar explicar la situación. Generalmente mando mis trabajos de impresión a la impresora compartida de un equipo que utiliza Windows 7. Usualmente no había tenido problemas hasta después de la última actualización de Manjaro en la que para mandar imprimir me pide un nombre de usuario y una contraseña.

Al principio creí que era la contraseña de root, pero luego me la volvía a pedir. Intenté con mi usuario de linux y tampoco. Lo único que funcionó era el nombre de usuario y contraseña de la computadora con Windows. Bueno ya era un avance.

En ocasiones anteriores este tipo de problemas se arreglaban solos o bastaba con dar de alta nuevamente la impresora para que desaparecieran pero ese no fue el caso.

Durante más de una semana me acostumbré a teclear el usuario y la contraseña. Funcionaba pero era poco práctico, ya era hora de buscar una solución.

Configuración de impresión.

Manjaro tiene un programa que se llama Configuración de impresión que es donde administro las impresoras que tengo dadas de alta en mi sistema. Supuse que la solución era un poco obvia, decirle a mi Manjaro que almacenara el nombre de usuario y contraseña en lugar de teclearlo cada vez que quería imprimir.

Cambiar el URI del dispositivoNo almacena el usuario y la contraseña.

Incluso existe un espacio en donde se puede especificar un usuario y contraseña en donde dice Autenticación, lamentablemente después de varios intentos me di cuenta de que no guarda esa información y en la siguiente impresión la vuelve a pedir. Así que era necesario probar otro enfoque.

Mediante la página de CUPS.

Para entrar a la página de CUPS solo hay que visitar http://localhost:631/ , luego el menú AdministraciónAdministrar Impresoras .. MantenimientoModificar Impresora (o ya de plano dar de alta una nueva impresora).  Seleccionar la opción que dice: Windows Printer via SAMBA y en ese lugar se le puede especificar el usuario y contraseña de la conexión a la impresora.

Modificar impresora en CUPSAquí es donde va a guardar la información de la conexión.

La conexión quedaría más o menos así:


Me pasó que el nombre de usuario de la computadora con Windows incluía un espacio, en ese caso, se agrega un %20 en el lugar donde va el espacio, algo más o menos así:


Lo que sigue es guardar los cambios, hacer algunas pruebas y si todo salio bien, ya no pedirá el usuario y la contraseña. Bueno, hasta la próxima actualización de Manjaro.

Espero que este consejo les sea de utilidad. ¡Hasta la próxima!.



Impresora compartida con samba pide usuario y contraseña

Viernes 03 de noviembre de 2017

Jonathan Hernández

Jonathan Hernández



Jueves 28 de septiembre de 2017

Héctor Daniel Cortés

Héctor Daniel Cortés
'Aztec Eagle' Turbo

Héctor y el secreto de la felicidad

Ayer ví una película de Simon Pegg titulada Héctor y el secreto de la felicidad.

Debo decir que me gustó.

«Un psiquiatra busca en el mundo para encontrar el secreto de la felicidad»

Aunque no voy a platicar la película, sí voy a mencionar las quince notas en el cuaderno de Héctor, así que, estimados lectores (¿todavía queda alguno por aquí?), están advertidos.

  1. Hacer comparaciones puede estropear tu felicidad.
  2. Mucha gente piensa que la felicidad es ser rico o importante.
  3. Muchas personas ven la felicidad sólo en su futuro.
  4. La felicidad podría ser la libertad de amar a más de una mujer al mismo tiempo.
  5. A veces la felicidad es no saber toda la historia.
  6. Evitar la infelicidad no es el camino hacia la felicidad.
  7. ¿La persona con la que te encuentras te trae predominantemente A): Arriba o B): Abajo?
  8. La felicidad es responder a tu vocación.
  9. La felicidad es ser amado por ser quien eres.
  10. Sweet Potato Stew!
  11. El miedo es un impedimento para la felicidad.
  12. La felicidad es sentirse completamente vivo. 
  13. La felicidad es saber celebrar.
  14. Escuchar es amar.
  15. La nostalgia no es lo que solía ser.
Y aunque no lo escribe en el cuaderno, termina diciendo «Todos tenemos la obligación de ser felices».

Ver en NetFlix

Domingo 24 de septiembre de 2017

Itzcoalt Alvarez Moreno

Itzcoalt Alvarez Moreno
Itzcoalt (itz) Álvarez

Terremoto 19S17


Soy una persona afortunada, muy afortunada, no solo estoy vivo, si no que todas las personas a las que amo también lo están, tengo un techo donde dormir, y acceso a todos los servicios.
Sobreviví al terremoto del 19 de septiembre de 1985, cuando apenas contaba con 12 años, en su momento no alcance a visualizar el tamaño real del desastre que se provocó, sin embargo, por mucho tiempo no hubo escuela, no había agua, y teníamos escases de comida.

Hoy me congratulo de haber sobrevivido al terremoto del 19 de septiembre de 2017, si bien el daño no fue tan grande como el de 1985, si fue, a mi juicio, el terremoto que más temor me ha causado, y ello se debe a que lo sentí en un séptimo piso, en frente del WTC, y muy cerca del lugar (escasas cuadras) en donde muchos edificios se derrumbaron.

Por las condiciones del edificio, nuestro protocolo de protección civil, indica que debemos esperar hasta que pase el movimiento telúrico para hacer el desalojo, ello implica que debes de confiar a ojos cerrados que la integridad estructural del edificio se conservará, solo te acercas a una de la columnas principales y esperas, esperas y observas todo el movimiento a tu alrededor, esperas y escuchas los ruidos que emite el edificio al resistirse al movimiento, esperas, y tratas de conservar la calma.

Los segundos son eternos, y el proceso de desalojo tiende a ser frustrante, si bien estamos organizados, sabemos que hacer y cómo hacerlo, ello no implica que por nuestra mente pasen muchas ideas, donde las principales son el comunicar nuestro estado a los seres amados y esperar lo mismo de ellos.

Como es de esperarse, las comunicaciones fallaron, y había acceso esporádico a datos por medio del celular, las actividades comerciales fueron suspendidas, y de pronto, todos pensaban en como regresar a sus hogares.

He caminado por muchos kilómetros, hasta un lugar en donde el transito permitía avanzar, en mi trayecto, logre observar lo que para muchos es difícil de entender, lo que los extranjeros no comprenden y admiran, y me refiero al hecho de que la sociedad civil tomo el control del proceso de ayuda.

No solo observe a gente con polines de madera, civiles controlando el tránsito de las principales avenidas de la ciudad, niños ofreciendo agua a la gran cantidad de personas que caminan buscando llegar a su destino, todo esto en menos de una hora después del suceso.

Mas tarde, ya más organizados, la ayuda se concentró en la misión principal, búsqueda y rescate de las víctimas, adicionalmente a ello, una red de soporte de creo, para llevar víveres, comida y medicamentos.
Y al igual que en 1985, somos y seremos ejemplo de solidaridad, de organización, y de un fuerte sentido de comunidad, como en ese momento, hoy día me siento orgulloso de vivir en donde vivo, de ser lo que soy, un mexicano.
Los temblores siguen, y al menos a nivel personal, estamos subsanando los errores que encontramos en este evento, a fin que, en caso de requerirse nuevamente, estos no se presenten.

Ello no implica que no sienta un temor terrible al escuchar la alerta sísmica, consientes que tarde o temprano llegara una réplica de una intensidad suficiente como para volver la activar.

Como lo dije en el inicio, soy una persona afortunada, muy afortunada.

Lunes 18 de septiembre de 2017

Promoviendo Software Libre: Conocer el total de memoria RAM en SOLARIS

Miércoles 16 de agosto de 2017

Rafael Bucio

Rafael Bucio
Rafael Bucio ⠠⠵

Fork Bomb

Fork bomb is an infinite loop that repeatedly launches the same process.

:() Defining a function called :

{:|: &} means run the function : and send its output to the : function again and run that in the background.

The ; is a command separator, like &&

: runs the function the first time.


#/bin/sh if for comment!! ;-)

Domingo 13 de agosto de 2017

Rafael Bucio

Rafael Bucio
Rafael Bucio ⠠⠵

Defcon 25!

DEFCON 25!, muy bueno !

Martes 08 de agosto de 2017

José Oviedo

José Oviedo

Microsoft Visual Studio: Not found Microsoft.CompactFramework.VisualBasic.targets

Al iniciar un proyecto en Microsoft Visual Studio 2008 en Windows 10, aparece el siguiente mensaje de error:

Unable to read the project file ‘Proyecto.vbproj’ c:\users\Proyecto.vbproj: The imported project: “C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.CompactFramework.VisualBasic.targets” was not found. Confirm that the path in the declaration is correct, and that the file exists on disk

Se actualizó al Service Pack 1 del Visual Studio 2008 y el error seguía, luego reinstalar .NET Compact Framework NET 3.5 y nada, y al final la solución fue instalar las Power Toys for .NET Compact Framework 3.5 desde la URL de Microsoft y listo, asunto arreglado.

Jueves 03 de agosto de 2017

Rafael Bucio

Rafael Bucio
Rafael Bucio ⠠⠵


Contra el Capital y sus muros: todas las artes.

Convocatoria a la edición cibernética del CompArte “Contra el Capital y sus muros, todas las artes”

Julio del 2017.

Compañeroas, compañeras y compañeros de la Sexta:

Hermanoas, hermanas y hermanos artistas y no, de México y el mundo:

Avatares, nicknames, webmasters, bloguer@s, moderador@s, gamers, hackers, piratas, bucaneros y náufragos del streaming, usuari@s de las redes antisociales, antípodas de los reality shows, o como-se-diga cada quien en la red, la web, internet, ciberespacio, realidad virtual o-como-se-diga:

Les convocamos, pues, porque tenemos algunas preguntas que nos inquietan:

¿Es posible otro internet, o sea otra red? ¿Se puede luchar ahí? ¿O es que ese espacio sin geografía precisa, ya está ocupado, copado, cooptado, atado, anulado, etceterado? ¿No puede haber ahí resistencia y rebeldía? ¿Se puede hacer Arte en la red? ¿Cómo es ese Arte? ¿Y puede rebelarse? ¿Puede el Arte en la red resistir la tiranía de códigos, passwords, el spam como buscador por default, los MMORPG de las noticias en las redes sociales donde ganan la ignorancia y la estupidez por millones de likes? ¿El Arte en, por y para la red banaliza la lucha y la trivializa, o la potencia y escala, o “nada qué ver, mi buen, es arte, no célula militante”? ¿Puede el Arte en la red arañar los muros del Capital y herirlo con una grieta, o ahondar y perseverar en las que ya hay? ¿Puede el Arte en, por y para la red resistir no sólo a la lógica del Capital, también a la lógica del Arte “conocido”, el “arte real”? ¿Lo virtual es también virtual en sus creaciones? ¿Es el bit la materia prima de su creación? ¿Es creado por un ser individual? ¿Dónde está el soberbio tribunal que, en la Red, dictamina qué es y qué no es Arte? ¿El Capital cataloga el Arte en, por y para la red como ciberterrorismo, ciberdelincuencia? ¿La Red es un espacio de dominación, de domesticación, de hegemonía y homogeneidad? ¿O es un espacio en disputa, en lucha? ¿Podemos hablar de un materialismo digital?

En realidad, real y virtual, es que sabemos poco o nada de ese universo. Pero creemos que, en la geografía inasible de la red, hay también creación, arte. Y, claro, resistencia y rebeldía.

Ustedes que crean ahí, ¿ven la tormenta?, ¿la padecen?, ¿resisten?, ¿se rebelan?

Para tratar de encontrar algunas respuestas, es que les invitamos a que participen… (íbamos a poner “desde cualquier geografía”, pero creemos que la red es donde tal vez importa menos el lugar).

Bueno, les invitamos a construir sus respuestas, a construirlas, o deconstruirlas, con arte creado en, por y para la red. Algunas categorías en las que se puede participar (seguramente hay más, y usted ya está señalando que la lista es corta, pero, ya sabe, “falta lo que falta”), serían:

Animación; Apps; Archivos y bases de datos; Bio-arte y arte-ciencia; Ciberfeminismo; Cine interactivo; Conocimiento colectivo; Cultural Jamming; Cyber-art; Documental web; Economías + finanzas experimentales; Electrónica DIY, máquinas, robótica y drones, Escritura colectiva; Geo-localización; Gráfica y diseño, Hacking creativo, graffiti digital, hacktivismo y borderhacking; Impresión 3D; Interactividad; Literatura electrónica e Hipertexto; Live cinema, VJ, cinema expandido; Machinima; Memes; Narrative media;; Net Audio; Performance, danza y teatro mediáticos; Psico-geografías; Realidad alterna; Realidad aumentada; Realidad virtual; Redes y Translocalidades colaborativas (diseño de comunidades, prácticas translocales); Remix culture; Software art; Streaming; Tactical media; Telemática y telepresencia; Urbanismo y comunidades online/offline; Videojuegos; Visualización; Blogs, Flogs y Vlogs; Webcomics; Web Series, Telenovelas para Internet, y eso que usted ve que falta en esta lista.

Así que bienvenid@s aquellas personas, colectivos, grupos, organizaciones, reales o virtuales, que trabajen desde zonas autónomas en línea, quienes utilicen plataformas cooperativas, open source, software libre, licencias alternativas de propiedad intelectual, y los etcéteras cibernéticos.

Bienvenida toda participación de todoas, todas y todos los hacedores de cultura, independientemente de las condiciones materiales desde las que trabajen.

Les invitamos también para que distintos espacios y colectivos alrededor del mundo puedan mostrar las obras en sus localidades, según sus propios modos, formas, intereses y posibilidades.

¿Tienen ya en algún lugar del ciberespacio algo qué decirnos, contarnos, mostrarnos, compartirnos, invitarnos a construir en colectivo? Mándanos tú link para ir construyendo la sala de exhibición en línea de este CompArte digital.

¿No tienes todavía un espacio donde subir tú material? Podemos proporcionártelo, y en la medida de lo posible archivar tú material para que quede registrado a futuro. En ese caso necesitaríamos que nos den un link a la nube, hospedaje cibernético o cosa similar de su preferencia. O que nos lo manden por correo electrónico, o lo suban a una de nuestras nubes o al FTP.

Aunque nos ofrecemos a hospedar todo el material, porque nos gustaría que formara parte del archivo de arte en red solidario, también vamos a ‘linkear’ a otras páginas o servidores o geo-localizaciones, porque entendemos que, en la época del capital global, es estratégico descentralizar.

Así que como gusten:

Si quieren dejar la información en sus sitios, con sus formas y sus modos, podemos linkearlos.

Y si necesitan espacio, también estamos para hospedarlos.

Bueno, pueden escribirnos un correo con la información de su participación. Por ejemplo, el nombre de los creadores, título, y la categoría en la que quieren que esta sea incluida, así como una pequeña descripción y una imagen. También díganos si tienen espacio en internet y sólo necesitan que pongamos un link, o bien si prefieren que la subamos al servidor.

El material que se vaya recibiendo desde el momento que aparezca la convocatoria, se irá clasificando en distintos apartados según su (in)disciplina. Las participaciones se harán públicas durante los días del festival para que cada individuo o colectividad lo navegue, use (o abuse) y difunda en sus espacios de reunión, calles, escuelas, o donde prefiera.

Las participaciones se publicarán como entradas y links.

También se publicará un programa de streaming en directo. Las actividades serán archivadas por si alguien no alcanza a verlas en vivo.

El correo al cual tienen que escribir para mandarnos sus links y comunicarse con nosotros es:

La página donde se irán montando los links a las participaciones, y la cual estará en pleno funcionamiento a partir del 1º de agosto de este año de 2017, es:

Desde ahí también se harán transmisiones y exposiciones, del 1º de agosto y hasta el 12 de agosto, de distintas participaciones artísticas desde su ciberespacio local, en distintas partes del mundo.

Bienvenidoas pues a la edición virtual del CompArte por la Humanidad:

“Contra el Capital y sus muros, todas las artes… también las cibernéticas”

Vale, salud y no likes, sino dedos medios up and fuck the muros, delete al capital.

Desde las montañas del Sureste Mexicano.

Comisión Sexta, Newbie but On-Line, del EZLN.

(Con mucho ancho de banda, mi buen, al menos en lo que a la cintura se refiere -oh, yes, nerd and fat is hot-)

Lunes 26 de junio de 2017

¿Realmente te conoce? –AdsBlock

Este post nace a través de este enlace Dataselfie, conociendo al Algoritmo de Facebook y su Machine Learning. en el que hablan de como funciona el proceso de la publicidad que te sale en facebook,  a través del tiempo ya has dibujado tu perfil en facebook sea por búsqueda o por likes todo lo que hagas dentro de esa red social te va a salir, luego que ya saben que es lo que te gusta te empiezan a mandar publicidad acorde a ella, nunca se habían realizado esa pregunta ¿Por que me sale esto?. si quieren conocer que facebook sabe mas que ustedes tranquilamente, pueden abrir  este enlace Preferencias Ads en Facebook

El cual con la sesión abierta de facebook, desglosan en Intereses, y veras todo tus gusto, lo que por alguna razón buscaste o le diste por omisión. Ahí te conocerás realmente que es lo que te gusta.

Ya que donaste los datos, que puedo hacer.

Lo mas sensato es darse de baja de una red social donde juegan con tu información. si quieres seguir usándolo lo mas lógico seria usar AdsBlock  que lo puedes instalar en firefox y chrome, no vas a ver mas publicidad pero igual en cualquier momento que abras un enlace vas a empezar a crear nuevamente tu perfil.

Hace años 10 años una persona que respeto me compartió este video sigue vigente creemos que los servicios que usamos son gratis realmente.