Archivo para la categoría Tips

May 19th, 2009 por Jorge Yau

Twitter Friendly Links es un plugin para Wordpress que te permite crear enlaces cortos para las entradas en tu blog, sin la necesidad de servicios como TinyURL o bit.ly, la desventaja de utilizar estos servicios es que al propagar estos enlaces, no estamos propagando enlaces a nuestro blog, si no al servicio, los buscadores no reconocen estos enlaces como enlaces a nuestro blog, por ende el ranking no sube y además perdemos la forma de saber de donde provino el visitante, ya que en nuestras estadísticas aparecen como provenientes de X servicio de enlaces en vez del sitio que nos está enlazando.

El uso de este plugin es sencillo, tan solo instala y activa el plugin, inmediatamente se generaran enlaces para tu blog, por ejemplo: http://tequilog.com/123

A continuación un vídeo demostrando el uso del plugin (en inglés)

Twitter Friendly Links por Konstantin Kovshenin

  • Share/Bookmark
December 10th, 2008 por CaDs

En general Test suele ser sinónimo de aburrimiento, al menos en lo que a la opinión popular se refiere. Conozco pocos programadores que realmente disfruten escribiendo tests o que lo hagan sin una petición explícita ya sea por parte de sus jefes, el departamento de calidad… etc.

En general creo que existe el concepto de que uno programa su código y debe haber otra persona que se encargue de hacer el testing y reportarnos los bugs.
Si bien el concepto de Test y QA (Quality Assurance) están relacionados, lo uno no debiera reemplazar a lo otro.

Sobre si se debe escribir tests o no, o qué técnica es la verdadera y única (TDD, BDD, ?DD….) se han escrito infinidad de páginas, y la verdad no me interesa entrar en polémicas, así que os voy a explicar desde mi punto de vista por qué usar tests es conveniente para cualquier programador.

Un test se podría definir como una inversión a largo plazo, es cierto que inicialmente consume parte del tiempo (que como programadores estamos deseando invertir en desarrollar nuestra lógica y hacer una bonita interfaz) pero a lo largo de la vida del proyecto uno disfruta de los beneficios.

Pero dejémonos de rodeos y teoría, vamos a entrar en materia

Para este ejemplo usaré rspec, un framework de testing para Ruby on Rails.
Sus creadores lo definen como un BDD (Behavior Driven Development) framework para ruby, y sin entrar en mayores detalles sobre lo que representa el BDD diré que la filosofía detrás de esta metodología de testing consiste en centrarnos más en el cómo debe comportarse nuestra aplicación sin necesidad de preocuparnos de los detalles de implementación.

Toda esta parafernalia técnica está muy bien, pero para mí simplemente significa que escribir tests deja de ser una tarea aburrida y pasan a formar parte fundamental del código y sobre todo de la documentación.
Y esto es importante Test = Documentación, porque cuando podemos presentar nuestros tests como la documentación fiable y actualizada de nuestro código estamos matando dos pájaros de un tiro (y nos ahorramos la pesada tarea de hacer esos documentos en word con screenshots y frases cortas del tipo “X hace Y”.

Nota: He usado rspec como ejemplo y como framework para mis proyectos porque me gusta, eso no quiere decir que no podamos obtener los mismos resultados usando otros framework de testing.
Ejemplos perfectamente válidos son JUnit, RUnit, PyUnit, PHPUnit … y un largo etcétera. Prácticamente cualquier lenguaje de programación dispone de varios frameworks para testing que podréis usar según vuestras preferencias.
Igualmente da lo mismo qué filosofía de testing decidáis usar, TDD, BDD, WhateverDD, un test simplemente consiste en tener la seguridad de que independientemente de los cambios que se hagan en el código en las diversas refactorizaciones o ampliaciones del mismo, lo que funcionaba antes sigue funcionando.

Hechas las aclaraciones pertinentes…

Instalar rspec es relativamente sencillo, instalamos el gem:

[sudo] gem install rspec-rails

Y en nuestra aplicación corremos el script:

ruby script/generate rspec

Este script nos creará una nueva carpeta en nuestro proyecto llamada spec…

… con varias subcarpetas.
Para los que estéis acostumbrados a Rails y a MVC en general veréis que existe una carpeta para los controladores, otra para los modelos y otra para las vistas. Estas carpetas contendrán los tests (o specs) que escribiremos para cada uno de esos elementos.
Adicionalmente tenemos la carpeta de helpers donde podremos escribir funciones auxiliares que vayamos a usar en nuestos tests y la carpeta de fixtures, donde podemos definir algo así como los mock objects que usaremos.

Bien, cómo creamos un test? Fácil. Rspec pone a nuestra disposición varios scripts que podemos usar integrados con Rails.
Por ejemplo, al crear un controlador habitualmente escribimos el comando:

./script/generate controller user

(siendo user un nombre cualquiera)

Bien, rspec nos permite hacer lo mismo pero con un sutil cambio:

./script/generate rspec_controller user

Este comando, además de generar nuestro habitual /app/controllers/user_controller.rb


class UserController < ApplicationController
end

creará un archivo en la carpeta /spec/controllers llamado user_controller_spec.rb donde podremos escribir nuestros specs.


require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')

describe UserController do

  #Delete this example and add some real ones
  it "should use UserController" do
    controller.should be_an_instance_of(UserController)
  end

end

Qué contiene este archivo? primero carga el spec_helper para hacer disponibles las funciones auxiliares que hayamos definido y por otro lado comienza a describir nuestro controlador con el comando describe.

Describe sigue la habitual estructura de bloques de RoR conformando un bloque…


describe UserController do
#Specs varios...
end

…donde comenzaremos a definir qué queremos que haga nuestro controlador.
Rspec nos genera un ejemplo (que borraremos en breve) que si bien no nos aporta gran cosa, sí nos da una pequeña idea de como escribir nuestros specs:


it "should descriptión de la acción" do
#Comportamiento deseado
end

En este punto estamos preparados para comenzar a codificar.
Los puristas del TDD dicen que “todo comienza con un test que falla”. Así que siguiendo este consejo vamos a escribir nuestro primer test sin haber escrito todavía una sola línea de código.
Borramos el test que nos viene por defecto y escribimos nuestro primer test, algo básico que nos sirva como ejemplo podría ser:


require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')

describe UserController do

  it "should render the register page" do
    get :register
    response.should render_template 'register'
  end

end


Este sencillo spec puede entenderlo cualquier persona, aun sin conocer nada de programación (vale, esa persona debe conocer algo de inglés) y nos sirve para definir el comportamiento que deseamos para nuestra aplicación.

En este caso es trivial, estamos accediendo con un método get a la acción register y esperamos que la respuesta muestre la página de registro dentro del controlador de usuarios.
Así que en cierto modo estamos definiendo para nuestra aplicación el comportamiento de un usuario. Si un usuario hace click en el link de registrar nuestra aplicación navegará a la página de registro donde el usuario puede meter sus datos y registrarse.

Así pues hemos escrito nuestro primer test y estamos listos para ver si funciona.
Para ello rspec nos proporciona algunos scripts que podemos usar:

./script/spec path/to/directory/with/specs

correrá todos los spec que existan en un determinado directorio, y

./script/spec path/to/individual_spec.rb

correrá un determinado spec.

En nuestro caso escribiremos:

./script/spec spec/controllers/user_controller_spec.rb 

Y la respuesta que obtendremos probablemente será algo como:
ActionController::UnknownAction in ‘UserController should render the register page’
No action responded to register. Actions:
…..
Finished in 0.097963 seconds

1 example, 1 failure

Tenemos nuestro primer fallo!, así que según los puristas del TDD vamos por el buen camino.
Por lo que leemos al parecer se está quejando de que no reconoce una acción llamada register, así que vamos a definirla.


def register
#Código para registrar un usuario, vacío por el momento    
end

Volvemos a correr nuestro test

./script/spec spec/controllers/user_controller_spec.rb 

y ahora la respuesta debiera ser algo como:
Finished in 0.223996 seconds

1 example, 0 failures

Funciona!, a partir de ahora hemos definido que al acceder a la acción registrar usuarios siempre debemos presentar la página de registro.

Este ejemplo, aunque parezca trivial y una tontería, nos sirve para definir cómo trabajar con tests.
Comenzamos escribiendo algunas especificaciones para nuestro código y luego nos aseguramos de que el código cumpla con lo definido.

Por qué no al revés? Por qué no escribir primero el código y luego los test?
Hay diversas razones que nos animan a hacerlo de esta manera.

    Por un lado en muchas ocasiones tenemos ideas, ya sean propias o de nuestros clientes, que se desean incorporar a un proyecto. Estas ideas, requisitos, funcionalidades, etc… especificaciones a fin de cuentas (o specs para abreviar) definen el comportamiento de la aplicación y deben ser escritas independientemente de la implementación que se vaya a realizar posteriormente. (otra cosa es poder hacerlo o no, pero eso no nos importa en este momento)
    Codificando inicialmente y posteriormente escribiendo los tests de alguna manera estamos imponiendo nuestra implementación sobre la especificación, pudiendo llegar a “corromperla” en cierto modo.
    Por otro lado en ocasiones simplemente deseamos anotar cosas que deseamos que nuestra aplicación haga, sin tiempo para ponernos a codificar. Tal vez estemos redactando un documento de especificación y deseamos presentar lo que hace nuestra aplicación y obtener el feedback de nuestro cliente antes de emplear recursos.

En fin, las razones son varias. No me considero un evangelista, de esos hay muchos por ahí pululando. Si os interesa realmente el tema buscad sobre TDD o BDD en google y probablemente encontréis más de lo que podáis digerir.

Siguiendo con nuestro ejemplo, alguien podría decir que el test es un poco ciego. Estamos esperando que se presente la página de registro pero en realidad no tenemos página de registro y sin embargo el test funciona.
Esto nos lleva a dos conceptos interesantes.

    Convention over configuration: Rails sabe que debe existir un template con el mismo nombre que la acción que define, así que siguiendo la convención, rspec sabe que en algún momento debe existir un template con ese nombre, así que no se preocupa de si está presente o no.
    Rspec es flexible: La cantidad de opciones que nos permite rspec es abrumadora, de hecho es una de las causas por las que tiene una curva de aprendizaje no tan suave como a muchos nos gustaría. Sus programadores tuvieron en cuenta las diversas capas del MVC a la hora del diseño y por tanto permite la abstracción en cuanto a la capa de presentación.

No obstante si ninguna de estos conceptos te convence, no hay problema, podemos usar un comando para que rspec integre las restricciones de las vistas dentro de los tests de nuestro controlador, basta con escribir integrate_views.


require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')

describe UserController do
  integrate_views
  
  it "should render the register page" do
    get :register
    response.should render_template 'register'
  end

end


Si volvemos a correr nuestro test ahora debieramos obtener algo como:

1)
ActionView::MissingTemplate in ‘UserController should render the register page’
Missing template user/register.erb in view path /Users/cads/post/app/views:
….
Finished in 0.101716 seconds

1 example, 1 failure

Ahora efectivamente se queja de que le falta la página de registro, así que debemos proporcionársela para que se quede contento.
Un ejemplo rápido podría ser:
app/views/user/register.html.erb


<div id="title">
  <h2>User Registration Page</h2>
</div>
<div id="form_fields">
  Username: <%= text_field_tag 'user_name', nil, :size => 20 %>
  <br/>
  Password: <%= password_field_tag 'password', nil, :size => 20 %>
</div>
<div id="buttons">
  <%= submit_tag "Register" %>
</div>

Si corremos ahora nuestro spec vemos que ya está contento:

Finished in 0.096693 seconds

1 example, 0 failures

Rspec proporciona una potente herramienta para testear interfaces, permitiéndonos validar incluso la existencia de tags en las vistas.


it "should render the register page" do
    get :register
    response.should render_template 'register'
    #Vamos a checkear que existan los 3 divs principales
    response.should have_tag("div[id=title]")
    response.should have_tag("div[id=form_fields]")
    response.should have_tag("div[id=buttons]")
end

Pero esto nos desvía, para más información sobre rspec podéis visitar su página de documentación (buena suerte)

El si se debe incluir la validación de interfaces dentro de los tests de un controlador es motivo de polémica y discusiones.
Podemos crear specs asociados a vistas y dedicarnos por completo a testear cada una de las vistas de nuestra aplicación.
Para ello bastaría con crear el archivo spec/views/user/template_spec.rb con un formato similar al anterior.

Nota: Si al generar nuestro rspec_controller indicamos las acciones del controlador rspec generará automáticamente specs para cada una de las vistas asociadas a las acciones.
Así pues, si hubiéramos generado nuestro user_controller de esta manera:

./script/generate rspec_controller user register

rspec habría generado: spec/views/user/register.html.erb_spec.rb


describe "/user/register do
  before(:each) do
    render 'user/register'
  end
  
  #Delete this example and add some real ones or delete this file
  it "should tell you where to find the file" do
    response.should have_tag('p', %r[Find me in app/views/user/register])
  end
end

Pero como digo, no quiero complicaros la existencia con las ramificaciones de rspec.

Retomando nuestro spec, vamos a generar otra descripción no tan trivial:


it "should register a user" do
    post :register, :user => {:user_name => 'Anakin', :password => 'yoda'}
    #Si lo ha creado bien debe redireccionarnos a la pagina del profile
    response.should redirect_to :action => 'profile'
    #El usuario Anakin debe existir y estar almacenado en nuesta base de datos
    User.find_by_user_name('Anakin').should_not be_nil
end

Ahora tenemos dos specs que podemos correr, con el resultado:

.F

1)
‘UserController should register a user’ FAILED
expected redirect to {:action=>”profile”}, got no redirect
./spec/controllers/user_controller_spec.rb:18:
./script/spec:5:

Finished in 0.099972 seconds

2 examples, 1 failure

Nuevamente tenemos un test que falla, y tenemos una nueva funcionalidad y comportamiento que nos interesa, así que ahora podemos implementarla:


class UserController < ApplicationController
  
  def register
    #Registrará un usuario
    if request.post? and params[:user]
      user = User.new(params[:user])
      if user.save
        redirect_to :action => 'profile'
      end
    end
  end
  
  def profile
    #Traerá el perfil del usuario
  end
  
end


Ahora el código debiera cumplir con lo que pide el test, así que volvemos a correr nuestro spec y…

.F

1)
NameError in ‘UserController should register a user’
uninitialized constant UserController::User
….
Finished in 0.102123 seconds

2 examples, 1 failure

Cierto! se nos había olvidado crear el modelo User.

Como vemos, a partir de un simple test vamos dando forma a nuestra aplicación, escribiendo código que cubra las necesidades de nuestras especificaciones y asegurándonos de esta manera que todo funcione según lo definido.
Así pues generamos nuestro modelo:

./script/generate rspec_model user

Definimos los atributos:
db/migrate/create_users.rb


class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.column :user_name, :string
      t.column :password, :string
      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

migramos


rake db:migrate

y


rake db:test:prepare

y volvemos a correr nuestro spec:

..

Finished in 0.109147 seconds

2 examples, 0 failures

Y listo, nuevamente todo funciona nuevamente.

Si os habéis fijado a la hora de generar el modelo he usado un rspec_model.
Al igual que con los controladores y las vistas, rspec nos permite crear tests para nuestros modelos y al igual que antes podemos encontrar el spec generado en spec/models/user_spec.rb


require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')

describe User do
  before(:each) do
    @valid_attributes = {
    }
  end

  it "should create a new instance given valid attributes" do
    User.create!(@valid_attributes)
  end
end

El cual, incialmente es trivial como el resto de sus compañeros, pero nos permite validar el correcto comportamiento de los modelos.
Por ejemplo si quisieramos asegurarnos de que debe existir un user_name y un password para nuestro modelo user podemos escribir:


class User < ActiveRecord::Base
  validates_presence_of :user_name, :password
end

Lo cual nos asegura de que nuestros usuarios para ser válidos deben tener un nombre de usuario y un password.
Si corremos ahora nuestro user_spec.rb debiera fallar:

./script/spec spec/models/user_spec.rb
F

1)
ActiveRecord::RecordInvalid in ‘User should create a new instance given valid attributes’
Validation failed: Password can’t be blank, User name can’t be blank

Finished in 0.158742 seconds

1 example, 1 failure

Ahora requerimos que nuestros usuarios tengan ciertos atributos, asi que podemos requerirlos en el test y validar que todo siga correctamente.
Para ello basta con definir dentro de @valid_attributes los atributos que requiramos como obligatorios:


require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')

describe User do
  before(:each) do
    @valid_attributes = { :user_name => 'Sheldom', :password => 'Leonard'
    }
  end

  it "should create a new instance given valid attributes" do
    User.create!(@valid_attributes)
  end
end

Si ahora volvemos a correr nuestro test veremos que…

.

Finished in 0.1016 seconds

1 example, 0 failures

Todo vuelve a funcionar.

Con esto termino este laaargo post.
La idea es que partiendo de tests podemos desarrollar el resto de la aplicación de una manera ordenada y con la seguridad de que si en el futuro, debemos refactorizar nuestro código (algo bastante habitual) y teniendo tests no “contaminados” con los detalles de la implementación, podemos estar relativamente seguros de que todo está bien sin tener que volver a navegar manualmente por todas y cada una de las funcionalidades de nuestra aplicación.

Nota: Correr los tests a mano cada vez que uno hace un cambio es bastante pesado y cansino, así que hay diversas herramientas que se encargan de hacerlo por nosotros.
Yo en concreto uso rspactor que se encarga de correr automáticamente los specs relacionados cada vez que se guardo un cambio en algun archivo y genera notificaciones con growl.
Para los que no uséis mac sé que hay versiones similares que corren en windows o en linux, pero ahora mismo no tengo el enlace por aquí.

Enjoy

  • Share/Bookmark
November 3rd, 2008 por CaDs

La idea detrás de la metodología MVC (Modelo Vista Controlador) consiste en separar en 3 capas independientes, pero interconectadas entre sí aspectos comunes a cualquier aplicación web.
De este modo tenemos las siguientes capas:

  • Modelo:Se encarga de encapsular la entidad que queremos representar y persistirla en memoria de alguna manera (habitualmente una base de datos).
  • Vista:Se encarga de proporcionar al usuario una interfaz para visualizar e introducir información.
  • Controlador:Contiene la lógica que se usará para administrar la información que circulará por el sistema. Es decir, se encargará de realizar las operaciones necesarias para proporcionar información de salida o se encagará de administrar la información que el usuario haya introducido.

La idea detrás de esto es mantener estos tres aspectos de cualquier aplicación independientes entre sí, de manera que un diseñador web pueda trabajar en la interfaz de nuestra aplicación mientras que un equipo de programadores desarrollan la lógica y tal vez un administrador de bases de datos define la mejor manera de almacenar nuestros objetos.

Hasta aquí a teoría, vayamos a la práctica. (Este ejemplo supone que tienes Ruby y Rails instalados)
Rails incorpora esta metodología como parte de su diseño, de manera que trabajando con Rails automáticamente estamos usando MVC.
Comencemos creando un nuevo proyecto de Rails. Abrimos una terminal nueva e introducimos:
rails bookstore
Esto nos generará el esqueleto de una aplicación Rails lista para trabajar.
Ahora para generar nuestros componentes basta con entrar al nuevo directorio que Rails ha creado:
cd bookstore
y escribir el siguiente comando:
./script/generate model book
o
ruby script/generate model book
Según la plataforma que uses y rails se encargará de crear varios archivos:

exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/book.rb
create test/unit/book_test.rb
create test/fixtures/books.yml
create db/migrate
create db/migrate/20081103140957_create_books.rb

En concreto nos interesan los dos archivos resaltados: book.rb y 20081103140957_create_books.rb
Si abrimos con cualquier editor book.rb veremos algo así:


class Book < ActiveRecord::Base
end

Esta aparentemente inofensiva clase incorpora un montón de funciones encapsuladas dentro de ActiveRecord::Base que importa todas las funciones de la clase ActiveRecord.
Dentro de esta clase incorporaremos todas las restricciones y lógica aplicada al modelo, de manera que podemos diseñar independientemente nuestro modelo.

El otro archivo que nos interesa 20081103140957_create_books.rb veremos algo así:


class CreateBooks < ActiveRecord::Migration
  def self.up
    create_table :books do |t|

      t.timestamps
    end
  end

  def self.down
    drop_table :books
  end
end

Donde podemos definir las columnas que formarán parte del objeto que persistiremos en nuestra base de datos. Ej:

 create_table :books do |t|
      t.column :title, :string
      t.column :ISBN, :string
      t.column :author, :string 
      t.timestamps
    end

Con esto tenemos nuestros modelos perfectamente controlados y listos para trabajar.

Ahora, si queremos generar un controlador basta con introducir el siguiente comando en nuestra terminal:
./script/generate controller bookstore

Lo cual al igual que antes, nos generará algunos archivos:

exists app/controllers/
exists app/helpers/
create app/views/bookstore
exists test/functional/
create app/controllers/bookstore_controller.rb
create test/functional/bookstore_controller_test.rb
create app/helpers/bookstore_helper.rb

Como antes el archivo que nos interesa es el llamado bookstore_controller.rb


class BookstoreController < ApplicationController
end

Al igual que antes vemos que esta clase, aparentemente vacía hereda de ApplicationController, lo cual nos permite hace bastantes cosas, entre ellas definir código que va a controlar las vistas que vamos a generar.
Por ejemplo podemos escribir algo como:


class BookstoreController < ApplicationController
  
  def index
    #Codigo para la página bookstore/index.html.erb
  end
  
  def add
    #Codigo para la pagina bookstore/add.html.erb
  end
  
  def remove
    #Codigo para la pagina bookstore/remove.html.erb
  end
  
end

Como podéis ver, los métodos que definimos dentro del controlador tienen efecto sobre ciertas páginas. La idea que hay tras ruby on rails es que este framework se encarga de realizar “todo el cableado interno” entre el controlador y las vistas.

Si nos fijamos en la estructuras de carpetas que nos generó el comando rails vemos que existe la siguiente estructura:

app/view/bookstore

Como vemos Rails nos genera una carpeta para almacenar las vistas asociadas al controlador que hemos creado (bookstore), de manera que podemos crear los archivos que serán nuestras vistas dentro de cada carpeta asociada a un controlador. Ej: index.hml.erb


<p> Hola, esta es la vista para la acción Index </p>

Importante, el nombre de la página debe llamarse igual que el nombre de la acción en el controlador.
Ej. Para el método index, debe existir el archivo index.html.erb, para el método add debe existir el archivo add.html.erb y así sucesivamente.

Si os habéis perdido en estos pasos lo mejor que podéis hacer es jugar un poco con vuestra aplicación de Rails.
Para ello arrancad vuestra aplicación con el siguiente comando:
./script/server
E introducid la siguiente dirección en vuestro browser:
http://localhost:3000/bookstore/index
Si todo ha ido bien debierais ver el texto:

Hola, esta es la vista para la acción Index

Como podemos ver las rutas en rails son bastante simples de entender:
Host/Controller/Action

Listo, ya tenéis una pequeña aplicación usando la metodología MVC. Cierto que no hace gran cosa, pero es un buen punto de partida :)

  • Share/Bookmark
October 30th, 2008 por Antonio Touriño

Administrar un servidor es una tarea algo engorrosa. Debes asegurarte que los recursos de tu máquina estén siendo utilizados de una manera óptima por tu aplicación. Tienes que cuidar tu máquina de intentos hostiles de acceso. Tienes que analizar los errores que generen tus aplicaciones para ver dónde hay posibles fallos, etc. Todo esto consume tiempo y paciencia ya que todos estos datos generalmente se encuentran desperdigados por diferentes directorios de tu máquina. Si tienes varias máquinas, se pone peor la cosa. Pero no te desesperes, ya que existen algunos programas que te pueden ayudar a monitorear y analizar la ruma de datos que existen en tu servidor que resultan difíciles de procesar manualmente. Aquí te hago una lista de algunas de estas herramientas.

  • monit: Te permite monitorear que todos los servicios que configures tu servidor sean reiniciados si se caen. También puedes hacer que monit verifique que tu servidor web esté sirviendo tus páginas correctamente. Lo puedes configurar para que te mande emails si algo llega a pasar.
  • collectd: Es un recopilador de datos estadísticos de muchos procesos. Te permite guardar esta información para poder visualizarla de diferentes maneras. Uno de los formatos es el RRD-File que es el formato que utiliza el RRDtool.
  • splunk: Splunk es una herramienta que consume informes, logs, en fin, todo dato que genere algún programa y lo procesa para que tu puedas buscar cualquier información que necesites. ¿Quieres saber cuales fueron los últimos 10 intentos fallidos de conexión al puerto de tu servidor SSH? ¿Y además quieres agruparlos por IP? ¿Y además lo quieres agruparlos por horas del día?
  • DenyHosts: Este script sencillo analiza los logs de tu servidor SSH continuamente para detectar muchos intentos de acceso fallidos en poco tiempo con el objetivo de neutralizar los ataques de fuerza bruta. Si DenyHosts encuentra más de cierta cantidad de intentos fallidos en una cantidad determinada de tiempo, crea una regla para denegar paquetes provenientes del IP que ha realizado los intentos. Claro que otra posibilidad para neutralizar este tipo de ataques es utilizando login de llaves únicamente (desactivando el login por medio de passwords).
  • Share/Bookmark
October 26th, 2008 por Jorge Yau

El concepto es sencillo, Hoptoad se encarga de recibir todos los mensajes de error que genere tu aplicación, Hoptoad se encargará de archivarlos y enviarte un reporte, incluso detecta si es un error duplicado y evita enviártelo múltiples veces.

Para esto solo necesitas:

  1. Crear una cuenta gratiuta y Crea tu primer proyecto
  2. Instala el plugin
    script/plugin install git://github.com/thoughtbot/hoptoad_notifier.git
  3. Configura tu aplicación

    Crea un initializer llamado hoptoad.rb en config/initializers/hoptoad.rb y copia lo siguiente:

    
    HoptoadNotifier.configure do |config|
      config.api_key = 'TU API KEY'
    end
    

    Luego añade lo siguiente a tu application controller:

    include HoptoadNotifier::Catcher

Y eso es todo, los errores de tu aplicación serán enviados directamente a tu e-mail.

  • Share/Bookmark