apache2 htacces

Mejorando la seguridad en Apache2 .htaccess

En una entrada anterior enseñamos como configurar mod_rewrite en nuestro .htaccess para poner a “punto de caramelo” nuestro Apache2 pero ahora es necesario preveniros de “haber abierto la caja de Pandora”: nuestro servidor web está expuesto a tácticas de intromisión y hasta toma de control por atacantes con malas intenciones. Sirva pues la presente para complementar y ayudaros a proteger vuestros equipos.

Apache mod_rewrite
Apache mod_rewrite

Prerequisitos.

Es bueno que leaís nuestro tutorial para configurar mod_rewrite pero si soís más avanzado os decimos de una vez que tenemos configurado ya un servidor Apache2 sobre Ubuntu 16 en una red de área local con la dirección 192.168.1.47

Para ser más exactos, corremos Apache 2.4 y podemos conocer cuál versión tenemos instalada abriendo una ventana terminal y ganando acceso como “root” o administrador:

root@KEVIN:/home/jimmy# apache2 -v
Server version: Apache/2.4.18 (Ubuntu)
Server built: 2016-07-14T12:32:26

Otra cosa que tenemos activado es el tratamiento de archivos .html o .htm como .php lo cual abre la posibilidad a que nuestra seguridad quede expuesta si alguien logra acceder a escribir en nuestro .htaccess (de nuevo os recordamos que todo está explicado en nuestra entrada anterior sobre como configurar mod_rewrite). Eso quiere decir que tenemos la siguiente instrucción en el archivo .htacces:

AddType application/x-httpd-php .html .htm

Al estar así configurado pasamos a estudiar las posibles brechas en seguridad.

apache2 htacces
apache2 htacces

Lo bueno, lo malo y lo feo.

Recordando la famosa película de vaqueros así clasificaremos las tretas y estrategias, poned atención que cada una de ellas es un caso particular a estudiar, pausar y seguir adelante para, al final, tener un panorama completo de la estrategia a seguir que más convenga a nuestro entorno de trabajo.

Empezaremos por lo malo, luego lo feo y de último lo bueno que podemos hacer.

Lo malo.

php_value auto_append_file.

Vale decir que este comando php_value bien puede estar ubicado ya sea en “PHP config”, “virtualhost settings” o en un archivo .htaccess que es el caso que nos ocupa y más específicamente el valor auto_append_file porque coloca al final de nuestra página web (en este ejemplo didáctico el archivo index.html que trae por defecto Apache al ser instalado) los valores que tengamos en nuestro archivo hosts con la siguiente instrucción:

php_value auto_append_file /etc/hosts

El resultado sería el siguiente:

php_value auto_append_file etc hosts
php_value auto_append_file etc hosts

Que para nuestro servidor de pruebas nos aporta muy poca información pero imaginad si lo tenéis en un servidor en producción y de paso sea compartido por otros sitios web, dicha información sería muy útil a los atacantes.

Otra variante de esta treta es incluir al archivo .htacces en sí mismo y adicionalmente algún código php. Por ejemplo podemos agregar el comando phpinfo(); con el cual podemos visualizar el entorno de variables con que trabajamos y buscar así software específico para nuestra configuración y poder de esta manera tomar control completo, si fueramos atacantes.


1
2
php_value auto_append_file .htaccess
#<?php phpinfo();
php_value auto_append_file htaccess phpinfo
php_value auto_append_file htaccess phpinfo

php_flag display_errors 1

Hasta ahora hemos visto inyecciones de código que se ejecutan cada vez que es cargado y mostrado un archivo .html ¿pero que tal colocar una bomba eventual? Si, como habéis leido, “eventual” es diferente a una bomba de tiempo, una bomba eventual se ejecuta cuando sucede algún disparador. Para este caso el disparador del evento es cuando nos hayamos equivocado programando algún código php, con la salvedad de que el atacante a nuestra web haya colocado un “script” que se lanza en este suceso, pero veamos el código:

php_flag display_errors 1
php_flag html_errors 1
php_value docref_root "'><script>alert('¡Programador perdedor!);</script>"

En la primera y segunda línea lo que se hace es activar la rutina de aviso de errores (que bien en vez del parámetro “1” puede tomar el valor “on”) y en la tercera línea es donde se inserta el código malicioso en sí (acá simplemente mostramos un aviso recriminando el error). Esto sería el equivalente a “castigar” al programador al cometer un error y el script que desencadene podría ser peor aún todavía. Por extraño comportamiento, esto produciría un muy extraño regocijo a nuestro atacante y esperad también ver algún código de aviso para el atacante que nos pudiera servir para dar con el paradero del delincuente digital.

Otra variante sería utilizar php_value docref_ext lo cual duplicaría las ejecuciones del script malicioso.

php_flag display_errors 1
php_flag html_errors 1
php_value docref_root "x"
php_value docref_ext "<script>alert(1);</script>"

QUERY_STRING

En lenguaje HTML y PHP es bien sabido que se puede pasar valores directamente por la barra de direcciones con simplemente agregar al final de la dirección web un signo de cierre de interrogación acompañado del nombre de la variable, un signo de igualdad y el valor de la variable. Si se desean pasar más valores se utiliza un et “&” y se repite el procedimiento. Esto es especialmente útil para iniciar sesión en una página web pero también abre la puerta a posibles robots que intenten, a lo largo de mucho tiempo, ir probando valores automáticamente hasta poder ingresar. Para cerrar esta posibilidad podemos hacer lo siguiente, consideremos el siguiente archivo llamado “bienvenido.hmtl“:

<?php
 echo '<html><body>Bienvenido ';
 if (isset($_GET['nombre'])) {
   $test = $_GET['nombre'];
 } else {
   $test = ' Invitado';
 }
 echo $test;
 echo '</body></html';
?>

Como podéis observar utilizamos el método $_GET a modo didáctico para poder hacer las pruebas sin necesitar de otro archivo con formulario que lo refiera. Si introducimos una consulta como la siguiente:

http://192.168.1.47/bienvenido.html?nombre=Pedro

Obtendremos la siguiente respuesta:

bienvenido html con pase de consulta
bienvenido html con pase de consulta

Pero como buscamos bloquear dichos “accesos directos” debemos modificar nuestro .htaccess de la siguiente manera:

RewriteEngine On
RewriteCond %{QUERY_STRING} .
RewriteRule ^bienvenido\.html /bienvenido.html? [L]

La primera línea sabemos que activa la maquinaría de reescritura de direcciones y la segunda es una condición que se cumple siempre: compara la consulta %{QUERY_STRING} (toda la subcadena de texto a la derecha del signo de interrogación) y lo compara con el metacaracter “.” que significa una cadena de texto con cualquier (cualesquiera) caracter(es) de cualquier longitud (1 ó más) para que lo ejecute el siguiente comando RewriteRule. Este comando simplemente pasa la dirección con el nombre del archivo en cuestión acompañado de la bandera [L] que le indica que no procese las siguientes líneas en el fichero .htaccess . El resultado sería que el fichero bienvenido.html (que contiene un guion de comandos escritos en lenguaje PHP) muestre el mensaje “Bienvenido Invitado” como si no hubiera pasado consulta alguna al servidor web.

bienvenido html con consulta bloqueada
bienvenido html con consulta bloqueada

Para suplementar lo anterior, son bien famosos los robots que hacen publicidad en los comentarios de las entradas de WordPress y por supuesto lo hacen con pases de consultas, las podemos filtrar con palabras claves y prohibirles el acceso. Famosos por ser bien insidiosos son los “spam” de medicamentos para la disfunción eréctil tales como “compre viagra en oferta”, vamos a realizar una regla adicional a lo anterior -pase de consultas-:

RewriteCond %{QUERY_STRING} \b(spill|cialis|ejaculation|erectile)\b [NC,OR]
RewriteCond %{QUERY_STRING} \b(erections|impotence|levitra|libido)\b [NC,OR]
RewriteCond %{QUERY_STRING} \b(fitex|sildenafil|tadalafilo?)\b [NC,OR]
RewriteCond %{QUERY_STRING} \b(viagra|duroval|viasek)\b [NC]
RewriteRule .* - [F]

Como apreciamos agregamos las marcas más conocidas pero aún faltan muchas más, como la lista es larga “encadenamos” cada RewriteCond con la bandera [OR] pero la última línea antes de RewriteRule NO debe contener [OR]. La otra bandera utilizada es [NC] para que coincida en la búsqueda en mayúsculas y/o minúsculas y para finalizar la bandera [F] para prohibir el acceso, que devuelva un código 403.

Poned atención en la palabra clave “tadalafilo?” ya que bloquea “tadalafil” o “tadalafilo” y en idioma castellano los nombres de principios químicos activos siempre la última letra produce sinonimías (otro ejemplo: “ciprofloxacino” y “ciprofloxacina” significan exactamente lo mismo). Esto es así debido que en inglés el género no toma mayor importancia (y en el lenguaje cotidiano da pie a muchas situaciones graciosas que aprovechan guiones de series de televisión “sitcom”) y cuando se traduce al castellano puede tomar valores ambivalentes y el algunos casos hasta extraños. Al contrario, en este campo, en el idiom inglés son pocos los casos que esto sucede (de hecho ellos GUSTAN de palabras cortas, no hablemos ya si gustan de sinonimias, además ellos utilizan marcas comerciales como nombres propios para los principios químicos activos), un caso muy particular es el medicamento contra la depresión llamado “Prozac” y por algunos es escrito como “Prosac”: en nuestras reglas de expresiones regulares lo podemos marcar como “pro[sz]ac” para que sea detectado -ambas escrituras- y bloqueado en los comentarios de cada entrada pública de nuestro blog.

Lo feo 🙁

php_flag engine 0

Con esta única línea en nuestro archivo .htaccess hará que automáticamente podamos descargar completamente un archivo .html o .php aunque igual se ejecute el guión php obtenemos el código fuente completo, incluidas contraseñas, comentarios, los diversos include hacia otros ficheros, etc. que hayamos colocado en dichos archivos. Nos parece que es la más maliciosa inyección de código en nuestro servidor.

LO BUENO 😎

IndexIgnore *

De manera predeterminada un servidor web Apache siempre buscará mostrar un archivo llamado “index.html” o “index.php” pero si dicho archivo -por alguna u otra razón- no se encuentra entonces se le mostrará al visitante -o atacante- los archivos y subdirectorios presentes, mirad un ejemplo:

lista directorios index of
lista directorios index of

Para evitar dicho comportamiento debemos agregar a nuestro .htaccess las siguientes líneas:

IndexIgnore *
Options +FollowSymLinks All -Indexes

Al guardar y revisitar mostrará lo siguiente:

Listado negado de directorio
Listado negado de directorio

De tener algún problema con la opción “+FollowSymLinks” (mirad imagen siguiente) simplemente comentarla y guardar de nuevo el archivo .htaccess.

Internal serve error
Internal serve error

DirectoryIndex

Mencionamos en el punto anterior que siempre buscará servir un fichero “index” pero ¿qué tal si tenemos dos ficheros llamados “index.php” e “index.html” en el mismo directorio?

Pues con la orden DirectoryIndex podemos ordenar cual se ejecuta primero -y de no conseguirse ejecuta el segundo-, esto puede ser de utilidad si queremos “forzar” cuál clase de archivos queremos siempre mostrar.

DirectoryIndex index.html index.php

En este ejemplo -recordad la configuración de servidor- obligamos que sea mostrado “index.html” primero (y dentro tenemos el código php necesario que será ejecutado por nuestra configuración especial .htaccess) y de no conseguirse buscaría mostrar “index.php”. Un atacante podría colocar su propio “index.php” y modificar .htaccess para camiar este orden. Nosotros preferimos utilizar solamente lo siguiente:

DirectoryIndex index.html

Así al faltar “index.html” no muestra ninguna página e intentará mostrar los archivos y subdirectorios opción la cual le eliminamos la visualización en el punto anterior.

FileETag MTime Size

Habilitar los ETag en un servidor web trae doble beneficio: por una parte ahorramos en tráfico de bytes lo cual redunda en rapidez al cargar nuestro sitio y el beneficio de la seguridad adicional.

ETags funciona identificando en un archivo TAGS las características que identifican unívocamente para fichero que pondemos a disposición del público. Es transmitido y guardado por el cliente en un caché, luego si recargan la página el servidor envia de nuevo el ETag y si el recurso no ha cambiado pues se ahorra el envio.

Por parte de la seguridad es útil si utilizamos rsync desde un servidor que origina datos (y que no está expuesto a la internet) y sirve para “alimentar” uno o varios servidores espejos -o nodos-. Hay un interesante artículo titulado “Rsync: Sincroniza tus carpetas o respalda tus archivos en Linux – Debian – Ubuntu – Derivados” escrito por el experimentado usuario Twitter @Xombra donde encontraréis mayores detalles acerca del uso de rsync como estrategia de respaldo.

 

Si utilizamos un servidor único podemos agregar INode, cuando hay varios servidores web para una misma página los ETags se vuelven inútiles ya que en cada servidor cada INode es diferente con lo cual incluso incrementa la carga de trabajo en nuestro sitio web. Es debido a esto que se les activa solamente dos atributos: tiempo (MTime) y tamaño (Size).

Para habilitarlo debemos colocar lo siguiente en nuestro archivo .htaccess (pendientes con detalle del INode):

FileETag INode MTime Size

SetEnvIf user-agent

Otra manera de proteger en alguna manera nuestro Apache es denegando a ciertos agentes que visiten nuestro sitio. Cada navegador web envia su identificación al solicitar una página web y a nuestro servidor podemos denegar el acceso (esto no quiere decir que a su vez los atacantes “disfrazen” su software de ataque como algún navegador web popular). La sintaxis que debemos usar es la siguiente:

SetEnvIf user-agent "Wget" stayout=1
SetEnvIf user-agent "Indy Library" stayout=1
SetEnvIf user-agent "libwww-perl" stayout=1
SetEnvIf user-agent "Download Demon" stayout=1
SetEnvIf user-agent "GetRight" stayout=1
SetEnvIf user-agent "GetWeb!" stayout=1
SetEnvIf user-agent "Go!Zilla" stayout=1
SetEnvIf user-agent "Go-Ahead-Got-It" stayout=1
SetEnvIf user-agent "GrabNet" stayout=1
SetEnvIf user-agent "TurnitinBot" stayout=1
deny from env=stayout

En realidad la última línea es la que bloquea los agentes, fijaros bien que la primera línea bloquea al famoso wget que si bien no es un programa malicioso en sí mismo si que se utiliza en scripts que pueden ser mal utilizados. Si tenéis algún script propio que acceda a vuestro servidor web tened cuidado en marcar como comentario dicha línea.

wget bloqueado por htaccess
wget bloqueado por htaccess

Fuentes consultadas.

En idioma inglés.

Lo malo:

Lo bueno:

Lo feo:

Joyeux Noel

🎵¡Feliz Navidad, Próspero Año y Felicidad!🎶

Feliz Navidad – José Feliciano – (En vivo, 1973, Dänemark).

Joyeux Noel
Joyeux Noël

¡Joyeux Noël!

¡Merry Christmas!

¡Frohe Weihnachten!

¡Buon Natale!

Que esta navidad 2016 sea siempre un recordatorio de que más importante que lo que tenemos es en realidad a QUIENES tenemos a nuestro lado,

¡Feliz Navidad a todos y todas!

Apache mod_rewrite

Tutorial para configurar mod_rewrite en Apache sobre Ubuntu

Para los que “montamos” páginas web siempre es útil ocultar las extensiones de nuestros archivos a ser servidos y así despistar a posibles atacantes pero es mejor aún para que nuestros usuarios les sea más fácil recordar nuestras secciones e incluso promociones publicitarias, ¿ya tenemos vuestra atención?

Introducción.

En un mundo donde ya prácticamente todo el mundo introduce una búsqueda en Google o DuckDuckGo para llegar a nuestra página web -exponiéndose a redirecciones hacia páginas falsas por los buscadores web- pues nosotros nos empeñamos en utilizar la barra de direcciones de nuestro navegador web recomendado, Mozilla Firefox.

Es así entonces que podemos publicar alguna promoción en algún medio de comunicación como televisión o prensa y queremos que se pongan en contacto con nosotros por medio de una página web que a tal efecto hayamos programado para ello. Dicha dirección podría ser:

nuestrodominio.com/contacto

Como véis no incluimos “www” ni tampoco las dobles barras (de hecho Tim Berners-Lee se disculpó públicamente por haber hecho la redundancia y hacernos escribir billones de veces ese caracter adicional) ni “http:” -la mayoría de los navegadores web completan automáticamente la dirección- pero mejor aún hemos obviado la extensión del archivo .html, algo que consideramos podría confundir a cualquier usuario común (sí, que hasta los “nativos digitales” también se pueden equivocar).

La intención de este tutorial es CONFIGURAR nuestro servidor web para que acepte dicha dirección y redirija a nuestros posibles clientes de manera transparente y así, a futuro, trabajemos y aumentemos nuestros ingresos 😉 .

Prefacio.

Aunque no estamos escribiendo un libro, estas páginas web algún día las podríamos recopilar en un ejemplar, por eso el uso de la palabra “prefacio“. Lo que necesitaremos para nuestra práctica didáctica es un ordenador con Ubuntu 16 instalado (que también vale este tutorial para Ubuntu 14) al cual le instalaremos Apache2. Para nuestro caso nuestra máquina tiene una dirección IP fija en nuestra red área de local 192.168.1.47 CAMBIAD lo que veaís aquí por vuestra propia dirección IP local. Lo que acá escribimos es válido también para cuando queráis montar vuestro servidor de producción en la internet y solo está limitado por las restricciones que os imponga vuestro proveedor de hospedaje. Este tutorial es completo y el escenario sería o bien una máquina virtual o real que alquileís a un proveedor de alojamiento (es más costoso que alojamiento compartido) o vuestro ordenador con una dirección IP fija que os venda vuestro ISP y que os conécteis bien sea por “ADSL” o “frame relay“.

Instalando Apache Web Server:

Abrimos una ventana de comandos (si no sabéis cómo, leed nuestro tutorial) e introducimos el siguiente comando:

sudo apt-get update
sudo apt-get install apache2

La primera línea actualiza los paquetes disponibles para nuestra versión GNU/Linux que tengamos instalado (Ubuntu 16 en este ejemplo) y la segunda línea instala el servidor web Apache2, software que ha evolucionado mucho desde los años 90. Nótese que usamos “sudo” para tener derechos de administrador o “root” y deberemos colocar la contraseña respectiva (luego el sistema obvia esta solicitud si corremos varios comandos seguidos en corto período de tiempo). Podremos ver algo muy parecido a esto, si todo sale bien:

apt-get install apache2
apt-get install apache2

Para probar que tenemos nuestro servidor instalado podemos navegar hasta nuestra propia dirección IP o en su defecto podemos utilizar la palabra clave “localhost” y eso sí, en la barra de direcciones de nuestro navegador (los buscadores web NO mostrarán enlace hacia nuestro servidor).

Apache2 Ubuntu Default Page
Apache2 Ubuntu Default Page

Habilitando mod_rewrite.

Antes de meternos de lleno con mod_rewrite cumplimos con avisaros que también existe la función mod_alias que es muchísimo más sencilla para resolver rápidamente ciertas situaciones -e incluso cuenta con los comando más avanzados llamados “<Location>” y “<LocationMatch>“- .

Pero si queremos evolucionar y disponer de una herramienta poderosa (y compleja) estudiaremos mod_rewrite. Para activar mod_rewrite debemos ejecutar las siguiente líneas:

sudo a2enmod rewrite
sudo service apache2 restart

La segunda línea sirve para que el servicio o “daemon” reinicie con la configuración deseada. En el ambiente GNU/Linux son muy parcos y estoicos, si todo va bien simplemente veréis de nuevo el indicador de la línea de comando “prompt” -pero al finalizar el primer comando nos indica que falta alguna instrucción que sea importante para finalizar el comando-. ES DECIR no espéreis a cada rato mensaje de confirmación de comando ejecutado -otra cosa, en raras y contadas ocasiones deberemos hacer un reinicio completo de nuestro ordenador, con reiniciar los servicios respectivos tiene para seguir funcionando luego de nuestros cambios-.

Como ya sabéis los comandos en GNU/Linux diferencian letras mayúsculas de minúsculas y por supuesto debemos escribir muy bien los comandos, no como nosotros que nos equivocamos pero luego correjimos, mirad:

sudo a2enmod rewrite
sudo a2enmod rewrite

Configurando .htaccess

Ahora debemos crear un archivo (oculto, mirad el puntito que precede el nombre del fichero) muy importante en el funcionamiento de Apache. Si lo tenemos ubicado en el directorio raíz de nuestro servidor web se aplicará a todas las subcarpetas que tengamos pero cada subcarpeta podrá tener su propio “.htaccess” que regirá para la carpeta donde esté ubicado (y a su vez las subcarpetas que contenga) obviando las instrucciones que hayamos colocado en nuestro “.htacces raíz”.

Pero antes, por razones de seguridad, debemos tener acceso (desde Apache) para crear y escribir dicho fichero, usamos nano -o vuestro editor de texto favorito- para modificar el siguiente archivo:

sudo nano /etc/apache2/sites-enabled/000-default.conf

Tras dentro del cual debemos insertar lo siguiente (notad los comentarios que insertamos en castellano en la imagen más abajo:)

  <Directory /var/www/html>
     Options Indexes FollowSymLinks MultiViews
     AllowOverride All
     Order allow,deny
     allow from all
  </Directory>
000-default.conf
000-default.conf

Es sumamente importante indentar las líneas (en nano lo podéis hacer rápidamente pulsando la tecla TAB para cada sangría) y respetar mayúsculas y minúsculas. Luego debemos reiniciar el servicio web Apache con el consabido comando:

sudo service apache2 restart

Como información adicional os contamos que el archivo “000-default.conf” es el archivo por defecto del primer dominio que sea servido por nuestro ordenador, es decir, podremos a futuro alojar varios dominios en una sola máquina. De este modo el segundo dominio utilizará el archivo “001-default.conf” y así sucesivamente, pero ¿cómo reconoce nuestro servidor web cual dominio entregar? Estad atentos más adelante en este tutorial os daremos noción de ello -y a futuro publicaremos una entrada totalmente dedicada a configurar un servidor Apache con varios dominios virtuales-.

Creando .htaccess

Ya que tenemos configurado a Apache para que acepte nuestro .htaccess procedemos a crearlo. Para ello debemos utilizar nuestro editor de archivos de texto favorito (usaremos nano en este caso) y escribiremos lo siguiente:


1
sudo nano /var/www/html/.htaccess

Y le agregamos una sola línea:


1
RewriteEngine on
RewriteEngine on
RewriteEngine on

Guardamos y luego debemos garantizar su acceso para los demás usuarios, nosotros o cualquiera otro usuario que edite nuestra página web (recordad que lo creamos con la credencial de administrador o “root”):


1
sudo chmod 644 /var/www/html/.htaccess

¡Y listo! Ya tenemos configurado nuestro .htaccess pero como decía Santo Tomás “hasta no ver, no creer” así que vamos a probar si es verdad que funciona.

Creando nuestra pequeña página web.

Como dijimos al principio haremos una página de contacto sin mayores pretensiones, en este ejemplo indicando nuestro correo electrónico de manera tal que no sea capturada por los robots que esparcen “spam” a diestra y siniestra (para una explicación más a fondo visitad nuestro tutorial sobre HTML5):

<html>
        <head>
                <title>Contacto.</title>
        </head>
        <body>
                <h1>Correo electr&oacutenico:</h1>
                <p> contacto EN 192.168.1.47 </p>
        </body>
</html>
contacto.html
contacto.html

Y al navegar desde nuestra barra de dirección de nuestro navegador web observamos que tranquilamente podemos obviar la extensión del archivo y nuestro Apache dará por bien servida a nuestros propósitos sin mayor configuración, pero…

contacto
contacto

… si escribimos “Contacto” (o cualquiera de sus variaciones en mayúsculas o minúsculas) veremos algo que se asemeja a esto:

Contacto
Contacto

Para solucionar esto hemos de echar mano en el archivo .htaccess y hacer uso de las expresiones regulares.

Usando expresiones regulares o racionales.

De antemano: Apache utiliza los conceptos de expresiones regulares o racionales desde el punto de vista del lenguaje Perl 5, ciertas diferencias hay que tenerlas muy en cuenta si usamos otros lenguajes que soportan o tienen librerías que permiten el uso de expresiones regulares (a saber hoy en día, sin que sea tajante la lista: AWK, C++, Java, JavaScript, PCRE, PHP, Python y .NET framework ).


1
sudo nano /var/www/html/.htaccess

Volvemos a modificar nuestro archivo .htaccess y agregamos la siguiente línea:


1
RewriteRule ^contacto.html$ contacto.html [NC]

Guardamos en inmediatamente la regla es puesta en funcionamiento, lo podemos comprobar al buscar nuestra página (recordad poner vuestra propia direción IP o dominio web) /Contacto.html y todas sus variantes, probad y volved.


Explicamos entonces la expresión regular -o racional- utilizada, el significado de cada metacaracter:

  • “contacto.html”: es el nombre del fichero al cual queremos “redirigir” de manera “transparente” al usuario, es decir, mostrará la página a pesar de como escriba el visitante el enlace web (mayúsculas o minúsculas).
  • “^”: representa todo el enlace a la izquierda de nuestra palabra clave (en nuestro caso el nombre de un fichero pero esto no es necesariamente así todo el tiempo, ya veremos más adelante).
  • “$”: representa todo el enlace a la derecha de nuestra palabra clave, éste y el anterior metacaracter actúan a modo de delimitadores, lo podemos ver de esa manera para simplificar su uso.
  • “[NC]”: es una bandera o banderín que indica que use indistintamente minúsculas y/o mayúsculas en nuestra palabra clave.

En conclusión que nuestros usuarios podrán escribir “contacto” con o sin extensión, en mayúsculas y/o minúsculas (todas sus combinaciones) -probad- más sin embargo las siguientes expresiones devolverán una respuesta 404 “página no encontrada”:

  1. 192.168.1.47/contacto.html/
  2. 192.168.1.47/contacto.htm
  3. 192.168.1.47/contact

En el primero se trata de abrir un subdirectorio, en el segundo y el tercer caso se trata de abrir un archivo totalmente diferente (casos que al final también analizaremos y trataremos).

Actualizado el sábado 5 de agosto de 2017.

Que este tema de las expresiones regulares da para una entrada completa en nuestro blog, por la red social Twitter econtramos una excelente imagen que lo explica muy rápidamente y a continuación leímos las opiniones de varios programadores al respecto. Os debemos ese tutorial y en cuanto hallemos tiempo libre de nuestro trabajo de ganarnos el pan de cada día lo haremos.

 

Reglas de “Rewrite”.

De las expresiones regulares o racionales, ese tema solo, solito él, da para una entrada completa, sin embargo ya tenéis la práctica (si algo no tenéis claro subid y practicad de nuevo) y es por ello que acá estudiaremos unas cuantas reglas más avanzadas del comando “RewriteRule” -valga la redundancia multilingüe, si es que eso existe- utilizando las expresiones regulares o racionales para usos más avanzados, ¡vamos!

RewriteRule patrón sustitución bandera
  • Cada regla ha de colocarse en cada archivo .htaccess al principio de la línea con la palabra clave “RewriteRule“.
  • A continuación escribiremos el patrón a buscar en el enlace recibido por nuestro servidor web (ya comentamos de entrada mera que los navegadores web modernos agregan “http://www”, colocan todo el dominio en minúsculas -NO los subdominios y archivos- y hasta completan “.com” si se escribe dominio y se presiona CTRL+INTRO).
  • Sustitución, osea, lo que queremos enviar a nuestro servidor web y que se comporte como si el mismo usuario lo hubiera escrito tal cual (si queréis, pensad en este proceso como un corrector ortográfico automático a toda petición web que llegue).
  • Opcional: bandera o banderín para modificar la regla.

Ejemplo sencillo: imaginad que ahora en nuestra cuenta Twitter, nuestro perfil, colocamos un enlace web para que los interesados sepan nuestro correo electrónico pero queremos reutilizar la paginita web “contacto.html” para ello, pues lo que debemos hacer es anteceder en nuestras reglas lo siguiente:

RewriteRule ^correoe$ contacto.html [NC]
RewriteRule ^contacto.html$ contacto.html [NC]

Como podeís observar en la primera línea, simplemente si un visitante escribe:

http://www.nuestrodominio.com/correoe

pues simplemente nuestro servidor web recibirá la orden de mostrar nuestro archivo “contacto.html” y listo, sin mayor trabajo hemos solucionado otro “problema” pero la cosa va más allá, vamos a preguntarnos ¿Qué tal si escribimos “Contacto.Html” en vez de “contacto.html”? Como bien sabéis en GNU/Linux (y los servidores web e internet en general) las mayúsculas se distinguen de las minúsculas, no son lo mismo a pesar que nuestro cerebro las siga tratando como iguales, ¿qué sucedería?

RewriteRule ^correoe$ Contacto.htmL
RewriteRule ^contacto.html$ contacto.html [NC]

Advertencia imagen pequeña

No, no estaís equivocados, en efecto, el archivo “Contacto.htmL” NO existe en nuestro servidor web pero igual nos “devuelve” el contenido de “contacto.hmtl”, resulta y acontece que cada regla se ejecuta una a una y la siguiente regla corrige lo que entrega la regla anterior -muchas otras personas lo ven como si se “sobreescribe” la una a la otra, pero en realidad nosotros lo vemos de manera muy similar al comando tubería “|” que utiliza el shell de GNU/Linux.

Anda, probad a gusto tu archivo .htaccess, quitad la segunda línea y ensayad, luego volved y seguiremos practicando otras cosillas.


Utilizando patrones alternos.

En este punto continuaremos con el ejemplo anterior: ¿qué tal si queremos escribir ambas reglas en una sola línea?

Para ello haremos uso del los paréntesis normales “()” y el metacaracter “|” que en este caso viene a significar “o” (“or” en idioma inglés) -no confundir con el comando grep que mencionamos párrafos arriba, son contextos diferentes debido a que están encerrados entre paréntesis-:

RewriteRule ^(contacto.html|correoe.html)$ contacto.html [NC]

Ya sabemos como funciona la regla, aquí lo nuevo es como expresamos el patrón y le estamos indicando que ya sea que recibamos “contacto.html” o “correoe.html” -en mayúsculas y/o minúsculas mirad la bandera– siempre “devolverá” la cadena de texto “contacto.html”, precisamente el nombre del fichero que mostrará nuestro servidor web. Incluso podemos ir más allá y quitar las extensiones “.html” del patrón e igual funcionará, probad esto:

RewriteRule ^(contacto|correoe)$ contacto.html [NC]

Utilizando el pase de parámetros.

De nuevo seguimos el hilo con el ejemplo anterior, ¿qué tal si quisiéramos saber cómo llegó nuestro usuario hasta nuestro servidor -preguntando por “correoe.html” o “contacto.html”?

Esto lo podemos lograr insertandole un poco de lenguaje PHP, pero vayamos por partes y configuremos nuestro ordenador:


En nuestro servidor web Apache debemos instalar las librerías que soportan PHP versión 7 (en Ubuntu 16):

apt-get install libapache2-mod-php
sudo a2enmod php7.0
sudo service apache2 restart
  1. En la primera línea instalamos las librerías php.
  2. En la segunda línea activamos php 7 para Apache.
  3. En la tercera línea reiniciamos el servicio Aapache.

Si todo va bien podremos examinar la configuración PHP con un archivo que podemos crear nosotros mismos con una línea: “<? phpinfo() ?>” y lo guardamos con el nombre que más nos guste. Al “llamarlo” por el navegador web nos mostrará algo parecido a lo siguiente:

PHP 7 en Apache 2 sobre Ubuntu 16
PHP 7 en Apache 2 sobre Ubuntu 16

NOTA: en un servidor “en producción” por razones de seguridad NUNCA debemos dejar un archivo con la función “phpinfo()” : haría que cualquier atacante conozca nuestro “entorno” y le sea más fácil utilizar herramientas específicas contra las versiones de software que tengamos instalado en nuestro ordenador configurado para trabajo público.


Ha llegado la hora, pues, de modificar nuestro .htaccess para que trabaje con lenguaje PHP:

AddType application/x-httpd-php .html .htm
RewriteRule ^(contacto|contacto.html|correoe)$ contacto.html?origen=$1 [NC,QSA]
  • En nuestro archivo .htaccess la primera línea indica a nuestro servidor Apache que trate los archivos .html y .htm como .php .
  • En la segunda línea añadimos la bandera “QSA” (“Query String Append”) la cual permite pasar de manera intacta la palabra clave recibida, tal cual fue escrita, por medio de un método GET al “interior” del archivo HTML (“?origen=$1”).
  • Por último el comodín $1 indica por cual de las opciones “entra” la consulta (si tuviéramos otro paréntesis con opciones “|” recuperaríamos dicha coincidencia o elección con $2 y así sucesivamente).
RewriteRule y variables seleccionadas
RewriteRule y variables seleccionadas

En nuestro archivo “contacto.html” modificamos para que reconozca las palabras claves “contacto” y “correoe”: con la primera escribiremos “Gracias por conocer nuestra promoción en TELEVISION” y a la segunda “Gracias por conocer nuestra promoción en PERIÓDICO”.

  • “contacto” -> “TELEVISION”.
  • “correoe” -> “PRENSA”.
<html>
  <head><title>Contacto.</title></head>
  <body>
    <?php
      $parametro = strtolower($_GET['origen']);
      $contacto = strpos($parametro,'contacto');
      if ($contacto !== false) {
        echo(' ¡Gracias por conocer nuestra promoción en TELEVISION!');
      }else{
        echo(' ¡Gracias por conocer nuestra promoción en PRENSA!');
      }
    ?>
    <h1>Correo electr&oacutenico:</h1>
    <p> contacto EN 192.168.1.47 </p>
  </body>
</html>

Como veís con el lenguaje PHP buscamos la palabra clave “contacto” para notificar que el cliente vio la promoción por televisión, el otro único valor posible es “correoe” ya que la regla mod_rewrite filtra lo que escribe el usuario.

  • Con el comando $_GET[‘origen’] obtenemos la cadena $1 del comando RewriteRule.
  • Con el comando strtolower() lo convertimos todo a minúsculas.
  • Con el comando strpos() obtenemos FALSO si no se haya la palabra clave, de lo contrario devuelve un valor mayor o igual a cero.
  • Teniendo en cuenta lo anterior se debe utilizar la comparación ($contacto !== false) por negación para obtener el resultado correcto.

Hasta acá hemos considerado que el usuario o visitante escriba ya sea “correoe” o “contacto” -con todas sus variantes, con o sin extensión (.html o .htm) pero ¿Qué ocurriría si, dado el caso, el navegante escribiera “correo”, es decir, obviara la última letra? En este caso nuestro servidor simplemente devolvería un mensaje de error 404 como este:

Ejemplo de página no encontrada.
Ejemplo de página no encontrada.

Podemos, con propósitos didácticos, ampliar nuestro estudio de Rewrite con un comando adicional: RewriteCond.

Reglas de “RewriteCond”.

El comando “RewriteCond” nos permite evaluar una condición y de ser cierta ejecutará la siguiente e inmediata línea “Rewrite” de lo contrario la saltará y seguira evaluando el resto de las líneas de nuestro fichero .htaccess (si es que hubieran más líneas). Otro punto a tener en cuenta es que se pueden tener varias líneas RewriteCond contínuas una después de la otra y si alguna se cumple se ejecutará la siguiente e inmediata línea “Rewrite”.

Veamos la sintaxis de RewriteCond:

RewriteCond cadena condicion banderas
  • RewriteCond: el comando en sí mismo que debe ser sucedido en la siguiente línea con un comando “RewriteRule”.
  • Cadena: lo que vamos a comprobar, la entrada de datos.
  • Condicion: lo que le vamos a aplicar a la cadena, con la que vamos a comparar y que nos devolverá un valor verdadero o falso.
  • Banderas: modifican el comportamiento de la condicion y va entre corchetes y separadas por comas, si son varias y tal como lo vimos con el comando “RewriteRule”.

Como vemos ya tenemos la teoría, ahora vayamos a la práctica. Seguiremos con nuestro ejemplo anterior: ¿qué sucede si el visitante de nuestra página web escribiera mal la dirección web (URI) y obtuviera un mensaje con error 404?

Podríamos “redirigir” la dirección solicitada hacia la página principal de nuestro servidor web de manera transparente con nuestro archivo .htaccess pero primero una advertencia:


Advertencia imagen pequeña

Esta NO es la manera correcta de tratar una visita a nuestra servidor web que no contenga, por alguna razón (página borrada, error del usuario, etc) una URI solicitada. Lo “legal” es manejar el error 404 con una página web personalizada (de hecho la que vemos es la que trae Apache por defecto) y recomendamos que transcurrido un tiempo necesario para su lectura sea redirigida automáticamente hacia nuestra página web principal (esto escapa a este tutorial pero podéis hacerlo con JavaScript o incluso PHP).

Para configurar nuestra propia página web personalizada para el error 404 podemos hacerla a nuestro gusto/diseño y nombrarla, por ejemplo, “404_personalizado.html” y ubicarla en el directorio raíz para luego agregar a nuestro archivo .htaccess la siguiente línea:

ErrorDocument 404 /404_personalizado.html

Retomando nuestro ejemplo podemos agregar a nuestro .htaccess las siguientes líneas que evaluarán y tratarán la entrada de la URL recibida y la ubicaremos al final del fichero para que sea ejecutada en último lugar (si la colocamos antes al llegar una consulta por “/correoe” automáticamente será redirigida a la página principal):

AddType application/x-httpd-php .html .htm
RewriteEngine on
RewriteRule ^(contacto|contacto.html|correoe)$ contacto.html?origen=$1 [NC,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ %1

Las 3 primeras líneas ya las hemos explicado y aprendido ahora expliquemos las dos líneas agregadas:

  • “RewriteCond”: El comando que nos permite evaluar una condición.
  • “%{REQUEST_FILENAME}”: El archivo solicitado, luego de haber recibido la URI (con confundir con {REQUEST_URI} ).
  • “!”: es un operador lógico que invierte un valor, por ejemplo de falso a verdadero.
  • “-f”: Le indica a nuestro servidor que compruebe si es un archivo es “regular”, esto es, que esté bien escrito y que exista en nuestro ordenador -y devuelve verdadero si esto se cumple-.
  • Si no se cumple el punto anterior y devuelve falso con el operador “!” lo convertimos en verdadero y tenga la respuesta positiva para ejecutar la siguiente línea “RewriteRule”.
  • “RewriteRule”: con la respuesta positiva recibida comienza a trabajar comparando con el patrón siguiente.
  • “^(.*)$”: los metacaracteres “^” y “$” ya los conocemos, los nuevos son “.” y “*” que indican que compare -y acepte- cualquier caracter y cualquier cantidad de los mismos, es decir, acepte toda entrada posible (el punto indica que puede ser cualquier caracter y el asterisco indica que dicho caracter se puede repetir cualquier cantidad de veces). Como cumple con el patrón procede a aplicar la regla.
  • ¿Recuerdan la variable “$1” que nos permitía elegir que opción de un patrón recibíamos? Ahora con la variable “%1” nos permite pasar intacta la referencia recibida de la “RewriteCond” (la parte que corresponde a nuestro dominio) que desencadenó la ejecución de la “RewriteRule”.

En este punto consideramos prudente mostrar de forma un tanto gráfica la nomenclatura de

Un último ejemplo de “RewriteCond”.

Para finalizar este tutorial vamos a proponernos el bloquear el acceso a una dirección IP4 en particular. Para nuestros propósitos didácticos tenemos una red de área local con nuestro servidor web en 192.168.1.47 (la misma a lo largo de toda esta entrada) y una máquina virtual con la dirección IP4 192.168.1.78 la cual queremos bloquear y para ello agregaremos lo siguiente:


1
2
RewriteCond %{REMOTE_ADDR} ^(192\.168\.1\.78)$
RewriteRule (.*) - [F,L]

Pasamos a explicar línea por línea y comando por comando:

  • “RewriteCond”: comando para evaluar una condición.
  • “%{REMOTE_ADDR}”: una variable que contiene la dirección IP del visitante.
  • “^” y “$”: delimitadores izquierdo y derecho de la dirección IP recibida.
  • “(” y “)”: cadena a evaluar con expresion regular.
  • “\”: la barra invertida sirve para indicarle a nuestro servidor web que el punto a la derecha lo considere como símbolo y NO como metacaracter (ver ejemplo anterior de error 404).
  • Los números pues son la dirección IP a bloquear.
  • “RewriteRule”: es la línea que sirve a la(s) última(s) “RewriteCond”.
  • “(.*)”: indica que acepte cualquier cadena de texto -ver ejemplo arriba-.
  • “-“: un guión para que NO sustituya nada ya que la bandera hará el trabajo por nosotros -ver siguiente punto-.
  • “[F,L]”: son dos banderas con dos instrucciones diferentes, la letra “F” le indica que envie el “mensaje” de prohibido (en realidad devuelve un “error 403” el cual también podemos personalizar con un fichero .html a nuestro gusto y conveniencia tal y como lo hicimos con el “No encontrado 404”). La letra “L” es muy importante e indica que es la última (“last”) regla a aplicar y que no revise las siguientes (si las hubiere) líneas en .htaccess . Esto es así porque si de plano le prohibimos el acceso ¿para qué vamos a revisar reglas adicionales?

La probamos y veremos algo muy similar a esto:

403 Forbidden
403 Forbidden

Si por el contrario queremos que solamente esa dirección IP tenga acceso al servidor web (por ejemplo queremos”administrar” nuestro servidor desde esa única y exclusiva dirección IP, sin que nadie nos moleste) simplemente antecedemos el caracter lógico “!” que inverte la respuesta de la comparación.

En idioma inglés:

Enlaces hacia expresiones regulares:

En idioma japonés:

 

Canaima software libre.

Gobierno lanzó oficialmente el sistema operativo GNU/Linux/Canaima 5.0

El vicepresidente ejecutivo, Aristóbulo Istúriz, estimó que con la incorporación
de la nueva herramienta se apunta hacia la independencia tecnológica del país.

Texto: Romer Viera.
Fotos: Héctor Rattia.
Caracas.

Canaima software libre.
Canaima software libre.

Ministras, ministros y representantes de empresas públicas y privadas que integran el Consejo Nacional de Economía Productiva se reunieron ayer en la sesión número 47 de esta instancia en la que, entre otras cosas, se formalizó el lanzamiento del sistema operativo Canaima GNU/Linux, en su versión 5.0, una creación cien por ciento venezolana, que a decir del vicepresidente ejecutivo, Aristóbulo Istúriz, apunta hacia la independencia tecnológica del país.

El sistema operativo se adapta a las necesidades de los estudiantes y activistas comunitarios.
El sistema operativo se adapta a las necesidades de los estudiantes y activistas comunitarios.

La reunión se realizó en el salón Ezequiel Zamora del Palacio Blanco de Miraflores, donde Istúriz hizo énfasis en los “distintos mecanismos de dominación utilizados por el imperialismo, entre ellos, los diseñados para crear dependencia tecnológica. En este sentido, recordó el trabajo emprendido por el comandante Hugo Chávez, y continuado por el presidente Nicolás Maduro, para “romper los lazos de dominación” que atan al país a las potencias extranjeras.

Como parte de su disertación, Istúriz precisó el papel que las potencias imperiales del mundo asignan a los países en proceso de desarrollo, a los cuales reconocen solo como generadores de materia prima sin la posibilidad de aumentar sus capacidades industriales y tecnológicas.
Istúriz sostuvo su apreciación sobre lo extraordinario del proyecto Canaima. Sin embargo, manifestó que si hay algo que perfeccionarle es el aspecto relacionado con la divulgación de sus características y bondades.

El lanzamiento se efectuó en el contexto de un encuentro en el que fueron divulgados los avances de 2016 de las carteras ministeriales que integran el consejo. Logros que, de acuerdo con el Vicepresidente, representan “lo que debe ser el salto hacia un nuevo modelo económico y socialista”.

De acuerdo con Kenny Ossa, presidente del Centro Nacional de Tecnologías de Información (CNTI), el sistema operativo Canaima GNU/Linux 5.0 está basado en las plataformas libres más estables y modernas del mundo, como Debian y Linux Mint. Aseveró que es una herramienta que incorpora elementos de orden tecnológico, comunitario y estratégico, con lo que se busca garantizar la seguridad nacional y avanzar en el modelo económico productivo establecido en la Agenda Económica Bolivariana.

El sistema operativo fue diseñado para satisfacer las necesidades de usuarias y usuarios del Programa Canaima Educativo, activistas comunitarios del software libre, servidoras y servidores del sistema público nacional, estudiantes, unidades socioproductivas y personas con discapacidad visual o auditiva, entre otros.

6.517 millones para la reinversión.

Según Ossa, su utilización en todas las instancias del sector de público permitiría un ahorro de hasta 6.517 millones de dólares, capital que a su parecer podría reorientarse hacia el desarrollo tecnológico de la nación. El experto dijo conocer ejemplos sobre cómo, mediante el uso de sistemas operativo no libres, no soberanos, grandes trasnacionales de la computación “han servido a los intereses de los gobiernos extranjeros que apuestan por el fracaso de la Revolución Bolivariana. Al respecto, aseguró que hay pruebas de cómo durante el golpe de Estado petrolero de 2002 se extrajo información de los sistemas de Pdvsa debido a la imposibilidad de auditar los softwares no libres.

Pueblo y gobierno.

Ossa aseguró que Canaima GNU/Linux 5.0 es referencia en el mundo por ser el único proyecto sociotecnológico en el que un Gobierno y comunidades organizadas trabajaron para desarrollarlo y garantizar la independencia tecnológica de una nación. Indicó que las versiones anteriores del sistema son de uso común en escuelas y liceos públicos, en los Centros Bolivarianos de Informática y Telemática (CBIT) e Infocentros de todo el país. También subrayó su utilización en los equipos portátiles.

Características.

Entre las características más relevantes de Canaima GNU/Linux 5.0 destacan su interfaz gráfica amigable, estable, segura y totalmente en castellano. Además de su capacidad de utilizar el navegador Firefox, el uso de la suite ofimática Libreoffice y de otros programas como el editor de video Pitivi, el editor de mapas mentales Freemin, el editor de audio Audacity y la herramienta de maquetación Scribus. Por ser una software libre no se requiere pagar por su licencia y no presenta problemas con virus informáticos.
Según información suministrada por el CNTI, actualmente Canaima GNU/Linux 5.0 está operativo en más de 70 mil 870 estaciones de trabajo, de las 125 instituciones que participaron en el censo 2012 de adopción de las tecnologías de información libres.

 

Gaceta OficiaL N° 41052 sumario.

IVA al 10% por 90 días con pagos electrónicos.

Por todos es bien sabido que en 1994 cuando se instituyó el Servicio Nacional Integrado de Administración Aduanera y Tributaria (SENIAT) se comenzó a cobrar el Impuesto al Consumo Suntuario y Ventas al Mayor (ICSVM) -que luego vendría a ser llamado Impuesto al Valor Agregado IVA- con una tasa impositiva de 10%. Pues bien, por 90 días -siempre y cuando se pague por medios electrónicos- se puede cobrar de nuevo la tasa de 10% según se especifica en la Gaceta Oficial N° 41.052 del miércoles 14 de diciembre de 2016. Publicamos este artículo para daros nuestra interpretación de dicho Decreto Presidencial N° 2.602 (que viene a ser el Decreto N° 34 en el Marco de Estado de Excepción y Emergencia Económica) pero os recomendamos muy bien que habléis con vuestro abogado, contador y programador de aplicaciones antes de tomar decisión alguna lo que aquí decimos es meramente informativo y no es vinculante, usad vuestro criterio lógico. Aquí vamos, pues.

Condiciones del Decreto.

  • Condición indispensable: la factura debe se pagada -o cancelada- por medios puramente electrónicos (entiéndase tarjeta de débito y/o tarjetas de crédito y/o transferencias bancarias electrónicas) según reza al Artículo 2° del Decreto de marras; si hay algún otro medio de pago no es válido cobrar el 10% de IVA, se deberá cobrar el 12% normal.
  • La factura debe ser menor o igual a Bs. 200.000,00 (se entiende que es el monto gravado o base del impuesto).
  • La factura debe ser hecha a consumidores finales, es decir, no da derecho a crédito fiscal (de no especificar esto el SENIAT y la nación dejaría de recaudar mucho dinero en toda la cadena de comercialización del importador, distribuidor y detallista).
  • Los bienes y/o servicios que ya incluyan el IVA (percibidos) no serán beneficiadas (recargas con tarjetas prepago a móviles celulares y teléfonos fijos por ejemplo) ya que el impuesto está pagado por adelantado por la empresa correspondiente.
  • Importaciones definitivas de bienes inmuebles (claro, se dijo que es a consumidores finales y alguien que importe algo lógicamente no es consumidor final).
  • Metales y piedras preciosas están exceptuados: aquí se ratifica lo decretado en la Providencia 0049 en la definición de metales preciosos y piedras preciosas (el Banco Central de Venezuela es el ente encargado de todos estos impuestos y retenciones porque es el único ente autorizado a comprar estos materiales preciosos).
  • Entrára en vigencia a los díez días continuos a partir de su publicación en Gaceta Oficial: salió publicado el 14 de diciembre de 2016 y eso quiere decir que estará vigente desde el 25 de diciembre de 2016 hasta el sábado 25 de marzo de 2017, ambos inclusive (si estamos equivocados en el cálculo, pásenos mensajes por Twitter a la cuenta @KS7000).

Condiciones implícitas del Decreto.

  • A nivel de contabilidad practicamente es poco lo que cambia porque ya existe el IVA disminuido o aumentado para ciertos negocios: los servicios de mensajeria de texto telefónico tienen IVA aumentado (consumo suntuario) y el IVA disminuido se aplicaba hasta no hace mucho a las carnes y los servicios de clínicas y hospitales privados -esto fue derogado-. Sin embargo hay muchos contadores que no están familiarizados con estos impuestos porque generalmente -practicamente- todo tiene IVA hoy en día (exceptuando ahora las clínicas y hospitales y en gran parte las farmacias -medicamentos- y uno que otro decreto específico para fomentar la producción nacional o la importación de materiales y enseres esenciales).
  • El sector que se ve mayormente afectado es el ramo de negocios que realizan ventas masivas y están obligados a utilizar ya sean impresoras fiscales o cajas fiscales. Lo que a continuación explicamos se aplica a las impresoras fiscales ya que las cajas fiscales no permiten personalizar las facturas y si lo hacen el operador debe durar bastante tiempo usando un teclado numérico para anotar el RIF y el nombre o razón social del comprador (que aunque no da derecho a crédito fiscal sí que debe estar a nombre de la persona natural o jurídica para efectos contables y para cálculos del Impuesto sobre la Renta ISRL).
  • Como dijimos las impresoras fiscales son prácticamente cajas fiscales pero sin dispositivos de entrada y salida para el usuario ya que van conectados a ordenadores que cumplen dichas funciones. Pero no no llaméis a engaño, son aparatos autónomos con su propio reloj y con un protocolo estricto -pasivo- que espera las órdenes y si son válidas las procesa y devuelve un resultado verdadero o falso -a veces acompañados de algún valor o valores adicionales-. Están obligados a usarlos los negocios de consumo masivo y hasta se especifican detalladamente los tipos de negocios (ver providencia 0071). En términos prácticos vale decir que el software de facturación -por medio de un puerto serial de 9 pines- enviará comandos -solicitudes- que la impresora fiscal aceptará o rechazará -según el estado fiscal en que se encuentre- y si y solo si la factura es emitida correctamente por la impresora fiscal es que se procederá a guardar en la base de datos dicha operación (además de los montos, fecha y hora que lleva la impresora fiscal) y nunca debemos delegar en utilidades de terceros la comunicación con dichos equipos en aras de que sistema de facturación y memoria fiscal lleven montos exactos e iguales al momento de realizar corte zeta (estad atentos a fallas eléctricas, sin papel para imprimir, etcétera, que pudieran entorpecen dicha labor).
  • Dichas impresoras fiscales tienen un monto exento y tres montos gravados con impuestos diferentes: el disminuido (actualmente 8%), el normal (12%) y el aumentado (27% adicional), lo que da pie a preguntarnos ¿dónde almacenaremos el 10% que es decretado ahora? (actualizado lunes 26 dic 2016: ver más adelante cómo resolvieron este problemilla). Ver, además, la Providencia SNAT/2016/0122 Artículo 4° contra el Artículo 4° de la Providencia 00071.
  • El último cambio hecho al firmware de las impresoras fiscales fue el cambio de hora por cambio de huso horario en Venezuela en abril del 2016 pero este cambio fue bien sencillo.
  • El último cambio al hardware fue hecho en enero del 2013 cuando los relojes de las impresoras fiscales PNP fallaron y no reconocía el año nuevo (tal vez subestimaron la durabilidad de estos equipos al colocarle un reloj barato que iba a durar más que el equipo mismo y aquí vamos rumbo al segundo cambio de memoria fiscal -cada dos mil cortes zetas- osea unos 5 años y medios).
  • El último cambio a impresoras fiscales en cuanto a la tasa del impuesto se realizó en el año 2009 cuando subió de 9% al 12% y el cambio se hizo sin mayor problema.
  • Para cambiar estas tasas de impuesto se debe utilizar software privativo compilado que se comunica directamente con la impresora fiscal con un protocolo (de encriptamiento) que vaya Dios a saber cuál es, un secreto bien guardado para impedir que un tercero intente acceder y modificar la memoria fiscal y/o la configuración del firmware y/o cambiar la hora y fecha.
  • Actualizado el lunes 26 de diciembre de 2016 (decreto en plena vigencia) y en respuesta a las inquietudes al respecto planteadas por las “redes sociales”:
  • Como véis las impresoras fiscales (al menos una muy conocida que lidera el mercado nacional) indica que debemos usar alguna de 2 las alícuotas que no utilize nuestra empresa para tomar alguna de ellas con el 10% (más adelante también veremos en qué consiste esto).
  • Surge una pregunta adicional ¿qué problemas trae seguir cobrando el 12% si la venta se paga 100% por medio electrónico? Pues ninguno excepto que nos vulnera nuestro bolsillo, nosotros, consumidor final, ya que todo negocio que siga cobrando 12% y no 10% sigue beneficiando las arcas de la nación, así que no veremos ningún tipo de operativo represivo sino más bien OPERATIVOS DE ORIENTACIÓN TRIBUTARIA.

Transcripción del Decreto N° 2.602.

PRESIDENCIA DE LA REPÚBLICA

Decreto N°2.602

14 de diciembre de 2016

Con el supremo compromiso y voluntad de lograr la mayor eficacia política y calidad revolucionaria en la construcción del Socialismo, la refundación de la Nación venezolana, basado en principios humanistas, sustentado en condiciones morales y éticas que persiguen el progreso de la Patria y del colectivo, por mandato del pueblo, de conformidad con el artículo 225 de la Constitución de la República Bolivariana de Venezuela y en ejercicio de las atribuciones que me confieren los numerales 2 y 11 del artículo 236 ejusdem, en concordancia con lo previsto en los artículos 27 y 62 del Decreto con Rango, Valor y Fuerza de Ley que establece el Impuesto al Valor Agregado y de acuerdo a lo preceptuado en articulo 3° del Decreto N° 2.452 de fecha 13 de septiembre de 2015, mediante el cual se declara el Estado de Excepción y Emergencia Económica en todo el Territorio Nacional, prorrogado mediante Decreto N° 2.548, de fecha 13 de noviembre de 2015, en Consejo de Ministros.

DICTO

DECRETO N° 34 EN EL MARCO DEL ESTADO DE EXCEPCIÓN Y EMERGENCIA ECONÓMICA QUE ESTABLECE LA ALÍCUOTA IMPOSITIVA GENERAL DE IMPUESTO AL VALOR AGREGADO (IVA) APLICABLE A LAS OPERACIONES PAGADAS A TRAVÉS DE MEDIOS ELECTRÓNICOS.

Artículo 1°.

Las ventas de bienes muebles y prestación de servicios efectuadas a personas naturales que sean consumidores finales, hasta por la cantidad de Doscientos Mil Bolívares (Bs. 200.000,00), serán gravadas con la alícuota impositiva general del impuesto al Valor Agregado del diez por ciento (10%), siempre que tales ventas o prestaciones de servicios sean pagadas a través de medios electrónicos.

Cuando las referidas operaciones sean pagadas a través de medios no electrónicos, se aplicará la alícuota general impositiva prevista en el artículo 62 del Decreto con Rango, Valor y Fuerza de Ley que Establece el Impuesto al Valor Agregado.

Artículo 2°.

La rebaja de la alícuota a que se refiere este Decreto, no aplicará cuando la modalidad de pago electrónico coexista con alguna otra forma de pago.

Artículo 3°.

Están excluidas de la rebaja de la alícuota establecida en este Decreto, las siguientes operaciones:

  1. La adquisición de bienes y servicios con el impuesto al valor agregado percibido.
  2. Las importaciones definitivas de bienes muebles.
  3. La adquisición de metales y piedras preciosas, se entiende como metales y piedras preciosas los siguientes bienes: oro, incluido oro platinado, en bruto, semilabrado o en polvo; la plata; el platino, el cual abarca el iridio, osmio, el paladino, el rodio y el rutenio; las aleaciones de metales preciosos; las piedras preciosas; y el diamante, incluso trabajado, sin montar ni engarzar, sin ensartar o sin clasificar.

     

Artículo 4°.

El Ministro del Poder Popular para la Banca y Finanzas, por órgano del Servicio Nacional Integrado de Administración Aduanera y Tributaria (SENIAT), estará encargado de la ejecución de este Decreto.

Artículo 5°.

Este Decreto entrará en vigencia a partir de los diez (10) días continuos siguientes a su publicación en la Gaceta Oficial de la República Bolivariana de Venezuela y tendrá una vigencia de noventa (90) días.

Dado en Caracas, a los catorce días del mes de diciembre de dos mil dieciséis. Años 206° de la Independencia, 157° de la Federación y 17° de la Revolución Bolivariana.

 

Ejecútese,

 

(L.S.)

 

 

NICOLÁS MADURO MOROS


Notificación vía Twitter por parte del SENIAT al mundo entero:

 

 


 

Transcripción de la Providencia Administrativa SNAT/2016/0122.

REPÚBLICA BOLIVARIANA DE VENEZUELA
MINISTERIO DEL PODER POPULAR PARA LA BANCA Y FINANZAS SERVICIO NACIONAL INTEGRADO DE ADMINISTRACIÓN ADUANERA Y TRIBUTARIA (SENIAT)

SNAT/2016/0122

Caracas, 14 de diciembre de 2016.

Años 206°, 157° y 17°

El Superintendente del Servicio Nacional Integrado de Administración Aduanera y Tributaria (SENIAT), en ejercicio de las atribuciones conferidas en el artículo 4, numerales 1, 8, 33, y 47 y el artículo 7 del Decreto con Rango, Valor y Fuerza de Ley del Servicio Nacional Integrado de Administración Aduanera y Tributaria, publicado en la Gaceta Oficial de la República Bolivariana de Venezuela N° 6.211 Extraordinario, de fecha 30 de diciembre de 2015, de conformidad con lo dispuesto en los artículos 27 del Decreto con Rango, Valor y Fuerza de Ley que Establece el Impuesto al Valor Agregado, publicado en la Gaceta Oficial de la República Bolivariana de Venezuela No. 6.152 Extraordinario de fecha 18 de noviembre de 2014, el artículo 3° del Decreto con Rango, Valor y Fuerza de Ley del Código Orgánico Tributario, publicado en la Gaceta Oficial de la República Bolivariana de Venezuela N° 6.152 Extraordinario, de fecha 18 de noviembre de 2014; de conformidad con el artículo 3 del Decreto N° 2.452 de fecha 13 de septiembre de 2016, publicado en la Gaceta Oficial de la República de Bolivariana de Venezuela N° 6.256 Extraordinario de la misma fecha, mediante el cual se decretó el Estado de Emergencia de Excepción y Emergencia Económica en todo el Territorio Nacional, prorrogado mediante Decreto N° 2.548 por sesenta (60) días, publicado en la Gaceta Oficial de la República Bolivariana de Venezuela N° 6.272 Extraordinario de fecha 13 de noviembre de 2016, dicta la siguiente:

PROVIDENCIA ADMINISTRATIVA MEDIANTE LA CUAL SE ESTABLECEN LAS FORMALIDADES PARA LA EMISIÓN DE FACTURAS, DECLARACIÓN Y PAGO POR LAS VENTAS DE BIENES MUEBLES Y PRESTACIONES DE SERVICIOS EFECTUADAS A PERSONAS NATURALES QUE SEAN CONSUMIDORES FINALES, GRAVADAS CON LA ALÍCUOTA IMPOSITIVA GENERAL DEL IMPUESTO AL VALOR AGREGADO
DEL DIEZ POR CIENTO (10%).

Artículo 1°.

La presente Providencia Administrativa tiene por objeto establecer las formalidades para la emisión de la factura, declaración y pago del impuesto al valor agregado, que deben cumplir los sujetos pasivos que realicen ventas de bienes corporales y presten servicios a personas naturales que sean consumidores finales hasta por la cantidad de Doscientos Mil Bolívares (Bs. 200.000,00), gravadas con la alícuota impositiva general del impuesto al Valor Agregado del diez por ciento (10%), siempre que tales ventas o prestaciones de servicios sean pagadas a través de medios electrónicos.

Artículo 2°.

Los sujetos pasivos a que se refiere el artículo anterior, además de los requisitos establecidos en la Providencia Administrativa que regula el Régimen General de Emisión de Facturas y otros Documentos, deberá indicar la alícuota del diez por ciento (10%) del impuesto al valor agregado, cuando el consumidor final cumpla con la condición establecida en el Decreto que establece la rebaja de la alícuota.

Artículo 3°.

Los sujetos pasivos podrán continuar utilizando el medio de emisión de factura que hayan adoptado o que estén obligados a utilizar, siempre y cuando el mismo se pueda adecuar a los requisitos exigidos en el artículo anterior.

Artículo 4°.

En caso que no sea posible la adecuación de la máquina fiscal, deben utilizar formatos elaborados por imprentas autorizadas, el cual debe reflejar la alícuota del impuesto al valor agregado aplicable por las operaciones señaladas en el artículo 2° de esta Providencia Administrativas, indicando en forma mecánica o manual que se realiza conforme al Decreto que establece la rebaja de la alícuota.

Artículo 5°.

Los sujetos pasivos obligados a cumplir con las formalidades establecidas en esta Providencia Administrativa, deben presentar la declaración y pago del impuesto al valor agregado, de acuerdo a las especificaciones técnicas señaladas a través del Portal Fiscal.

DISPOSICIONES TRANSITORIAS

PRIMERA.

Los Proveedores o fabricantes de Máquinas Fiscales, deben adaptar los modelos autorizados por el Servicio Nacional Integrado de Administración Aduanera y Tributaria para incluir la rebaja de la alícuota, dentro de los diez (10) días continuos siguientes a la entrada en vigencia de esta Providencia Administrativa.

De igual manera, los sujetos pasivos deben solicitar la adaptación de las Máquinas Fiscales a sus Proveedores o fabricantes autorizados por este Servicio, dentro del plazo establecido en esta Disposición Transitoria.

SEGUNDA.

Los Proveedores o fabricantes de Máquinas Fiscales, cuyos modelos autorizados por el Servicio Nacional Integrado de Administración Aduanera y Tributaria no tengan la capacidad técnica para ser adaptados, deberán notificarlo por escrito, especificando los motivos ante la Gerencia de Fiscalización de este Servicio, dentro de los dos (2) días hábiles siguientes a la entrada en vigencia de la presente Providencia Administrativa.

El Servicio Nacional Integrado de Administración Aduanera y Tributaria deberá publicar en su portal fiscal una lista de los modelos que no puedan adecuarse técnicamente a lo establecido en la presente Providencia Administrativa.

DISPOSICIONES FINALES

PRIMERA.

los efectos de esta Providencia Administrativa se entiende por Portal Fiscal la página Web http://www.seniat.gob.ve o cualquiera otra que sea creada por el Servicio Nacional Integrado de Administración Aduanera y Tributaria (SENIAT) para sustituirla.

SEGUNDA

Esta Providencia Administrativa entrará en vigencia a partir de su publicación en Gaceta Oficial de la República Bolivariana Venezuela.
Comuníquese y publíquese.

Comuníquese y Publíquese,

JOSÉ DAVID CABELLO RONDÓN
Superintendente del Servicio Nacional
Integrado de Administración Aduanera y Tributaria.

Decreto N° 5.851 del 01-02-2008
Gaceta Oficial de la República Bolivariana de Venezuela N° 38.863 del 01-02-2008


Procedimiento para cambio de tasas a impresoras fiscales distribuidas por «The Factory HKA®».

El ejecutable distribuido por el importador de dichas impresoras fiscales corre sobre software privativo, el detalle es que estas impresoras solamente tienen memoria para 3 tasas de impuesto: normal, reducido y aumentado. El aumentado generalmente se le conoce como “impuesto al lujo” y como la gran mayoría de los negocios y comercios obligados a utilizar impresoras fiscales NO venden nada con este impuesto entonces es el candidato ideal para ser tomado con el 10% decretado así que recomendamos tomar la opción número 2 (ver imágenes a continuación). Sumamente importante que el software de facturación en el ordenador le envie la opción “&H23” que corresponde al aumentado (ahora decretado como especial o reducido “R” ):

  • Caracter &H20: exento.
  • Caracter &H21: tasa normal, 12% a la fecha de hoy.
  • Caracter &H22: tasa disminuida, 8% a la fecha de hoy.
  • Caracter &H23: tasa al 10% reducida por Decreto N° 2.602

Consultad con el manual del programador y el protocolo de comunicación por puerto serial, NO TOMÉIS A PIE JUNTILLAS LO AQUÍ INDICADO, PENSAD, EVALUAD Y TOMAD VUESTRA PROPIA DECISIÓN, recordando que vosotros procedéis a vuestro propio riesgo, solamente compartimos nuestra experiencia con propósitos puramente didácticos, el conocimiento es libre pero la responsabilidad de vuestras acciones es única y exclusivamente vuestra.

Procedimiento para cambio de tasas a impresoras fiscales distribuidas por «Desarrollos PNP®».

Publicado (actualizado) jueves 05 enero 2017.

Estas impresoras fiscales marcas PNP son de tecnología antigua, de matriz de punto, ruidosas y con papel químico con copia de rollo de auditoría pero muy duraderas en sus partes mecánicas, sus cabezales de 9 pines soportan 80 millones de impactos ¡y más, lo certificamos!

Aquí pasamos a describir cómo cambiar las tasas (alícuotas) por medio del software privativo que podéis descargar (previo registro) y cuya utilería no es hecha específicamente para esta oportunidad y de hecho es la misma utilizada en el año 2009 (pero curiosamente tiene una última actualización en febrero de 2016).

Una vez hayamos descargado y descomprimido el fichero ejecutable lo lanzamos:

PNP cambio de alicuotas 1

Pulsamos click en el botón “Siguiente >” y el programa revisará cada puerto serial y si detecta impresora le consulta su serial por medio de comando ex profeso:

PNP cambio de alicuotas 2

Confirmamos que el serial mostrado por pantalla coincida con el precinto de seguridad adherido a la máquina fiscal, verificamos que haya papel suficiente ya que procederemos a sacar un corte zeta y pulsamos siguiente:

PNP cambio de alicuotas 3

Al finalizar de emitir el corte zeta (por favor entregar a contabilidad inmediatamente para evitar su pérdida física) nos mostrará la siguiente pantalla con valores que vaya a saber Dios de dónde los sacaron y en todo caso debemos cambiarlos nosotros mismos sin el separador decimal:

PNP cambio de alicuotas 4

Es vuestra responsabilidad única y exclusivamente el colocar los valores correctos, nosotros acá sólamente ofrecemos una simple guía para compartir nuestra experiencia y contribuir así al conocimiento libre, ¡estáis advertidos todos y advertidas todas!

PNP cambio de alicuotas 5

Aunque el software NO lo indica sabemos por experiencia empírica que la tasa 1 es la alícuota normal, la tasa 2 es la reducida y la tasa 3 es la aumentada (impuesto al lujo); en todo caso nosotros no utilizamos esta última por lo que la dejaremos tranquilita y utilizaremos la tasa 2 REDUCIDA (R) para nuestros propósitos a esta situación sobrevenida.

Una vez estemos completamente seguros que tenemos los valores correctos observando de no colocar separadores decimales (de hecho a las impresoras fiscales los separadores decimales no se utilizan sino que a la hora de visualizar por papel o visor fiscal agrega la coma tomando dos cifras de derecha a izquierda por eso se hace absolutamente necesario que rellenéis con los debidos caracteres en cero) hacemos click en el botón “proceder”:

PNP cambio de alicuotas 6

(¡Ver observación hecha el 6 de enero de 2017 al final de esta entrada en el blog! “Fe de errata”)

Si todo va bien veremos el mensaje (sic) “Impresor Actualizado Satisfacotiamente” tras lo cual podemos pasar a comentar sobre los cambios en el sistema de software de facturación.

A diferencia de otras marcas de impresoras fiscales, en el caso de las PNP no hay que realizar cambio alguno a los comandos enviados por sistema instalado en el ordenador al cual está conectada físicamente la impresora fiscal PORQUE en el protocolo de comunicación simplemente enviamos la tasa correspondiente (¿os dijimos ya que sin separador decimal alguno?) del producto a facturar, renglón por renglón -osea, enviamos la tasa y ya, no es un comando específico ni un alias para tasa normal, reducida o aumentada-. El meollo del asunto es que la impresora fiscal compara contra todas y cada una de las tasas -alícuotas- que ella tenga registrada en memoria hasta conseguir una que coincida exactamente. En el caso de NO conseguir una tasa coincidente pues simplemente rechaza el comando y responde con un mensaje de error y pues no imprime el renglón causando una aparente “cuelgue” de la impresora fiscal (revisad de tanto en tanto vuestro registro de comunicación que guardéis debidamente en vuestra base de datos, sería como una bitácora de mensajes enviados y recibidos hacia y desde la impresora fiscal).

Una vez realizado todo el procedimiento pues damos al botón salir y no olvidéis de borrar completamente del disco duro del ordenador de caja el fichero ejecutable (no lo corráis desde una ubicación remota porque si perdéis la comunicación vais a quedar a medio camino del proceso de cambio de tasas -sin mencionar otros riesgos de seguridad al enviar datos por internet-, lo mejor es copiar el ejecutable al disco duro local y de allí lanzarlo para luego borrarlo al terminar el proceso).

Actualizado el miércoles 28 diciembre 2016:

Y no, no tiene nada que ver que este días señalado coincida con el Día de los Santos Inocentes.

SENIAT actualiza alícutoa en plataforma de declaración del IVA.

Actualizado el viernes 6 de enero de 2017.

De regalo de Reyes Magos, el portal del SENIAT actualizó la plataforma de declaración del IVA incluyendo alícuota 10%:

Fe de errata:

Actualizado el viernes 6 de enero de 2017.

Estamos plenamente conscientes que con los clientes que trabajamos absolutamente ninguno de ellos ni ellas realiza ventas con el impuesto al lujo y sirva la presente para reconocer debidamente que dicha tasa es 27%, lo cual corregiremos en próximos cortes Z para tener la alícuota correcta, pero reafirmamos, no vendemos absolutamente nada con “alícuota general más alícuota adicional”. Valga entonces a todos vosotros y vosotras la aclaración respectiva.

Fuentes consultadas:

En idioma castellano:


 

Nueva monedas 2017 Bs. 10.

Nuevas monedas año 2017

¡Feliz 2017! ¡Feliz 2017! Nuestra economía, en el día a día, se verá dinamizada con el anuncio de la puesta en circulación de las nuevas monedas que reeplazarán a los viejos y gastados billetes de Bs. 2, 5, 10, 20, 50 y 100. La mínima denominación es de 10, luego sigue la de 50 y 100, si bien con esta inflación actual utilizaremos más frecuentemente estas dos últimas.

El anunció fue realizado por la red social Twitter ayer bien tarde en la noche, horas después de la cadena presidencial de radio, televisión e internet. He aquí el mensaje de marras:

Acá agregamos las fotos para que veaís en mayo detalle las nuevas monedas que circularán a partir de hoy en la medida de lo posible que las vayan recibiendo las agencias bancarias.

Nuevas monedas venezolanas año 2017.
Nuevas monedas venezolanas año 2017: Bs. 10, 50 y 100.
Nuevas monedas venezolanas año 2017.
Nuevas monedas venezolanas año 2017:
Bs. 10, 50 y 100.

Moneda Bs. 10 año 2017:

Nueva monedas 2017 Bs. 10.
Nueva monedas 2017 Bs. 10.

Moneda Bs. 50 año 2017:

Nueva monedas 2017 Bs. 50.
Nueva monedas 2017 Bs. 50.

Moneda Bs. 100 año 2017:

Nueva monedas 2017 Bs. 100.
Nueva monedas 2017 Bs. 100.

Actualizado el jueves 29 de diciembre de 2016.

Actualizado el domingo 12 de febrero de 2017.

Reconversión monetaria año 2008.

Eso merece recordar la reconversión monetaria en la cual quitamos “tres ceros” a la moneda, es decir, dividimos entre mil para ahorrar TIEMPO (billones de teclas pulsadas en todos nuestros ordenadores) ya que hora MULTIPLICAMOS POR CIEN, es decir, agregamos dos ceros -en la práctica- a todos nuestros montos monetarios. Esto también trae cambios en el software ya que hay modificar las interfaces de usuario de nuestros programas.

Python logo sin texto

Como trabajar con formatos de cadenas de texto en Python 3

Hemos escrito y referenciado -bastante- sobre cómo trabajar bajo la linea de comandos en GNU/Linux y para trabajar con Python de esta manera muchas veces debemos presentar los datos y resultados de una manera agradable a la vista. Para ello echaremos mano de unos comando que vienen por defecto en Python 3.5.2 , la versión que usamos a la fecha. Hagamos pues, ¡manos a la obra!

Introducción.

En el lenguaje de programación Python (y esto es un brevísimo repaso) las cadenas de texto deben ser contenidas o encerradas entre comillas simples o comillas dobles, con apertura y cierre correspondiente y por pares, y dichas comillas no serán mostradas por pantalla al ordenar imprimirlas, veamos el ejemplo:

'¡Hola! ¿cómo están?'
"Nosotros bien, ¿y ustedes?"

Hasta aquí no necesita mayor explicación, ustedes decidirán cuáles pares de comillas utilizar, a su gusto y elección pero eso sí, tratemos de ser constantes en su uso, si son simples o dobles. Para este tutorial utilizaremos comillas simples y nuestra balanza se inclina hacia allá porque al uno introducir una cadena de texto entrecomillada doble y presionar intro en el shell de Python por pantalla nos mostrará la misma cadena pero con comilla simples, un detalle a observar. Pero para poder mostrar estas cadenas de caracteres en un guión o script debemos utilizar el comando print() y dentro del par de paréntesis introduciremos dichas cadenas de texto:

print('¡Hola! ¿cómo están?')
print("Nosotros bien, ¿y ustedes?")

Y el resultado por pantalla será la cadena de texto sin comilla alguna.

Concatenado de cadenas de texto.

Si queremos imprimir en una sola línea de texto dos cadenas, debemos usar el símbolo de suma “+” pero en este caso simplemente nos muestra la primera cadena y luego la segunda (podemos incluir en las mismas espacios para separar las palabras):

print('Simón ' + 'José ' + 'Antonio ' + 'de la Santísima Trinidad ' + 'Bolívar y Palacios')

Ahora analizamos que aunque usemos el símbolo de la suma no quiere decir que podemos pasar cualquier número para que sea interpretado como texto, el siguiente comando producirá un error y el segundo es el que debemos utilizar:

print('Simón Bolívar nació en el año ' + 1783)
print('Simón Bolívar nació en el año ' + '1783')

Nótese que hemos encerrado el número entre comillas para que sea considerado una cadena de texto, en el lenguaje Python nos atreveríamos a decir que los datos deber ser explícitos, el lenguaje es estricto en su manipulación (si son caracteres, caracteres serán siempre, si son números igualmente, más adelante profundizaremos en esto).

Repetición de cadenas de texto.

Muchas veces necesitamos repetir uno o más caracteres varias veces, especialmente con propósitos decorativos. Esto es importante en el caso de las licencias de software donde se muchas veces se utiliza el signo de igualdad ‘=’ para encerrar los títulos de la misma. Así como usamos el símbolo de suma ahora utilizaremos el signo de multiplición en programación que es el asteristo ‘*’ (la equis la utilizamos para los humanos, como por ejemplo para representar las tablas de multiplicación). Para ello encerramos entre comillas el texto deseado y seguido de un asterisco y luego un número que representa las veces que repetiremos el caracter o caracteres:

print('='*40)
print('+-'*40)

Almacenando cadenas de texto en variables.

Pues bien, si en nuestro programa vamos a repetir muchas veces una frase pues lo mejor es almacenarla en una variable para mostrarla donde la necesitemos y escribirla una sola vez al principio del software que desarrollemos:

gracias = '¡Muchas gracias por su colaboración!'

Y una vez la tengamos declarada podemos imprimirla con el famoso comando print() -en Python 3 los paréntesis son obligatorios-:

print(gracias)

Reutilizando el último resultado.

Gracias al sr. Juan J. Merelo Guervós quien amablemente publica por Twitter una presentación sobre Python, nos enteramos del uso de el guion bajo “_” para utilizar el último valor que hayamos presentado por la consola interactiva de Python teneindo cuidado de darle el tratamiento adecuado al valor: si es texto, número, etcétera y valga para que aplique a las combinaciones posibles, echad un ojo al siguiente ejemplo:

Uso del guion bajo como almacen del último resultado en consola Python
Uso del guion bajo como almacen del último resultado en consola Python

Comillas y apóstrofos.

Sí, así como lo leen APÓSTROFOS y no , es común caer en este error, pero ese es el nombre correcto: apóstrofos (tal vez influye en errar el como se escribe en inglés: “apostrophes”). Lo cierto del caso es que en castellano no tenemos mayor problema en la escritura, más en el habla coloquial vaya sí que usamos la “contractura” de la palabra (elisión le dice la Real Academia Española), un caso muy común: “para allá” lo pronunciamos “pa’llá”. Como véis igual hacemos en Python, solo que esta vez rompemos la regla de utilizar comillas simples porque de lo contrario se produce un error si escribimos ‘pa’llá’ pues la comilla simple en el medio de la frase indica que allí termina la cadena de texto (si queréis ver algo más avanzado, por favor leed nuestro otro tutorial sobre el tema). Algunos nombres que vienen del idioma portugués también utilizan el apóstrofo, como por ejemplo el apellido “D’acosta”, y si lidiamos con eso debemos usar distintos tipos de comillas, tengamos precaución con esto al momento de programar.

Si necesitamos mostrar las comillas en sí mismas pues las encerramos debidamente de forma anidada, ejemplo:

print('Sí, eso fue lo que ella dijo:"Hacia el sur"')

Líneas múltiples.

Si pretendemos mostrar varias líneas podemos almacenar dichas líneas encerrandolas entre comillas triples (sencillas o dobles, según necesitemos o queramos):

agua = '''El agua está compuesta de:
-Oxígeno
-Hidrógeno'''
print(agua)

Caracteres de escape.

Con el caracter de escape barra invertida “\” podemos escribir nuestro apóstrofo encerrado entre comillas simples de la siguiente manera:

print('El ciudadano Pedro D\'acosta.')

Como pueden observar le indicamos a Python que tome el caracter que está a la derecha de la barra invertida como caracter en sí mismo y que no lo tome como un caracter especial para el lenguaje (en este caso como delimitador de cadena de texto).

También podemos usar dicho caracter de escape con la comilla doble:

print("Vendedme un tubo de 2\" de diámetro.")
# El siguiente comando también hará el mismo trabajo:
print('Vendedme un tubo de 2" de diámetro.')

En Python si una línea comienza con el símbolo numeral “#”, todo lo que esté hacia la derecha hasta el retorno de carro será considerado comentario -sirve para documentar nuestro código para futuras generaciones-.

Además, si el caracter que le agregamos a la derecha NO es un caracter especial (por ejemplo, la letra “n”) nos permitirá “quebrar” o insertar un retorno de carro en una sola línea:

print('Línea 1\nLínea 2')

Y con la barra invertida y la letra “t” podremos presentar por pantalla la composición química del agua del ejemplo anterior pero numerada y tabulada:

agua = 'El agua está compuesta de:\n1\tátomo de Oxígeno\n2\tátomos de Hidrógeno'
print(agua)

Y para imprimir la barra invertida…

Y si necesitamos imprimir la barra invertida por pantalla con el comando print() debemos anteceder la letra “r” justo antes de la cadena de texto:

print(r'El agua está compuesta de:\n1\tátomo de Oxígeno\n2\tátomos de Hidrógeno') 

Formateando cadenas de texto con marcadores de posición.

Así como utilizamos el comando print() en este caso utilizaremos otro comando intrínseco en Python: format(). En lenguaje Python podemos “heredar” o “unir” a una variable una función -es por ello que dicen y comentan que es un lenguaje de programación avanzado-: por medio del punto “.” unimos primero la variable y luego la función format() auxilíandonos con un par de corchetes “{}” -marcador de posición- que le indicará a dicha función dónde colocar el valor que necesitemos. Vayamos de la teoría a la práctica:

print('Venezuela tiene {} estados.'.format(24))

Y veremos por pantalla lo siguiente:

Venezuela tiene 24 estados.

Tal como lo presentamos es poco útil en verdad, pero vayamos un poco más allá: en Venezuela el ahora estado Amazonas antes era un territorio federal, así que el número de estados a lo largo del tiempo será algo que puede variar. Asimismo muchos países están divididos por estados (otros por comunas como Chile, otros por cantones como Suiza, etcétera). Veamos el siguiente código:

pais = "Venezuela"
estados = 24
print(pais + ' tiene {} estados.'.format(estados))

Ahora tiene más sentido ya que dichas variables ‘pais’ -sin acento, así se acostumbra escribir los nombres de variables- y ‘estados’ podrían ser llenados, por ejemplo, desde los valores almacenados en una base de datos con varios países y sus respectivas cantidades de estados y podremos hacer un ciclo para mostrarlos a todos. Lo que incluiremos entre corchetes no necesariamente debe ser un número, también puede ser otra cadena de texto como veremos a continuación.

Formateando cadenas de texto con varios marcadores de posición.

Continuando con el ejemplo anterior, es posible reescribirlo de la siguiente manera:

pais = "Venezuela"
estados = 24
print('{} tiene {} estados.'.format(pais, estados))

Siempre hay que tener en cuenta el colocar las variables a insertar en el mismo orden que van de izquierda a derecha según los marcadores de posición, esto es así porque dentro de los corchetes no hemos insertado aún órdenes especiales; por lo tanto lo siguiente NO mostrará correctamente la información:

pais = ''Venezuela'
estados = 24
print('{} tiene {} estados.'.format(estados, pais))

Para corregir lo anterior debemos colocar el número correspondiente (comenzando desde cero) a la enumeración de elementos -valga la redundancia-. Es decir que lo que insertemos dentro de los paréntesis del comando format -separados por comas- automáticamente tomará el primer elemento el índice cero, el segundo, uno y así sucesivamente:

pais = "Venezuela"
estados = 24
print('{1} tiene {0} estados.'.format(estados, pais))

Podremos escribir muchos más elementos que la cantidad de marcadores de posición -corchetes {}- pero no menos, porque produce un error; veamos el próximo modelo:

pais = "Venezuela"
print('{} tiene {} estados.'.format(pais))

Allí tenemos dos marcadores de posición pero una sola variable (podemos complicar el ejercicio con muchos más elementos, pero trabajar con 2 ó 3 elementos ilustra bien lo que queremos enseñar). Igualmente, si a los marcadores de posición le insertamos índices que no existen, pues también nos arroja error:

pais = "Venezuela"
estados = 24
print('{1} tiene {2} estados.'.format(estados, pais))

Tal como les indicamos, se debe enumerar desde cero, es así que el elemento 2 no existe ni está declarada dicha variable (está fuera de rango, produce error).

Si se nos hace difícil el trabajar con base cero, también Python nos permite colocarles nombres clave a las variables abramos nuestra mente a los llamados alias:

pais = "Venezuela"
estados = 24
print('{uno} tiene {dos} estados.'.format(uno = estados, dos = pais))

Si analizamos bien, en realidad estamos llamando a la variable “pais” con el alias “uno” y “estados” con el alias “dos”, lo cual nos muestra lo poderoso que es el lenguaje Python.

Pasando los formatos específicos.

Hasta ahora hemos utilizado los marcadores de posición vacios o con un índice o alias pero podemos ir más allá. Por medio de los dos puntos “:” nos permite separar el índice o alias del formato con que queramos presentar las variables. Para ilustrar imaginemos que tenemos una lista de países pero sus nombres, desde luego, no tienen el mismo número de caracteres. Si queremos mostrarlos de una manera muy ordenada nos fijaremos cual tiene la cifra más larga y asi dejaremos sufiente espacio para los otros más cortos. Hagamos un sencillo listado de 3 países hartos conocidos por nosotros los venezolanos:

pais = ("Colombia", "Chile", "Venezuela")
division = ("departamentos", "comunas", "estados")

Con estas declaraciones le estamos indicando a Python que nos haga una matriz (ellos lo llaman “tupla”, una palabra no reconocida por la RAE) de 1 fila y 3 columnas para la variable “pais” e igualmente para la variable “division”. Fijaos que el más largo es Venezuela con 9 letras y le sumaremos uno más para separar del resto de la oración con un espacio; haremos uso de un ciclo for:

for k in range(0,3):
  print("{0:10} está dividido políticamente en {1}.".format(pais[k], division[k]))

Ya os dijimos que las numeraciones arrancan desde cero, pero es conveniente aclarar que la variable “k” es evaluada por Python al inicio del ciclo, por eso debemos agregarle uno más a nuestros índices de matriz.  Veremos la siguiente salida por pantalla:

Colombia  está dividido políticamente en departamentos.
Chile     está dividido políticamente en comunas.
Venezuela está dividido políticamente en estados.

¡Qué práctico! Lo más interesante es que podemos alinear las variables al centro o a la derecha (por defecto alinea a la izquierda) si le colocamos el signo “^” o “<” para la alineación a la izquierda o “>” para alinear a la derecha:

for k in range(0,3):
  print("{0:10} está dividido políticamente en {1}.".format(pais[k], division[k]))
 Colombia está dividido políticamente en departamentos.
    Chile está dividido políticamente en comunas.
Venezuela está dividido políticamente en estados.

Incluso podemos presentar los nombres de los países de la misma manera que uno hace al escribir los nombres de los beneficiarios en un cheque bancario: agregando asteriscos (o cualquier otro caracter) a la izquierda y derecha y centrando el nombre y agregaremos 12 “espacios” en vez de 10, probad en vuestra terminal lo siguiente (no publicamos imágenes del resultado para “forzaros” a practicar en vuestro ordenador):

for k in range(0,3):
  print("{0:*^12} está dividido políticamente en {1}.".format(pais[k], division[k]))

Tal vez con los números hallaremos la máxima utilidad al formateo de cadenas con marcadores de posición, veamos algunos de ellos.

Pasando los formatos numéricos específicos.

Muchas veces necesitamos en nuestros programas las tasas de los impuestos que recauda el Estado para el buen funcionamiento de la República. En Venezuela el ente encargado es el Servicio Nacional Integrado de Administración Tributaria y Aduanera (SENIAT por sus siglas) quien legalmente está facultado a publicar y hacer cumplir las variaciones en los porcentajes. El Impuesto al Valor Agregado (IVA por sus siglas) recordamos que comenzó con un 10% en 1994 (año en que fue creado el SENIAT de la mano de la Guardia Nacional quienes nos visitaron para cumplir y hacer cumplir el impuesto) y ha sufrido subidas y bajadas estando hoy en 12% -en España tenemos entendido que está en 25% al momento de escribir estas líneas-. Imaginemos que queremos informar esto a nuestros usuarios:

iva1994 = 10
iva2016 = 12
print('La tasa de impuesto del IVA en 1994 era de {:f}%'.format(iva1994))
print('Hoy en día, año 2016:{:f}%'.format(iva2016))

Como recordaremos, en el marcador de posición debemos colocar los dos puntos para separar el índice (por defecto cero porque es un solo elemento y se puede omitir) del formato numérico que deseamos presentar. En nuestra vida común los números del 0 al 100 toman especial importancia y tanto nuestra moneda y tasas se representa hasta con dos decimales a la derecha de la coma -mejor dicho, empleamos hasta la centésima parte de la unidad-. Es por esto que, si habéis practicado los comandos de arriba, notaréis que se “imprime” con seis decimales porque utilizamos el parámetro “f” -número con separador decimal flotante- y para limitar la salida a dos decimales debemos agregar “.2” al formato:

print('La tasa de impuesto del IVA en 1994 era de {:.2f}%'.format(iva1994))
print('Hoy en día, año 2016:{:.2f}%'.format(iva2016))

Ahora se ve un poco mejor, pero con el inconveniente de que nuestro separador decimal es la coma y para el mundo anglosajón es el punto (los sistemas operativos modernos lidian con esto muy bien todo el tiempo simplemente asignandole un identificador especial que tal vez sea el Unicode 2396 “” y mostrando al usuario de cada región su símbolo particular en cada salida por pantalla y/o impresora). Nota: los parámetros en la función format() deben ser en estricto orden: “{0:.2f}” es lo correcto -índice, separador, número de decimales y tipo de número, “f” para flotante-; mientras que “{0:f.2}” no funcionará.

Usando formatos de texto para presentar datos.

Una aplicación práctica de la vida real es mostrar a nuestros párvulos las tablas de multiplicar, escojamos -¡ejem!- el número 7, nuestro número de la suerte, y hagamos un programita:

for k in range(1,10):
  print('{} x {} = {}'.format(7, k, 7*k))

Como véis no representa mayor problema la salida pues el único elemento díscolo es el resultado de “7 x 1”, vamos a ampliar la tabla hasta 30 (recordad sumar uno más) y mostramos su respuesta a continuación:

for k in range(1,31):
  print('{} x {} = {}'.format(7, k, 7*k))
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
7 x 6 = 42
7 x 7 = 49
7 x 8 = 56
7 x 9 = 63
7 x 10 = 70
7 x 11 = 77
7 x 12 = 84
7 x 13 = 91
7 x 14 = 98
7 x 15 = 105
7 x 16 = 112
7 x 17 = 119
7 x 18 = 126
7 x 19 = 133
7 x 20 = 140
7 x 21 = 147
7 x 22 = 154
7 x 23 = 161
7 x 24 = 168
7 x 25 = 175
7 x 26 = 182
7 x 27 = 189
7 x 28 = 196
7 x 29 = 203

Aquí está el meollo del asunto, a medida que los números “engordan” nuestras columnas no se presentan de manera tabulada. Para observarlo más a nuestro gusto, el de los seres humanos (imagino que las computadoras cuando gobiernen al mundo obviarán el arte por completo, privando la funcionalidad por encima de todo, pero hasta que esos días lleguen no nos preocuparemos por #Skynet) necesitamos que cada número, sin importar su valor, ocupe máximo 3 espacios o casillas, si lo queremos ver de esa manera. Para ello agregamos “{:3d]” en cada marcador de posición y listamos el resultado (en este ejemplo colocamos lo que se ve en la línea de comandos de Phyton):

Python ciclo for con marcadores de posicion para una tabla de multiplicar
Python ciclo for con marcadores de posicion para una tabla de multiplicar.

¡Mucho mejor para nosotros los obsesivos por el orden!

Formatos soportados por Python.

Como era de esperarse, hay una gran cantidad de parámetros en el comando format() y acá explicamos los hasta ahora conocidos teniendo en cuenta que hay que respetar el orden en que pasamos los parámetros, a saber son los siguientes:

  1. El índice o alias de la variable que queremos formatear, generalmente se omite ya que acostumbramos a colocarlas en el orden correspondiente, cosas de nosotros los seres humanos.
  2. Caracter separador, los dos puntos “:”.
  3. Caracter de relleno, cualquiera que se necesite (hicimos un ejemplo con un asterisco, el ejemplo de los cheques bancarios ¿lo recordáis?).
  4. Alineación (recordad el ejemplo de los países), abajo especificamos más.
  5. Signo positivo, negativo o cero (abajo aclaramos).
  6. En el caso de números en otros sistemas de numeración podemos usar “#” o “0”, de nuevo abajo explicamos mejor el asunto.
  7. Anchura del campo, un número entero de no muchas cifras ya que el ancho de pantalla generalmente es 80 caracteres en remembranza de los antiguos monitores monocromáticos.
  8. Opción de agrupamiento: aquí si que hay mucha tela que cortar, mirad el punto 8 que lo hacemos muy detalladamente.
  9. Precisión: en el caso de las tasas de impuesto usamos 2 decimales, pero podemos usar los que necesitemos, lo único que no explicamos es que esta función redondea hacia arriba (si es mayor o igual a 5) o hacia abajo según el primer decimal fuera del alcance de precisión.
  10. Tipo de dato: lo más importante queda de último, ya que podemos indicarle explícitamente qué tipo de datos pasamos e incluso que conversión hacemos, leed el punto 10 en detalle.

Los puntos 1 y 2 ya los hemos explicado muy bien, veamos los siguientes.

3.-Caracter de relleno.

Cualquier caracter INCLUSO los caracteres especiales no presentan ningún problema, recordad que lo TODO lo que está en el marcador de posición “{}” Python los considera parámetros, no comandos especiales; haced la prueba colocando comillas simples, dobles, barra y barra invertida y os lo mostrará sin problema alguno.

4.-Alineación de caracteres.

  • “<“: alinea a la izquierda, generalmente se omite ya que es la opción por defecto en la mayoría de los objetos.
  • “^”: alinea al centro del espacio disponible.
  • “>”: alinea a la derecha.
  • “=”: solamente para formatos numéricos que presentan signo, por ejemplo “+000000120”, rara vez se utiliza.

5.-Signo numérico.

  • “+”, “-” y ” “: si necesitamos colocarle signo a nuestro resultado usamos el signo de suma o de resta, o simplemente dejamos un solo espacio en blanco reservado para el signo, si es negativo se muestra sino coloca un espacio en blanco.

6.-Forma alterna para la conversión.

El utilizar “#” o “0” nos hes tremendamente útil si hacemos conversiones a otros sistemas de numeración (binarios, por ejemplo), mirad el punto 10.

7.-Anchura del campo.

Ya dijimos que está limitado por nuestra noció de estética pero en realidad si le pasamos un valor muy alto pues simplemente Python lo mostrará en tantas líneas como necesite, una abajo de la otra, dando al traste cualquier tipo de formato que deseemos, cuidadito con esta cifra.

8.-Opción de agrupamiento.

¿Recuerdan que hablamos del separador decimal y que en nuestro país es la coma? De hecho nosotros usamos el punto como separador de miles y esto trae muchas veces un dolor de cabeza para el mundo de la banca y negocios. Acá os mostramos cómo lo maneja Ubuntu 16.04:

Formato regional en Ubuntu 16.04
Formato regional en Ubuntu 16.04

Pues acá va que Python se empeña en utilizar el punto como separador decimal y la coma como separador de miles a pesar de nosotros tener nuestra configuración regional como corresponde. Es por ello que en la PEP378 le buscan una solución al asunto haciendo uso de un comando y un artilugio: cambiamos las comas “,” que separan los miles en formato anglosajón por guiones bajos “_”, luego cambiamos el punto “.” que es separador decimal en formato anglosajón por una coma “,” y finalmente cambiamos los guiones bajos “_” por puntos “.” ¿complicado en idioma castellano? Veamos como se escribe en lenguaje Python:

monto = 1234567.89
print('Su saldo bancario es Bs.' + '{:,}'.format(monto).replace(",","_").replace(".", ",").replace("_","."))

El comando clave es replace(,) y nótese que hemos dejado el símbolo de “Bs.” fuera del valor numérico para que ese punto no sea sustituido por una coma y nuestro trabajo se ve plasmado así:

Representación correcta de Python de los formatos numéricos para Venezuela
Representación correcta de Python de los formatos numéricos para Venezuela.

¿Complicado? Pues aún no hemos comenzado a programar de verdad, ja ja ja 😉

En realidad nuestros amigos que desarrollan Python de manera desinteresada (monetariamente hablando) se han compadecido de nuestro predicamento porque, al menos nos han permitido el parámetro de la coma “,” como separador de miles, de parte de nosotros está comenzar a programar nuestras propias utilerías y “subirlas” a GitHub para que estén disponibles de manera pública por medio del Software Libre. Como ustedes ya imaginarán ya otros colegas habrán pasado por esto y en la internet habrá una solución ya realizada, lo que hay es que buscarla o sino hacerla nosotros mismos.

10.-Tipos de datos (y conversiones).

Pues ya va finalizando nuestra clase del día, lo último y tal vez más importante es que le podemos decir a Python el tipo de dato que le vamos a pasar para que nos lo represente adecuadamente e incluso podemos hacer conversiones a otros sistemas de numeración, miremos:

  • “s”: formato de cadena de texto, es el valor por omisión, eso quiere decir que es tácito y sobre entendido que lo que le pasamos al comando format() es una cadena de texto sin más; se puede omitir.
  • “b”: nos representará un número en de numeración formato binario, si le pasamos la coma como separador de agrupamiento lo hará de 4 en 4 caracteres.
  • “c”: un número entero que corresponde a un caracter ASCII, así la letra “A” es el número 34, le pasamos ese número y nos dibujará una letra “A”.
  • “d”: sistema de base decimal, si se lo pasamos en binario hace la conversión correspondiente.
  • “o”: sistema de numeración de base 8.
  • “x” y “X”: sistema de numeración de base 16 con los caracteres en mayúsculas o minúsculas para los valores por encima de nueve.
  • “n”: supuestamente para indicar que se utilize los separadores decimales y sepradores de miles segúna la configuración regional del sistema operativo del usuario (lo probamos y no funciona para nada bajo Python 3.5.2, no señor, la teoría es hermosa pero la práctica que hace nuestra experiencia ES MARAVILLOSA).

Ejemplos de conversiones:

Ejemplos de conversión a otros sitemas de numeración con el comando format().
Ejemplos de conversión a otros sitemas de numeración con el comando format().

Fuentes consultadas:

En idioma inglés:

Ubuntu botón para hibernar.

Habilitar hibernación en Ubuntu

No, no estamos de osos e hibernación sino de la metáfora entre el comportamiento animal y las computadoras: se trata de “dormir” a la computadora escribiendo todo lo que está en memoria RAM a un área especial en nuestro disco duro, tras lo cual podemos hasta desenchufar nuestro equipo y cuando de nuevo lo necesitemos quedaremos exactamente con los mismos programas y documentos abiertos justo donde los dejamos.

Antecedentes.

En los lejanos tiempos cuando no teníamos interfaz gráfica (podéis saber -o recordar- más en nuestros anteriores artículos sobre bash y sobre ingeniería social) pues tenía poco sentido el hablar de este proceso de hibernación. Pero es que hay más: los equipos XT tenían un simple interruptor que cortaba la energía, apagando de golpe a la computadora y perdiendo datos (ni hablaremos que los discos duros tipo IDE tenían que “parquear” el cabezal para no dañar los platos). Pero con el advenimiento de los equipos AT se incorporó más bien un botón lógico que cuando uno lo presiona el BIOS de la tarjeta madre se comunica con el sistema operativo -moderno- para entonces así poder apagar, cerrando y guardando debidamente los documentos y programas abiertos. Adicionalmente -y esto aplica a los monitores también- se les colocó una función de “dormir” lo cual hace que la máquina trabaje a una velocidad mínima a la espera de un evento determinado -pulso de tecla, movimiento de ratón, mensaje por tarjeta de red, etc.- logrando ahorrar energía. Dicha función se activa automáticamente cada cierto tiempo predeterminado y así se ahorra, a nivel mundial, de muchísima energía eléctrica.

Pero fueron las computadoras portátiles las que más se beneficiaron pues permite alargar el tiempo que trabajan con una sola carga de batería e incluso hay planes más detallados y específicos que poner a “dormir” al equipo: disminuye el brillo en pantalla, deshabilita uno o más núcleos en el CPU (ahora casi todos los equipos son doble núcleo de 64 bits), apagar la red inalámbrica, apagar el disco duro, etc.

En el caso de la hibernación es el ahorro máximo de energía: apagar el equipo para luego encenderlo muy rápidamente y justo donde estabamos trabajando, de paso ahorrando tiempo y como dijimos, se trata de escribir todo lo que está en memoria al disco duro.

¿Por qué Ubuntu no trae la opción de hibernación activada?

Pues ya saben la historia, a las computadoras se les agregó las opciones de “dormir” e “hibernar” para cumplir normas medioambientales (y ahorro en nuestros bolsillos en nuestra factura por consumo de electricidad) pero resulta ser que cada fabricante impuso sus propios “chips” integrados en las tarjetas madres para cumplir dichas funciones. Ellos, para proteger sus “secretos industriales y de manufactura”, no explican a ciencia cierta cómo funcionan y son pocos los fabricantes que se dedican a trabajar de la mano con los desarrolladores de sistemas operativos. En el caso de Ubuntu fue a partir de la versión 12.04 que tomaron la salomónica decisión de deshabilitarlo (en Debian viene por defecto activado): son pocos los hardwares que son certificados para trabajar con Ubuntu y la base de datos para llevar cuenta de ellos es gigantesca y engorrosa, un trabajo a todas luces de evitar.

¿Y qué es un hardware certificado para trabajar con Ubuntu?

Pues son ordenadores que garantizan que al hibernar no perderemos absolutamente ninguno de nuestros datos, recordemos que todos los GNU/Linux son sistemas operativos estables y confiables y no se arriesgan a perder su reputación simplemente porque la mayoría de los fabricantes de niegan a vender hardware libre (aunque esto también desaliente a las empresas que trabajen por cerificar su hardware con Ubuntu).

¿Y quienes se benefician del proceso de hibernación?

Pues obviamente los equipos de escritorio y portátiles porque las versiones Ubuntu Server para nada ahorran energía: son equipos que trabajan las 24 horas del día. No obstante el software libre nos permite sin ningún problema el convertir nuestros ordenadores de uso diario como servidores de bases de datos, servidores web, etcétera y si éste es vuestro caso pues olvidad la opción de hibernar.

Requisitos para la hibernación.

Pues antes de entrar más en detalles debemos asegurarnos no sólo que tenemos espacio libre en disco duro del mismo tamaño de nuestra memoria RAM, sino que incluso contemos con una partición de intercambio especialmente hecha para ello, y en inglés recibe el nombre “swap” (no confundir con la partición para archivos temporales). Generalmente si escogimos que nuestra distribución Linux ocupe todo nuestro disco entonces habrá particionado nuestro disco duro con los valores adecuado a nuestro hardware.

Pero si fuimos nosotros quienes decidimos los valores de partición debemos revisar, en todo caso nunca está demás consultar dichos valores así que nos arremangamos las mangas de la camisa y abrimos una venta terminal y escribimos lo siguiente:

cat /proc/swaps

Como ya sabemos el comando cat sirve para visualizar el contenido de un archivo y en GNU/Linux todo es un archivo (sin caer en el tema de systemd) y la partición de intercambio tiene su archivo que lo representa. El que consultemos un archivo, ya sea por pantalla, impresora, terminal remota, etc. no representa ningún problema para nuestro ordenador, es decir no desconfiguramos nada (lo peor que nos puede pasar es que no tengamos derecho de lectura del archivo en cuestión).

Pero si queremos ir más allá podemos usar el comando swapon el cual está disponible desde 1995 (apareció en 4.0BSD) y forma parte de las utilerías de Linux. Dicho comando ofrece opciones de reporte y la primera que usaremos es:

swapon -s

o en su versión “larga” -que nos permite memorizarla mejor-:

swapon --summary

Esta opción hace exactamente el mismo trabajo de cat que indicamos al principio y así explícitamente lo indica la ayuda de swap (tecleamos “man swap” -y podemos usar el comando man para obetener ayuda de cualquier otro comando de Linux-). Con el comando swapon también podemos activar o descativar el área de intercambio pero exige conocimientos exactos de nuestro hardware para poderlo ejecutar correctamente, recomendamos mucha precaución si se deciden a ir más allá.

Hay muchos otras muchas herramientas (mirad los enlaces consutlados para hacer esta entrada) pero con 3 creemos es más que suficiente en nuestra labor didáctica, dicho tercer comando es free que nos permite ver tanto en Gigabytes, Kilobytes o Megabytes (las letras iniciales son los parámetros del comando) de nuestra memoria física y el área de intercambio -en realidad sirve para la memoria RAM pero como están intimamente relacionadas con el área de intercambio pues se incluye en los resultados-:

free -g
free -k
free -m

Acá mostramos una captura de nuestra ventana terminal:

cat swapon free
“cat”, “swapon” y “free”.

Otra alternativa es utilizar la interfaz gráfica pulsando la tecla ALT+F2 y escribimos (en Ubuntu) “disco” y automáticamente nos listará las aplicaciones debajo de la linea de comandos -si usan Debian escriban palimpsest – y hacemos click en la utilidad de discos, verán algo parecido a esto:

Ubuntu partición de intercambio.
Ubuntu partición de intercambio.

Como vemos también nos informa del estado del disco duro, temperatura etc.

Probando si nuestro equipo es compatible con hibernación.

La manera pragmática de determinar si nuestro equipo soporta el proceso de hibernación es tener unas cuantas aplicaciones abiertas con datos sin importancia (navegador web, gedit editando una nota, algún reproductor de música) tras lo cual ejecutamos en nuestra línea de comandos lo siguiente:

sudo pm-hibernate

Al presionar la tecla intro nuestro ordenador, según la cantidad de aplicaciones abiertas, la cantidad de memoria RAM y tipo de disco duro, tomará de unos cuantos segundos hasta un minuto. Luego de que se hayan apagado todas las luces y ventiladores esperamos unos 10 segundos y procedemos a encender por su correpondiente botón.

Una vez haya arrancado de nuevo verificamos si nuestras aplicaciones de prueba están en pantalla, si suena la música, el estado de conexión de red; puede ser que parpadee la pantalla una o varias veces, movemos el ratón y observamos cuánto tarda en responder.

Si hemos llegado hasta aquí sin problemas…

Pues ¡enhorabuena! Nuestro ordenador es compatible con la hibernación ahora procederemos a habilitarlo y describiremos el proceso general pero cambiaremos los valores de acuerdo a la versión de Ubuntu que tengamos instalado:

  1. Vamos a crear un archivo llamado “com.ubuntu.enable-hibernate.pkla“.
  2. Dicho archivo lo guardaremos en la siguiente ubicación: ” /etc/polkit-1/localauthority/50-local.d
  3. Debemos hacerlo con derechos de usuario raíz o “root” con “sudo su“.
  4. Reinciamos el equipo y verificamos que nos aparezca la opción correspondiente, veremos algo como esto:
Ubuntu botón para hibernar.
Ubuntu botón para hibernar.

Si usamos Ubuntu 13 o anterior:

Procedemos a abrir una ventana terminal y ejecutamos lo siguiente:

sudo nano /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla

y luego rellenamos con esto (sientanse libres de copiar y pegar):

[Re-enable hibernate by default]
  Identity=unix-user:*
  Action=org.freedesktop.upower.hibernate
  ResultActive=yes

Si usamos Ubuntu 14:

Deberemos rellenar el archivo con esto:

[Re-enable hibernate by default in upower]
  Identity=unix-user:*
  Action=org.freedesktop.upower.hibernate
  ResultActive=yes

[Re-enable hibernate by default in logind]
  Identity=unix-user:*
  Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.hibernate-multiple-sessions
  ResultActive=yes

Si tenemos Ubuntu 16:

[Re-enable hibernate by default for login1]
 Identity=unix-user:*
 Action=org.freedesktop.login1.hibernate
 ResultActive=yes

[Re-enable hibernate for multiple users by default in logind]
 Identity=unix-user:*
 Action=org.freedesktop.login1.hibernate-multiple-sessions
 ResultActive=yes

Observaciones importantes del archivo de marras:

Advertencia imagen pequeña

Ahora que conocemos el archivo que permite la hibernación hemos de considerar lo siguiente: las lineas que comienzan por “Identity”, “Action” y “ResultActive” como bien pueden observar son las mismas para las versiones de Ubuntu lo que si que es diferente son las etiquetas que las encabezan. Es de notar también que el identado es importante para dichas líneas pues son en jerarquía “hijas” de las etiquetas. Además los nombres de las etiquetas son muy específicas para cada versión de Ubuntu, bueno cada cabeza es un mundo e imaginamos que son muchos y diferentes programadores que han trabajado sobre Ubuntu y que siempre debemos tener siempre en mente que en el campo del software libre nada está escrito sobre piedra, es decir: ¿nos molesta que cada versión de Ubuntu tenga sus diferencias particulares de una a otra según las liberan? El software libre nos permite descargar el código fuente, modificarlo y compilarlo para nuestra propia metadistribución, es decir, es el mismo Ubuntu con pequeñas variaciones (pero si dichas variaciones afectan de algún modo o manera a las aplicaciones que se ejecutan debemos compilar también dichas aplicaciones adaptadas y publicar nuestro propio repositorio para nuesta metadistribución ¿A ver quién se anima a trabajar en ello? Hay gente que conozco que lo hacen, ¡tienen mucho esfuerzo y tenacidad en sus convicciones!).

Si tenemos un ordenador portátil.

En las computadoras portátiles al cerrar su tapa, el comportamiento predeterminado es “dormir” o suspender pero podemos cambiar ese comportamiento siempre y cuando hayamos probado varias veces que la hibernación funciona correctamente:

  • Abrimos una venta terminal e introducimos lo siguiente:
sudo nano /etc/systemd/logind.conf
  • Buscamos la línea que contiene “#HandleLidSwitch=suspend” y la sustituimos por “HandleLidSwitch=hibernate” (nótese que eliminamos el caracter almohadilla y cambiamos “suspend” por “hibernate”.
  • Guardamos el archivo y reiniciamos.

¿Qué problemas podemos enfrentar?

Actualizado el jueves 10 de noviembre de 2016.

Pues pusimos a hibernar nuestro ordenador y al regresar de nuestro trabajo en la calle encendimos y nos mostraba este mensaje:

Ocurrio un error al montar /boot/efi.
Pulse S para no montar o M para una reparación manual.

Al escoger la opción “no montar” pues acepta contraseña pero al no tener acceso al disco duro pues regresa a la pantalla de inicio de sesión. Al escoger la opción de reparación manual “cae” con credenciales de “root” y al introducir:

sudo apt-get update

no se ejecuta correctamente y sugiere el comando dpkg.

Aplicamos:

sudo dpkg --configure -a

y luego el comando “reboot” tras lo cual arranca correctamente. Suponemos que como tenemos configurada las actualizaciones del sistema operativo como “descargar e instalar automáticamente” pues estaba precisamente en ese proceso cuando la pusimos a hibernar.

Agradecemos a los amables colaboradores de Ubuntu-es.org por proporcionarmos la solución, podéis leer el caso en este enlace web.

Enlaces consultados:

En idioma castellano:

En idioma inglés:

Gaceta Oficial membrete

Presidente Maduro anuncia aumento de sueldos a partir del 1° noviembre 2016

Tomado de la página web de “Alba Ciudad 96.3 FM” según se desprende de la información registrada en el vídeo anterior:

El Presidente Nicolás Maduro anuncia este jueves un aumento integral de salario mínimo y pensiones de 40 por ciento, según señaló en cadena nacional desde Ciudad Tiuna, donde entrega la vivienda 180 mil del año. Es el cuarto aumento del año. El aumento es válido desde el 1 de noviembre, tendrá incidencia en las utilidades y lleva el salario mínimo de Bs. 22.576 a Bs. 27.091. “Todas las tablas de trabajadores públicos, la Fuerza Armada, médicos, policías, bomberos y maestros suben automáticamente 20 por ciento“, señaló. Igualmente, los tickets de alimentación (cestatickets) suben de 8 puntos de la unidad tributaria a 12 puntos: de Bs. 42.480 mil a Bs. 63.720.

 

De esta forma, una persona que gane sueldo mínimo ganará Bs. 90.212, contando el sueldo básico y los tickets de alimentación. El acumulado del año es de 454 por ciento, que “es muy, pero muy encima de la inflación”, expresó el Presidente venezolano.

Maduro también anunció el aumento de la tarjeta socialista de los Hogares de la Patria, de Bs. 30 mil a Bs. 39 mil.

Igualmente, las y los pensionados del Seguro Social recibirán un mes adicional de aguinaldos. El Presidente informa que se están estudiando fórmulas para apoyarlos más.

Enlaces relacionados:


Gaceta Oficial membrete

Advertencia imagen pequeña

Debemos de hacer notar, y cumplimos con hacerlo, que aunque dicho aumento está publicado en Gaceta Oficial Extraordinaria N° 6.269 NO CONTAMOS AÚN con ese documento digital de una fuente oficial, POR AHORA nos remitimos a la página web “Finanzas Digital” quienes han digitalizado y publicado una copia de su propio ejemplar de gaceta según se informa pública y notoriamente por cuenta Twitter, a continuación tenéis el mensaje:


 Decreto N° 2.504.

Decreto N° 2.504, mediante el cual se aumenta en un veinte por ciento (20%) el salario mínimo nacional mensual obligatorio en todo el territorio de la República Bolivariana de Venezuela, para los trabajadores y las trabajadoras que presten servicios en los sectores públicos y privados, sin perjuicio de lo dispuesto en el Artículo 2 de este Decreto, a partir del 1° de noviembre de 2016, estableciéndose la cantidad de veintisiete mil noventa y dos bolívares con diez céntimos (Bs. 27.092,10) mensuales.(Véase N° 6.269 Extraordinario de la GACETA OFICIAL DE LA REPUBLICA BOLIVARIANA DE VENEZUELA, de esta misma fecha.)

Decreto N° 2.505.

Decreto N° 2.505, mediante el cual se ajusta la base de cálculo para el pago del Cestaticket Socialista para los trabajadores y las trabajadoras que presten servicios en los sectores públicos y privados, a doce Unidades Tributarias (12 U.T.) por día, a razón de treinta (30) días por mes, pudiendo percibir hasta un máximo del equivalente a trescientas sesenta Unidades Tributarias (360 U.T.) al mes, equivalente a la cantidad de sesenta y tres mil setecientos veinte bolívares sin céntimos (Bs. 63.720,00) para la fecha de la publicación de este Decreto, sin perjuicio de lo dispuesto en el Artículo 7º del Decreto con Rango, Valor y Fuerza de Ley del Cestaticket Socialista para los Trabajadores y Trabajadoras.


NICOLÁS MADURO MOROS

Presidente de la República

Con el supremo compromiso y voluntad de lograr la mayor eficacia politica y calidad revolucionaria en la construcción del Socialismo, la refundacion de la patria venezolana, basado en principios humanistas, sustentado en condiciones morales y éticas que persiguen el vivir bien del país y del colectivo, por mandato del pueblo de conformidad con lo establecido en con los artículos 80, 91 el artículo 226 de la Constitución de la República Bolivariana de Venezuela; y en ejercicio de las atribuciones que me confiere el numeral 11 del artículo 236 eiusdem, en concordancia con en el artículo 46 del Decreto con Rango, Valor y Fuerza de Ley Orgánica de la Administración Pública, concatenado con los artículos 10, 95, 111 y 129 del Decreto con Rango, Valor y Fuerza de Ley Orgánica del Trabajo, los Trabajadores y las Trabajadoras, en Consejo de Ministros,

CONSIDERANDO

Que el Estado democrático y social, de Derecho y de Justicia garantiza a los trabajadores y las trabajadoras la participación en la justa distribución de la riqueza generada mediante el proceso social de trabajo, como condición básica para avanzar hacia la mayor suma de felicidad posible, como objetivo esencial de la Nación que nos legó El Libertador,

CONSIDERANDO

Que es principio rector y un compromiso del gobierno revolucionario la defensa del pueblo y proteger a la familia venezolana de la guerra económica desarrollada por el imperialismo, que induce Ia inflación exacerbada por la oligarquía apátrida, como instrumento de acumulación de capital en manos de una minoría,

CONSIDERANDO

Que la República Bolivariana de Venezuela ha suscrito y ratificado los convenios números 26, 95 y 100 de la Organización Internacional del Trabajo (O.I.T.), relativos al establecimiento de métodos para la fijación de salarios mínimos, la protección del salario y a la igualdad de la remuneración de los trabajadores y las trabajadoras,

CONSIDERANDO

Que es deber del Estado mantener estos convenios para cumplir con el compromiso democrático, la equidad, la política de recuperación sostenida del poder adquisitivo de la población venezolana, así como la dignificación de la remuneración del trabajo y el desarrollo de un modelo productivo soberano, basado en la justa distribución de la riqueza, capaz de generar trabajo estable y de calidad, garantizando que las y los trabajadores disfruten de un salario mínimo igual para todas y todos,

CONSIDERANDO

Que el Decreto con Rango, Valor y Fuerza de Ley Orgánica del Trabajo, los Trabajadores y las Trabajadoras promulgado por el Comandante Supremo de la Revolución Bolivariana, Hugo Rafael Chávez Frías, el 30 de abril de 2012 y publicado en Gaceta Oficial de la República Bolivariana de Venezuela el 07 de mayo de 2012, establece que el Estado fijará cada año el salario mínimo, el cual deberá ser igual para todos los trabajadores y trabajadoras en el territorio nacional y pagarse en moneda de curso legal.

DICTO

El siguiente,

DECRETO N° 10 EN EL MARCO DEL ESTADO DE EXCEPCIÓN Y EMERGENCIA ECONÓMICA, MEDIANTE EL CUAL SE FIJA UN AUMENTO SALARIAL MENSUAL OBLIGATORIO EN TODO EL TERRITORIO NACIONAL.

Artículo 1°.

Se aumenta en un veinte por ciento (20%) el salario mínimo nacional mensual obligatorio en todo el territorio de la República Bolivariana de Venezuela, para los trabajadores y las trabajadoras que presten servicios en los sectores públicos y privados, sin perjuicio de lo dispuesto en el artículo 2 de este Decreto, a partir del 1° de noviembre de 2016, estableciéndose la cantidad de VEINTISIETE MIL NOVENTA Y DOS BOLÍVARES CON DIEZ CÉNTIMOS (Bs. 27.092,10) mensuales.

El monto de salario diurno por jornada, será cancelado con base al salario mínimo mensual a que se refiere este artículo, dividido entre treinta (30) días.

Artículo 2°.

Se aumenta en un veinte por ciento (20%) el salario mínimo nacional mensual obligatorio en todo el territorio de la República Bolivariana de Venezuela para los y las adolescentes aprendices, de conformidad con lo previsto en el Capítulo II del Título V del Decreto con Rango, Valor y Fuerza de Ley Orgánica del Trabajo, los Trabajadores y las Trabajadoras, a partir del 1° de noviembre de 2016, estableciéndose la cantidad de VEINTE MIL CIENTO CUARENTA Y SIETE BOLÍVARES CON NOVENTA CÉNTIMOS (Bs. 20.147,90) mensuales.

El monto del salario por jornada diurna, aplicable a los y las adolescentes aprendices, será cancelado con base al salario mínimo mensual a que se refiere este artículo, dividido entre treinta (30) días.

Cuando la labor realizada por los y las adolescentes aprendices, sea efectuada en condiciones iguales a la de los demás trabajadores y trabajadoras, su salario mínimo será el establecido en el artículo 1° de este Decreto, de conformidad con el artículo 303 del Decreto con Rango, Valor y Fuerza de Ley Orgánica del Trabajo, los Trabajadores y las Trabajadoras.

Artículo 3°.

Los salarios mínimos establecidos en este Decreto, deberán ser pagados en dinero en efectivo y no comprenderán, corno parte de los mismos, ningún tipo de salario en especie.

Artículo 4°.

Se fija como monto de las pensiones de los jubilados y las jubiladas, los pensionados y las pensionadas de la Administración Pública, el salario mínimo nacional obligatorio establecido en el artículo 1° de este Decreto.

Artículo 5°.

Se fija como monto de las pensiones otorgadas a los jubilados y jubiladas, los pensionados y las pensionadas, por el Instituto Venezolano de los Seguros Sociales (I.V.S.S.), el salario mínimo nacional obligatorio establecido en el artículo 1° de este Decreto.

Artículo 6°.

Cuando la participación en el proceso social de trabajo se hubiere convenido a tiempo parcial, el salario estipulado como mínimo, podrá someterse a lo dispuesto en el artículo 172 del Decreto con Rango, Valor y Fuerza de Ley Orgánica del Trabajo, los Trabajadores y las Trabajadoras, en cuanto fuere pertinente.

Artículo 7°.

El pago de un salario inferior a los estipulados como mínimos en este Decreto, obligará al patrono o patrona a su pago de conformidad con el artículo 130 del Decreto con Rango, Valor y Fuerza de Ley Orgánica del Trabajo, los Trabajadores y las Trabajadoras y dará lugar a la sanción indicada en su artículo 533.

Artículo 8°.

Se mantendrán inalterables las condiciones de trabajo no modificadas en este Decreto, salvo las que se adopten o acuerden en beneficio del trabajador y la trabajadora.

Artículo 9°.

Queda encargado de la ejecución de este Decreto, el Ministro del Poder Popular para el Proceso Social de Trabajo.

Artículo 10.

Este Decreto entrará en vigencia a partir del 1° de noviembre de 2016.
Dado en Caracas, a los veintisiete días del mes de octubre de dos mil dieciséis. Años 206° de la Independencia, 157° de la Federación y 17° de la Revolución Bolivariana.


DECRETO N° 11 EN EL MARCO DEL ESTADO DE EXCEPCION Y EMERGENCIA ECONÓMICA, MEDIANTE EL CUAL SE INCREMENTA LA BASE DE CALCULO PARA EL PAGO DEL BENEFICIO DEL CESTATICKET SOCIALISTA.

Artículo 1°.

Se ajusta la base de cálculo para el pago del Cestaticket Socialista para los trabajadores y las trabajadoras que presten servicios en los sectores públicos y privados, a doce Unidades Tributarias (12 U.T.) por día, a razón de treinta (30) días por mes, pudiendo percibir hasta un máximo del equivalente a trescientas sesenta Unidades Tributarias (360 U.T.) al mes, equivalente a la cantidad de SESENTA Y TRES MIL SETECIENTOS VEINTE BOLÍVARES SIN CÉNTIMOS (Bs. 63.720,00) para la fecha de la publicación de este Decreto, sin perjuicio de lo dispuesto en el artículo 7° del Decreto con Rango, Valor y Fuerza de Ley del Cestaticket Socialista para los Trabajadores y Trabajadoras.

Artículo 2°.

Las entidades de trabajo de los sectores público y privado, ajustarán de conformidad con lo establecido en el artículo 1° de este Decreto, el beneficio de alimentación denominado “Cestaticket Socialista” a todos los trabajadores y las trabajadoras a su servicio.

Artículo 3°.

El ajuste mencionado en el artículo 1° de este Decreto, es de obligatorio cumplimiento por parte de los empleadores y las empleadoras en todo el territorio de la República Bolivariana de Venezuela.

Artículo 4°.

Las entidades de trabajo de los sectores público y privado, que mantienen en funcionamiento el beneficio establecido en el artículo 4°, numerales 1 al 4 del Decreto con Rango, Valor y Fuerza de Ley del Cestaticket Socialista para los Trabajadores y Trabajadoras, adicionalmente y en forma temporal, mientras dure la emergencia económica, deberán otorgar dicho beneficio, mediante la provisión de cupones, tickets o tarjeta electrónica de alimentación, emitidos por una entidad financiera o establecimiento especializado en la administración y gestión de beneficios sociales.

Artículo 5°.

Queda encargado de la ejecución de este Decreto, el Ministro del Poder Popular para el Proceso Social de Trabajo.

Artículo 6°.

Este Decreto entrará en vigencia a partir del 1° de noviembre de 2016.

Dado en Caracas, a los veintisiete días del mes de octubre de dos mil dieciséis. Años 206° de la Independencia, 157° de la Federación y 17° de la Revolución Bolivariana.


 

Moodle logo

Moodle Turnkey VirtualBox

Moodle

Es una poderosa herramienta para el aprendizaje electrónico (o aprendizaje en línea) y, esencialmente, es un sistema de gestión de cursos basados en una interfaz web, ¿suena sencillo, cierto? Pero debajo de esta apariencia está una nueva manera de aprender muy diferente del aprendizaje presencial. Para ir asimilando progresivamente el concepto, primero debemos leer y tener una noción de los que es la Educación a Distancia para luego agregar que Moodle es la herramienta para crear Aulas Virtuales de tal manera que podemos modelar los cursos que queramos impartir a los requerimientos de los participantes y la materia a enseñar. Sin embargo, esta sigue siendo una definición simplista, aún hay mucha tela que cortar al respecto.


AdvertenciaLa educación en sí misma es toda una ciencia, ardua y difícil. Nuestros respetos hacia esa rama epistemológica, sumo respeto. Acá tocaremos muy superficialmente ese tema, y si ya han leído nuestras muchas otras publicaciones, nos orientamos más hacia lo autodidacta (o como llama el hacker @ChemaAlonso “aprender haciendo” -lo otro es “aprender aprendiendo” dice él-). Esta entrada en nuestro blog vamos a enfocarnos más bien en instalar un servidor VirtualBox con Moodle, configurarlo y usarlo. Finalmente deseamos expresar nuestro agradecimiento a la Licenciada @MarielaLLovera por su breve orientación al tema, ¡muchas gracias!


Directo al grano: Moodle con TurnKey.

La manera más rápida de instalar y poner a funcionar -sin tanto esfuerzo- es ir a la página web de TurnKey Linux en su apartado Moodle. El esquema de negocios de dicha compañía es el servicio: ofrecen alojamiento y respaldos automatizados -y por supuesto cobran por ello- y a cambio nos dan una “api key” que la introducimos en nuestros servidores y nos olvidamos de muchas tareas de mantenimiento lo cual nos libera tiempo para dedicarlo a la administración en sí de Moodle.

La página de descarga de Moodle TurnKey (aproximadamente 297 megabytes al momento de escribir este artículo) utiliza Debian 8 Jessie y se deben descargar las actualizaciones de seguridad no más terminar de instalar el servidor (se puede obviar este paso si nuestro servidor es para pruebas nada más, como es nuestro caso).

Como hoy en día los vídeos están de moda  a la hora de enseñar, pues ni cortos ni perezosos hemos subido uno donde mostramos como instalamos y ponemos a punto de uso (fijaos en que los certificados autogenerados SSL para nuestro https saltarán las alarmas en nuestros navegadores web, en nuestros artículos hemos publicado bastante material explicando lo de la seguridad al navegar en páginas web).

Seguimos recalcando que hemos simplificado al máximo la tarea, debajo del capó se esconden no un motor sino varios motores: primero Debian quien sostiene todo, luego Apache2 Web Server con -como lo dijimos- SSL y como motor de base de datos MySQL, el correo electrónico (Postfix), las conexiones SSH, Adminer y por último y por supuesto Moodle (si olvidamos mencionar algún software libre os perdonáis por favor).

Al finalizar veremos que, para nuestro estudio, nuestro enrutador web de área local nos asignó la dirección 191.168.1.137 adonde podremos navegar y veremos una imagen parecida a esta:

Moodle Turnkey VirtualBox
Moodle Turnkey VirtualBox

Como abreboca es más que suficiente, vayamos ahora a profundizar en la materia: historia de Moodle.

Breve historia de Moodle.