5 de marzo de 2017

add and subtract days to a Date in Python 2

A few days back in the place where i work in the moment one of the reports was failing or at least one of the day was missing, the problem was the way of how it was getting the name of a file in it, the code was something like this in the script.

import datetime
now = datetime.datetime.now()
#we need the file of yesterday
myfile = '/home/dev/file_' + str(now.day - 1)+ '_' + str(now.month)+ '_' + str(now.year) +'.csv'

This look pretty and all but the problem was when the day is 1 the file of yesterday is not present because the day zero doesn't exist, so a better way of doing this is like:

import datetime
yesterday = datetime.datetime.now() - datetime.timedelta(1)
#we need the file of yesterday
myfile = '/home/dev/file_' + str(yesterday.day)+ '_' + str(yesterday.month)+ '_' + str(yesterday.year) +'.csv'

We can add days if we want like days


3 de diciembre de 2016

Download youtube videos as a mp3 using youtube-dl

so you only need youtube-dl and ffmpeg and if you want your mp3 file with metadata like the artist and title we can use the next command line:

youtube-dl --prefer-ffmpeg --extract-audio --audio-format mp3 --audio-quality 1 -o '%(title)s.%(ext)s' --metadata-from-title '%(artist)s - %(track)s' --add-metadata

Let's explain some of the argument

--extract-audio: Convert video files to audio-only files
--audio-format: Format of the audio file
--audio-quality: Quality of the audio can be between 0 (better) and 9 (worse)
-o or --output: How we want to name the file
--metadata-from-title: Parse additional metadata from the video title the format like --output
--add-metadata: Actually write the metadata in the file


21 de diciembre de 2015

traps in a file, in smnpd not using the default port


well for this I am going to write this in English because it was difficult to get this to work properly

the business rule is as follows:

let's get some traps from a device to our machine to port 8080 and we have to stored in a file somewhere.

Install the snmpd im using ubuntu so:

apt-get install snmpd

Save the traps in a file:

we need to modify the file /etc/default/snmpd and change the variables to this:


TRAPDOPTS='-A -Lf /var/log/snmptrapd.log -p /var/run/snmptrapd.pid’
the traps are stored in /var/log/snmptrapd.log

Configure the "community string" and the port for listen:

we need to open the file /etc/snmp/snmptrapd.conf and write this.

snmpTrapdAddr udp:8080
authCommunity log public

we are listen in the 8080 via udp package.
"public" is the community string ,change this to match with your case scenario.

Restart the service

service snmpd restart

Simulate traps

we can do this with this command if we are in the machine(localhost).

snmptrap -v 1 -c public . localhost 6 17 '' . s "Just a test"

you can change the for the address of the machine if you are trying to test from another machine


check if indeed it is listening for the corresponding port:

netstat -lnp | grep snmp

and we get something like this:

udp 0 0* 957/snmpd
udp 0 0* 957/snmpd
udp 0 0* 962/snmptrapd
unix 2 [ ACC ] STREAM LISTENING 9632 957/snmpd /var/agentx/master

other way is using nmap

nmap -sU localhost

the output is something like this:

Starting Nmap 5.21 ( http://nmap.org ) at 2015-12-21 01:51 CLT
Nmap scan report for localhost (
Host is up (0.0000080s latency).
Not shown: 997 closed ports
68/udp open|filtered dhcpc
161/udp open snmp
162/udp open|filtered snmptrap

Nmap done: 1 IP address (1 host up) scanned in 1.24 seconds

anyway you can hear the port to see if it reaches something and verify that the community string is the same, we lost so much time because of a bad string they gave us


22 de septiembre de 2015

Calculando el promedio en bash


Dado N enteros, el promedio con tres decimales.

Formato de entrada
La primera linea contiene N enteros.N lineas que siguen contiene un solo numero.

Formato de salida
Mostrar el promedio de N enteros, con tres decimales de aprox.







read a
for (( c=1; c<=$a; c++ ))
read d
echo $(printf %.3f $(echo "scale=4;($b/$a)" | bc))

21 de septiembre de 2015

calculando numeros impares en bash mediante un ciclo

ultimamente he estado medio aburrido así que en vez de jugar me he estado entreteniendo resolviendo problemas de programación uno bien fácil que encontré por ahí es el siguiente:

Mostrar los números impares desde el 1 al 99 usando bash
for i in {1..99}
if(( $i % 2 != 0 ))
echo "$i"

19 de septiembre de 2015

Resumen de Tmux para su uso

tmux lo conoci en una charla que vi en youtube y expandí mis conocimientos usando un libro he aquí un resumen para que les sea útil.


Nueva sesión
tmux new -s miSesion

Ver las distintas sesiones
tmux ls

Crear una nueva sesión pero que quede funcionando por detrás
tmux new -s miSesion -d

Volver a una sesión
tmux attach -t miSesion

Matar una sesión
tmux kill-session -t miSesion

Crea una nueva sesión con un nombre en la ventana
tmux new -s miSesion -n miVentana

Salir o salir ventana


El prefijo por defecto es Ctrl + b sin embargo se puede cambiar.

Crea una nueva ventana en tmux
prefix + c

Renombrar la ventana
prefix + ,

Ir a la ventana previa
prefix + p

Ir a la ventana siguiente
prefix + n

Ir a la ventana nº 1
prefix + 1

Salir de la ventana
prefix + &

prefix + d

Divide la pantalla Vertical
prefix + %

Divide la pantalla Horizontal
prefix + "

Salta al panel según la dirección
prefix +{← ↑ → ↓}

Cambiamos de posición los paneles dependiendo la configuración por defecto
prefix + space

Cierra el panel que estamos ocupando
prefix + x

Pasar al modo comando
prefix + :

Mostrar toda las combinaciones de botones
prefix + ?

Inicio automatizado

Para usar una configuración para llamarlo de alguna forma se debe usar el siguiente comando:
tmux -f miConfig.conf attach

la siguiente configuración lo que hace es crear 4 ventanas con sus respectivos nombres ya que asi tenia disponible las vistas,modelos y controladores de una pagina web la cual estaba construyendo.

source-file ~/.tmux.conf
new-session -s admin -n model
new-window -n controller -t admin
new-window -n view -t admin
new-window -n config -t admin
send-keys -t model 'cd /home/ubuntu/ad/app/Model' C-m
send-keys -t controller 'cd /home/ubuntu/ad/app/Controller' C-m
send-keys -t view 'cd /home/ubuntu/ad/app/View' C-m
send-keys -t config 'cd /home/ubuntu/ad/app/Config' C-m

Mi configuración

La configuración de tmux se puede configurar colocando algunas cosas en el archivo .tmux.conf por ejemplo yo cambie el prefijo a Ctrl + a como se usa en "screen", para que tome los cambios se necesita hacer en el modo comando source-file ~/.tmux.conf o en otro archivo de configuración como en el ejemplo anterior.


#Prefix es Ctrl-a
set -g prefix C-a
bind C-a send-prefix
#Sacamos Ctrl-b
unbind C-b
#Cambiamos el Delay
set -sg escape-time 1
#Cambiamos el inicio de las ventanas a 1
set -g base-index 1
#Cambiamos el inicio para los paneles
setw -g pane-base-index 1
#Recargar nuestra configuracion a tmux
bind r source-file ~/.tmux.conf \; display "Reloaded!"
bind | split-window -h
bind - split-window -v
#Mouse works as expected
setw -g mode-mouse on
set -g mouse-select-pane on
set -g mouse-resize-pane on
set -g mouse-select-window on

setw -g monitor-activity on
set -g visual-activity on

set -g mode-keys vi
set -g history-limit 10000

# y and p as in vim
bind Escape copy-mode
unbind p
bind p paste-buffer
bind -t vi-copy 'v' begin-selection
bind -t vi-copy 'y' copy-selection
bind -t vi-copy 'Space' halfpage-down
bind -t vi-copy 'Bspace' halfpage-up

# extra commands for interacting with the ICCCM clipboard
bind C-c run "tmux save-buffer - | xclip -i -sel clipboard"
bind C-v run "tmux set-buffer \"$(xclip -o -sel clipboard)\"; tmux paste-buffer"
#set -g default-command "reattach-to-user-namespace -l /bin/bash"
#bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"
#bind C-v run "tmux set-buffer $(reattach-to-user-namespace pbpaste);tmux paste-buffer"

# easy-to-remember split pane commands
bind | split-window -h
bind - split-window -v
unbind '"'
unbind %

# moving between panes with vim movement keys
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# moving between windows with vim movement keys
bind -r C-h select-window -t :-
bind -r C-l select-window -t :+
# resize panes with vim movement keys
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5
# Highlight active window
setw -g window-status-fg white
setw -g window-status-bg black
setw -g window-status-attr bright
# Color para los paneles
set -g pane-border-fg green
set -g pane-border-bg black
set -g pane-active-border-fg white
set -g pane-active-border-bg yellow
# Modo vi para moverse por el buffer
#setw -g mode-keys v
# Modificando el status-bar
set -g status-left-length 40
set -g status-left "#[fg=red]Session: #S #[fg=green]#I #[fg=black]#P"
set -g status-right "#[fg=black]%d %b %R"
# Color de la status bar completa
set -g status-bg white
set -g status-utf8 on
## Ventanas en el centro
set -g status-justify centre
# Para tener los 256 colores
set -g default-terminal "screen-256color"