Sábado 22 de julio de 2017

Asociación LiGNUx: Tutorial para instalar la versión de mantenimiento del kernel Linux 4.12.3
Baltasar Ortega

Baltasar Ortega
KDE Blog

Crónica matinal del segundo día de Akademy-es 2017 de Almería

Bienvenidos a la crónica matinal del segundo día de Akademy-es 2017 de Almería, una jornada un poco extraña para mi ya que solo estuve la mitad de ella, la vespertina. La razón es que por la mañana estuve en la Asamblea General de KDE e.V., del cual soy miembro desde hace poco. No obstante, mi pajaritos me han informado con solvencia de lo ocurrido. Espero no que notéis la diferencia.

Crónica matinal del segundo del día de Akademy-es 2017 de Almería

 

  • 10:00 – 11:00 Mi primera Aplicación KDE para Android – Albert Astals, desarrollador de KDE

Rompe el hielo Albert Astals, uno de los desarrolladores con más experiencia de la Comunidad KDE, que nos explica de forma práctica como crear una aplicación para el sistema dominante en los smartphone.

Concretamente, vemos como Albert creta un aplicación Qt para Android + PC usando QtQuick para la UI y KDE Frameworks.

Crónica matinal del segundo del día de Akademy-es 2017

  • 11:05 – 11:40 La importancia de la promoción: podcasts de KDE España – Ruben Gómez, coordinador de Podcasts de KDE España

Llega el momento de una charla centrada en la promoción de KDE España y el proyecto KDE. El gran comunicador Rubén nos cuenta la experiencia de la realización de los Podcast de KDE España, los cuales han sufrido un gran empuje desde que él se subió al equipo.

Además, mostró las estadísticas sobre las visitas y las  interacciones que están recibiendo los vídeo-podcast.

Aprovecho la ocasión para invitaros a seguirnos en los canales habituales:

 

  • 12:00 – 12:35 Modern C++ – Jesús Fernández, desarrollador de The Qt Company

Vuelven las charlas técnicas de la mano del nuevo miembro de KDE España, Jesús Fernández, que se estrena hablando del lenguaje de programación C++. En ella nos muestra un par de ejemplos que comenta detenidamente.

 

 

  • 12:40 – 13:25 Portátiles Slimbook y KDE – Alejandro López, Slimbook Team

Para cerrar la mañana se decidió parar con esta charla, y así coincidir con la gente de KDE e.V. en la comida. Entra en juego, Alejandro López, miembro del equipo de Slimbook, que nos habla de su gama de ordenadores compatibles 100% con Linux y de su producto nacido de la unión de los esfuerzos con el proyecto KDE, el famoso KDE Slimbook.

No obstante, el centro de su charla son las motivaciones de la empresa por introducirse en el apasionante y apenas explorado mundo de la unión de Hardware y Software Libre en un solo producto.

Recuerda: utiliza la etiqueta #akademyes cuando utilices twitter o facebook y hables de nuestro evento.

Cuando un “cuñado” empieza con GNU/Linux…

Viernes 21 de julio de 2017

Asociación LiGNUx: Ubuntu y la rolling release perdida.
Ubuntizando.com

Ubuntizando.com
Ubuntizando.com

Ubuntu quiere saber cuales son tus aplicaciones favoritas

Conocer qué aplicaciones son las más usadas y preferidas por los usuarios es clave para que una distribución sea popular. A todos nos gusta no perder el tiempo instalando aplicaciones comunes.  Con vistas a la presentación de Ubuntu 18.04 (aún nos toca esperar un poco) acaba de abrirse una encuesta a través de OMGUbuntu donde se pregunta a lectores y usuarios qué aplicaciones nos gustaría ver incluidas por defecto durante la instalación de nuestra distribución favorita.

Esta encuesta está dividida en diferentes categorías de aplicaciones y podemos sugerir varias por respuesta. Así que si somos unos indecisos no tenemos que torturarnos mucho en elegir. 😉

Ubuntizando.com

Ubuntizando.com
Ubuntizando.com

SurBook: La Surface killer de CHUWI ya es una realidad (Actualizado)

El pasado mes de abril hablaba de la expectación que despierta el último producto de CHUWI. Se trata de la Surbook, una tablet 2×1 (Windows 10 y Android) promete ser la próxima “SurFace Killer” ya que supera a ésta en muchos aspectos ya que cuenta con un procesador Intel Apollo Lake Lake N3450 (pequeño pero potente) y un chipset gráfico Intel HD Graphics de novena generación a un precio asequible.

Para lograrlo CHUWI inició una encuesta entre sus usuarios de cara a presentar un producto redondo en indieGOGO, plataforma de crowdfunding donde espera lograr la financiación necesaria para fabricar su próximo modelo.

Dentro de este dispositivo de 12,3 pulgadas (2736 x 1824 píxeles de resolución), encontramos además 6GB DDR de RAM y un almacenamiento de 128GB eMMC. Totos esto alimentado por una batería de 10.000 mAh de capacidad que garantiza más de 6 horas de autonomía.

 

La mala noticia es que por el momento CHUWI apuesta por WINDOWS 10 pero ya sabemos que su línea Lapbook si contará con la posibilidad de adquirirse con Ubuntu próximamente.

Este fabricante lo está haciendo muy bien. La meta fijada ha sido superada a falta de tres días en más de un 2559% de los $30,000 fijados como objetivo a falta de 3 días para finalizar. Vamos $767.569, que es un dineral y todo un logro. Solo resta que se animen a apostar por Linux como desde aquí venimos demandando. ¿Nos harán caso?

Baltasar Ortega

Baltasar Ortega
KDE Blog

Akademy-es y Akademy 2017 serán protagonistas del nuevo podcast de KDE España

Continuamos con la tercera temporada de los vídeo podcast de la Comunidad KDE española. En esta ocasión, y dado que los integrantes de KDE España se encuentran juntos en Almería, Akademy-es y Akademy serán protagonistas del nuevo podcast de KDE España. Así que, si nada lo impide, el próximo lunes 24 de julio a una hora por determinar, pero mañanera,  nos encontremos en directo y, con toda probabilidad, con un formato novedoso.

Akademy-es y Akademy 2017 serán protagonistas del nuevo podcast de KDE España

Akademy-es y Akademy 2017 serán protagonistas del nuevo podcast de KDE EspañaYa se habrá terminado Akademy-es y la parte de las charlas de Akademy, momento en el cual los integrantes del podcast de KDE España se reunirán en un lugar con buena conexión a la red para tratar como han ido estos eventos, explicar sus sensaciones y a contaros de primera mano las novedades que han surgido en ellos.

También será el momento para comentar los cambios que están surgiendo dentro de la misma asociación de KDE España, que seguro que os gustarán y animarán a formar parte de ella.

 

Así que. si no ocurre algún problema, el  próximo 24 de julio os invito a escucharnos (y vernos) en directo hablar sobre temas relaciones con KDE y el Software Libre en general.

Para poder disfrutar del podcast en directo seguiremos utilizando los servicios de acontecimiento en vivo de Youtube  y contestaremos, si podemos, vuestras preguntas en directo. Por cierto, este podcast será el séptimo de la tercera temporada.

¡Os esperamos el lunes 24 de julio a las 18:30!

Los podcast de KDE España

Ayúdanos a decidir el temaEn un afán de acercarnos más a todos los simpatizantes de KDE hace un tiempo que empezamos a realizar podcast. En ellos varios miembros de la Comunidad KDE de España nos reunimos para hablar un poco de los diversos proyectos.

Hemos hablado de muchos temas como por ejemplo Akademy, KDE Connect, Plasma Mobile, etc.

Podéis seguirnos en  el canal de Youtube de KDE España o en Ivoox, donde estamos subiendo poco a poco los audios emitidos. Esperamos que os gusten.

BlogDRAKE: Disponible TuningDrake 2.1.7

Jueves 20 de julio de 2017

Baltasar Ortega

Baltasar Ortega
KDE Blog

Crónica primer día de Akademy-es 2017 de Almería.

Llegó el gran día para los KDEeros españoles. Esta es la crónica primer día de Akademy-es 2017 de Almería. Espero que sirva para que los que no habéis podido venir os hagáis una idea de cómo se ha desarrollado el día.

Crónica primer día de Akademy-es 2017 de Almería.

Mi día comienza saliendo de casa a las 6 de la mañana y tras cinco horas de coche llegué a Almería. Fue muy sencillo encontrar el alojamiento recomendado y registrarme. Lo cierto es que la Residencia Civitas me sorprendió por su limpieza y su aspecto impoluto… cierto es que apenas tiene un año de funcionamiento pero no se le puede pedir más a una Residendencia de Estudiantes.

Tras llegar a la habitación, deshacer la maleta y cerrar unos asuntos, bajé al vestíbulo donde empecé a encontrarme con miembros de KDE España y otros desarrolladores de KDE Internacional. Saludos y alegría. No soy muy efusivo pero dentro de mi corazón mi regocijo es enorme.

Es el momento de ir a comer a la Universidad. Comida en la cantina de la Facultad abundante y buena. Empiezan las conversaciones interesantes sobre el software libre y la vida en general.

Ahora nos vamos al aula de las charlas para acabar de prepararla. Enchufes, wifi, mesas, etc. Es el momento que aprovecha Slimbook para montar su mesa de promoción y mostrar al mundo sus productos como KDE Slimbook o Excalibur.

  • 16:00 – 16:05 Ceremonia de apertura – Albert Astals, desarrollador de KDE

La persona que da inicio a esta primera jornada es el gran Albert Astals, ex-presidente de KDE España y desarrollador incansable de la Comunidad KDE. Con una pocas palabras da las gracias a los principales agentes que han hecho posible la realización de Akademy-es 2017Universidad de Almería (UAL)UNIA (Universitarios Informáticos de Almería) y HackLab Almería. Y, por supuesto, a Opentia por patrocinar el evento.

  • 16:10 – 16:45 Desarrollando Software Libre sin ser informático – Baltasar Ortega, editor de KDE Blog

La primera charla de la tarde la realiza un servidor, Baltasar Ortega editor de este blog, que intenta hacer una charla motivadora animando a que los asistentes al evento colaboren con el Software Libre y que si ya lo hacen animen a sus allegados a que también lo hagan, aunque sean simples usuarios. Ya que en realidad todo el mundo puede ser desarrollador de KDE aunque no sepa escribir una línea de código.

Crónica primer día de Akademy-es 2017 de Almería.

 

  • 16:50 – 17:25 Aplicaciones convergentes con QtQuick y Kirigami – Aleix Pol, Vicepresidente de KDE eV

Toca una charla una charla un poco más técnica con QtQuick y Kirigami de la mano de Aleix Pol donde nos pone los antecedentes de estas tecnologías y su relación con el proyecto KDE y nos explica un poco la estructura de Discover, una aplicación convergente.

Nos muestra otras aplicaciones como Subsurface, Kalgebra y Minuet, antes de explicar los componentes interesantes y explicar 4 ejemplos.

 

  • 17:30 – 18:05 Empaquetando KDE para openSUSE y SUSE Linux Enterprise – Antonio Larrosa, Presidente de KDE España

Llega el turno del desarrolladore de KDE más veterano que nos explica cómo funciona el empaquetado de los paquetes de KDE para las dos distribuciones de SUSE. Todo ello de forma prácticamente automática y online.

Como siempre, es sorprendente la forma de trabajo que tiene SUSE.

 

  • Descanso

Momento de tomar un respiro y reponer fuerzas. Café, zumo, bocadillos y dulces cortesía de KDE España. Momento de charlar de muchos temas de Software Libre.

 

 

  • 18:35 – 18:50 Para que sirve KDE España – José Millán, Tesorero de KDE España

Sale a la palestra el tesorero para explicar qué es y que no es la asociación KDE España. Una interesante charla de obligada realización todos los años. Uno de los objetivos de Akademy-es es aumentar el número de socios.

En esta presentación se anuncia la nueva forma de ser socio de KDE España, a la cual dedicaré una entrada especial.

 

  • 18:55 – 19:30 Buscando nuevos horizontes para KDE – Agustin Benito, ex-Tesorerode KDE eV

Finalizamos la jornada con el gran ideólogo de KDE Agustín Benito (@toscalix) que antes de empezar su charla nos presenta una charla donde nos muestra una pantalla táctil montada sobre una Raspberry Pi  con una distribución GNU/Linux y que sirve para controlar todos los parámetros de nuestro automóvil.

A continuación empieza su charla donde realiza una visión reflexiva sobre el el momento actual de KDE y hacia donde cree que debe moverse la Comunidad KDE que no es más que al mundo de la automoción. Una más que interesante charla.

Al finalizar toca realizar la Asamblea Anual de KDE España, la reunión donde los socios y tratan asuntos referidos al funcionamiento de la asociación.

Una vez concluido el cónclave queda recoger trastos e ir a la Residencia, y tras descansar unos minutos, reunirnos de nuevo para ir de cena. El colofón perfecto a un día perfecto. Mañana más.

Recuerda: utiliza la etiqueta #akademyes cuando utilices twitter o facebook y hables de nuestro evento.

Liher Sanchez

Liher Sanchez
El blog de Liher

Vendo mi portátil, me he comprado otro

He ido cambiando de portátil muchas veces desde que compré mi primer portátil usado y, no se la razón, pero nunca se me había ocurrido poner a la venta el portátil que vendía a través del blog, siempre lo he vendido a conocidos o a través de webs como milanuncios. Bueno, pues aquí os ofrezco la posibilidad de comprarlo, os daré todo lujo de detalles acerca del ordenador y las condiciones en las que esta para que podáis tomar la decisión de comprarlo o no.

El portátil que he comprado es un Lenovo Thinkpad T430S. Tiene un procesador Intel i5 de tercera generación con dos núcleos y dos hilos de proceso. Tiene 4 GB de RAM y le he puesto el SSD de 250 GB que tenia en el anterior. Tiene una tarjeta gráfica Nvidia. En cuanto a la diferencia con el anterior, el T420, no es mucha, el rendimiento es prácticamente igual con la diferencia de que la resolución de pantalla del T430S es de 1600×900, que puedo decir que es la principal razón por la que he cambiado. Mas adelante le ampliare la RAM y le iré haciendo algún cambio mas.

Ahora os detallo las características del portátil y sus componentes que pongo a la venta, también os pondré fotos y, si alguien quiere mas detalle también puedo enviar mas fotos por email.

El modelo que vendo es Lenovo Thinkpad T420. Tiene un procesador Intel i5 de segunda generación, con dos núcleos y 2 hilos de proceso, lo cual hace como si tuviese 4 núcleos. Cuando lo compre venia con 4 GB de RAM y le puse otras 4 GB, con lo que ahora mismo tiene 8 Gb de RAM. La tarjeta gráfica es una Intel HD que viene integrada en la placa base. La pantalla es de 14 pulgadas con una resolución máxima de 1368×768. Tiene una batería original que dura unas 3 horas y el cargador también es original. Tiene un disco MSata SSD de 60 GB en el cual instalare el sistema operativo que me pida el comprador, también tiene otro disco duro de 320 GB y otro mas de 120 GB en la bahia del DVD, lo entrego con los tres discos duros y recién formateados. El DVD también va incluido, es intercambiable con el tercer disco duro. He tenido instalado en el Ubuntu 14.04 y 16.04, Linux Mint 17 y 18, Debian 9, Manjaro, Linus lite y LXLE ademas de Windows 7. No he tenido ningún problema de hardware con ningún sistema operativo, todo funciona a la primera, es el ordenador que he usado durante el ultimo año y medio.

Estéticamente solo tiene un fallo, por así decirlo, la tecla F12 esta un poco suelta y cuando se usa a veces se quita, pero es muy fácil de ponerla y funciona sin problemas, personalmente apenas la he usado. Por lo demás esta perfecto, os enviare todas las fotos que me pidáis. Hace unos 6 meses lo abrí y le hice una muy buena limpieza general, le cambie la pasta térmica del procesador y limpie el ventilador y el sistema de refrigeración.

Por lo demás no se que mas os puedo decir, responderé a cualquier pregunta que queráis hacerme. El precio de todo es de 250 euros, los gastos de envío corren a cargo del comprador.

Os dejo algunas fotos

 

 

 

 

 

Si alguno de vosotros esta interesado y tiene cualquier pregunta no dudéis en poneros en contacto conmigo. Un saludo.

Asociación LiGNUx: Introducción básica a las BBDD ( Bases de Datos )

Miércoles 19 de julio de 2017

Liher Sanchez

Liher Sanchez
El blog de Liher

Como instalar Ubuntu Tweak en Ubuntu 16.04 y derivadas

Últimamente no le he dedicado mucho tiempo al ordenador y menos al blog. Tengo muchos artículos pendientes para escribir y aquí va uno de ellos. Me han consultado en varias ocasiones como instalar Ubuntu Tweak en Ubuntu 16.04 y sus derivadas como Linux Mint 18. Sé que un usuario que visitó mi blog me dejó la dirección pero he estado buscándolo y no recuerdo quien fue, desde aquí quiero darle las gracias y siento mucho no recordar su nombre.

En varias ocasiones os he hablado de Ubuntu Tweak y a mi me parece un programa genial por lo sencillo, potente y útil que es ya que nos permite hacer muchos cambios en nuestro sistema como seleccionar un tema de ventanas o configurar la ventana de inicio de sesión de LightDM. Una de las cosas que se pueden hacer con Ubuntu Tweak y que mas me gusta es el limpiador. Es una herramienta muy sencilla de usar y que nos permite tener nuestro sistema limpio.

La verdad es que me lleve un chasco cuando me enteré de que el proyecto iba a ser abandonado ya que llevo usando Ubuntu Tweak casi desde que empecé con Ubuntu y se ha convertido en imprescindible para mi. Por suerte los chicos de Getdeb han puesto a nuestra disposición una versión modificada para que pueda funcionar en Ubuntu 16.04 y tengo que decir que, después de usarlo durante mas de 1 año, no me ha dado ningún problema en absoluto. Lo he usado en Ubuntu 16.04 y en todas las versiones de Linux Mint 18 que están basadas en las diferentes revisiones de Ubuntu 16.04.

Bueno, no os entretengo mas, si queréis instalar Ubuntu Tweak en vuestro ordenador lo único que tenéis que hacer es acceder a la siguiente dirección:

Al acceder veréis una ventana con lo siguiente:

 

descargar ubuntu tweak para ubuntu 16.04

 

En esta pantalla tenéis que hacer click en la tercera linea empezando por abajo, es la que señala la flecha de la imagen. Al hacer click en dicha linea se descargará el instalable del programa. En el navegador os aparecerá un mensaje como este en la parte inferior izquierda:

 

mensaje descarga de ubuntu tweak

 

Debido a que el archivo que se descargar en un ejecutable que permite instalar un programa en nuestro Ubuntu nos sale esa advertencia. En este caso, como es de total confianza pulsamos en el botón que señala la flecha de la imagen, donde pone “Descargar” y ya tendremos el instalador en nuestro ordenador. Ahora solo tenemos que hacer doble click en el archivo descargado y se abrirá GDebi para instalar el programa, así de sencillo.

Ahora ya sabéis como podéis instalar Ubuntu Tweak en vuestro Ubuntu 16.04 y las distribuciones que sean derivada de esta. No se si los chicos de GetDeb volverán a hacer lo mismo mas adelante, quizás lo hagan con loa próxima versión LTS de Ubuntu, eso espero.

Un saludo a todos.

Ubuntizando.com

Ubuntizando.com
Ubuntizando.com

System76 presenta su propia distribución Linux. Cuando haces Pop!

Por mi parte estaba claro que la decisión de Canonical de abandonar Unity iba a traer importantes noticias. Si algo logró Canonical fue “estandarizar” el escritorio de modo que cualquiera, profano o no, pudiera reconocer el sistema como una seña de identidad. Esto no era ninguna tontería porque permite sentar unas bases y permitir reducir la curva de aprendizaje del sistema así como facilitar el desarrollo de aplicaciones de escritorio. Creo que no hay lugar a dudas en que Canonical logró colarse como escritorio por defecto para muchos hasta el punto de que muchos confunden Ubuntu por Linux en general (ya sé que no es la mayoría).

System76 acaba de presentar su propia distribución Linux, basada en Ubuntu, con el nombre de Pop!_OS. Disponible a partir de octubre de este año, promete ofrecer una agradable experiencia de usuario con un escritorio vistoso, rápido y funcional.

Si no puedes esperar ya es posible descargar la primera versión Alpha o conocer más información del proyecto desde su web oficial.

Mantén tus datos protegidos de SambaCry, actualiza Samba

Hace apenas unas semanas, vimos como la mayoría de usuarios de sistemas Windows, padecía el infierno de WannaCry, un ransomware que se extendió rápidamente por la red gracias a una vulnerabilidad en el protocolo SMB del conocido sistema operativo de Microsoft, incluso afectando a empresas tan importantes como Telefónica. Aunque parece que en WannaCry ha sido aplacado y Windows ha
TutorialesLinux.com: Instalar memcached en Plesk sobre CentOS

Lunes 17 de julio de 2017

BlogDRAKE: ¡Por fin! ¡Ha llegado Mageia 6!

Domingo 16 de julio de 2017

BlogDRAKE: Se ha publicado Mageia 6

Sábado 15 de julio de 2017

Gorka Urrutia

Gorka Urrutia
Nideaderedes

Nuevo capítulo del libro POO en PHP: Traits

El libro de programación orientada a objetos en PHP va creciendo poco a poco. Además de otras mejoras ya está disponible el capítulo sobre los Traits en PHP.

¿Qué son los traits?

En PHP no existe la herencia múltiple (una clase no puede tener más que una clase madre) y esa es una limitación importante. Para solucionar los problemas de esta limitación se introdujeron los traits que son una forma de hacer copia/pega sin hacer copia/pega.

Por supuesto, esto de los traits es bastante más complejo y es más largo de explicar. Si quieres descubrir mucho más acerca de los traits te recomienzo echar un vistazo al libro. En él podrás leer cómo se usan los traits, los peligros que tienen, cuándo usarlos, qué diferencias hay entre un trait y la herencia, etc.

Y recuerda que, hasta el 30 de Septiembre de 2017 está a un precio muy rebajado. Aprovecha para conseguir el libro ahora.

Formulario de registro en Elm

Recientemente he estado experimentando con Elm, un lenguaje funcional puro y a la vez framework de backend. De momento he programado ya he visto unas cuántas cosas y puedo decir que me gusta bastante, que es un soplo de aire fresco en el mundo web y que sinceramente no creo que vaya a triunfar algún día. Sin embargo para proyectos personales, lo veo como alternativa superior a Angular, React y Vue.

Uno de los ejercicios que puede venir bien para entender Elm es implementar un formulario de registro con normas para la contraseña. Según vayamos escribiendo se nos informa sobre qué errores tiene la contraseña para ser segura y cuando lo sea mostramos el botón de registro.

Es un código un poco tonto pero me apetecía compartirlo.

import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (onInput)
import Char
import String
import List

main : Program Never Model Msg
main = Html.program {init = init, view = view, update = update, subscriptions = subscriptions}

type alias Model =
{
    name : String,
    password : String,
    passwordAgain : String
}

init : (Model, Cmd Msg)
init = (Model "" "" "", Cmd.none)

subscriptions : Model -> Sub Msg
subscriptions model = Sub.none

type Msg = Name String | Password String | PasswordAgain String

update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
    case msg of
        Name name -> ({ model | name = name},Cmd.none)
        Password pass -> ({model | password = pass},Cmd.none)
        PasswordAgain pass -> ({model | passwordAgain = pass},Cmd.none)

view : Model -> Html Msg
view model =
    div []
        [
            input[type_ "text", placeholder "Name", onInput Name][],
            input[type_ "password", placeholder "Password", onInput Password][],
            input[type_ "password", placeholder "Confirm", onInput PasswordAgain][],
            viewValidate model
        ]

viewValidate : Model -> Html Msg
viewValidate model =
    let list = checkMinLength model :: checkPassword model :: checkUpper model :: checkLower model :: checkDigit model :: []
    wrongList = List.filter (\(x,y) -> not x) list
    in
    if List.length wrongList == 0 then
        div [] [button[]]
    else
        div [] (List.map showError wrongList )

showError : (Bool,String) -> Html Msg
showError (_,error) =
    div [style[("color","red")]] 

checkPassword : Model -> (Bool, String)
checkPassword model =
    if model.password == model.passwordAgain then
        (True,"")
    else
        (False,"Passwords do not match")

checkMinLength : Model -> (Bool,String)
checkMinLength model =
    if String.length model.password > 7 then
        (True,"OK")
    else
        (False,"Password must have a minimum length of 8 characters")

checkUpper : Model -> (Bool,String)
checkUpper model =
    let isUp = String.any Char.isUpper model.password
    in
    if isUp then
        (True,"")
    else
        (False,"The password must contain an upper letter")

checkLower : Model -> (Bool,String)
checkLower model =
    let isDown = String.any Char.isLower model.password
    in
    if isDown then
        (True,"")
    else
        (False,"The password must contain a lower letter")

checkDigit : Model -> (Bool,String)
checkDigit model =
    let isDig = String.any Char.isDigit model.password
    in
    if isDig then
        (True,"")
    else
        (False,"The password must contain a digit")

 

La entrada Formulario de registro en Elm aparece primero en Blog - Adrianistan.eu.

Jueves 13 de julio de 2017

Pausa

Ya comenzaron los cursos de verano por lo que estoy de trabajo (y calor) hasta el cuello. Inicia aquí una pausa para este blog en la que trataré de utilizar el escaso tiempo libre (y las escasas fuerzas) que me quede(n) para terminar el libro sobre LyX. A menos de una hipotética, imprevista e improbable […]

Miércoles 12 de julio de 2017

Kaspersky lanza su propio sistema operativo basado en Linux

Que Linux es un sistema operativo libre de virus, malware y demás porquería que podamos encontrar por internet, comenzó siendo un rumor en las redes y terminó cogiendo fuerza después de haberlo constatado a base de pruebas. Pero hoy, esa frase va a tomar muchísima más fuerzo, ¿el culpable? la conocida empresa Kaspersky. Kaspersky, a todos nos suena ya que en la última década ha sido
Liher Sanchez

Liher Sanchez
El blog de Liher

La importancia del responsive de una web

Nuestra sociedad cambia continuamente y nuestros hábitos y costumbres  también. Hace unos pocos años nadie o casi nadie llevaba un teléfono con Internet en el bolsillo y no os estoy hablando de hace 50 años, si os paráis a pensar cuanto tiempo hace que Internet esta en nuestros teléfonos móviles no es hace mucho. Yo hace unos 5 o 6 años que tengo Internet en el móvil, aunque me da la impresión de que es desde hace mas tiempo.

Me atrevería a decir que, hoy en día, cerca del 90% de la población española lleva Internet en el móvil y eso conlleva, entre otras cosas, que los negocios han tenido que cambiar la forma de publicitarse y mostrar sus servicios hacia sus potenciales clientes. A día de hoy todavía se encuentran muchos negocios sin pagina web y muchos de los que tienen web no la tienen adaptada a los teléfonos móviles, eso tiene que cambiar si no quieren quedarse atrás. Hace un par de días leí en una web llamada Metacom BCN que entre el 40% y el 70% del trafico web procede de los teléfonos móviles. Este es un dato que todos los negocios tienen que tener muy presente. Es muy importante que una empresa tenga pagina web y que sea responsive, es decir, que pueda ser navegable desde cualquier dispositivo, y esto tiene que ser si o si, ya no hay vuelta atrás. ¿Recuerdas la ultima vez que recurriste a las pagina amarillas para buscar una tienda? Fue hace tiempo, ¿verdad? Ahora la gran mayoría buscamos en Google.

Lo mismo que la web de un negocio tiene que ser responsive también tiene que estar optimizada para de cara al SEO. Para esto suelo usar un ejemplo muy claro para que la gente entienda realmente el valor del SEO. Si tienes un negocio y creas una web que no tiene trabajado el SEO es como tener una tienda física sin escaparate, sin rotulo de empresa y metida en un callejón por el que apenas pasa gente. Sin embargo, si trabajas el SEO puedes conseguir que esa tienda física acabe en una calle principal por la que pasa mucha gente, con un escaparte bonito y llamativo y con el nombre de la empresa en un rotulo bien grande para que la gente sepa quien eres y que haces. ¿Veis la diferencia? ¿Que tienda tiene mas posibilidades de conseguir clientes y salir adelante? La respuesta es clara 😀

Para que un negocio tenga una web y que esa web consiga su objetivo no hay nada mejor que buscar profesionales del sector, no vale con que tu cuñado o tu amigo te haga la web, a no ser que sea esa su profesión. Ese es el caso de Metacom BCN, una empresa del sector que esta especializada en la creación de paginas web, el marketing y el SEO, es la web que os he comentado al principio del articulo. Si queréis hablar con ellos podéis contactar aquí y pedir presupuesto para crear una web, una tienda online, hacer una auditoria SEO y mas. Seguro que vuestro negocio os lo agradecerá, todo lo que ellos pueden hacer por vuestra web es una inversión que seguro repercutirá positivamente en las ventas.

Un saludo a todos.

Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Permitir que nuestros usuarios ejecuten tareas controladas en nombre de otro. #SUID #SGID – Con ejemplos y ataques

Uno de los puntos fuertes de un sistema Unix es su forma de gestionar los privilegios de usuario. Se suele decir que el malware en GNU/Linux sólo afecta al usuario por el que entra (y podrá hacer todo lo que éste pueda hacer), por lo tanto será muy difícil (nada es imposible, y siempre hay bugs) que un programa ejecutado con privilegios de usuario normal afecte al sistema completo.

Eso sí, otro de los puntos fuertes de un sistema tipo Unix, es que nos deja automatizar absolutamente todo. Podemos crear sistemas que trabajen solos, que atiendan a eventos y éstos disparen acciones dentro del sistema, casi sin límite. Como muchas tareas dependen de datos externos, se ejecutan multitud de programas (cada uno de su padre y de su madre), si queremos mantener un sistema seguro, debemos hacer que el usuario que haga esa automatización de tareas sea un usuario con los menores privilegios posibles. Aunque puede que alguna vez necesite ejecutar algo con mayores privilegios, incluso privilegios root.

Una breve introducción (permisos sobre archivos)

En este tipo de sistemas, cuando consultamos los permisos de acceso de un archivo (por ejemplo con ls), veremos algo como esto:

ls -latr test
-rwxr-xr-- 1 gaspy oficina 8608 mar 11 20:40 test

Veremos (de derecha a izquierda) el nombre, la fecha, el tamaño, el grupo, el usuario, número de enlaces y privilegios. Lo que nos interesa son los privilegios. Son 10 caracteres, primero encontramos un carácter que indicará si es un archivo, directorio, enlace, pipe, socket o cualquier otra cosa, y luego tres grupos de tres que pueden ser r (readable), w (writable) y x (executable); es decir, cada grupo puede tener activa la lectura, escritura y la ejecución de forma individual dependiendo de lo que puede hacer con el archivo.
El primer grupo, que en este caso es rwx, corresponde al dueño del fichero, el usuario (u) que aparece al lado, es decir, gaspy. En este caso, el usuario gaspy podrá leer, escribir y ejecutar el fichero.
El segundo grupo, que es r-x (como vemos, no tiene la w), corresponde a los permisos que tendrá cualquier usuario que pertenezca al grupo (g), es decir, cualquier usuario del grupo oficina sólo podrá leer y ejecutar el archivo.
El tercer grupo, r– (no tiene w, ni x), corresponde a los permisos que tendrá cualquier otro usuario del sistema (o), vamos un usuario que no sea el dueño, ni pertenezca al grupo oficina sólo podrá leer el archivo.

Bueno, no digo nada de root porque éste lo puede hacer todo, ya lo dice el dicho: “Cada user en su home y root en la de todos”.

Eso sí, como vemos, cada grupo puede tener cualquier combinación de rwx para un mismo archivo, cada elemento (rwx) corresponde con un bit, lo que hacen que los permisos se representen con 3bits. Además cada grupo puede tener ocho combinaciones diferentes de rwx (—, –x, -w-, -wx, r–, r-x, rw-, rwx) por lo que podemos representarlas por un número entre el 0 y el 7. Por lo tanto, muchas veces podremos representar los permisos con su forma numérica, incluso con 3 números, podríamos representar los permisos de los tres grupos. Por ejemplo, podría ser 754 (ningún número podrá ser mayor a 7).

Para cambiar los permisos de un archivo, podemos hacerlo con chmod:

chmod o+r mi_archivo

Con esta línea, daremos permiso de lectura a cualquier usuario sobre el archivo mi_archivo. También podremos hacer:

chmod 777 test

Ahora estaremos dando permiso de lectura/escritura/ejecución sobre el archivo test a todo el mundo.

SETUID y SETGID

Estos bits indican que vamos a ejecutar dicho archivo como si fuéramos el usuario y/o el grupo dueños del archivo. Por lo tanto podremos hacer cosas que tal vez el usuario normal no puede hacer. Y es común utilizar estos bits para hacer que un usuario ejecute tareas como root o como cualquier otro usuario que especifiquemos. Eso sí, debemos definir bien los permisos.
Vamos a empezar con un ejemplo sencillo, primero vamos a crear un programa en C que ponga en pantalla el usuario actual, en realidad debería indicar el usuario efectivo, este usuario efectivo será el que verifique el sistema operativo para casi todas las tareas. Normalmente coinciden, pero en este tipo de casos se separan los caminos de cada uno y aunque un programa realmente lo lanza un usuario sin privilegios, el usuario efectivo debería ser root.
El programa en C será el siguiente (muy sencillo, sin comprobación de errores y lo llamaremos quiensoy.c):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <pwd.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    struct passwd *pww;

    pww = getpwuid(geteuid());
    printf ("USER: %s\n",  pww->pw_name);

    return 0;
}

Ahora compilamos, y ejecutamos:

gcc -o quiensoy quiensoy.c
./quiensoy
USER: gaspy

Luego le damos privilegios (con el usuario www-data, por ejemplo. Podría ser root si queremos):

sudo chown www-data:www-data quiensoy
sudo chmod u+s quiensoy
./quiensoy
USER: www-data

Dejo aquí un ejemplo con el que podemos ver también el grupo, usuario real y demás.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <sys/types.h>
#include <unistd.h>

int main()
{
    struct passwd *pww;
    struct group *grp;

    pww = getpwuid(geteuid());
    printf ("USER EFECTIVO: %s\n",  pww->pw_name);

    pww = getpwuid(getuid());
    printf ("USER REAL: %s\n",  pww->pw_name);

    grp = getgrgid(getgid());
    printf ("GRUPO REAL: %s\n",  grp->gr_name);

    grp = getgrgid(getegid());
    printf ("GRUPO EFECTIVO: %s\n",  grp->gr_name);

    return 0;
}

Ahora si compilamos, establecemos permisos y damos SGID y SUID veremos lo que pasa:

gcc -o quiensoy quiensoy.c
sudo chown www-data:openvpn quiensoy
sudo chmod u+s quiensoy
sudo chmod g+s quiensoy
./quiensoy
USER EFECTIVO: www-data
USER REAL: gaspy
GRUPO REAL: gaspy
GRUPO EFECTIVO: openvpn

De este modo podremos ejecutar acciones como si fuéramos otro usuario. Aunque tenemos que tener cuidado con lo que dejamos hacer a la gente.

SUID y SGID en scripts

Esto supone una gran brecha de seguridad. Si, por ejemplo el usuario pudiera escribir el script o crear un enlace a un fichero que llame el script, o sustituir algún programa (por ejemplo, un programa que use which para buscar un ejecutable y creemos un equivalente en una ruta a la que sí tengamos acceso… o bueno, se nos pueden ocurrir mil cosas por las cuales esto no sería seguro. Así que muchos sistemas operativos tipo Unix no te van a dejar… bueno sí te van a dejar, pero harán caso omiso del SUID/SGID que le hayamos dado, incluyendo las últimas versiones del kernel Linux. Aunque existe un ataque típico que consiste en aprovecharse del tiempo que tarda el kernel en leer en #! de comienzo del script así como el intérprete y cargar todo en memoria para hacer el cambiazo del script.

De todas formas, si queremos comprometer un sistema es un buen punto para probar, porque podemos alcanzar privilegios de forma muy fácil.

Hasta hace relativamente poco, podíamos utilizar scripts en perl con SUID, pero las últimas versiones ya no lo permiten. Podemos pensar que App Packer para perl nos haría el trabajo sucio, ya que crea un ejecutable directamente con nuestro script. Pero, tras unas comprobaciones de seguridad que hacen los ejecutables no es posible hacerlo. Existe una versión parcheada, pero si no es para experimentar yo no la usaría.

Otra cosa que podemos hacer es utilizar scripts en Python y compilarlos con cython. Si no queremos hacer programas en C, que a veces es la solución más pesada y con un script podemos hacer las cosas mucho más rápido. Los ejecutables quedarán algo grandes, pero es lo que tiene utilizar otro lenguaje y luego traducirlo. Podemos hacer algo como esto:

1
2
3
4
5
6
#!/usr/bin/python3

import os
import pwd

print ("QUIÉN SOY? {}".format(pwd.getpwuid(os.geteuid()).pw_name))

Ahora compilamos, asignamos permisos y demás:

cython --embed -3 quiensoy.py
gcc -I/usr/include/python3.5m quiensoy.c -o quiensoy -lpython3.5m
sudo chown root:root quiensoy
sudo chmod u+s quiensoy
./quiensoy
QUIÉN SOY? root

Envolventes de scripts

No lo recomiendo, para nada. Pero alguna vez, y sobre todo para hacer experimentos, está muy bien. El objetivo es crear un programa en C que ejecute un script y lo haga con privilegios del usuario elegido. Podemos hacerlo de múltiples maneras, ya que es un programa muy pequeño que sólo se encarga de llamar a otro programa:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <unistd.h>
#include <errno.h>
#include <stdio.h>

int main( int argc, char ** argv )
{
              if( setgid(getegid()) ) perror( "setgid" );
              if( setuid(geteuid()) ) perror( "setuid" );

              execl("./miscript", "./miscript", (char *) 0);

              return errno;
}

Pero vamos, no es nada recomendable, un usuario podría llegar a cambiar el contenido de miscript. Por ejemplo, en este programa (vulnerable por definición) podría cambiar la ruta desde la que se ejecuta el programa y así ./miscript seguramente no sea quien creemos que es. O simplemente podemos atacar una llamada de comando falseando la variable $PATH o cualquier otra variable de entorno.

De todas formas utilizar una envoltura de este tipo es prácticamente igual a utilizar sudo, que debidamente configurado y actualizado podría ser incluso más seguro.

Seguridad

¡ Ataques ! ¡ Ataques !
Es cierto que ningún sistema es 100% libre de fallos, y que cuanto menos código o programas ejecutemos con privilegios, mejor para nosotros y nuestra seguridad (menos puntos de rotura del sistema). De todas formas hay varios ataques clásicos y típicos para los programas ejecutados con SETUID/SETGID. En casi todos los sistemas están arreglados pero, tal vez nos encontremos ante un Unix pequeño (sobre todo de sistemas empotrados) o incluso en nuestra facultad tengan un sistema Unix de hace unos cuantos años y tengamos la necesidad de romperlo.

El primero de los ataques es un ataque IFS. Si has curioseado shell scripts, habrás visto que IFS es el Internal Field Separator, es decir, el separador de campos, o palabras, o comandos, etc. Entonces podríamos crear un archivo llamado “bin”, hacerlo ejecutable y poner lo que queramos ejecutar con privilegios. Al mismo tiempo, asignaremos a IFS el valor ‘/‘ (la barra de separación de directorios), para que cuando una envoltura ejecute ./miscript y el script intente procesar el intérprete ejecute en realidad nuestro fichero bin. Afortunadamente no suele funcionar desde hace muchos años, pero claro, siempre hay implementaciones pequeñas para IOT donde puede que funcione.

Otro ataque importante es el de la precarga de bibliotecas. Normalmente como usuarios podemos sustituir las bibliotecas que se cargan cuando ejecutamos un programa. Esto es muy útil para solucionar problemas en ciertos programas (sobre todo si no disponemos del código fuente), mantener retrocompatibilidad con bibliotecas y algunas cosas más. Aunque si lo llevamos al terreno de las maldades, podríamos sustituir todas las llamadas a printf() por lo que nosotros queramos, como abrir un intérprete de comandos, por lo que nada más ejecutar el primer printf() el programa abrirá un bash/sh/dash/etc. Eso sí, si el programa tenía activado el SUID o SGID, la shell la abrirá con el usuario dueño del archivo, lo cual puede ser muy malo. Afortunadamente, en la mayoría de sistemas esto ya no es un problema.

Otro posible ataque es debido a bugs de los programas instalados. Por ejemplo, hace poco tiempo, la aplicación nmap, muy útil para auditoría de red tenía el bit SUID definido en algunas distribuciones Linux, con lo que podíamos acceder a un modo interactivo y ejecutar un intérprete de comandos, con lo que teníamos root en muy poco tiempo. ¿Necesita nmap ese SUID? Si estamos en un servidor, ¿necesitamos nmap?
De todas formas, es una buena práctica de seguridad tener un listado de todos los archivos con SUID o SGID. De la siguiente forma:

find / -user root -perm -u=s -type f
/usr/sbin/pppd
/usr/bin/pkexec
/usr/bin/nvidia-modprobe
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/gpasswd
/usr/bin/chsh
/usr/bin/chfn
/usr/bin/newgrp

Y de la misma forma que ponemos -u=s para SUID, probaremos -g=s para SGID. Lo primero es preguntarnos, ¿necesitamos todo esto?. Si es nuestro trabajo estar al tanto de la seguridad del sistema, deberíamos revisar uno a uno todos los archivos que se pueden ejecutar, y no estaría de más crear un informe sobre cada uno de ellos, para revisarlo en el futuro.
Además, es importante hacer esto de forma periódica para ver que no hay cambios, o asegurarnos de que los cambios están controlados.

OverlayFS exploit. Podemos probarlo, afectaba desde Linux 3.13 hasta Linux 3.19. Podemos encontrarlo aquí. Sólo hay que compilarlo y veremos si el programa nos permite escalar privilegios

SUID/SGID en nuestro día a día

Seguramente hayas utilizado esta característica en el pasado casi sin darte cuenta. Ya que necesitaríamos privilegios especiales para escribir cualquier archivo sobre el que no tengamos permiso, por ejemplo como hace la orden passwd. Este comando, que sirva para cambiar nuestra contraseña de usuario deberá escribir sobre un archivo que ni tan solo podemos leer por cuestiones de seguridad, /etc/shadow y para hacerlo, necesitamos obligatoriamente permisos de superusuario. Si hacemos stat podremos ver:

stat /usr/bin/passwd
Fichero: ‘/usr/bin/passwd’
Tamaño: 54256      Bloques: 112        Bloque E/S: 4096   fichero regular
Dispositivo: 813h/2067d Nodo-i: 203318      Enlaces: 1
Acceso: (4755/-rwsr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Acceso: 2017-06-27 22:23:51.194148876 +0200
Modificación: 2017-05-17 01:37:35.000000000 +0200
Cambio: 2017-05-22 02:50:43.470092977 +0200
Creación: --

Por supuesto, sudo. Cómo si no se las apaña para cambiar el usuario antes de hacer la ejecución de un programa. Aunque tenemos que cumplir con la propia seguridad de sudo (archivo sudoers).

Ping… ¡ehh! ¿Por qué ping requiere privilegios? ping lo utilizamos muchas veces para probar la red, saber si tenemos conexión y saber el tiempo de respuesta de un servidor. Pero ping necesita acceso directo a los protocolos de red y eso sólo lo puede hacer root.

Otros comandos podrían ser mount / umount, mlocate y algunos más. Nosotros incluso podríamos crear algunos programas para la administración de nuestros servidores, toma de decisiones, y mucho más. Eso sí, con mucho cuidado, y estudiando las posibilidades de un usuario o malware a afectar nuestra máquina. A veces, ésta no siempre es la mejor solución.

Foto principal: Alex Knight

The post Permitir que nuestros usuarios ejecuten tareas controladas en nombre de otro. #SUID #SGID – Con ejemplos y ataques appeared first on Poesía Binaria.

Martes 11 de julio de 2017

Raúl González Duque

Raúl González Duque
Linux – Mundo Geek

Ubuntu: la aplicación para Windows

Se está haciendo historia y somos testigos de excepción: el infierno, por fin se ha congelado. Desde hace un tiempo ya era posible ejecutar Linux en Windows, gracias al Subsistema de Windows para Linux, pero ahora Microsoft va un paso más allá anunciando que desde hoy Ubuntu está disponible en la propia Windows Store.

Ubuntu en la tienda de Windows

Si tienes instalada una de las últimas compilaciones para insiders de Windows 10 instalar Ubuntu ahora es tan sencillo como seguir el enlace al sistema operativo en la tienda de Windows y hacer clic sobre el botón “Obtener”.

TutorialesLinux.com: Bloquear países por IPTables

Lunes 10 de julio de 2017

SpeedCrunch: una potente calculadora científica

SpeedCrunch es una calculadora científica de alta precisión con una interfaz gráfica que le da gran importancia al teclado. El proyecto tiene ya algunos años y recuerdo haberlo probado en el pasado, siempre dejándolo a un lado frente a otras alternativas como Qalculate!, pero hoy se me ha dado por probar de nuevo y la […]

Domingo 09 de julio de 2017

Xavier Genestos

Xavier Genestos
SYSADMIT

Linux: SSH login lento

Cuando realizamos una conexión SSH (Secure SHell), en ocasiones podemos encontrarnos con que el proceso de login es lento. Concretamente, experimentamos lentitud hasta que se nos pide el password. Ejemplo de problema de login SSH lento (conectamos con el usuario root al servidor ssh: 192.168.1.25): ssh root@192.168.1.25 Espera... Espera...Espera... Espera... Espera... Espera...
TutorialesLinux.com: Como añadir o borrar entradas DNS masivamente en Plesk

Jueves 06 de julio de 2017

Repensar «Domando al escritor»

Existen dos buenas razones en las que puedo escudarme para decir que este año no habrá una nueva edición de «Domando al escritor»: Estoy preparando «LyX, la otra forma de escribir» A principios del 2018 saldrá LibO 6.0 Esta nueva versión de LibO traerá seguramente varias novedades. Quizás las nuevas opciones para la interfaz gráfica […]

Miércoles 05 de julio de 2017

Linus Torvalds nos cuenta el presente y futuro de Linux en la LinuxCon 2017

A finales del pasado mes de Junio, pudimos ver a Linus Torvalds, creador del ecosistema y sistema operativo Linux, en las charlas anuales y conferencias de la LinuxCon que éste año se hicieron en Beijing, China.  No sólo pudimos disfrutar de la LinuxCon, sino que aunaron fuerzas para hacer las conferencias de lo más completas y las charlas unieron a la LinuxCon, ContainerCon y
Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Píldora #Bash: Conocer el tiempo que lleva un proceso abierto en Linux

Bash tiempo proceso
¡Una nueva sección! Después de tanto tiempo y tantas secciones inacabadas. Algo que tenía ganas de hacer, es crear posts con esa serie de recetas, scripts, oneliners, o píldoras que se me van ocurriendo mientras trabajo en consola. Suelen ser cosas pequeñas y deberían caber en un tweet junto con una pequeña descripción. De todas formas a mí me gusta explicar un poco más las cosas para que quede bien claro.

En este caso, vamos a empezar conociendo el tiempo que lleva abierto un proceso, o un programa. Puede ser una información útil si, por ejemplo, tenemos corriendo servicios que ante un problema se reinician solos. O porque simplemente queremos saber ese dato, al igual que: ¿cuánto tiempo llevo con el ordenador encendido? que podemos responder con uptime. En este caso queremos saber cuánto tiempo llevo con un programa arrancado, como puede ser firefox, spotify, chrome, o apache.

Al grano

Vamos a poner dos métodos que iré explicando más adelante:

pid=$(pidof firefox); s=$(($(date +%s)-$(stat -c %Y /proc/”$pid”))); echo $(date -ud “@$s” +”$(($s/86400)) dias %Hh:%Mm:%Ss”)
1 dias 23h:39m:24s

O de una forma más corta, podemos utilizar

ps -eo pid,etime,comm | grep firefox
24441  1-23:53:14 firefox

Donde veremos primero el PID, luego el tiempo y luego el nombre del proceso.

Explicando el primero

En el primer ejemplo, lo primero que hacemos es coger el ID del proceso (PID).

pid=$(pidof firefox)

Tras ello, sacaremos la fecha y hora en formato UNIX del momento actual (como siempre, esto será el número de segundos desde el 1 de Enero de 1970 a las 00:00).
date +%s

Luego consultaremos la fecha del directorio /proc/PID y la pondremos en formato UNIX también. Recordemos que todos los procesos tendrán un directorio virtual en /proc/ con información sobre los mismos.
stat -c %Y /proc/”$pid

El objetivo es restar las dos fechas, así obtenemos el número de segundos transcurridos desde que se inició el proceso. .
s=$(($(date +%s)-$(stat -c %Y /proc/”$pid”))); echo $s

Ahora sólo queda ponerlo en un formato más humano, es decir, en días, horas, minutos y segundos. Para ello, el número de días lo podemos sacar a mano, ya que sería $s (el número de segundos) dividido entre 86400 (los segundos que tiene un día). Pero el resto se lo podemos pedir al comando date. Lo hacemos así porque date presenta fechas y horas (1 de Enero de 2017 a las 12:34:45) no tiempos transcurridos (120 días 3 horas, 4 minutos, 5 segundos), aunque la hora actual es lo mismo que pedir el tiempo transcurrido desde las 00:00.
Podríamos también calcular todos los elementos a mano (días, horas, minutos y segundos), el problema es que el script ya no entraba en un tweet:

pid=$(pidof firefox); secs=$(($(date +%s)-$(stat -c %Y /proc/”$pid”))); printf ‘%d days %dh:%dm:%ds\n’ $(($secs/86400)) $(($secs%86400/3600)) $(($secs%3600/60)) $(($secs%60))
1 dias 23h:39m:24s

El segundo ejemplo, con ps

Este segundo ejemplo, será mucho más portable entre sistemas UNIX, y mucho más corto, es verdad, pero no nos da mucho juego a la hora de escoger el formato de salida. El formato del tiempo será fijo (días-horas:minutos:segundos) y será importante visualizar el PID o el nombre del proceso.
Además, es mucho más lento, ya que con ps estamos analizando el tiempo de todos los procesos del sistema, aunque luego en pantalla sólo mostremos el que nos interesa porque la salida de ps la hemos pasado por grep.

The post Píldora #Bash: Conocer el tiempo que lleva un proceso abierto en Linux appeared first on Poesía Binaria.

Martes 04 de julio de 2017

Chuleta pequeña sobre Git

El maravilloso git que fue regalo del dios en la tierra Torvals jejejeje…lastima que no triunfara mercurial…que era en el maravilloso Python.

Tiene un par de comandos que siempre se me olvidan y me toca buscar, es jugar con las ramas, porque no es algo diario pero con la suficiente rutina para que maldigas la falta de memoría.

  • Crear rama (en local y en remoto)
git checkout -b <branch_name>
git push <remote_name> <branch_name>

Por ejemplo:

git checkout -b feature_para_ayer
git push origin feature_para_ayer
  • Borrar una rama (en local y en remoto)
    git branch -d <branch_name>
    git push <remote_name> :<branch_name>

Por ejemplo:

git branch -d feature_para_ayer
git push origin :feature_para_ayer
Gaspar Fernández

Gaspar Fernández
Poesía Binaria

¿Cómo cerrar un puerto TCP ocupado por una aplicación en GNU/Linux?

Cuando vamos a establecer una comunicación entre dos máquinas a través de una red TCP/IP, vamos lo que estamos haciendo a diario miles de veces con nuestro ordenador mientras navegamos por Internet, lo hacemos a través de un puerto. Imaginemos que tenemos un sistema de comunicación rudimentario entre 10 amigos, con 5 cables y, cada cable, nos permite hablar con uno de nuestros amigos, pero claro, como sólo tenemos 5 cables, sólo podemos hablar con 5 amigos al mismo tiempo, así que en algún punto del recorrido deberá haber alguien con la capacidad de enchufar y desenchufar esos cables. El caso es que esos cables serían los canales, o puertos de nuestro sistema, alguien deberá enchufar y desenchufar cables para asegurarse de que nos conectemos con quien queremos.
Por lo tanto, yo tengo 5 cables que corresponden con las 5 conexiones que puedo tener simultáneas, ahora, por seguir un orden, si quiero conectarme con Alberto, éste se conectará con mi canal 1, aunque nadie me dice a mí que yo también esté en su canal 1. Ahora bien, conecto con Bruno por el canal 2 y cierro a Alberto, para conectar con Carla, que podemos enchufarla en el 1, ya que está libre… ahora Bruno y Alberto contactarán entre ellos, cada uno por alguno de los canales que tenga libre. Bueno, ¿se capta la idea?

Hablando de TCP/IP tenemos algunos más de 5 puertos (podríamos tener 65535 puertos) y serían las conexiones que podemos tener abiertas al mismo tiempo desde una máquina, o al menos desde una misma dirección IP. Y, hablando de nuestro ordenador, cada programa que tenemos en ejecución y que hace conexiones de red puede estar utilizando determinados puertos para establecer las comunicaciones. Por ejemplo, nuestro navegador, programas de chat, correo, música online, sincronización de información y demás tendrán ciertos puertos abiertos para utilizar dichos servicios. Algunos puertos estarán abiertos en modo escucha (para que otros se conecten con nosotros) y otros puertos serán las conexiones establecidas (nos hemos conectado a un puerto en modo escucha, en nuestro equipo, o en un equipo de la red).

Entonces, las aplicaciones que corren en nuestro sistema pueden tener determinados puertos abiertos para realizar su trabajo.

Nos gusta el cacharreo

Ahora bien, puede que si estamos desarrollando un programa que haga uso de la red, nuestro programa deje un puerto abierto y se haya quedado bloqueado. O también puede ser que estemos intentando poner a prueba la gestión de errores de un software, o estemos haciendo algo de ingeniería inversa. En cualquier modo, lo que queremos es cerrar sin piedad un puerto en nuestro ordenador.
Tenemos que tener cuidado porque, si lo hacemos sin control, puede que algún programa haga cosas muy raras. Además, necesitaremos permisos de root para algunas cosas, por lo que serán acciones privilegiadas.
En mi caso, casi siempre que hago esto es para experimentar. Por ejemplo, ¿cómo se comportaría mi programa si cierro la conexión de repente? Sin que ninguna de las dos partes se lo espere. Como también está bien utilizar iptables para restringir las futuras comunicaciones de mi aplicación (sería algo así como tirar del cable). El objetivo es que nuestro software sea más rubusto y sepa qué hacer en este tipo de casos.

Ver qué programa utiliza qué puerto

Lo primero que debemos hacer es averiguar qué proceso está utilizando el puerto que queremos. Con netstat.

netstat -tanp
(No todos los procesos pueden ser identificados, no hay información de propiedad del proceso
no se mostrarán, necesita ser superusuario para verlos todos.)
Conexiones activas de Internet (servidores y establecidos)
Proto  Recib Enviad Dirección local         Dirección remota       Estado       PID/Program name
tcp        0      0 127.0.0.1:631           0.0.0.0:*               ESCUCHAR    --
tcp        0      0 0.0.0.0:45847           0.0.0.0:*               ESCUCHAR    18904/nc
tcp        0      0 0.0.0.0:17500           0.0.0.0:*               ESCUCHAR    19556/dropbox
tcp        0      0 127.0.0.1:4381          0.0.0.0:*               ESCUCHAR    30420/spotify
tcp        0      0 192.168.0.7:60892       64.233.167.188:5228     ESTABLECIDO 22144/libpepflashpl
tcp        0      0 192.168.0.7:42090       157.55.235.157:40008    ESTABLECIDO 1992/skype
tcp        0      0 192.168.0.7:39342       xx.xxx.xxx.xx:28         ESTABLECIDO 7428/ssh
tcp     3775      0 127.0.0.1:35381         127.0.0.1:37516         ESTABLECIDO --
tcp        0      0 192.168.0.7:48130       192.30.253.124:443      ESTABLECIDO 24441/firefox
tcp        0      1 192.168.0.7:33380       92.189.149.89:35148     FIN_WAIT1   --
tcp        0      1 192.168.0.7:33988       92.189.149.89:35148     FIN_WAIT1   --
tcp        0      1 192.168.0.7:39694       37.35.181.204:63905     FIN_WAIT1   --
tcp        0      0 192.168.0.7:60244       xx.xxx.xxx.xx:143        ESTABLECIDO 3708/thunderbird
tcp        0      0 192.168.0.7:60544       138.68.115.83:443       TIME_WAIT   --
tcp        0      0 127.0.0.1:50542         127.0.0.1:35381         ESTABLECIDO 7345/emacs
tcp        0      0 192.168.0.7:53492       72.21.206.121:443       ESTABLECIDO 24441/firefox
tcp        0      0 127.0.0.1:37516         127.0.0.1:35381         ESTABLECIDO 7345/emacs

Sólo he puesto una pequeña muestra. Con los argumentos tanp conseguimos:
  • -t: Sólo muestra conexiones TCP.
  • -a: Muestra también los puertos que estamos escuchando
  • -n: No resuelve las direcciones. (Es mucho más rápido, pero veremos sólo IPs y no nombres)
  • -p: Muestra los procesos que originan dichas conexiones. (pid y nombre, si es posible)

Vemos que muchos programas no aparecen y eso puede ser debido a los privilegios con los que hemos ejecutado el programa, por lo que si utilizamos sudo deberíamos ver todos o casi todos. Por supuesto, la salida de netstat la podemos pasar por grep, para realizar un filtrado de lo que nos interesa:

netstat -tanp | grep  40008
tcp        0      0 192.168.0.7:42090       157.55.235.157:40008    ESTABLECIDO 1992/skype

Si queremos más información sobre las conexiones abiertas y su asociación con procesos, en lugar de netstat podremos utilizar lsof. Aunque con lsof veremos muchísima información, ya que no sólo se centra en conexiones de red, sino que veremos cada descriptor de archivo abierto en el sistema. Y como las conexiones de red suelen tener un descriptor de archivo asociado, las veremos también . Por lo que, con lsof, podremos visualizar todos los descriptores abiertos por todos los procesos. Por ejemplo:

sudo lsof -n | grep emacs | grep TCP
emacs      7345                     gaspy   17u     IPv4           40529162       0t0        TCP 127.0.0.1:49778->127.0.0.1:35381 (ESTABLISHED)
emacs      7345                     gaspy   18u     IPv4           40538567       0t0        TCP 127.0.0.1:50542->127.0.0.1:35381 (ESTABLISHED)
emacs      7345                     gaspy   19u     IPv4           40585112       0t0        TCP 127.0.0.1:53658->127.0.0.1:35381 (ESTABLISHED)
emacs      7345                     gaspy   20u     IPv4           40595540       0t0        TCP 127.0.0.1:53728->127.0.0.1:35381 (ESTABLISHED)
emacs      7345                     gaspy   21u     IPv4           41279086       0t0        TCP 127.0.0.1:37436->127.0.0.1:35381 (ESTABLISHED)
emacs      7345                     gaspy   22u     IPv4           41283195       0t0        TCP 127.0.0.1:37516->127.0.0.1:35381 (ESTABLISHED)
emacs      7345                     gaspy   23u     IPv4           41284210       0t0        TCP 127.0.0.1:37578->127.0.0.1:35381 (ESTABLISHED)

Con lo que veremos las conexiones TCP que ha establecido mi aplicación Emacs.

También podemos conocer con fuser, el proceso que origina la conexión. Conociendo el puerto (por ejemplo 35381):

fuser -n tcp 35381
35381/tcp:            7359

Matando procesos

Si queremos ser rápidos, lo más fácil para cerrar la conexión de manera abrupta, y una buena forma para probar nuestros programas es matarlos. Como muchos sabréis podemos hacerlo con kill.

kill 7345

O con killall, pero tenemos que tener cuidado si hay varios procesos con el mismo nombre.
killall emacs

Aunque tanto kill como killall, por defecto intentan cerrar la aplicación educadamente, y la aplicación puede elegir cerrarse o no. Incluso puede estar bloqueada, por lo que si queremos podemos utilizar el argumento -9 o -SIGKILL , con lo que el programa no tendrá más remedio que terminar, es más, no tiene elección, ya que es el sistema operativo el que lo mata.

De todas formas, una forma algo más segura es matar al proceso que tiene un determinado puerto. Igual que antes veíamos la información con fuser. Este comando también mata aplicaciones, directamente enviando SIGKILL, es decir, matando, sin pedir permiso, las aplicaciones (a no ser que lo especifiquemos en los argumentos):

fuser -k -n tcp 8080
8080/tcp:            23003

Método artesano que sólo cierra conexiones

Me encanta este método. Con él hacemos que el proceso entre en depuración y lo matamos. Una cosa importante a tener en cuenta, como dije antes, son los descriptores. Cada conexión, o fichero abierto tiene un descriptor único para la aplicación en la que se encuentra. Y suelen ser números pequeños y secuenciales. Así como la salida estándar por pantalla suele ser el 1, la salida de error el 2, y la entrada por teclado el 0, cuando abrimos el primer fichero, se le asignará el 3 y cuando creamos una conexión después el 4, y así sucesivamente. Entonces, veamos cómo al ejecutar lsof, vemos en mi cuarta columna, generalmente unos números. Para hacer el ejemplo más legible, he ejecutado netcat para abrir un puerto, así:

nc -l 54321

Luego, para averiguar el ID de proceso, lo podemos hacer con fuser, por ejemplo, aunque podemos utilizar cualquier comando de los explicados anteriormente:
fuser -n tcp 54321
54321/tcp:           23101

Ya que tenemos nuestro PID, 23101, vemos los descriptores abiertos por ese proceso:
lsof -np 23101
COMMAND   PID  USER   FD   TYPE    DEVICE SIZE/OFF    NODE NAME
nc      23101 gaspy  cwd    DIR      8,22    12288 7602177 /home/gaspy
nc      23101 gaspy  rtd    DIR      8,18     4096       2 /
nc      23101 gaspy  txt    REG      8,18    31248  129397 /bin/nc.openbsd
nc      23101 gaspy  mem    REG      8,18  1868984  426046 /lib/x86_64-linux-gnu/libc-2.23.so
nc      23101 gaspy  mem    REG      8,18   101200  400728 /lib/x86_64-linux-gnu/libresolv-2.23.so
nc      23101 gaspy  mem    REG      8,18    81040  393967 /lib/x86_64-linux-gnu/libbsd.so.0.8.2
nc      23101 gaspy  mem    REG      8,18   162632  396890 /lib/x86_64-linux-gnu/ld-2.23.so
nc      23101 gaspy    0u   CHR    136,14      0t0      17 /dev/pts/14
nc      23101 gaspy    1u   CHR    136,14      0t0      17 /dev/pts/14
nc      23101 gaspy    2u   CHR    136,14      0t0      17 /dev/pts/14
nc      23101 gaspy    3u  IPv4 139144920      0t0     TCP *:54321 (LISTEN)

Al final, veremos 0u, 1u, 2u, 3u (la u indica que es de lectura/escritura; r, sería lectura y w, escritura. Aunque algunas veces tenemos descriptores de lectura/escritura que no son necesariamente así… pero eso es otra historia). Lo que nos interesa es que el descriptor 3 es el que corresponde con la conexión que queremos cerrar. Ahora, podemos utilizar gdb para depurar el programa e introducir un comando close() a dicho descriptor, para cerrarlo (salen muchas letras, pero es sencillo):

sudo gdb -p 23101
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type “show copying”
and “show warranty” for details.
This GDB was configured as “x86_64-linux-gnu”.
Type “show configuration” for configuration details.
Para las instrucciones de informe de errores, vea:
.
Find the GDB manual and other documentation resources online at:
.
For help, type “help”.
Type “apropos word” to search for commands related to “word”.
Adjuntando a process 23101
Leyendo símbolos desde /bin/nc.openbsd…(no se encontraron símbolos de depuración)hecho.
Leyendo símbolos desde /lib/x86_64-linux-gnu/libbsd.so.0…(no se encontraron símbolos de depuración)hecho.
Leyendo símbolos desde /lib/x86_64-linux-gnu/libresolv.so.2…Leyendo símbolos desde /usr/lib/debug//lib/x86_64-linux-gnu/libresolv-2.23.so…hecho.
hecho.
Leyendo símbolos desde /lib/x86_64-linux-gnu/libc.so.6…Leyendo símbolos desde /usr/lib/debug//lib/x86_64-linux-gnu/libc-2.23.so…hecho.
hecho.
Leyendo símbolos desde /lib64/ld-linux-x86-64.so.2…Leyendo símbolos desde /usr/lib/debug//lib/x86_64-linux-gnu/ld-2.23.so…hecho.
hecho.
0x00007ff39bffa060 in __accept_nocancel () at ../sysdeps/unix/syscall-template.S:84
84 ../sysdeps/unix/syscall-template.S: No existe el archivo o el directorio.
call close(3)
1 = 0
quit
Una sesión de depuración está activa.
Inferior 1 [process 23355] will be detached.
¿Salir de cualquier modo? (y or n)
y
Separando desde el programa: /bin/nc.openbsd, process 23355

Eso sí, puede que el programa que estamos corriendo dependa de la conexión, o ese sea su único propósito, por ejemplo netcat o telnet, por lo que una vez cerrada la conexión se cierran. Aunque otros programas utilizan las conexiones de red realizan otras tareas como por ejemplo mantener un entorno gráfico, monitorizar el sistema, actualizar un fichero, etc; deberían poder gestionar correctamente ese cierre de conexión sin sufrir ningún desastre.

killcx, o cerrar conexiones educadamente

Ésta es una de esas herramientas (escrita en Perl) que deben estar en nuestra caja de herramientas de sysadmin. Y sirve para matar conexiones, aunque lo hace de un modo seguro. Es más, es capaz de cerrar una conexión que se ha quedado bloqueada en el sistema. Para utilizarla debemos hacer:

sudo ./killcx 127.0.0.1:54321 lo
killcx v1.0.3 -- (c)2009-2011 Jerome Bruandet -- http://killcx.sourceforge.net/
[PARENT] checking connection with [127.0.0.1:54321]
[PARENT] found connection with [127.0.0.1:44904] (ESTABLISHED)
[PARENT] forking child
[CHILD]  setting up filter to sniff ACK on [lo] for 5 seconds
[PARENT] sending spoofed SYN to [127.0.0.1:44904] with bogus SeqNum
[CHILD]  hooked ACK from [127.0.0.1:44904]
[CHILD]  found AckNum [3556219343] and SeqNum [477005426]
[CHILD]  sending spoofed RST to [127.0.0.1:44904] with SeqNum [3556219343]
[CHILD]  sending RST to remote host as well with SeqNum [477005426]
[CHILD]  all done, sending USR1 signal to parent [23768] and exiting
[PARENT] received child signal, checking results…
=> success : connection has been closed !

La IP y puerto variarán según nuestras necesidades, y lo es el dispositivo, que podrá ser eth0, wlan0, etc.
La herramienta podemos descargarla desde aquí.

Foto principal: Alex Lehner

The post ¿Cómo cerrar un puerto TCP ocupado por una aplicación en GNU/Linux? appeared first on Poesía Binaria.

Lunes 03 de julio de 2017

Documentación con rustdoc

La documentación es una parte importante y muchas veces olvidada de un proyecto de software. Rust cuenta desde el principio con una herramienta destinada a que escribir documentación sea poco doloroso, se trata de rustdoc.

Comentarios en Markdown

Los comentarios de rustdoc empiezan con 3 barras y pueden llevar Markdown. Se escriben encima de la función, estructura, etc que describamos.

/// Perfil almacena los datos del perfil de un usuario en nuestra webapp
struct Perfil{
    username: String,
    password: String,
    url: Option<String>
}

impl Perfil{
    /// Genera un nuevo Perfil
    /// # Ejemplo
    /// ```
    /// let user = Perfil::new("The42","1234");
    /// ```
    pub fn new(u: &str, p: &str) -> Perfil{
        Perfil {username: String::from(u), password: String::from(p), url: None}
    }
}

Mencionar que el código del comentario es sometido a tests también por cargo test. Para generar la documentación basta con escribir cargo doc y Cargo generará la documentación en formato HTML.

Consultando documentación

El mejor sitio para leer la documentación de Rust es Docs.rs. Docs.rs ejecuta cargo doc a todas las crates de Crates.io y las expone al público sin costo.

 

La entrada Documentación con rustdoc aparece primero en Blog - Adrianistan.eu.

Tests en Rust

Mientras los programas no puedan verificarse de forma matemática de forma sencilla, la única manera de asegurarse que un programa más o menos funciona es con tests. Rust soporta tests de forma nativa. Gracias a la directiva #[test].

Definiendo una función de test

Una función de test es cualquiera que lleve la directiva #[test]. Normalmente, estos tests se dejan dentro de un módulo con la directiva #[cfg(test)].

fn suma(a: i32,b: i32) -> i32{
    a+b
}

#[cfg(test)]
mod test{

    #[test]
    fn suma(){
        assert_eq!(super::suma(4,5),9);
    }
}

La macro assert_eq! provocará un panic! si sus argumentos no coinciden. También es posible hacer fallar los tests llamando a panic! manualmente. ¿Cómo se ejecutan estos test te preguntarás? Sencillo, con cargo test. Automáticamente Cargo selecciona las funciones de test y las ejecuta todas, generando un informe de tests existosos y tests que han fallado.

Obviamente, existen más opciones dentro de los tests. assert! comprobará que una expresión sea true. #[should_panic] se deberá indicar en aquellas funciones de test en lo que lo correcto sea que ocurra un panic!. Por otro lado, la trait Debug es interesante.

Es posible ejecutar tests de forma manual, con cargo test NOMBRE_TEST.

 

La entrada Tests en Rust aparece primero en Blog - Adrianistan.eu.

Lunes 26 de junio de 2017

¿Realmente te conoce? –AdsBlock

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

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

Ya que donaste los datos, que puedo hacer.

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

Hace años 10 años una persona que respeto me compartió este video sigue vigente creemos que los servicios que usamos son gratis realmente.
https://www.youtube.com/watch?v=6bYLRGS3vFs

 

 

 

 

 

 

 

 

 

Domingo 25 de junio de 2017

José María Morales Vázquez

José María Morales Vázquez
tecnología – Un lugar en el mundo…

Script desatendido para eliminar ficheros antiguos de un servidor ftp

Hace ya un tiempo que dejamos por aquí el “esqueleto” de un script para realizar una conexión y transferencia desatendida a un servidor ftp. La finalidad del mismo era automatizar los backups en nuestro hosting cuando lo que nos proporcionan para ello es este medio. Auxiliar a este tenía uno que eliminaba los backups antiguos, pero nunca llegué a estar demasiado satisfecho de él. Hace poco buscando mejorarlo vi una solución maravillosamente elegante en stackoverflow. El script original es este:

#!/bin/bash
# get a list of files and dates from ftp and remove files older than ndays
ftpsite="ftp.yourserver.com"
ftpuser="loginusername"
ftppass="password"
putdir="/public_ftp/admin/logs"

ndays=7

# work out our cutoff date
MM=`date --date="$ndays days ago" +%b`
DD=`date --date="$ndays days ago" +%d`

echo removing files older than $MM $DD

# get directory listing from remote source
listing=`ftp -i -n $ftpsite <<EOMYF 
user $ftpuser $ftppass
binary
cd $putdir
ls
quit
EOMYF
`
lista=( $listing )

# loop over our files
for ((FNO=0; FNO<${#lista[@]}; FNO+=9));do
  # month (element 5), day (element 6) and filename (element 8)
  #echo Date ${lista[`expr $FNO+5`]} ${lista[`expr $FNO+6`]}          File: ${lista[`expr $FNO+8`]}

  # check the date stamp
  if [ ${lista[`expr $FNO+5`]}=$MM ];
  then
    if [[ ${lista[`expr $FNO+6`]} -lt $DD ]];
    then
      # Remove this file
      echo "Removing ${lista[`expr $FNO+8`]}"
      ftp -i -n $ftpsite <<EOMYF2 
      user $ftpuser $ftppass
      binary
      cd $putdir
      delete ${lista[`expr $FNO+8`]}
      quit
EOMYF2

    fi
  fi
done

Por comentarlo un poco y “ganarnos el pan”, el script tiene tres bloques: el primero de definición de variables que tendrás que personalizar con tus datos (hasta la línea 8 incluida), el segundo en el que se realiza una conexión con el servidor y se obtiene un listado de todos los ficheros que están en el directorio que indicamos (hasta la línea 25) y por último un tercer bloque en el que se realiza el borrado propiamente dicho.

En el primer bloque la variable ndays en la línea 8 define la máxima antigüedad de los ficheros que no se eliminaran (7 días en este caso) y la variable putdir en la 6 el directorio del servidor ftp donde dejamos los archivos. Si, como yo, dejas los backups directamente en el raiz del servidor ftp puedes eliminar (o comentar) las líneas 6, 20 y 42

En el segundo bloque, la línea 14 indica la fecha límite de los ficheros que se conservaran. Todos los anteriores a esta se eliminarán. Si no quieres que aparezca en la salida puedes eliminarla o comentarla.

En el tercer bloque, si quieres hacer pruebas de que el script funciona antes de lanzarlo en modo real, puedes comentar la línea 43. Esto te mostrará en la consola los ficheros que se eliminarían pero no te los borrará realmente con lo cual podrás comprobar que el script hace lo que realmente necesitas. La línea 38 es la que te muestra el fichero que va a borrarse. Puedes eliminarla o comentarla también cuando ya no te interese. Por último, la línea 30 que aparece comentada muestra un listado de todos los ficheros del servidor ftp antes de realizar el borrado. Puedes descomentarla también para evaluar si está trabajando de forma correcta.

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: Script desatendido para eliminar ficheros antiguos de un servidor ftp || Hospedado en un Cloud VPS de Gigas.

Activar/desactivar registro de usuarios en WordPress

Registro WordPress

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

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


order allow,deny
deny from 8.8.8.8
deny from 8.8.8.9
allow from all

Sábado 24 de junio de 2017

Seguridad en WordPress , Garantizar el acceso a wp-admin

WordPress por ser un CMS mas usado pues tienes vulnerabilidades y necesitamos blindarlo en seguridad y que mejor usando plugins para que no tengas una mala experiencia.

Esta es una de esas en la cual la ruta  ../wp-admin/ la remplazas para evitar acceso a ella.

En el caso el plugin WPS Hide Login no vas a eliminar /wp-login.php o /wp-admin , pero si lo va remplazar para no sea visible y colocaremos una url que solo sabremos nosotros.

Lo buscamos  WPS Hide Login en plugins  haz clic en Instalar y posteriormente en Activar.

En el plugin accede a Ajustes, Generales y establece la palabra de paso que sustituirá al clásico:

wp-admin por no-vasaentrar guardas los cambios y pruebas.

Configuración del plugin

Cuando intentas acceder a  http://tu-dominio.com/wp-admin
Te dará un 404 not found

De igual forma  también para  /wp-login.php no existen.

 

Prueba de acceso incorrecta

Si por el contrario pones la url de tu dominio con la palabra de paso establecida:

http://tu-dominio.com/?no-vasaentrar

Te va a salir tu panel para acceder, que se busca con esto, evitar ataques de diccionario, evitar suscripciones y proteger tu CMS de la mejor manera.

si por casualidad no te acuerdas de la url, puedes borrar el plugin en la carpeta wp-content y vuelve a la ruta original

 

Jueves 15 de junio de 2017

Gorka Urrutia

Gorka Urrutia
Nideaderedes

Ya está disponible mi libro de programación orientada a objetos en PHP

Con un pequeño retraso pero ya está disponible mi libro de programación orientada a objetos en PHP.

En mi humilde opinión es un libro que merece la pena. En él comparto muchos años de experiencia desarrollando en PHP. Todo lo que he aprendido, lo que he sufrido y lo que me he divertido programando está reflejado en sus páginas.

Está todavía en fase “Beta” ¿qué quiere decir eso? Que todavía no está terminado y puede haberse colado algún errorcillo. Para compensarlo el precio es mucho más bajo de lo que será el precio definitivo. Pero “sin terminar” no quiere decir que tenga pocas páginas, son ya casi 120 páginas de pura sabiduría :-D.

El fatídico logo

Martes 13 de junio de 2017

Todo el mundo debería tener su propia App Móvil

Cualquiera que tenga una página web o otro medio de comunicación en internet debería tener una app. Esta permite conectar directamente con cada cliente, permite mandar notificaciones personificadas y así aumentar las ventas, conversiones o visitas. Los teléfonos móviles han aumentado su cuota y ya superan al ordenador en cantidad de personas que lo usan […]

La entrada Todo el mundo debería tener su propia App Móvil aparece primero en Blog de Informática ✏ Luisi.

Lunes 12 de junio de 2017

Llega el veranito y quiero mejorar mi ingles…coño ayuda a la comunidad del software libre

Dentro de las incongruencias del ser humano, tenemos dos muy importantes:

  • las promesas de año nuevo, que nunca se cumplen o quedan lejos del éxito.
  • y con llegada del verano, las miles de ideas de aprovechar el tiempo…”que si me voy de turismo ONGero”, “que si me apunto a clases de ingles”, “que si voy al curro en bici”…pero al final la única bici que ves es las que te hacen dormir la siesta en La2 con la vuelta de españa.

Pero bueno, desde los tomates, no vamos desanimarte en tu intento de mejorar con la lengua de la isla.

Pero ya que te mola el turismo ONGero…¿Por qué no aprovechas tu esfuerzo de aprender ingles, ayudando a la comunidad del software libre?

Ayudaras a proyectos de software libre traduciendo sus textos al español desde el ingles, y además te vale para curriculum, porque es una colaboración con un proyecto.

Desde aquí te pasamos una lista de webs donde hay alojados los textos a traducir al español:

  • Launchpad: es una web montada por Canonical (Ubuntu) donde a parte de proyectos de esta distribución, encontrarás muchos otros proyectos que aprovechan las herramientas que les dan para gestionarlos, entre ellas un panel web de traducción.
  • Transifex: un web que ofrece servicios de traducción a proyectos de software, pero que si el proyecto es software libre se lo da gratuitamente.
  • Traducciones de la wikipedia: aquí puedes además de traducir del ingles al español, al contrario. Y además tienes que esforzarte en la redacción y no son palabras sueltas. Aportas contenido y refuerzas la mayor enciclopedia colaborativa y de cultura libre que no es otra que la wikipedia.

Y de propina Stringlate, es una APP libre que puedes encontrar en F-Droid un “store de APPs libres para Android”, esta te da un formulario muy fácil también para colaborar en la traducción de aplicaciones libres de Android.

¿Sabes algún otro sitio donde se pueda colaborar en traducciones de material libre al español?

Sábado 10 de junio de 2017

Lenin Hernandez

Lenin Hernandez
Leninmhs

Como instalar la ultima versión de Firefox en Debian Jessie, vía APT

En esta breve entrada lograras tener la ultima versión del navegador web Firefox en tu sistema Debian. Lo instalaremos agregando el repositorio de firefox para Debian, con lo cual podremos mas adelante volver a actualizar y obtener la versión mas reciente cuando pase algo de tiempo. Pasos para instalar ultima versión de Firefox en Debian … Sigue leyendo Como instalar la ultima versión de Firefox en Debian Jessie, vía APT

Martes 06 de junio de 2017

Bruno Exposito

Bruno Exposito
The Linux Alchemist

20 consejos para optimizar consultas SQL

1.- Elije el motor de almacenamiento mas apropiado

Los principales motores de búsqueda son MyISAM e InnoDB, pero existen muchos otros como Aria, TokuDB, XtraDB o archive.

MyISAM es mas apropiado en aquellos casos en los que predominen las consultas SELECT.

Sus principales características son:
– Bloqueo a nivel de tabla
– Mayor velocidad en consultas SELECT
– Alta compresión
– Búsquedas full-text
– No soporta claves foráneas

InnoDB es mas apropiado si predomina los INSERT, UPDATE o DELETE

Sus principales características son:
– Bloqueo a nivel de fila
– Permite claves foraneas
– Búsquedas full-text a partir de la versión 5.6.4
– Permite transacciones

Mención especial para Aria (como alternativa a MyISAM) y Archive (para almacenar logs).

 

2.- Evita select *

Selecciona tan solo aquellas columnas que realmente vayas a utilizar.

Seleccionar mas columnas de las necesarias aumenta el tiempo que tarda en ejecutarse la consulta y el tiempo de transferencia si la BBDD está en un servidor independiente.

Bien:
SELECT id, titulo FROM tareas;

Mal:
SELECT * FROM tareas;

 

3.- Limita el n.º de resultados

Utiliza una clausula LIMIT si solo necesitas una determinada cantidad de resultados o si estás filtrando por id y por lo tanto solo hay un resultado como máximo.

Bien:
SELECT id, titulo FROM tareas where id = 555 LIMIT 1;

Mal:
SELECT id, titulo FROM tareas where id = 555;

4.- Evita subconsultas

Por cada subconsulta que agregues, MySQL va a realizar una query adicional por cada registro de la query principal.

Si tienes una consulta que muestra 100 resultados, realizará 100 consultas adicionales por cada subconsulta.

Bien:
SELECT t.id, t.nombre, s.salario
FROM trabajadores t
JOIN salarios s ON s.trabajador = t.id

Mal:
SELECT t.id, t.nombre, (SELECT salario from salarios s where s.trabajador = t.id) as ‘salario’
FROM trabajadores t

 

5.- Guarda direcciones IP como unsigned int

Guarda las direcciones IP como un entero sin signo. PHP permite convertir una IP con ip2long y long2ip para revertir el proceso.

6.- Optimiza la consulta para la cache

Algunas funciones impiden a MySQL cachear la consulta, por ejemplo, la función now() obtiene la fecha/hora actual cada vez que se ejecuta.

Una solución sería obtener la fecha en el lenguaje que estés usando junto con SQL (PHP, JAVA, etc)

 

7.- Join con el mismo tipo de columna

Hacer join con una columna del mismo tipo y tamaño es mas rápido.

8.- Autoincrementales unsigned

Los autoincrementales no pueden ser negativos, estableciendo la columna como unsigned ganas un bit extra, lo que permite guardar valores mas grandes.

Tipo Bytes Mínimo Máximo Unsigned
TINYINT 1 -128 127 No
0 255 Si
SMALLINT 2 -32768 32767 No
0 65535 Si
MEDIUMINT 3 -8388608 8388607 No
0 16777215 Si
INT 4 -2147483648 2147483647 No
0 4294967295 Si
BIGINT 8 -9223372036854775808 9223372036854775807 No
0 18446744073709551615 Si

 

9.- EXISTS en lugar de IN

Utiliza exists siempre que sea posible, ya que EXISTS deja de buscar cuando encuentra una coincidencia.

 

10.- Evita usar WILCARD (%)

El wilcard (%) penaliza seriamente el rendimiento, utilizalo solo si es estricamente necesario.

Mal:
SELECT id, usuario, password
FROM usuarios
WHERE usuario LIKE ‘%bruno%’;

Bien:
SELECT id, usuario, password
FROM usuarios
WHERE usuario = ‘bruno’;

 

11.- Utiliza CHAR en lugar de VARCHAR

CHAR es hasta un 50% mas rápido que VARCHAR, aunque tiene dos incovenientes:
– Ocupa mas espacio en disco
– Tiene un límite de 255 caracteres.

 

12.- Utiliza el tipo de columna ENUM

Enum es un tipo de columna que permite almacenar un listado de valores que internamente se guardan como un TinyInt.

Es ideal para almacenar valores fijos, como por ejemplo: colores, sexo, estados, etc.

13.- Evita usar ORDER BY RAND

Cuando agregas la claúsula ORDER BY RAND, lo que MySQL va a hacer es:
– Seleccionar TODOS los registros que cumplan con tu claúcula WHERE
– Los carga en memoria o en una tabla temporal
– Asociar valores aleatorios a cada fila
– Los ordena
– Muestra N resultados de acuerdo a la claúsula LIMIT

Algunos motores de BBDD, como Oracle, ni tan siquiera permiten realizar esta acción.

14.- Guarda los logs en el motor ARCHIVE

Archive está pensado para guardar un gran volumen de datos.

Permite INSERT y SELECT, pero no DELETE, REPLACE o UPDATE, aunque puedes hacer un TRUNCATE para vaciar la tabla.

Este motor es un buen candidato para almacenar logs.

15.- Las columnas pequeñas son mas rápidas

Utiliza siempre el tamaño justo para la columna.

Por ejemplo, si vas a guardar un DNI, no tiene sentido tener un campo de 20 caracteres, ya que el DNI está formado por 9 caracteres.

 

16.- Particionamiento vertical

En ocasiones ocurre que tenemos tablas con columnas que no son estricamente necesarias.

Imagina una tabla que se emplea para inciar sesión y que además tiene información adicional del usuario.

Tabla sin particionar

Dado que el nombre, apellidos y el DNI no son necesarios para iniciar sesión, lo mas lógico es mover las columnas a otra tabla (ficha_usuario) y referenciar a la tabla usuarios.

Particionamiento vertical

17.- Usan explain

Explain permite obtener información acerca de como se va a ejecutar la consulta, para así optimizarla.

Ejemplo:
EXPLAIN SELECT t.id, t.nombre, s.salario
FROM trabajadores t
JOIN salarios s ON s.trabajador = t.id

 

18.- Indexa las columnas sobre las que ejecutes búsquedas

Por ejemplo, en la tabla libros, sería apropiado indexar el nombre del libro o el ISBN, dependiendo del uso que le estés dando.

Indexar campos búsqueda

19.- Benchmark

La función BENCHMARK ejecuta una exprensión N veces. Se utiliza para conocer cuán rápido ejecuta MySQL la expresión.

El resultado de la consulta siempre es 0 (no va a seleccionar NADA), lo importante es el tiempo que tarda en ejecutar la consulta.

SELECT BENCHMARK(500000,ENCODE(‘hola’,’adios’));
+———————————————-+
| BENCHMARK(500000,ENCODE(‘hola’,’adios’)) |
+———————————————-+
|                                            0 |
+———————————————-+
1 row in set (2.46 sec)

20.- Sígue a The Linux Alchemist

Seguir a The Linux Alchemist aumenta el rendimiento de todas las base de datos en un 125%, trust me I’m an engineer.


Sábado 03 de junio de 2017

Bruno Exposito

Bruno Exposito
The Linux Alchemist

Inkscape – Botones de descarga de las distros mas populares

Hace algún tiempo, mientras programaba una pequeña app en Qt y C++, hice unos cuantos botones de descarga, con la idea de usarlos para que la gente descargara el paquete para su distro en concreto.

Están hechos con Inkscape, una herramienta gratuita y libre para realizar dibujos vectoriales, puedes encontrar muchos dibujos bajo licencias libres en la Open Clip Art

Están bajo la licencia creative commons, puedes descargar el PNG y SVG desde mi OwnCloud (si, irónicamente no tiene icono de descarga).

Botón de descarga de Arch Linux

Botón de descarga de Debian

Botón de descarga de Fedora

Botón de descarga de Mageia

Botón de descarga de openSUSE

Botón de descarga de Ubuntu

 

 


Miércoles 31 de mayo de 2017

Gorka Urrutia

Gorka Urrutia
Nideaderedes

Los capítulos del libro de PHP orientado a objetos

Acabo de publicar el listado provisional de capítulos del libro programación orientada a objetos en php. Más o menos serán éstos:

  1. Herramientas
  2. El estándar PSR
  3. Introducción express a PHP
  4. Programación orientada a objetos
  5. Un ejemplo paso a paso
  6. Encapsulación
  7. Herencia
  8. Introducción al desarrollo guiado por pruebas
  9. Interfaces
  10. Clases abstractas
  11. Introducción a Git
  12. Términos y definiciones

Es posible que los reorganice pero seguramente éste será el orden final. Todavía faltan algunos más para terminar el libro.

Privacidad en Internet – Ventajas de un navegador anónimo

Nunca nada ha sido gratis o por lo menos “completamente” gratis. Y ahora mismo estamos pagando por tener acceso a todo el contenido de Internet. No me refiero a pagar por nuestro ADSL o fibra óptica, va mucho más allá. Pagamos con nuestros datos personales, tú eres un posible cliente para cualquier empresa y conocerte, […]

La entrada Privacidad en Internet – Ventajas de un navegador anónimo aparece primero en Blog de Informática ✏ Luisi.

Lunes 22 de mayo de 2017

Como hacer una foto con la webcam de forma programada en Ubuntu

Continuando con el artículo que escribí hace unos días sobre xbacklight y backlight-indicator, hoy le toca a como hacer una foto con la webcam.

El funcionamiento de backlight-indicator es muy sencillo. Esta aplicación hace una foto con la webcam y la procesa para calcular el brillo. Una vez calculado el brillo lo configura para tu pantalla.

Ahora bien, ¿Cómo podemos hacer una foto con la webcam?…

Como hacer de forma programada una foto con la webcam en Ubuntu

Hacer una foto con la webcam

Hasta la fecha, en backlight-indicator utilizaba GStreamer, para tomar una foto con la webcam. Esto tenía un problema, y es que necesitaba guardar la imagen en el disco duro para luego procesarla.

Hace poco, me topé con python-v4l2capture, un proyecto en GitHub que se dedicaba única y exclusivamente a esto. Es decir, a capturar vídeo con video4linux2, una API de captura de vídeo en Linux.

El uso y funcionamiento es muy sencillo, y permite integrarlo fácilmente con cualquier aplicación en Python. Y aquí es donde puedes sacarle un importante partido…

Automatización de fotografías

Un uso muy interesante de esta sencilla utilidad es el de una foto con la webcam… (evidentemente), pero esto lo puedes automatizar por ejemplo para que se tome una foto cada vez que se inicie una sesión en tu equipo, de forma que puedes rastrear quien lo utiliza. Es decir, tendrías claras pruebas…

Vamos a ello…

Primero realizaremos un sencillo script en Python, que puedes descargar desde la propia página de GitHub, captura una foto

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

from PIL import Image
import select
import time
import datetime
import v4l2capture

video = v4l2capture.Video_device("/dev/video0")
size_x, size_y = video.set_format(1280, 1024)
video.create_buffers(1)
video.start()
time.sleep(2)
video.queue_all_buffers()
select.select((video,), (), ())
image_data = video.read()
video.close()
image = Image.frombytes("RGB", (size_x, size_y), image_data)
image.save('/tmp/{0}.jpg'.format(
    datetime.datetime.now().strftime('%Y%m%dT%H%M%S')))

Lo primero es darle permisos de ejecución. Para ello, ejecutaremos la siguiente orden,

chmod +x take_photo.py

Luego lo pondremos en el algún sitio accesible, por ejemplo,

cp take_photo.py /usr/local/bin

Ahora vamos a realizar un sencillo lanzador que colocaremos en el lugar adecuado, de forma que cada vez que alguien inicie nuestro equipo, realice la captura con la webcam. Para ello crearemos el siguiente lanzador ~/.config/autostart/takephoto.desktop,

    [Desktop Entry]
    Type=Application
    Exec=/usr/local/bin/take_photo.py
    Hidden=true
    NoDisplay=true
    X-GNOME-Autostart-enabled=true
    X-GNOME-Autostart-Delay=2

De esta manera, cada vez que se inicie tue equipo y transcurridos 2 segundos se realizará una captura de pantalla… guardando una prueba de quien estaba utilizando el equipo. Evidentemente, puedes modificar el momento en el que se realiza la captura

La imagen la guarda en /tmp con el formato YYYMMDDThhmmss.jpg

Otras interesantes utilidades

Además de esto, puedes darle mas utilidades a esta aplicación. Por ejemplo si tienes una segunda webcam y quieres que tome una imagen cada cierto tiempo, o cualquier otra idea similar. Son utilidades muy sencillas pero que pueden ahorrarte mucho trabajo.

Instalación

Antes de poder utilizar esta aplicación, necesitaremos instalar la biblioteca que nos da acceso a su uso. Esta biblioteca no se encuentra en los repositorios oficiales de Ubuntu, pero la puedes instalar fácilmente ejecutando las siguientes órdenes en un terminal,

sudo add-apt-repository atareao/atareao
sudo apt update
sudo apt install python3-v4l2capture

La entrada Como hacer una foto con la webcam de forma programada en Ubuntu aparece primero en El atareao.

Domingo 21 de mayo de 2017

¿Qué es, como defenderme y eliminar un Ransomware?

Simplificando al máximo es un programa creado para hacer mal, lo que hace es encriptar nuestros archivos y para que un ciberdelincuente consiga una suma de dinero a cambio de recuperarlos. Se oculta dentro de otro programa que sí puede ser legítimo (por eso hay que tener cuidado al descargar programas o archivos desde páginas […]

La entrada ¿Qué es, como defenderme y eliminar un Ransomware? aparece primero en Blog de Informática ✏ Luisi.

Lunes 15 de mayo de 2017

Varios sistemas Linux en un PC, varias distribuciones y/o versiones

Uno de los problemas que me encuentro con el desarrollo de aplicaciones para Ubuntu es que tengo que ir probándola en las diferentes versiones que aparecen. Esto me obliga a tener una o dos distribuciones instaladas en mi equipo, porque en ocasiones, virtualizarlas no es suficiente. Desde hace tiempo, utilizo una partición donde guardo documentos. Sin embargo, esto no es suficiente. Y todo ello ha dado lugar este artículo como tener varios sistemas Linux en un PC y no morir en el intento.

El otro día mientras escuchaba un podcast de Yoyo en Salmorejo Geek sobre como guardaba sus documentos personales, me decidí a darle una vuelta mas al sistema, y esto es lo que te voy a intentar explicar a continuación.

Varios sistemas Linux en un PC, varias distribuciones y/o versiones. Portada.

Varios sistemas Linux en un PC

Antes de nada y para que nadie se lleve a engaño, indicar que todos los sistemas Linux que instalo en mi equipo son Ubuntu. Esto no quita que esta misma solución se pueda aplicar a otras distribuciones.

Desarrollo de aplicaciones en Ubuntu

Como comentaba en la introducción, el desarrollo de aplicaciones para Ubuntu se encuentra con la necesidad de revisar que cada aplicación funciona correctamente en cada una de las versiones que se liberan. Es decir, aunque yo desarrollé my-weather-indicator para Ubuntu 10.10 Maverick Meerkat, ahora en la versión 17.04 Zesty Zapus, necesito probarla también.

Esto es así, porque de unas versiones a otras cambian las librerías que utilizo en la aplicación, cambia el propio entorno de escritorio y cambia GNOME, lo que en muchas ocasiones obliga a un rediseño de la aplicación.

En otros casos…

No solo el desarrollo de aplicaciones lleva a tener varios sistemas Linux en un PC. Es posible que seas un distrohopper, es decir, uno de los tantos de usuarios Linux que disfrutan probando cada una de las distribuciones y versiones que aparecen en el extenso universo Linux.

Otra razón que se me ocurre, aunque seguro que hay cientos de razones mas, es que simplemente para según que trabajo estés mejor en un entorno de escritorio y otro.

Centralización

El problema de tener varios sistemas Linux en un PC (o no), es que en cada uno de ellos tienes documentos, y es probable que estando trabajando en un sistema quieras utilizar un documento que esté en otro sistema.

Existen diferentes soluciones para resolver esto, desde utilizar la misma partición /home para todos, a utilizar una partición independiente donde situar todos tus documentos.

El problema de la partición /home común son los archivos de configuración que puede ser que te generen problemas en un sistema operativo o en otro, por estar utilizando diferentes versiones.

Sin embargo, hay una solución muy simple, con la que no notarás el cambio de un Linux a otro… los enlaces simbólicos.

Y ¿porque no enlazarlo todo?. Pues la razón para esto radica en que al cambiar de versión, la configuración de un escritorio puede entorpecer en otra instalación…

La propuesta para resolver como tener varios sistemas Linux en un PC

Directorios

Mi propuesta es bastante simple. Cada uno de los Linux que tienes instalados en tu equipo, tiene sus directorios ~\Escritorio, ~\Documentos, ~\Descargas, etc… Elimina todos esos directorios y haz un enlace simbólico al que se encuentra en tu partición común.

Es decir, si tu partición común la montas en /datos en esta partición común tendrás un directorio que se llamará /datos/Escritorio de forma, que cada uno de los ~\Escritorio de todos los Linux instalados en tu equipo apuntaran a /datos/Escritorio.

De esta manera cuando entres en cualquiera de los sistemas Linux instalados y te enfrentes al escritorio, encontrarás exactamente lo mismo.

Esto mismo lo podemos hacer con el resto de directorios…

Configuraciones

Sin embargo, podemos ir mas lejos todavía… En mi caso particular, utilizo GIMP e Inkscape para hacer las imágenes que ves en este sitio y para mi trabajo.

Estas aplicaciones no suelen cambiar de versión tan frecuentemente como Ubuntu, con lo que su archivo de configuración, puede permanecer inalterado durante años, sin que esto afecte a las distintas versiones.

Igual que hemos hecho con los directorios, también podemos hacer con los archivos de configuración. Es decir, podemos hacer un enlace simbólico desde el directorio de configuración o archivo de configuración que se ubica en ~/.config/GIMP/ a /datos/.config/GIMP.

Siguiendo este procedimiento nos encontraremos que aunque entremos en diferentes Linux en nuestro equipo, y trabajemos con diferentes GIMP, la apariencia de cada uno de ellos siempre será la misma. Siempre y cuando tengamos instalados los mismos complementos, etc.

Esto nos llevará a ahorrar mucho tiempo y ser más productivos.

Una solución para tener varios sistemas Linux en un PC

Esta solución funciona muy bien, sin embargo, tiene un pequeño inconveniente. Cada vez que instales una nueva distribución o una nueva versión, tienes que realizar todos estos enlaces…

Para darle una solución a este problema he creado un sencillo script que realiza estos enlaces simbólicos, de forma que cada vez que instalo una nueva distribución o versión solo tengo que ejecutar el script, que por supuesto está instalado en /datos.

Este script está en GitHub. Puedes utilizarlo fácilmente, descargarlo, compartirlo, contribuir o lo que consideres.

Una indicación, en las primeras líneas de linker.py tienes el directorio de origen que no habría que modificarlo, y el directorio de destino (este a lo mejor si que consideras en borrarlo).

A continuación tienes todos los directorios a enlazar. Por supuesto que lo que enlazas es a~/ seguido del directorio o archivo que consideres. El funcionamiento es muy sencillo. Lo que hace es mirar si en /datos existe el directorio de origen, si existe borra, el directorio de tu directorio de inicio y realiza el enlace simbólico. Si en /datos no existe, primero copia el de tu directorio de inicio y luego lo enlaza.

Conclusiones

La solución de tener todo en un directorio aparte es muy buena solución tal y como lo comentaba Yoyo. Ahora, completado esto con los enlaces simbólicos, el funcionamiento es impecable. De esta manera, yo paso de una distribución, versión o instalación a otra, sin echar nada de menos. Muy recomendable.

La entrada Varios sistemas Linux en un PC, varias distribuciones y/o versiones aparece primero en El atareao.

Lenin Hernandez

Lenin Hernandez
Leninmhs

Como instalar el Antivirus para Linux “Comodo” en Debian 8 (Jessie)

¿Por qué el Antivirus Comodo? El Antivirus Comodo para Linux (CAVL) ofrece la misma protección antivirus que el mismo software para Windows con el beneficio añadido de un sistema anti-spam totalmente configurable. Con los escáneres de virus a la vista y bajo acceso, CAVL también utiliza el análisis de comportamiento basado en la nube de … Sigue leyendo Como instalar el Antivirus para Linux “Comodo” en Debian 8 (Jessie)

Sábado 06 de mayo de 2017

Raúl González Duque

Raúl González Duque
Linux – Mundo Geek

Linux en Windows: el Subsistema de Windows para Linux

El Subsistema de Windows para Linux o WSL es una nueva característica de Windows 10 que permite ejecutar binarios ELF64 de Linux directamente en Windows. Aunque el funcionamiento es parecido, no es exactamente una máquina virtual; es una nueva alternativa que abre montones de posibilidades, debido a una mucho mayor integración: realmente es casi como si estuviéramos ejecutando Linux en Windows, con un único sistema operativo común para las aplicaciones Windows y Linux.

Este proyecto, como decimos, permite utilizar herramientas nativas de Linux en Windows, desde una simple consola bash, a programas como vim, awk o git, ¡e incluso un entorno gráfico alternativo completo! ¿Quieres probarlo? ¡Pues sigue estas instrucciones!

Prerequisitos

Necesitas tener instalada la versión de 64 bits de Windows y tener actualizado el sistema a la compilación 14393 de Windows 10 Anniversary Update o superior.

Activar el Modo de programador

Pulsa Windows + I, y selecciona Actualización y seguridad -> Para programadores. Marca la opción de “Modo de programador”

Activar el Modo de programador de Windows 10

Instalar el Subsistema de Windows para Linux

Pulsa Windows + R, y escribe “optionalfeatures” para abrir el diálogo de “Activar o desactivar las características de Windows”. Selecciona “Subsistema de Windows para Linux (beta)”. Una vez instalado Windows te pedirá que reinicies el ordenador.

Activar el Modo de programador de Windows 10

¡Instalar Ubuntu en Windows!

Pulsa Windows + R, y ejecuta el comando “bash“. Te pedirá que aceptes la licencia de Canonical, la empresa detrás de Ubuntu, y descargará e instalará la distribución de Ubuntu Linux. Durante el proceso de instalación te preguntará si quieres establecer la configuración regional a la misma que tenga Windows (probablemente) y te pedirá un nombre de usuario y contraseña para crear una nueva cuenta.

Rock and roll

A partir de ahora ya tienes un sistema Linux totalmente funcional (aunque sin interfaz gráfica), con los comandos y el funcionamiento habitual de una distro Linux. Para iniciar la consola de Linux en cualquier momento, de nuevo pulsa Windows + R y ejecuta el comando bash.

Si queremos actualizar los paquetes del sistema que hemos instalado, al estar basado en Ubuntu, escribiríamos los siguientes comandos:

sudo apt update
sudo apt upgrade

Nuestro nuevo sistema tiene los discos de Windows montados en /mnt/, por lo que para listar los archivos en C:, por ejemplo, escribiríamos el siguiente comando:

ls /mnt/c

Para buscar un programa en los repositorios:

apt search término1 término2 término3

Para instalar un programa desde repositorio:

sudo apt install programa

Desinstalar Linux

Si en algún momento quieres desinstalar WSL, con un poco de suerte, porque prefieras instalar un Linux completo, basta con escribir el siguiente comando en la línea de comandos de Windows:

lxrun /uninstall /full /y

Sábado 29 de abril de 2017

Lenin Hernandez

Lenin Hernandez
Leninmhs

Como integrar GIT con el gestor de archivos Nautilus y Nemo – RabbitVCS

Cuando se es usuario cotidiano de software para control de versiones, siempre desearemos tener a disposición herramientas que nos faciliten y hagan mas evidente el trabajo. Es común conocer los comandos de tu control de versiones (GIT, SVN, Hg, etc…), contar con un cliente de control de versiones incorporado en tu editor de código favorito, … Sigue leyendo Como integrar GIT con el gestor de archivos Nautilus y Nemo – RabbitVCS

Jueves 27 de abril de 2017

Telegram desde el terminal en Ubuntu, Linux Mint y derivados. Instalación y uso.

Desde que se montó Ubuntizados, el grupo colaborativo de usuarios de Ubuntu en Telegram, me he vuelto un fiel usuario de Telegram. Actualmente estoy suscrito a varios canales y grupos, y cada vez me gusta mas. Sin embargo tenía algo pendiente, que es utilizar Telegram desde el terminal.

Hace algún tiempo que voy detrás de Telegram Messenger CLI. Telegram Messenger CLI es una interfaz para la línea de comandos de Telegram. Y no tanto por las posibilidades que nos ofrece trabaja desde el terminal, si no también por integrarlo con Nautilus, Nemo y Caja. Igualmente, por la opción de utilizarlo directamente desde Python. Vamos que nos ofrece todo un mundo de posibilidades.

Imagínate (y con esto te puedes hacer una idea de en que estoy trabajando) que puedes enviar documentos o archivos directamente desde Nautilus a Telegram…

Telegram desde el terminal en Ubuntu, Linux Mint y derivados. Instalación y uso. Portada.

Telegram desde el terminal

El uso de Telegram desde el terminal tiene muchas ventajas. Pero desde mi punto de vista, las ventajas vienen de la mano de la automatización.

Me refiero por ejemplo a crear sencillos scripts para enviar archivos a un usuario o chat, o que te avisen de algún evento o situaciones similares. O incluso dar órdenes a tu equipo para que realice determinadas acciones.

¿Que nos permite hacer Telegram desde el terminal?

Existe toda una serie de comandos que seguro nos va a facilitar el uso de Telegram desde el terminal.

Para acceder a la lista de comandos una vez ya estamos ejecutando Telegram desde el terminal, tan solo tenemos que pulsar dos veces el tabulador.

Tampoco es necesario escribir el comando completo o el usuario completo, tan solo tenemos que comenzar a escribirlo y pulsar tabulador para que nos ayude a completarlo.

Así algunos de los comandos mas interesantes soportados, en el momento de escribir este artículo ,son los siguientes:

  • msg <contacto> "Texto". Nos permite enviar un texto a un contacto. Indicar que el Texto debe ir entrecomillado, y que nuestro contacto, en caso de que sea Nombre y Apellido debe figurar como Nombre_Apellido. Es decir, hay que reemplazar el espacio por guión bajo.
  • send_photo <contacto> <nombre-del-archivo> envía una imagen al contacto.
  • send_video <contacto> <nombre-del-archivo> envía un vídeo al contacto.
  • send_text <contacto> <nombre-del-archivo> envía un archivo de texto al contacto.
  • load_photo <msg-numero> descarga una imagen correspondiente al número de mensaje indicado. Empezando por cero la última foto. Esto es completamente independiente del canal, grupo o contacto.
  • load_video <msg-numero> descarga un vídeo correspondiente al número de mensaje indicado.
  • load_document <msg-numero> descarga un documento correspondiente al número de mensaje indicado.
  • searchnos permite buscar entre los mensajes
  • dialog_list muestra la información relativa a los diálogos.
  • contact_list muestra información sobre nuestros contactos.

Instalación

Telegram-Cli no está disponible en los repositorios oficiales de Ubuntu. Sin embargo, dado que me ha parecido realmente interesante lo he empaquetado y lo he añadido al repositorio. De esta forma lo puedes instalar muy fácilmente con ppaurl haciendo clic en telegram-cli. O bien desde el emulador de terminal ejecutando la siguientes órdenes,

sudo add-apt-repository ppa:atareao/telegram
sudo apt update
sudo apt install telegram-cli

Más información,

La entrada Telegram desde el terminal en Ubuntu, Linux Mint y derivados. Instalación y uso. aparece primero en El atareao.

Domingo 23 de abril de 2017

Xavier Genestos

Xavier Genestos
SYSADMIT

VMWare ESXi: Instalar pfSense

pfSense es una FreeBSD personalizada para su uso como Firewall y Router. Es de código abierto y cuenta con una interfaz web sencilla para su configuración. Se ha popularizado en el mundo corporativo como uno de los gateways mundialmente más utilizados. En este artículo vamos a enumerar los pasos básicos para poder desplegar una instancia de pfSense en un entorno VMWare ESXi. A

Martes 18 de abril de 2017

Bruno Exposito

Bruno Exposito
The Linux Alchemist

Automontar discos en Ubuntu

Hace algunos años, el único modo de que se automontar un disco o partición era conocer el nombre del disco (/dev/xxx) y:
a) Editar el fichero de configuración /etc/fstab y rezar para no haberla cagado
b) Crear un script que monte el disco/partición, darle permisos y agregarlo a los scripts que se ejecutan al inicio

Afortunadamente, los creadores de la herramienta “discos” (sudo apt-get install gnome-disk-utility) se percataron de que no estamos en los años 90 y que eso se podría hacer desde una interfaz gráfica.

Esta herramienta (Gnome Disk Utility/Discos) suele estar instalada en la mayoría de las distribuciones que utilizan gnome o mate.

Desde ella, se pueden ver los diferentes dispositivos de almacenamiento, comprobar el estado de la unidad, formatear el disco y crear particiones, entre muchas otras cosas.

Gnome Disk Utility

 

Seleccionando el disco duro en el listado de la izquierda aparecen las particiones (volúmenes) del disco, y un poco mas abajo botones para montar, desmontar y un menú desplegable con opciones (el botón de la rueda dentada).

opciones montaje

Entrando a “Editar las acciones de montaje” puedes configurar los diferentes parámetros para el montaje del disco. Mi configuración ha quedado tal que así:

Configuración montaje


Lunes 17 de abril de 2017

Pedro L. Lucas

Pedro L. Lucas
Cartas de Linux

Temas y plantillas en Hugo – Parte 4

En esta serie de artículos sobre el gestor de contenidos Hugo, vamos a centrarnos en los temas.

En el siguiente enlace podemos ver cientos de ejemplos de temas para Hugo:

http://themes.gohugo.io/

Para instalarlos sólo hay que descargarlos y copiarlos en la carpeta themes de nuestro sitio. Aunque la mayoría de los temas los podemos instalar usando el comando git.

Algunos temas nos van a requerir alguna distribución especial de los contenidos o introducir alguna configuración especial en el sitio. Esto lo podemos ver en las descripciones de los temas.

Los temas se crean a través de las plantillas (Templates) de Hugo. Básicamente una plantilla es un fichero html y en el que vamos a encontrar algunas etiquetas especiales del tipo “{{ algo }}”.

Por ejemplo:

<!DOCTYPE html>
<html>
<head>
  <title>{{ .Title }}</title>
</head>
<body>
  <h1>{{ .Title }}</h1>
  {{ .Content }}
</body>
</html>

Esto es una plantilla html del lenguaje Go. Para ver una introducción a este lenguaje podemos consultar la documentación de Hugo sobre las plantillas:

https://gohugo.io/templates/go-templates/

En el ejemplo anterior, se puede ver que aparece la etiqueta “{{ .Title }}”, que lógicamente se reemplaza por el título cuando el sitio se construye. También tenemos la etiqueta “{{ .Content }}”, que se reemplazará por el contenido.

Temas y layouts

Hay dos carpetas que nos var interesar la carpeta themes y la carpeta layouts. Generalmente layouts estará vacía y cuando se tenga que crear un sitio, se tomarán los archivos de themes y se usará el tema que se haya seleccionado. Puede ocurrir que deseemos que independientemente del tema a utilizar, se use una determinada configuración para la página de inicio (por ejemplo), podemos entonces crear nuestra página de inicio en layouts que se usará independientemente del tema que se vaya a poner por defecto.

Plantillas principales de Hugo

Tenemos la plantillas:

  • Single: Representa cómo se va a dibujar una entrada o un elemento simple de contenidos
  • List: Representa cómo se va a dibujar una lista de contenidos.
  • Homepage: Es la página de inicio de nuestro sitio.

Empecemos por la página de inicio, la vamos a entrar en el directorio “themes/nuestro-tema/index.html”. Probad a editarla y veréis cómo se modifica la página de inicio de vuestro sitio.

Según el tema, también deberéis tocar ciertos parámetros de la configuración para cambiar ciertos elementos del tema.

Pero antes de continuar vamos a ver las posibilidades de las plantillas de Go.

Plantillas de Go

Variables

Hugo usa las plantillas del lenguaje Go para procesar el texto html de forma muy rápida. Como ya se ha dicho, las plantillas van entre los símbolos {{ }}. Así, por ejemplo, para obtener el valor de una variable ya definida se pondría:

<!DOCTYPE html>
<html>
<body>
  {{ variable }}
</body>
</html>

Las variables que define Hugo, se pueden encontrar en:

http://gohugo.io/templates/variables/

Para definir el valor de una variable también se puede usar el símbolo $ delante de la variable:

{{ $variable := "Hola mundo" }}

Después se obtiene su valor:

{{ $variable }}

Hugo también permite usar funciones, las funciones predefinidas se pueden encontrar en:

http://gohugo.io/templates/functions/

Para usar una función simplemente se la llama por su nombre:

{{ función }}

Para pasar argumentos a una función, se ponen los argumentos separados por espacios:

{{ add 1 2}}

La función add suma dos valores, en este caso devolverá 3.

Iteraciones

Las plantillas de Hugo permiten iterar entre los elementos de una array. Para ello se usará “range”. Por ejemplo, para listar todos los elementos de un array:

{{ range $elemento := array }}
    {{ $elemento }}
{{ end }}

Vamos a verlo funcionar, se abre el archivo index.html, dentro de nuestra carpeta themes/tema, e introducimos:

{{ range $pagina := .Data.Pages }}
    Títulos de páginas: {{ $pagina.Title }}<br/>
{{ end }}

Ahora al generar el sitio veremos el contenido que se ha introducido al ejecutar “range”.

Se puede también acceder por contexto:

{{ range array }}
    {{ . }}
{{ end }}

En el ejemplo que estábamos manejando:

{{ range .Data.Pages }}
    Títulos de páginas: {{ .Title }}<br/>
{{ end }}

Por último, se pueden usar mapas, para iterar en el mapa se puede usar la siguiente construcción:

{{range $índice, $elemento := array}}
    {{ $índice }}
    {{ $elemento }}
{{ end }}

En nuestro ejemplo:

{{ range $index, $page := .Paginator.Pages }}
    {{ $index }}
    {{ $page.Title }} <br/>
{{ end }}

Condicionales

La estructura if está soportada por la plantillas de Go. Por ejemplo:

{{ if lt 2 3 }}
    Cierto
{{ end }}

que significa si 2 es menor que 3 escribe “Cierto”.

Disponemos de los comparadores:

  • eq Devuelve verdadero si arg1 == arg2
  • ne Devuelve verdadero si arg1 != arg2
  • lt Devuelve verdadero si arg1 < arg2
  • le Devuelve verdadero si arg1 <= arg2
  • gt Devuelve verdadero si arg1 > arg2
  • ge Devuelve verdadero si arg1 >= arg2

Se puede usar and y or para añadir nuevas condiciones, pero hay que tener en cuenta que en la plantillas de Go los argumentos van siempre detrás de la función:

{{ if and (lt 2 3) (gt 3 2) }}
    Cierto
{{ end }}

Por supuesto, la estructura if-else también se puede usar:

{{ if lt 3 2 }}
    False
{{ else }}
    Cierto
{{ end }}

Else if:

{{ if lt 3 2 }}
    False
{{ else if gt 3 2 }}
    Cierto
{{ end }}

Se puede usar not para negar una condición:

{{ if not lt 3 2 }}
    Cierto
{{ end }}

Contextos

A veces tenemos que hacer referencia a objetos dentro de otros objetos y hay que escribir mucho código. Una forma de hacer esta tarea más cómoda es usando with. En el siguiente ejemplo, cada vez que nos refiramos a . dentro de la estructura with, nos estaremos refiriendo a “.Params.title”:

{{ with .Params.title }}
    <h4>{{ . }}>
{{ end }}

Tuberías

Se tiene algo similar a las tuberías UNIX, por ejemplo, supongamos la siguiente operación matemática:

{{ add 5 (add 3 2) }}

Se podría escribir de la siguiente forma:

{{ add 3 2 | add 5 }}

Como se puede ver el resultado de la suma 3+2 se pasa como último argumento de la siguiente operación “add 5”.

Se pueden encadenar varias tubería:

{{ add 3 2 | add 5 | add 4}}

Uso del operador . en contextos

El operador {{ . }} siempre se refiere al contexto actual. Nos sirve para llamar a variables y a varibles dentro de variables (“.Params.title”). Dentro de un bucle {{ . }} se referirá al valor del elemento actual. Si es necesario acceder al contexto global, se puede usar $., por ejemplo:

{{ range .Data.Pages }}
    Títulos de páginas: {{ .Title }}
    {{ $.Site.Title }} <br/>
{{ end }}

Includes

Se puede incluir un archivo dentro de otro. Por ejemplo, podríamos tener en una archivo la cabecera que queremos que aparezca en todas las páginas web de nuestro sitio. En otro archivo el pie de página. En cada página que escribamos, podemos incluirlos usando:

{{ partial "cabecera" . }}

Texto de la página

{{ partial "pie" . }}

De forma automática Hugo incluirá el pie y la cabecera en la página. Si hacemos una modificación en la cabecera, todas las páginas en las que hayamos incluido la cabecera, recibirán la actualización.

Para incluir archivos podemos usar el comando partial:

{{ partial "archivo" contexto }}

El archivo debe estar localizado en el directorio layout/partials. El contexto se refiere a las variables a las que tendrá acceso el archivo incluido, normalmente acceden a “.”.

Tenemos otra forma de incluir archivos usando template:

{{ template "archivo" contexto }}

La diferencia se encuentra en que el archivo a incluir deberá estar en layout. La documentación de Hugo recomienda usar partial.

Si exploráis los temas de Hugo vais a ver buenos ejemplos del uso de partial.

Existe otra forma de incluir plantillas, la función “.Render”. Para introducir contenidos con “.Render” sólo hay que incluir el nombre de la plantilla a utilizar. Por ejemplo, para ver la plantilla “summary.html”:

{{ .Render "summary"}}

Eliminando espacios en blanco

Imaginad que el comando “.Title” devuelva un título con espacios en blanco y saltos de línea antes y después, por ejemplo:

<h1>{{ .Title }}</h1>

e imaginad que la salida final fuera:

<h1>
    Ejemplo de título
        </h1>

Esta salida no es elegante ni cómoda de leer a la hora de editar código.

Usando el operador {{- -}} se pueden eleminar estos espacios:

<h1>{{- .Title -}}</h1>

La salida final sería:

<h1>Ejemplo de título</h1>

Paso de parámetros a las pantillas

Hugo tiene predefinidas una serie de variables que pueden ser útiles:

http://gohugo.io/templates/variables/

A través de los archivos de configuración o a través de metadatos, se pueden pasar parámetros, definidos por el usuario, a las plantillas. Supongamos que se define la sección params en el archivo “config.toml”. Dentro de esta sección definimos las variables que necesitamos, por ejemplo:

baseurl = "http://localhost:1313"
languageCode = "es"
title = "Ejemplo de nuevo sitio"

[params]
ejemplo = "Ejemplo de valor definido"

Dentro de uno de los archivos del tema podremos introducir:

{{ .Site.Params.Ejemplo }}

y allí obtendremos el valor de la variable.

De forma similar se pueden definir variables en la cabecera de las entradas. Por ejemplo, si se tiene la entrada “hola-mundo.md”, se podría introducir la variable “Fecha”:

+++
date = "2017-04-07T01:04:36+02:00"
title = "hola mundo"
Fecha = true

+++

Hola mundo **esto** es un ejemplo.

Ahora se podría ir a la parte del tema correspondiente y hacer que si Fecha es true, se muestre la fecha de esta entrada:

{{ if .Params.Fecha }}
    {{ .Date.Format .Site.Data.Formats.date }}
{{ end }}

Como se puede ver usando “.Params.parámetro” se puede acceder al valor de la variable.

Para terminar

Hasta aquí esta breve introducción a los temas Hugo. Un par de recomendaciones:

La primera, ver la documentación oficial de Hugo:

https://gohugo.io/templates/go-templates/

Por otro lado es bueno bajarse un tema y explorarlo y modificarlo. Veremos que se usan cosas como “.Render” que llama a alguna plantilla para mostrar los contenidos. Para no volvernos locos buscando los archivos se recomenda usar los comandos de UNIX grep y find:

Con grep buscaremos los archivos que contengan algún tipo de texto que nos interese:

grep -Re 'texto a buscar'

Por otro lado find nos ayuda a buscar archivos por su nombre:

find . -name "nombre del archivo"

En el nombre del archivo se pueden introducir wildchars como son el * y la ? que nos ayudan a buscar los archivos de forma más cómoda.


Xavier Genestos

Xavier Genestos
SYSADMIT

VMWare: Kali Linux instalar

¿Qué es Kali Linux? Kali Linux es una distribución de Linux gratuita basada en Debian que permite al administrador realizar tareas de autoría de seguridad.Los creadores de Kali Linux es la empresa de seguridad informática: Offensive SecurityKali Linux es el sucesor de Backtrack Linux.Kali Linux dispone muchos programas que les resultarán conocidos por los auditores de seguridad o los

Lunes 10 de abril de 2017

Pedro L. Lucas

Pedro L. Lucas
Cartas de Linux

Resolviendo el problema de los acentos y las eñes que de repente dejan de funcionar

¿Alguna vez os ha pasado que estabais escribiendo algo en vuestro Linux y los acentos han dejado de funcionar? Pues tiene solución y es sencilla, se llama ibus.

En Ubuntu sólo tenemos que ir a “Configuración del sistema/Soporte de Idiomas” y seleccionar en “Sistema de método de entrada de teclado” la opción ibus. Reiniciamos y… problema resuelto.

¿Y si no tengo esta ventana? Por ejemplo, estoy usando un escritorio LXDE con lo mínimo instalado. Entonces hay que instalar ibus:

sudo apt install ibus

Una vez instalado con la herramienta ibus-setup, lo podemos configurar:

Captura de pantalla de 2017-04-09 17-03-22

Fin.


Domingo 09 de abril de 2017

Pedro L. Lucas

Pedro L. Lucas
Cartas de Linux

Contenidos en Hugo – Parte 3

En esta serie de artículos sobre el gestor de contenidos Hugo, vamos a centrarnos en la creación de los contenidos.

Con el comando:

hugo new

Se pueden introducir nuevas entradas en nuestro sitio web. Por ejemplo:

hugo new eldiario/noticia1.md

Dentro del directorio content, se habrá creado una carpeta llamada “eldiario” y allí dentro un archivo con la extensión “md”, “noticia1.md”.

Ahora con:

hugo new eldiario/noticia2.md

Dentro del directorio eldiario/noticia se habrá creado “noticia2.md”.

Si ahora con el comando:

hugo server --theme=hugo_theme_robust -Dv

Visitamos el sitio web creado, se puede comprobar que aparecen noticia1 y noticia2, y a cada una se les ha asignado la etiqueta “eldiario” (que coincide con el nombre del directorio). Si se hace clic sobre el nombre de la etiqueta, nos mostrará todas las noticias que tengan asignada esta etiqueta (notica1 y noticia2).

Si las comparamos con las taxonomías, en las taxonomías se creaba un menú con las etiquetas que se habían introducido. En el caso de las etiquetas no.

Vamos ahora a introducir una imagen en una de las entradas que hemos creado. Las imágenes las podemos poner en 2 lugares:

  • En la carpeta en la que se introduce la entrada.
  • En la carpeta static.

Por ejemplo, creamos una entrada nueva:

hugo new noticia/noticia1.md

Se creará la carpeta “content/noticia” y dentro de ésta “noticia1.md”.

Ahora ponemos una imagen en “content/notica”, por ejemplo, “imagen1.png”. Si queremos hacer que esta imagen aparezca en la noticia, en el texto de la noticia deberemos poner:


+++
date = "2017-04-09T15:35:01+02:00"
draft = true
title = "noticia1"

+++

En formato markdown
![Esto es una imagen](../imagen.png)

En formato html:
<img src='../imagen.png' />

Si nos fijamos, la referencia a la imagen la hacemos a la carpeta anterior “../imagen.png”.

Si ahora, la imagen la ponemos en la carpeta static, la referencia deberá ser:


+++
date = "2017-04-09T15:35:01+02:00"
draft = true
title = "noticia1"

+++

En formato markdown
![Esto es una imagen](/imagen.png)

En formato html:
<img src='/imagen.png' />

Es decir a “/imagen.png”, los contenidos de static se copian directamente a la raíz del sitio web.

Por último, si en static creamos la carpeta “img” y ponemos la imagen en “static/img”, deberemos poner:


+++
date = "2017-04-09T15:35:01+02:00"
draft = true
title = "noticia1"

+++

En formato markdown
![Esto es una imagen](/img/imagen.png)

En formato html:
<img src='/img/imagen.png' />

Es decir, en la raíz del sitio web se va crear la carpeta “/img” y dentro de ella se copiará la imagen.

Algunos temas soportan imágenes en las cabeceras de las noticias, para ello usamos el parámetro thumbnail en la cabecera del documento:

+++
date = "2017-04-09T15:35:01+02:00"
draft = true
title = "noticia1"
thumbnail = "/imagen.png"

+++

Esta es la noticia 1.

Por último, vamos a dar un repaso a los directorios que se crean cuando se ejecuta el comando “hugo new site” para crear un sitio nuevo:

  • archetypes: Cuando se crea un nuevo contenido con el comando “hugo new”, se añaden al artículo algunas configuraciones por defecto, como el título o la fecha. Aquí se pueden definir las configuraciones por defecto que se van a colocar.
  • config.toml: Es el archivo de configuración del sitio web. Usa el lenguaje TOML, aunque se pueden usar otros como JSON o YAML. En él se definen cosas como el nombre del sitio, el idioma, la URL.
  • content: Aquí se almacenan los contenidos que el usuario almacena en el sitio.
  • data: Se usa para almacenar la configuración que Hugo usa para generar el sitio web.
  • layouts: Indica la forma en la que los contenidos van a ser transformados en un sitio estático.
  • static: Lo podemos usar para almacenar todos los contenidos estáticos del sitio, como imágenes, Javascript, CSS, imágenes,… El contenido se copiará a la raíz del sitio.
  • themes: Son los temas que definen la apariencia que va a tener el sitio web. Se pueden crear e instalar varios temas y cambiar de uno a otro. Hay muchos temas disponibles para ser descargados y modificados.