Miércoles 25 de abril de 2018

Planeta Gruslic: Max Valdez: Métricas: A veces el sentido común sí es confiable

Sábado 21 de abril de 2018

Marco Islas

Marco Islas
Marco Islas

Si no le entiendes no mereces llamarte ingeniero en sistemas ni administrador de redes

O que ?? Te dolió ??

Viernes 20 de abril de 2018

Marco Islas

Marco Islas
Marco Islas

Finally got a haircut

Marco Islas

Marco Islas
Marco Islas

GitLab Web IDE now open source

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 chingon.com 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: mirror.reconn.ru
* epel: mirror.logol.ru
* extras: mirror.reconn.ru
* remi-php70: mirror.reconn.ru
* remi-php72: mirror.reconn.ru
* remi-safe: mirror.reconn.ru
* updates: mirror.reconn.ru
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: libqpol.so.1(VERS_1.4)(64bit) for package: policycoreutils-python-2.5-17.1.el7.x86_64
--> Processing Dependency: libqpol.so.1(VERS_1.2)(64bit) 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: libapol.so.4(VERS_4.0)(64bit) 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: libqpol.so.1()(64bit) for package: policycoreutils-python-2.5-17.1.el7.x86_64
--> Processing Dependency: libapol.so.4()(64bit) 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 chingon.com -d www.chingon.com
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
cancel): perengano@gmail.com
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org

Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. 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): supporters.eff.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for chingon.com
http-01 challenge for www.chingon.com
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/httpd/sites-available/chingon.com-le-ssl.conf
Deploying Certificate to VirtualHost /etc/httpd/sites-available/chingon.com-le-ssl.conf
Enabling site /etc/httpd/sites-available/chingon.com-le-ssl.conf by adding Include to root configuration
Deploying Certificate to VirtualHost /etc/httpd/sites-available/chingon.com-le-ssl.conf

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/chingon.com.conf to ssl vhost in /etc/httpd/sites-available/chingon.com-le-ssl.conf

Congratulations! You have successfully enabled https://chingon.com 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: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

[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/chingon.com-le-ssl.conf, 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/chingon.com-le-ssl.conf /etc/httpd/sites-enabled/chingon.com.ssl.conf


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 https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html

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 "perengano@gmail.com"
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/id_rsa.pub.
The key fingerprint is:
SHA256:1AfAgsKI7fv/9h0dTHkUccMR2bwD+XkUcBQbWOaq/LA perengano@gmail.com
The key's randomart image is:
+---[RSA 4096]----+
|.+ . .... .B/%|
|o + . . .. . ++=O|
| . . .. . . =++|
| . . . o.*.|
| . S .o o|
| . . .. . |
| . +. . |
| . . .+. |
| ..o...E.. |
perengano@elrond:~$ cat .ssh/id_rsa.pub

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/id_rsa.pub"
/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/id_rsa.pub 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 id_rsa.pub
-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.

Gustavo Rubio

Gustavo Rubio
Ahí vamos

Traducción de aplicaciones con gettext (parte 1)

Hace unos días escribía sobre la importancia de utilizar el inglés como la lengua de facto en proyectos de software. Para mi, tener convenciones es

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: https://github.com/mono/mono/issues/6985.

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](https://github.com/mono/mono/pull/7941) 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 (https://github.com/godotengine/godot/pull/17134).

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…

Viernes 30 de marzo de 2018

Planeta Gruslic: Mario Oyorzábal: usando amp y facebook instant articles

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 : electrum.joiz.net.




Gustavo Rubio

Gustavo Rubio
Ahí vamos

¿Por qué usar inglés en proyectos de software?

Pocas cosas me incomodan más en mi trabajo que ver un proyecto en spanglish, es decir, con partes en inglés y otras en español. La

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 opensource.com.

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.





Miércoles 21 de marzo de 2018

Gustavo Rubio

Gustavo Rubio
Ahí vamos

Tu imagen sí es importante

Nunca fui particularmente seguidor de tendencias. Con temor a escucharme pedante diría que siempre he sido diferente; a mi hermano le gustaban las tortugas ninjas

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: example.net 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.example.com 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 pxeboot.example.com.conf file:
grep -v ‘#’ /etc/apache2/sites-available/000-default.conf | sudo tee /etc/apache2/sites-available/pxeboot.example.com.conf
Modify the “ServerName” variable:
ServerName pxeboot.example.net
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 http://mirrors.ocf.berkeley.edu/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso -O /tmp/isos/centos7.iso
sudo wget http://releases.ubuntu.com/17.04/ubuntu-17.04-server-amd64.iso -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 domain=example.com

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/pxeboot.example.net/install/Packages/syslinux-4.05-12.el7.x86_64.rpm /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

Alcance Libre: Promoción Curso Global de Servidores con CentOS 7, modalidad online, marzo y abril de 2018.
Planeta Gruslic: Héctor Daniel Cortés: Verificando los arreglos de discos

Sábado 10 de marzo de 2018

Gunnar Wolf

Gunnar Wolf
Gunnar Wolf

On the demise of Slack's IRC / XMPP gateways

I have grudgingly joined three Slack workspaces , due to me being part of proejects that use it as a communications center for their participants. Why grudgingly? Because there is very little that it adds to well-established communications standards that we have had for long years decades.

On this topic, I must refer you to the talk and article presented by Megan Squire, one of the clear highlights of my participation last year at the 13th International Conference on Open Source Systems (OSS2017): «Considering the Use of Walled Gardens for FLOSS Project Communication». Please do have a good read of this article.

Thing is, after several years of playing open with probably the best integration gateway I have seen, Slack is joining the Embrace, Extend and Extinguish-minded companies. Of course, I strongly doubt they will manage to extinguish XMPP or IRC, but they want to strengthen the walls around their walled garden...

So, once they have established their presence among companies and developer groups alike, Slack is shutting down their gateways to XMPP and IRC, arguing it's impossible to achieve feature-parity via the gateway.

Of course, I guess all of us recognize and understand there has long not been feature parity. But that's a feature, not a bug! I expressly dislike the abuse of emojis and images inside what's supposed to be a work-enabling medium. Of course, connecting to Slack via IRC, I just don't see the content not meant for me.

The real motivation is they want to control the full user experience.

Well, they have lost me as a user. The day my IRC client fails to connect to Slack, I will delete my user account. They already had record of all of my interactions using their system. Maybe I won't be able to move any of the groups I am part of away from Slack – But many of us can help create a flood.

Say no to predatory tactics. Say no to Embrace, Extend and Extinguish. Say no to Slack.

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 github.com

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 luiscachog.io
    Congratulations! Your new Hugo site is created in /home/luiscachog/sites/luiscachog.io.
    Just a few more steps and you're ready to go:
    1.- Download a theme into the same-named folder.
        Choose a theme from https://themes.gohugo.io/, 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 https://gohugo.io/ 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.io
    luiscachog@dev-server:~$ ls
    archetypes  config.toml  content  data  layouts  static  themes
    luiscachog@dev-server:~$ tree 
    ├── archetypes
    │   └── default.md
    ├── 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 https://themes.gohugo.io/

    git init
    git submodule add https://github.com/budparr/gohugo-theme-ananke.git 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 https://github.com/k4ch0/gohugo-theme-ananke.git 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/my-first-post.md
    echo "Hola Mundo" >> content/posts/my-first-post.md

    El comando anterior creara un archivo en la ruta content/posts/my-first-post.md, 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 github.com 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 https://github.com/k4ch0/luiscachog.io
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 https://github.com/k4ch0/luiscachog.io  luiscachog.io.git

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/luiscachog.io.git/hooks
    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/luiscachog.io.git/hooks/post-update
    Cloning into '/var/www/vhosts/luiscachog.io/working_hugo'...
    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.io
luiscachog@dev-server:~$ git remote add prod admin@IP_servidor_productivo:luiscachog.io
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  git@github.com:k4ch0/luiscachog.io.git (fetch)
origin  git@github.com:k4ch0/luiscachog.io.git (push)
prod    admin@IP_servidor_productivo:luiscachog.io.git (fetch)
prod    admin@IP_servidor_productivo:luiscachog.io.git (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.io
luiscachog@dev-server:~$ hugo new posts/Testing-Deployment.md
luiscachog@dev-server:~$ echo "Deployment Test" >> content/posts/Testing-Deployment.md
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/luiscachog.io/working_hugo'...
remote: done.
remote: Cloning into '/var/www/vhosts/luiscachog.io/working_hugo/themes/hugo-future-imperfect'...
remote: INFO 2018/03/01 03:12:34 Using config file: /var/www/vhosts/luiscachog.io/working_hugo/config.toml
remote: Building sites … INFO 2018/03/01 03:12:34 syncing static files to /var/www/vhosts/luiscachog.io/public_html/
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
To admin@IP_servidor_productivo:luiscachog.io.git
   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 "bernardo.mejia@gmail.com"
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/id_rsa.pub.
The key fingerprint is:
SHA256:Choz61K1xeFpqf6o66AT1LX8I/7I6KXMWnThT4bSV9g bernardo.mejia@gmail.com
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 id_rsa.pub.

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== bernardo.mejia@gmail.com

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


~$ ssh xanatos@mysqlvm001.bmejiaparedes.mx
The authenticity of host 'mysqlvm001.bmejiaparedes.mx (' 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 'mysqlvm001.bmejiaparedes.mx,' (ECDSA) to the list of known hosts.
xanatos@mysqlvm001.bmejiaparedes.mx'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 id_rsa.pub
-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 xanatos@mysqlvm001.bmejiaparedes.mx
Last login: Sat Mar  3 17:32:13 2018 from fixed-189-203-149-57.totalplay.net
[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 id_rsa_clasex1.pub

xanatos@vmclase001:~$ ssh -i id_rsa_clasex1 clasex1@mysqlvm001.bmejiaparedes.mx
Last login: Sat Mar  3 16:44:09 2018 from fixed-189-203-149-57.totalplay.net
[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.py – script en Python por Alex

2o lugar: copia.sh – 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.

Miércoles 21 de febrero de 2018

Miguel de Icaza

Miguel de Icaza
Miguel de Icaza


Mono has a pure C# implementation of the Windows.Forms stack which works on Mac, Linux and Windows. It emulates some of the core of the Win32 API to achieve this.

While Mono's Windows.Forms is not an actively developed UI stack, it is required by a number of third party libraries, some data types are consumed by other Mono libraries (part of the original design contract), so we have kept it around.

On Mac, Mono's Windows.Forms was built on top of Carbon, an old C-based API that was available on MacOS. This backend was written by Geoff Norton for Mono many years ago.

As Mono switched to 64 bits by default, this meant that Windows.Forms could not be used. We have a couple of options, try to upgrade the 32-bit Carbon code to 64-bit Carbon code or build a new backend on top of Cocoa (using Xamarin.Mac).

For years, I had assumed that Carbon on 64 was not really supported, but a recent trip to the console shows that Apple has added a 64-bit port. Either my memory is failing me (common at this age), or Apple at some point changed their mind. I spent all of 20 minutes trying to do an upgrade, but the header files and documentation for the APIs we rely on are just not available, so at best, I would be doing some guess work as to which APIs have been upgraded to 64 bits, and which APIs are available (rumors on Google searches indicate that while Carbon is 64 bits, not all APIs might be there).

I figured that I could try to build a Cocoa backend with Xamarin.Mac, so I sent this pull request to let me do this outside of the Mono tree on my copious spare time, so this weekend I did some work on the Cocoa Driver.

But this morning, on twitter, Filip Navarra noticed the above, and contacted me:

He has been kind enough to upload this Cocoa-based backend to GitHub.

Going Native

There are a couple of interesting things about this Windows.Forms backend for Cocoa.

The first one, is that it is using sysdrawing-coregraphics, a custom version of System.Drawing that we had originally developed for iOS users that implements the API in terms of CoreGraphics instead of using Cairo, FontConfig, FreeType and Pango.

The second one, is that some controls are backed by native AppKit controls, those that implement the IMacNativeControl interface. Among those you can find Button, ComboBox, ProgressBar, ScrollBar and the UpDownStepper.

I will now abandon my weekend hack, and instead get this code drop integrated as the 64-bit Cocoa backend.

Stay tuned!

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.

[1] https://es.wikipedia.org/wiki/Tor_(red_de_anonimato)
[2] https://www.torproject.org/about/overview.html.en
[3] http://gwolf.org/node/3929
[4] http://gwolf.org/node/4094
[5] https://techcrunch.com/2017/04/24/dmitry-bogatov-tor-russia/
[6] https://share.riseup.net/#pxoC4nPXgyQla1yzXJl06w
[7] https://lists.torproject.org/pipermail/tor-talk/2018-February/043981.html

Vim one liner

Never learned visual mode of vim: Disable vim automatic visual mode on mouse select issue: :set mouse-=a
add to ~/.vimrc:
set mouse-=a

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

Jueves 25 de enero de 2018

Alcance Libre: Promoción Curso Global de Servidores con CentOS 7, modalidad online, febrero de 2018.

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 heictojpg.com 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:

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



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.

Martes 19 de septiembre de 2017

Héctor Daniel Cortés

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

2017-09-19 18:14:39 (M7.1) PUEBLA, MEXICO 18.6 -98.4 (82934)


Geographic coordinates: 18.584N, 98.399W
Magnitude: 7.1
Depth: 51 km
Universal Time (UTC): 19 Sep 2017 18:14:39
Time near the Epicenter: 19 Sep 2017 13:14:39
Local standard time in your area: 19 Sep 2017 12:14:39

Location with respect to nearby cities:
8 km (5 miles) ESE (111 degrees) of Iz�car, Puebla, Mexico
22 km (14 miles) ENE (71 degrees) of Atencingo, Puebla, Mexico
36 km (22 miles) ENE (75 degrees) of Axochiapan, Morelos, Mexico
56 km (35 miles) SSW (202 degrees) of Puebla, Puebla, Mexico
123 km (76 miles) SE (139 degrees) of MEXICO CITY, D.F., Mexico

event ID : us 2000ar20

This is a computer-generated message and has not yet been reviewed by a
For subsequent updates, maps, and technical information, see:

National Earthquake Information Center
U.S. Geological Survey

DISCLAIMER: https://earthquake.usgs.gov/ens/help.html?page=help#disclaimer

Lunes 18 de septiembre de 2017

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

Viernes 08 de septiembre de 2017

Héctor Daniel Cortés

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

2017-09-08 04:49:17 UPDATED: (M8.0) OFFSHORE CHIAPAS, MEXICO 15.0 -93.8 (82934)


***This event supersedes event AT00OVY2Q7,PT17251000.

Geographic coordinates: 15.029N, 93.807W
Magnitude: 8.0
Depth: 35 km
Universal Time (UTC): 8 Sep 2017 04:49:18
Time near the Epicenter: 7 Sep 2017 23:49:18
Local standard time in your area: 7 Sep 2017 22:49:18

Location with respect to nearby cities:
97 km (60 miles) SW (221 degrees) of Pijijiapan, Chiapas, Mexico
107 km (66 miles) WSW (245 degrees) of Mapastepec, Chiapas, Mexico
117 km (73 miles) S (182 degrees) of Tonal�, Chiapas, Mexico
165 km (102 miles) W (275 degrees) of Tapachula, Chiapas, Mexico
356 km (221 miles) W (278 degrees) of GUATEMALA CITY, Guatemala

event ID : us 2000ahv0

This is a computer-generated message and has not yet been reviewed by a
For subsequent updates, maps, and technical information, see:

National Earthquake Information Center
U.S. Geological Survey

DISCLAIMER: https://earthquake.usgs.gov/ens/help.html?page=help#disclaimer

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!! ;-)

Alex Callejas

Alex Callejas

Notas del Curso de Docker: Principiante

El fin de semana pasado, tuve la fortuna de poder asistir al meetup de Docker, donde nos dieron un curso de Docker para principiantes. A pesar de las dificultades presentadas, ya que al ser un curso totalmente gratuito, a base del esfuerzo de la comunidad se logró bastante bien.

En este primer post, les compartiré mis notas del curso.

En el #SysArmyMxTalks previo, el buen Iván Chavero, nos habló de los fundamentos de los contenedores, si quieren revisar el material, lo encuentran en los enlaces:

Durante el curso, nos dieron una breve introducción a docker, además de ver un fragmento del vídeo de la presentación de Jessie Frazell:

Ver en Youtube

Después de esto, iniciamos con la parte práctica:

Comandos básicos

1. Después de instalar docker, es necesario habilitarlo e iniciarlo

user@computer:$ sudo systemctl status docker
[sudo] password for alex.callejas:
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: dis
Active: inactive (dead)
Docs: http://docs.docker.com
$ sudo systemctl enable docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
$ sudo systemctl start docker

2. Para correr un contenedor mediante docker con nginx, ejecutamos

user@computer:$ sudo docker run nginx
Unable to find image 'nginx:latest' locally
Trying to pull repository registry.fedoraproject.org/nginx ...
Trying to pull repository registry.access.redhat.com/nginx ...
Trying to pull repository docker.io/library/nginx ...
sha256:788fa27763db6d69ad3444e8ba72f947df9e7e163bad7c1f5614f8fd27a311c3: Pulling from docker.io/library/nginx
94ed0c431eb5: Pull complete
9406c100a1c3: Pull complete
aa74daafd50c: Pull complete
Digest: sha256:788fa27763db6d69ad3444e8ba72f947df9e7e163bad7c1f5614f8fd27a311c3
Status: Downloaded newer image for docker.io/nginx:latest

Como es una imagen que no tenemos en un repositorio local, la descarga del repositorio oficial de docker.

3. Si abrimos una terminal alterna, podemos observar que el contenedor se esta ejecutando

user@computer:$ sudo docker ps
[sudo] password for alex.callejas:
2127ad18758a nginx "nginx -g 'daemon ..." 30 seconds ago Up 29 seconds 80/tcp cocky_joliot

Se observa que, por default, docker nombra el contenedor como cocky_joliot, esto es debido a que si no especificamos un nombre del contenedor, docker por convención utilizará un adjetivo y el apellido de algún científico (según el código fuente de docker)

4. También podemos ejecutar un contenedor de forma interactiva con una TTY

user@computer:$ sudo docker run ubuntu bash
Unable to find image 'ubuntu:latest' locally
Trying to pull repository registry.fedoraproject.org/ubuntu ...
Trying to pull repository registry.access.redhat.com/ubuntu ...
Trying to pull repository docker.io/library/ubuntu ...
sha256:34471448724419596ca4e890496d375801de21b0e67b81a77fd6155ce001edad: Pulling from docker.io/library/ubuntu
d5c6f90da05d: Pull complete
1300883d87d5: Pull complete
c220aa3cfc1b: Pull complete
2e9398f099dc: Pull complete
dc27a084064f: Pull complete
Digest: sha256:34471448724419596ca4e890496d375801de21b0e67b81a77fd6155ce001edad
Status: Downloaded newer image for docker.io/ubuntu:latest
$ sudo docker run -it ubuntu bash
root@a656df585428:/# ps
1 ? 00:00:00 bash
11 ? 00:00:00 ps
root@51728d60a8a8:/# pwd
root@51728d60a8a8:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@51728d60a8a8:/# exit

Se observa que, dentro del contenedor, solamente existe el proceso de bash que ejecutamos, además de contar con toda la estructura de directorios del sistema.

5. En la terminal alterna, podemos observar la ejecución del contenedor

user@computer:$ sudo docker ps -a
a656df585428 ubuntu "bash" 45 seconds ago Exited (0) 28 seconds agonifty_payne
2127ad18758a nginx "nginx -g 'daemon ..." 3 minutes ago Exited (0) 2 minutes ago cocky_joliot

Con la opción -a, podemos ver todos los contenedores que hemos ejecutado, por default solo se muestran los que se encuentran en ejecución actualmente.

6. Si queremos eliminar un contenedor, utilizamos su CONTAINER ID, de la salida del ps ejecutando

user@computer:$ sudo docker rm 2127ad18758a
$ sudo docker rm a656df585428

Al revisar en la terminal alterna, ya no se observa dicho contenedor

user@computer:$ sudo docker ps

7. Se le puede indicar al contenedor que se ejecute en background y que utilice un puerto local en particular

user@computer:$ sudo docker run -d -p 80:80 nginx

Se observa en la terminal alterna, que el proceso se ejecute en el puerto asignado

user@computer:$ sudo docker ps
c81ee76d8cd0 nginx "nginx -g 'daemon ..." 5 seconds ago Up 4 seconds>80/tcp tender_montalcini

Podemos revisar con el navegador o con curl que el contenedor nos muestre la página de prueba de nginx en el puerto local configurado

Para detener el contenedor, sin eliminarlo, utilizamos su CONTAINER ID o su nombre

user@computer:$ sudo docker stop tender_montalcini

8. Si lo deseamos, podemos ejecutar un contenedor con un nombre en particular

user@computer:$ sudo docker run --name test -d -p 80:80 nginx

Lo revisamos en la terminal alterna

user@computer:$ sudo docker ps
a13f3e75ea52 nginx "nginx -g 'daemon ..." 3 seconds ago Up 3 seconds>80/tcp test

También podemos obtener estadísticas ejecutando

user@computer:$ sudo docker stats

a13f3e75ea52 0.01% 1.969 MiB / 7.493 GiB 0.03% 7.68 kB / 936 B 0 B / 0 B 2

Estas se muestran en tiempo real.

9. Con el contenedor ejecutándose, también podemos indicarle que corra algún comando en particular, por ejemplo

user@computer:$ sudo docker exec -it test bash
[sudo] password for alex.callejas:
root@a13f3e75ea52:/# ps
bash: ps: command not found
root@a13f3e75ea52:/# exit

En este caso en particular, le indicamos que ejecutara, de forma interactiva bash, sin embargo se observa que la imagen del contenedor no tiene el comando ps. Esto puede ser debido a que cuando se creo la imagen, no se le incluyó dicho comando o comandos; esto se puede realizar para que la imagen del contenedor tenga una característica de seguridad en caso de ser necesario.

El proceso para generar la imagen de esta forma se profundizará en una sesión posterior.

10. Para revisar la configuración general del contenedor, ejecutamos

user@computer:$ sudo docker inspect test
"Id": "a13f3e75ea522646ca6b1b6a926cdf680b636924bdbf2c2942b7249acff0e513",
"Created": "2017-08-12T15:37:29.101171417Z",
"Path": "nginx",
"Args": [
"daemon off;"
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 6912,
"ExitCode": 0,
"Error": "",
"StartedAt": "2017-08-12T15:37:29.606735048Z",
"FinishedAt": "0001-01-01T00:00:00Z"
"Image": "sha256:b8efb18f159bd948486f18bd8940b56fd2298b438229f5bd2bcf4cedcf037448",
"ResolvConfPath": "/var/lib/docker/containers/a13f3e75ea522646ca6b1b6a926cdf680b636924bdbf2c2942b7249acff0e513/resolv.conf",

Salida completa de la inspección: inspect_test.txt

También podemos obtener información de la inspección en formato de Go

user@computer:$ sudo docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' test
$ sudo docker inspect --format='{{range .NetworkSettings.Networks}}{{.Gateway}}{{end}}' test

11. Para listar las imágenes que hemos utilizado, ejecutamos

user@computer:$ sudo docker images
docker.io/ubuntu latest ccc7a11d65b1 43 hours ago 120 MB
docker.io/nginx latest b8efb18f159b 2 weeks ago 107 MB

Creación de imágenes

12. La primer opción, aunque no la mejor nos comentaron, es utilizar una imagen básica de algún Sistema Operativo y adecuarla a nuestras necesidades. Por ejemplo, si queremos una imagen de vim, primeramente ejecutamos de forma interactiva una imagen base, para nuestro caso, de fedora e instalamos el paquete de forma tradicional

user@computer:$ sudo docker run -it fedora bash
[root@057ce3fd873e /]# dnf install vim
Fedora 25 - x86_64 2.7 MB/s | 50 MB 00:18
Fedora 25 - x86_64 - Updates 3.8 MB/s | 25 MB 00:06
Last metadata expiration check: 0:00:06 ago on Sat Aug 12 15:51:37 2017.
Dependencies resolved.
Package Arch Version Repository Size
gpm-libs x86_64 1.20.7-9.fc24 fedora 36 k
perl-Carp noarch 1.40-365.fc25 fedora 29 k
perl-Exporter noarch 5.72-366.fc25 fedora 33 k
perl-libs x86_64 4:5.24.2-387.fc25 updates 1.5 M
vim-common x86_64 2:8.0.823-1.fc25 updates 6.7 M
vim-enhanced x86_64 2:8.0.823-1.fc25 updates 1.3 M
vim-filesystem x86_64 2:8.0.823-1.fc25 updates 35 k
which x86_64 2.21-1.fc25 fedora 46 k

Transaction Summary
Install 8 Packages

Total download size: 9.6 M
Installed size: 37 M
Is this ok [y/N]: y
Downloading Packages:
(1/8): which-2.21-1.fc25.x86_64.rpm 71 kB/s | 46 kB 00:00
(2/8): gpm-libs-1.20.7-9.fc24.x86_64.rpm 56 kB/s | 36 kB 00:00
(3/8): perl-libs-5.24.2-387.fc25.x86_64.rpm 1.0 MB/s | 1.5 MB 00:01
(4/8): perl-Carp-1.40-365.fc25.noarch.rpm 213 kB/s | 29 kB 00:00
(5/8): perl-Exporter-5.72-366.fc25.noarch.rpm 244 kB/s | 33 kB 00:00
(6/8): vim-enhanced-8.0.823-1.fc25.x86_64.rpm 524 kB/s | 1.3 MB 00:02
(7/8): vim-filesystem-8.0.823-1.fc25.x86_64.rpm 249 kB/s | 35 kB 00:00
(8/8): vim-common-8.0.823-1.fc25.x86_64.rpm 1.3 MB/s | 6.7 MB 00:05
Total 1.3 MB/s | 9.6 MB 00:07
warning: /var/cache/dnf/updates-87ad44ec2dc11249/packages/vim-enhanced-8.0.823-1.fc25.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fdb19c98: NOKEY
Importing GPG key 0xFDB19C98:
Userid : "Fedora 25 Primary (25) <fedora-25-primary@fedoraproject.org>"
Fingerprint: C437 DCCD 558A 66A3 7D6F 4372 4089 D8F2 FDB1 9C98
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-25-x86_64
Is this ok [y/N]: y
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Installing : perl-Carp-1.40-365.fc25.noarch 1/8
Installing : perl-Exporter-5.72-366.fc25.noarch 2/8
Installing : perl-libs-4:5.24.2-387.fc25.x86_64 3/8
Installing : vim-filesystem-2:8.0.823-1.fc25.x86_64 4/8
Installing : vim-common-2:8.0.823-1.fc25.x86_64 5/8
Installing : which-2.21-1.fc25.x86_64 6/8
Installing : gpm-libs-1.20.7-9.fc24.x86_64 7/8
Installing : vim-enhanced-2:8.0.823-1.fc25.x86_64 8/8
Verifying : vim-enhanced-2:8.0.823-1.fc25.x86_64 1/8
Verifying : gpm-libs-1.20.7-9.fc24.x86_64 2/8
Verifying : which-2.21-1.fc25.x86_64 3/8
Verifying : vim-common-2:8.0.823-1.fc25.x86_64 4/8
Verifying : perl-libs-4:5.24.2-387.fc25.x86_64 5/8
Verifying : perl-Carp-1.40-365.fc25.noarch 6/8
Verifying : perl-Exporter-5.72-366.fc25.noarch 7/8
Verifying : vim-filesystem-2:8.0.823-1.fc25.x86_64 8/8

gpm-libs.x86_64 1.20.7-9.fc24 perl-Carp.noarch 1.40-365.fc25
perl-Exporter.noarch 5.72-366.fc25 perl-libs.x86_64 4:5.24.2-387.fc25
vim-common.x86_64 2:8.0.823-1.fc25 vim-enhanced.x86_64 2:8.0.823-1.fc25
vim-filesystem.x86_64 2:8.0.823-1.fc25 which.x86_64 2.21-1.fc25

[root@057ce3fd873e /]# exit

Identificamos el nombre del contenedor, con ayuda de la terminal alterna

user@computer:$ sudo docker ps -a
057ce3fd873e fedora "bash" 2 minutes ago Exited (0) About a minute ago infallible_fermat
a13f3e75ea52 nginx "nginx -g 'daemon ..." 16 minutes ago Up 16 minutes>80/tcp test

Y hacemos commit al cambio en la imagen, identificándola con un mensaje descriptivo y un nuevo nombre

user@computer:$ sudo docker commit -m "testvim" infallible_fermat imagenvim

Al revisar las imágenes observamos

user@computer:$ sudo docker images
imagenvim latest 663643920fdd 12 seconds ago 452 MB
docker.io/ubuntu latest ccc7a11d65b1 43 hours ago 120 MB
docker.io/nginx latest b8efb18f159b 2 weeks ago 107 MB
registry.fedoraproject.org/fedora latest 7f17e6b4a386 6 weeks ago 232 MB

Existe una importante diferencia en el tamaño de la imagen base contra la imagen que creamos, esto depende de los paquetes que instalamos.

Al ejecutar vim dentro del contenedor, funciona correctamente

user@computer:$ sudo docker run -it imagenvim
[root@c4e11a2ac378 /]# vim

~ VIM - Vi IMproved
~ version 8.0.885
~ by Bram Moolenaar et al.
~ Modified by <bugzilla@redhat.com>
~ Vim is open source and freely distributable
~ Become a registered Vim user!
~ type :help register<Enter> for information
~ type :q<Enter> to exit
~ type :help<Enter> or <F1> for on-line help
~ type :help version8<Enter> for version info


[root@c4e11a2ac378 /]# exit

Podemos revisar la diferencia de imágenes usando el id del contenedor:

user@computer:$ sudo docker ps -a
[sudo] password for alex.callejas:
c4e11a2ac378 imagenvim "bash" 41 minutes ago Exited (0) 40 minutes ago clever_meitner
057ce3fd873e fedora "bash" 44 minutes ago Exited (0) 42 minutes ago infallible_fermat
$ sudo docker diff c4e11a2ac378
C /root
C /root/.bash_history
A /root/.viminfo
$ sudo docker diff 057ce3fd873e
C /etc
C /etc/ld.so.cache
C /etc/pki/nssdb
C /etc/pki/nssdb/cert9.db
C /etc/pki/nssdb/key4.db
C /etc/profile.d
A /etc/profile.d/vim.csh
A /etc/profile.d/vim.sh
A /etc/profile.d/which2.csh
A /etc/profile.d/which2.sh
A /etc/vimrc
C /root
A /root/.bash_history
D /root/.pki

Salida completa de la diferencia: diff_imagenvim.txt

13. La otra forma de crear una imagen, es generando un archivo Dockerfile con las instrucciones de personalización del contenedor. Utilizando el mismo ejemplo, creamos el archivo Dockerfile (por convención, así debe llamarse) con la información necesaria

user@computer:$ vim Dockerfile
FROM fedora
RUN dnf update -y && dnf install -y vim

Y ejecutamos la construcción de la imagen

user@computer:$ sudo docker build -t imagenvim:2 .
Sending build context to Docker daemon 2.048 kB
Step 1/2 : FROM fedora
---> 7f17e6b4a386
Step 2/2 : RUN dnf update -y && dnf install -y vim
---> Running in 8b8e9e66ca8a
Last metadata expiration check: 0:00:18 ago on Sat Aug 12 16:01:33 2017.
Dependencies resolved.
Package Arch Version Repository Size
curl x86_64 7.51.0-8.fc25 updates 307 k
dbus x86_64 1:1.11.16-1.fc25 updates 255 k
dbus-libs x86_64 1:1.11.16-1.fc25 updates 175 k
emacs-filesystem noarch 1:25.2-3.fc25 updates 66 k
expat x86_64 2.2.3-1.fc25 updates 86 k
file-libs x86_64 5.29-7.fc25 updates 497 k
glibc x86_64 2.24-9.fc25 updates 3.3 M
glibc-common x86_64 2.24-9.fc25 updates 879 k
glibc-langpack-en x86_64 2.24-9.fc25 updates 282 k
gnutls x86_64 3.5.14-1.fc25 updates 754 k
krb5-libs x86_64 1.14.4-8.fc25 updates 741 k
libcrypt-nss x86_64 2.24-9.fc25 updates 44 k
libcurl x86_64 7.51.0-8.fc25 updates 267 k
libdb x86_64 5.3.28-24.fc25 updates 750 k
libdb-utils x86_64 5.3.28-24.fc25 updates 139 k
libgcc x86_64 6.4.1-1.fc25 updates 95 k
libgcrypt x86_64 1.7.8-1.fc25 updates 435 k
libidn2 x86_64 2.0.3-1.fc25 updates 97 k
libsolv x86_64 0.6.28-5.fc25 updates 366 k
libsss_idmap x86_64 1.15.3-1.fc25 updates 83 k
libsss_nss_idmap x86_64 1.15.3-1.fc25 updates 81 k
nspr x86_64 4.15.0-1.fc25 updates 137 k
nss x86_64 3.31.0-1.1.fc25 updates 862 k
nss-softokn x86_64 3.31.0-1.0.fc25 updates 385 k
nss-softokn-freebl x86_64 3.31.0-1.0.fc25 updates 224 k
nss-sysinit x86_64 3.31.0-1.1.fc25 updates 61 k
nss-tools x86_64 3.31.0-1.1.fc25 updates 504 k
nss-util x86_64 3.31.0-1.0.fc25 updates 87 k
openldap x86_64 2.4.44-11.fc25 updates 352 k
pcre x86_64 8.41-1.fc25 updates 199 k
sqlite-libs x86_64 3.14.2-2.fc25 updates 454 k
sssd-client x86_64 1.15.3-1.fc25 updates 134 k
systemd x86_64 231-17.fc25 updates 2.8 M
systemd-libs x86_64 231-17.fc25 updates 421 k
systemd-pam x86_64 231-17.fc25 updates 178 k
tar x86_64 2:1.29-4.fc25 updates 814 k
vim-minimal x86_64 2:8.0.823-1.fc25 updates 525 k

Transaction Summary
Upgrade 37 Packages

Total download size: 18 M
Downloading Packages:
/usr/share/doc/file-libs/ChangeLog: No such file or directory
cannot reconstruct rpm from disk files

Verifying : vim-filesystem-2:8.0.823-1.fc25.x86_64 8/8

gpm-libs.x86_64 1.20.7-9.fc24 perl-Carp.noarch 1.40-365.fc25
perl-Exporter.noarch 5.72-366.fc25 perl-libs.x86_64 4:5.24.2-387.fc25
vim-common.x86_64 2:8.0.823-1.fc25 vim-enhanced.x86_64 2:8.0.823-1.fc25
vim-filesystem.x86_64 2:8.0.823-1.fc25 which.x86_64 2.21-1.fc25

---> 6306acd85190
Removing intermediate container 8b8e9e66ca8a
Successfully built 6306acd85190

Salida completa de la construcción de la imagen: build_imagenvim2.txt

Al ejecutar vim dentro del contenedor, funciona correctamente

user@computer:$ sudo docker run -it imagenvim:2
[root@aa039e84b63b /]# vim
~ VIM - Vi IMproved
~ version 8.0.885
~ by Bram Moolenaar et al.
~ Modified by <bugzilla@redhat.com>
~ Vim is open source and freely distributable
~ Become a registered Vim user!
~ type :help register<Enter> for information
~ type :q<Enter> to exit
~ type :help<Enter> or <F1> for on-line help
~ type :help version8<Enter> for version info


[root@aa039e84b63b /]#
[root@aa039e84b63b /]# uname -a
Linux aa039e84b63b 4.11.11-300.fc26.x86_64 #1 SMP Mon Jul 17 16:32:11 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@aa039e84b63b /]# exit

Al listar las imágenes, observamos

user@computer:$ sudo docker images
[sudo] password for alex.callejas:
imagenvim 2 6306acd85190 26 minutes ago 519 MB
imagenvim latest 663643920fdd 35 minutes ago 452 MB
docker.io/ubuntu latest ccc7a11d65b1 44 hours ago 120 MB
docker.io/nginx latest b8efb18f159b 2 weeks ago 107 MB
registry.fedoraproject.org/fedora latest 7f17e6b4a386 6 weeks ago 232 MB

A esta nueva imagen, le podemos asignar una etiqueta diferente para poder diferenciarla

user@computer:$ sudo docker tag imagenvim:2 axl/imagenvim2
$ sudo docker images
axl/imagenvim2 latest 6306acd85190 28 minutes ago 519 MB
imagenvim 2 6306acd85190 28 minutes ago 519 MB
imagenvim latest 663643920fdd 37 minutes ago 452 MB
docker.io/ubuntu latest ccc7a11d65b1 44 hours ago 120 MB
docker.io/nginx latest b8efb18f159b 2 weeks ago 107 MB
registry.fedoraproject.org/fedora latest 7f17e6b4a386 6 weeks ago 232 MB

Podemos, además, guardar esta imagen como archivo

user@computer:$ sudo docker save -o imagenvim2 axl/imagenvim2
$ ls
Dockerfile imagenvim2
$ sudo file imagenvim2
imagenvim: POSIX tar archive
$ du -sh imagenvim2
509M imagenvim2

Con lo cual, podríamos portar la imagen a algún lugar, incluso por USB y exportarla. Para este ejemplo, primero eliminamos la imagen

user@computer:$ sudo docker rmi axl/imagenvim2
Untagged: axl/imagenvim2:latest
$ sudo docker images
imagenvim 2 6306acd85190 2 days ago 519 MB
imagenvim latest 663643920fdd 2 days ago 452 MB
docker.io/ubuntu latest ccc7a11d65b1 4 days ago 120 MB
docker.io/nginx latest b8efb18f159b 2 weeks ago 107 MB
registry.fedoraproject.org/fedora latest 7f17e6b4a386 6 weeks ago 232 MB

Para cargar esta imagen en algún otro equipo, después de transferir dicha imagen, utilizamos el comando

user@computer:$ sudo docker load -i imagenvim2
Loaded image: axl/imagenvim2:latest
$ sudo docker images
cosasaxl latest 2b76fbb9ebba 2 days ago 147 MB
axl/imagenvim2 latest 6306acd85190 2 days ago 519 MB
docker.io/ubuntu latest ccc7a11d65b1 4 days ago 120 MB
docker.io/nginx latest b8efb18f159b 2 weeks ago 107 MB
docker.io/debian latest a20fd0d59cf1 3 weeks ago 100 MB
registry.fedoraproject.org/fedora latest 7f17e6b4a386 6 weeks ago 232 MB


La información de los contenedores es efímera, pero si requerimos que se monte algún directorio en particular o que los datos sean persistentes, utilizamos volúmenes.

14. Si requerimos que nuestro contenedor incluya algún directorio en particular, ejecutamos

user@computer:$ sudo docker run -it -v /directorio ubuntu bash
[sudo] password for alex.callejas:
root@46e6e1cc5fc1:/# ls
bin boot dev directorio etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@46e6e1cc5fc1:/# ls directorio/
root@46e6e1cc5fc1:/# touch directorio/hola
root@46e6e1cc5fc1:/# ls directorio/
root@46e6e1cc5fc1:/# mkdir -p directorio/test
root@46e6e1cc5fc1:/# touch directorio/test/hola
root@46e6e1cc5fc1:/# ls -l directorio/*
-rw-r--r--. 1 root root 0 Aug 12 02:24 directorio/hola

total 0
-rw-r--r--. 1 root root 0 Aug 12 02:25 hola
root@46e6e1cc5fc1:/# exit

En la terminal alterna, inspeccionamos el contenedor, para revisar los montajes

user@computer:$ sudo docker ps
[sudo] password for alex.callejas:
540ee1c3cc95 ubuntu "bash" 25 seconds ago Up 24 seconds gracious_lamarr
$ sudo docker inspect --format='{{range .Mounts}}{{.Destination}}{{end}}' gracious_lamarr
$ sudo docker inspect --format='{{range .Mounts}}{{.Source}}{{end}}' gracious_lamarr

Por default, docker crea un directorio en el host para poder montarlo en el contenedor. Esto lo podemos revisar,como root, directamente en el host

user@computer:$ # ls -ld /var/lib/docker/volumes/4f3eb21be35f9b49ecc082592a47587253785ead6937f6352e434db2b8d6a323/_data
drwxr-xr-x. 2 root root 4096 Aug 12 21:32 /var/lib/docker/volumes/4f3eb21be35f9b49ecc082592a47587253785ead6937f6352e434db2b8d6a323/_data
# ls /var/lib/docker/volumes/4f3eb21be35f9b49ecc082592a47587253785ead6937f6352e434db2b8d6a323/_data
hola test
# ls /var/lib/docker/volumes/4f3eb21be35f9b49ecc082592a47587253785ead6937f6352e434db2b8d6a323/_data/*


15. Si queremos que el contenedor utilice algún directorio del host en particular, ejecutamos

user@computer:$ mkdir directorio
$ ls
directorio Dockerfile imagenvim2
$ sudo docker run -it -v $PWD/directorio:/directorio ubuntu bash
root@4230a22ebcd5:/# ls
bin boot dev directorio etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@4230a22ebcd5:/# ls directorio/
ls: cannot open directory 'directorio/': Permission denied
root@4230a22ebcd5:/# touch directorio/hola
touch: cannot touch 'directorio/hola': Permission denied

Se montó correctamente el directorio dentro del contenedor, pero no tenemos permiso de escritura debido a que el daemon de docker lo monta como root, como se observo en la inspección anterior. Para poder escribir, necesitamos indicarle al contenedor los permisos que requerimos, ejecutando

user@computer:$ sudo docker run -it -v $PWD/test:/prueba:ro ubuntu bash
root@59c188463618:/# ls
bin boot dev etc home lib lib64 media mnt opt proc prueba root run sbin srv sys tmp usr var
root@59c188463618:/# ls prueba/
ls: cannot open directory 'prueba/': Permission denied
root@59c188463618:/# cd prueba
root@59c188463618:/prueba# ls
ls: cannot open directory '.': Permission denied
root@59c188463618:/prueba# touch hola
touch: cannot touch 'hola': Read-only file system
root@59c188463618:/prueba# exit

En la inspección se observa

user@computer:$ sudo docker inspect --format='{{range .Mounts}}{{.Source}}{{end}}' dazzling_franklin
$ sudo docker inspect --format='{{range .Mounts}}{{.Destination}}{{end}}' dazzling_franklin
$ sudo docker inspect --format='{{range .Mounts}}{{.Mode}}{{end}}' dazzling_franklin
$ sudo docker inspect --format='{{range .Mounts}}{{.RW}}{{end}}' dazzling_franklin

16. Los volúmenes los podemos crear antes de usarlos, ejecutando

user@computer:$ sudo docker volume create --name myvol
$ sudo docker volume ls
local 4f3eb21be35f9b49ecc082592a47587253785ead6937f6352e434db2b8d6a323
local 5e76c5028ea86b1671837372c914d1603944dbf7d4676d0ee49740920756da24
local a909d99c5b8cab582d7c7a5c8e8dc21ed75f0a0ff8df15040906ab34fc67f142
local d840fde43be8d06fa06448478755f414de20c00705d27928ac5a8e0bba140d02
local myvol

Para asignarlo al contenedor, ejecutamos

user@computer:$ sudo docker run -it -v myvol:/stuff ubuntu bash
root@6b2116af2431:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv stuff sys tmp usr var
root@6b2116af2431:/# cd stuff/
root@6b2116af2431:/stuff# touch test{1..7}
root@6b2116af2431:/stuff# ls
test1 test2 test3 test4 test5 test6 test7

En la inspección observamos donde se creo el volumen y los archivos creados

user@computer:$ sudo docker inspect distracted_franklin | grep Mounts -A 11
"Mounts": [
"Type": "volume",
"Name": "myvol",
"Source": "/var/lib/docker/volumes/myvol/_data",
"Destination": "/stuff",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
# ls /var/lib/docker/volumes/myvol/_data
test1 test2 test3 test4 test5 test6 test7

17. Para eliminar el volumen, después de eliminar el contenedor, ejecutamos

user@computer:$ sudo docker volume rm myvol
$ sudo docker volume ls
local 4f3eb21be35f9b49ecc082592a47587253785ead6937f6352e434db2b8d6a323
local 5e76c5028ea86b1671837372c914d1603944dbf7d4676d0ee49740920756da24
local a909d99c5b8cab582d7c7a5c8e8dc21ed75f0a0ff8df15040906ab34fc67f142
local d840fde43be8d06fa06448478755f414de20c00705d27928ac5a8e0bba140d02

18. Si se requiere copiar archivos del host al contenedor, la mejor práctica es realizarlo desde su creación mediante Dockerfile, suponiendo que en el host tenemos un directorio archivos que deseamos tener en el contenedor dentro del directorio stuff, ejecutamos

user@computer:$ ls archivos/
notas1.txt notas2.txt
$ cat Dockerfile
FROM debian
RUN apt-get update && apt-get install vim -qqy
COPY ./archivos/ /stuff
$ sudo docker build -t cosasaxl .
[sudo] password for alex.callejas:
Sending build context to Docker daemon 556 kB
Step 1/3 : FROM debian
---> a20fd0d59cf1
Step 2/3 : RUN apt-get update && apt-get install vim -qqy
---> Running in d095c62569fa
Ign:1 http://deb.debian.org/debian stretch InRelease
Get:2 http://deb.debian.org/debian stretch-updates InRelease [88.5 kB]
Get:3 http://security.debian.org stretch/updates InRelease [62.9 kB]
Get:4 http://deb.debian.org/debian stretch Release [118 kB]
Get:5 http://deb.debian.org/debian stretch Release.gpg [2373 B]
Get:6 http://security.debian.org stretch/updates/main amd64 Packages [169 kB]
Get:7 http://deb.debian.org/debian stretch/main amd64 Packages [9497 kB]
Fetched 9938 kB in 5s (1799 kB/s)
Reading package lists...
debconf: delaying package configuration, since apt-utils is not installed
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/editor (editor) in auto mode
---> 56193462f153
Removing intermediate container d095c62569fa
Step 3/3 : COPY ./archivos/ /stuff
---> 83e969244bce
Removing intermediate container 0a687e1b1998
Successfully built 83e969244bce
$ sudo docker run -it cosasaxl bash
root@7f3d34dfa53a:/# ls
bin   dev  home  lib32 libx32 mnt  proc  run srv sys  usr
boot  etc  lib lib64 media opt  root  sbin  stuff tmp  var
root@7f3d34dfa53a:/# ls stuff/
notas1.txt notas2.txt
root@7f3d34dfa53a:/# exit

19. Suponiendo que necesitamos que el contenedor ejecute un script al arrancarlo, lo construimos con la opción ENTRYPOINT 

user@computer:$ cat entrypoint.sh
ls -la
echo "Hola desde entrypoint"
$ cat Dockerfile
FROM debian
RUN apt-get update && apt-get install vim -qqy
COPY ./archivos/ /stuff
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT /entrypoint.sh
$ ls
archivos Dockerfile entrypoint.sh
$ sudo docker build -t cosasaxl .
[sudo] password for alex.callejas:
Sending build context to Docker daemon 557.1 kB
Step 1/5 : FROM debian
---> a20fd0d59cf1
Step 2/5 : RUN apt-get update && apt-get install vim -qqy
---> Using cache
---> 56193462f153
Step 3/5 : COPY ./archivos/ /stuff
---> Using cache
---> 83e969244bce
Step 4/5 : COPY entrypoint.sh /entrypoint.sh
---> e403afe2511c
Removing intermediate container b0c28c21c8ff
Step 5/5 : ENTRYPOINT /entrypoint.sh
---> Running in 4ad3f139001d
---> 2b76fbb9ebba
Removing intermediate container 4ad3f139001d
Successfully built 2b76fbb9ebba
$ sudo docker run -it cosasaxl bash
total 68
drwxr-xr-x. 1 root root 4096 Aug 12 17:18 .
drwxr-xr-x. 1 root root 4096 Aug 12 17:18 ..
-rwxr-xr-x. 1 root root 0 Aug 12 17:18 .dockerenv
lrwxrwxrwx. 1 root root 7 Jul 23 00:00 bin -> usr/bin
drwxr-xr-x. 2 root root 4096 Jul 13 13:04 boot
drwxr-xr-x. 5 root root 360 Aug 12 17:18 dev
-rwxrwxr-x. 1 root root 49 Aug 12 17:14 entrypoint.sh
drwxr-xr-x. 1 root root 4096 Aug 12 17:18 etc
drwxr-xr-x. 2 root root 4096 Jul 13 13:04 home
lrwxrwxrwx. 1 root root 7 Jul 23 00:00 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Jul 23 00:00 lib32 -> usr/lib32
lrwxrwxrwx. 1 root root 9 Jul 23 00:00 lib64 -> usr/lib64
lrwxrwxrwx. 1 root root 10 Jul 23 00:00 libx32 -> usr/libx32
drwxr-xr-x. 2 root root 4096 Jul 23 00:00 media
drwxr-xr-x. 2 root root 4096 Jul 23 00:00 mnt
drwxr-xr-x. 2 root root 4096 Jul 23 00:00 opt
dr-xr-xr-x. 337 root root 0 Aug 12 17:18 proc
drwx------. 2 root root 4096 Jul 23 00:00 root
drwxr-xr-x. 4 root root 4096 Jul 23 00:00 run
lrwxrwxrwx. 1 root root 8 Jul 23 00:00 sbin -> usr/sbin
drwxr-xr-x. 2 root root 4096 Jul 23 00:00 srv
drwxr-xr-x. 2 root root 4096 Aug 12 17:09 stuff
dr-xr-xr-x. 13 root root 0 Aug 12 14:27 sys
drwxrwxrwt. 1 root root 4096 Aug 12 17:09 tmp
drwxr-xr-x. 1 root root 4096 Jul 23 00:00 usr
drwxr-xr-x. 1 root root 4096 Jul 23 00:00 var
Hola desde entrypoint

En un siguiente post, cuando nos den la segunda parte del curso: Intermedio, les compartiré de igual forma mis notas.

P.D.: Hace ya algún tiempo, aquí en el blog, había publicado una muy buena introducción a docker [ver] 😉

Espero les sirva…

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 https://www.microsoft.com/en-us/download/details.aspx?id=13442 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.art; 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.










Domingo 25 de junio de 2017

Activar/desactivar registro de usuarios en WordPress

Registro WordPress

La solución es de forma inmediata, dentro del Escritorio (al que accedas administración del WordPress), le vas hacer click en  a Ajustes, Generales y activas o desactiva el checkbox de: Cualquiera puede registrarse. depende para lo que requieras.

Si lo que tienes  problema con usuarios que se registran y en realidad son robots o personas spammers, usa el plugin que mencione anteriormente  http://blog.julioh.com.ve/?p=476 en el cual se hace ocultar la url de wp-admin  otra forma es usando .httpass dentro de los directorios y bloqueando su acceso, o en su momentos podrías saber cual es tu ip para indicarle desde donde te conectas por ejemplo algo así.

order allow,deny
deny from
deny from
allow from all