Category Archives: Programming

Once more, going back to the design bench, a new fresh start once again

Doing a personal project being the customer, architect, developer and product manager is one of the most challenging experiences in my professional live I’ve ever had before, is really hard to feel comfortable with all the decitions I have to take, and well here I am after months of development thinking about the future of my beloved “Katana Project”, I can say that the idea is really nice and from the first draft this second one was good enough, but now after getting a little bit of experience in large environments and understanding in a better way security concetps and protocols makes me think I need to redefine again what I want to accomplish, therefore this is not a fresh start but another start, there is a lot of good lessons learned during the development of the Katana Project v2 but now I need to start from scratch and think more deeply about v3, this is big, and because of that I really need to focus and polish my skills as a software designer and architect.

What is comming in the future, well haven’t decided it yet, but one thing is for sure, I will start with the true core, and that means I need to focus only and work only on core functionality (SSO, user management, public API…) Not decided completely now.

Wait for further information and keep radio contact!

 

Open a rails form with Twitter Bootstrap modals

This is a copy of my protip at Coderwall.com

Sometimes we require to open a form or display information that opens up as modal windows, I will show you an easy way to do it using twitter bootstrap modals.
First make sure you added the bootstrap-sass gem to your gemfile and also used bundle to install the gem.

Also in your application.js include the calling to the bootstrap-modal javascript file in the following way:

//= require bootstrap-modal

Now in the routes.rb file add the route to the partial you want to show as modal, for example:

get "project/new_release" => 'project#new_release', :as => :new_release

In the controller add the respond_to block to use some ajax magic

  def new_release
    respond_to do |format|
      format.html
      format.js
    end
  end

In the calling view use a link_to helper in the following way:

<%= link_to 'Add release', new_release_path,  {:remote => true, 'data_toggle' =>  "modal", 'data-target' => '#modal-window'}  %>

We need to have a DIV in the calling view that will load the partial as the modal window, so we are having something like this:

<div id="modal-window" class="modal hide fade" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"></div>

We are going to put the partial form inside that div with jquery.
Make sure to have the partial, in this case should be a file named _new_release.html.erb, inside this you will have the content you want to show for example:

 <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
    <h3 id="myModalLabel">Modal header</h3>
  </div>
  <div class="modal-body">
    **here comes whatever you want to show!**
  </div>
  <div class="modal-footer">
    <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
    <button class="btn btn-primary">Save changes</button>
  </div>

Now we need some javascript to make this works, make a file named same way as the controller action but with the suffix .js.erb for this example should be:

new_release.js.erb

And inside the file add the following:

$("#modal-window").html("<%= escape_javascript(render 'project/new_release') %>");

That’s it, now when you click on the link a nice modal will show up with a very clean fade effect. Hope this little snippet can be handy for you.

Regla de oro MVC: controladores delgados, modelos gordos!

Ultimamente he estado haciendo muy pocos avances en mi proyecto sin embargo he estado haciendo algunos ajustes y refactorizaciones a mi código para dejarlo mejor, y fue cuando puse en practica la regla “Thin Controllers Fat Models” y fue cuando decidí todavia hacer los modelos mas delgados usando helpers (ruby on rails), así pues empece a delegar responsabilidades y separar lo que semanticamente debería realizar el modelo y lo que puede ser realizado por un ayudante (helper).

Lo primero fue separar los métodos para encriptar el password y autenticar el usuario, pues aunque son parte del usuario, pueden ser realizadas por un ayudante, recuerden que el objetivo es DRY (Don’t Repeat Yourself).

Al delegar la responsabilidad de encriptar el password y realizar la auntenticación a un ayudante, el modelo (User.rb) queda lo suficientemente delgado, en el helper también se pueden poner las validaciones sobre el modelo.

Existe una nueva forma de hacerlo usando los concerns, basicamente es usar modulos donde se pueda encapsular lógica compartida por varios modelos, en un proximo post explicaré como se pueden implementar los concerns, por ahora les dejo un excelente articulo de 37signals donde explican como usarlos.

Hasta pronto!

Why we always like chubby processes?

It’s been a long time since I wrote a post, now I would like to retake it writing about something that has been around my head the last few days, why we likes chubby processes speaking of organizational process, in the company where I work, we are following CMMI processes of level 3 aiming to have the SCAMPI assesment to get level 3, don’t think I don’t like processes, I’m ok and I believe there should be a standarized way to do the things, in College we learned all the benefits of following a well known process, the point is we always tend to start with chubby process that means a lot of “red tape” or innecesary documents, or extra activities that don’t add any value to the process nor the product.

You might say “Hey, but we need a lot of information to have a great project managment, and always guarantee a good level of acceptance to our customer, that’s why we need to measure everything”, ok then my counter question will be again “Why?”, do we really need to measure everything, does it really worth it?

I believe that the best approach is always the most simple, start from basics, start on focus what is really important and that is what we produce, because our customers buys our products, I know every company bigger or smaller is different, but I think this problem is more related to big ones, sometimes they grow very fast and with time start to get greedy that brings the problem to always want more and more, and the only way to sustain all this “war machinery” is by getting fat, look at the “big leagues” of the software business, I’m not saying being big is bad, there must be another way, I think and as almost all CMMI guru will tell “CMMI shouldn’t be chubby”, the CMMI model doesn’t specify the bureucracy on each process, I believe you can acchieve the same or better results when you keep it really simple and stick to the plan, again, not saying CMMI is bad or any other model for organizations like ISO.

Anyway this was just a few ideas about what’s going on and where we are going, I want to address some of the principles I found on this website from Scott Bradford:

1. Eliminate duplication and redundancy.
2. Create an alternate CMMI implementation for non-development tasks.
3. Accept ‘Not Applicable’ as a valid answer, when appropriate.
4. Automate the creation of most periodic reporting documents.
5. Have document originators enter their own documents in the document repository.
6. Unify CMMI, ISO 9001:2000, and other certification-related policies and procedures.
7. Establish stable, rarely-changing documentation requirements.
8. Clearly communicate all documentation requirements.
9. Eliminate last-minute, rush requests for updated documentation. 
10. Establish good, non-obstructionist procedures . . . then FOLLOW THEM!  

A new project is on the oven

As the post title states, I’m on the process of developing a small application that aims to be big, basically what I’m developing is a scrum dashboard with options to log time, and get some basic statistics, I know there are many options in the market out there, some free (as in free speech and also as in free beer) and also not free (same, in both ways), why I want to create another one? well because many reasons, just for fun, the existent options don’t meet my needs and why not? I like coding!, I want to practice and learn Ruby, Rails, TDD, BDD, etc.

This project is aimed for small companies, startups, that don’t have big projects or independent developers, if they want to manage small software projects.

Now, why I’m writing a post about it, same reason I want to share my intentions and use this like a diary to log my thoughts, findings and problems related to this project which by the way right now the codename is “Katana”.

Here are some features and/or specs for the project:

  • License: AGPL V.3
  • Technology: Rails 3
  • Project repository: github


Features:

  • Admin panel for controlling users and projects, including setting up configurations for the web application.
  • Users can log in and create stories and task to make a scrum dashboard.
  • Scrum dashboard to monitor progress.
  • Show basic statistics (points burn down chart, hours burn down chart, spring estimations, etc).
  • Users are able to log time on every activity.
  • REST api to allow other tools to communicate with “project katana”. (This is a nice to have feature).
  • Very simple bug tracking tool.



So far I only have the Admin panel functional but without beauty (stylesheets, js, colors, images, etc.), right now I’m looking for a good name for this tool, also any idea or suggestions for logo will be very welcome, I’m also open to listen to requests and any feedback that can be useful for improving or increase the basic features list.

Well so far this is the only information available.

See you soon!

acciones custom en Rails 3 (Parte 2 editar multiples registros)

Como lo habia prometido, esta es la ultima parte de mi post sobre multiples acciones en Rails 3. En el post anterior explicaba como poder borrar multiples registros, ahora explicaré como poder editar multiples registros, sin perder la funcionalidad de borrar varios registros, estuve buscando una solución sencilla y muchas usaban trucos con javascript, pero como buen Javero me es dificil estar haciendo trucos o soluciones en el cliente haha, así que implementé algo parecido a un dispatchEvent pero mucho muy básico.

1.- Editar el archivo routes.rb

Bueno aqui tuve que simplificarme las cosas un poco y modifique la ruta existente para borrar registros y crear la nueva ruta.

    
namespace :admin do |admin|
resources :users do
collection do
post 'edit_selected'
post 'evt_dispatch', :as => "evt_dispatch"
put :update_multiple
end
end
end

Como pueden ver es necesario crear una ruta con el método put para realizar la actualización.

2.- Editar el controlador de usuarios para agregar las nuevas acciones
Mi controlador de usuarios quedó de la siguiente manera, (solo muestro las acciones modificadas o necesarias para este post):

  
def edit_selected
@users = User.find(params[:user_ids])
end

def update_multiple
@users = User.find(params[:user_ids])
@users.each do |user|
user.update_attributes!(params[:user].reject { |k,v| v.blank? })
end
flash[:notice] = "Users Updated!"
redirect_to admin_users_path
end

def evt_dispatch
if !(params[:user_ids] == nil)

case params[:button]
when "delete"
del_selected

when "edit"
@users = User.find(params[:user_ids])
render :action => "edit_selected"
end

else
redirect_to admin_users_path, :notice => "Please select at least one user."
end
end

def del_selected

if !(params[:user_ids] == nil)

params[:user_ids].each do |id|
User.delete_all(["id = ?" , id.to_i])
end
flash[:notice] = "Users deleted successfully."
redirect_to admin_users_path

else
redirect_to admin_users_path, :notice => "Please select users to delete."
end
end

Aqui se pueden observar varias cosas, primero que tengo repetida la funcionalidad en la acción edit_selected y en el evento editar de evt_dispatch, esto es porque todavia mi código sigue en fase de pruebas, y ademas que no se ejecuta la acción edit_selected inmediatamente, primero se muestra la pantalla, aqui es donde extraño un poco el ciclo de vida de JSF (Java Server Faces)… :(, también notar que la acción update_multiple esta programada para que no tome en cuenta los registros en blanco para realizar la actualización.

Otro detalle importante de recalcar es que estoy haciendo validaciones sobre si se seleccionaron registros en el servidor y no con javascript, bueno recuerden que estoy aprendiendo a usar rails y todavia no empiezo a ver como hacer esto mas dinamico con AJAX, así que sean pacientes 🙂

3.- Editando el formulario principal
Una vez configurados las rutas y el controlador, hay que agregar las acciones a los botones correspondientes, así pues mi archivo index.html.erb queda así:

   

Users catalog


<% if @users.blank? %>

The are no users yet!


<% else %>
<%= form_tag evt_dispatch_admin_users_path do %>
<%= button_tag 'Delete Selected', :value => "delete", :type => :submit, :confirm => 'Are you sure?' %>
<%= button_tag 'Edit Selected', :value => "edit", :type => :submit %>










<% @users.each do |user| %>











<% end %>
Username Name Last name Email Role Status
<%= check_box_tag "user_ids[]", user.id %> <%= user.username %> <%= user.name %> <%= user.last_name %> <%= user.email %> <%= @roles[user.role] %> <%= @status_desc[user.status.to_sym] %> <%= link_to 'Edit', edit_admin_user_path(user) %> <%= link_to 'Delete', admin_user_path(user), :method => :delete,
:confirm => 'Are you sure?' %>

<% end %>
<% end %>


<%= link_to 'New User', new_admin_user_path %>

Aquí como pueden ver uso los helpers button_tag y lo único que cambio es el “valor” del botón o lo que envia, al hacer clic a un botón se envia a la acción evt_dispatch en el controller y dependiendo de que botón se presionó entonces se ejecuta una acción.

4.- Crear vista para edición multiple
Por ultimo es necesario crear la vista para edición multiple, el archivo edit_selected.html.erb me quedó de la siguiente manera:

 
<%= form_for :user, :url => update_multiple_admin_users_path, :method => :put do |f| %>

    <% for user in @users %>

  • <%= hidden_field_tag "user_ids[]", user.id %>
    <%= user.username %>

  • <% end %>

<%= f.label :role %>
<%= f.select :role, User::roles.map{|role| [ role[1], role[0] ]}, :include_blank => true %>
<%= f.label :status %>
<%= f.select :status, User::status_desc.map{|role| [ role[1], role[0] ]}, :include_blank => true %>
<%= f.submit %>
<% end %>
<%= link_to 'Back', admin_users_path %>

Estoy usando el for para poder mostrar los elementos seleccionados para que el usuario pueda visualizar que elementos se está editando, y además estoy agregando campos en blanco para los elementos de tipo Select esto es porque quiero que los campos en blanco sean ignorados al momento de actualizar los registros. Tanto el rol como el estatus son obtenidos de un pequeño hash que agregué al modelo del usuario, esto es porque son valores predefinidos y es una manera de tener mas control sobre lo que se puede agregar en los campos.
En fin, espero les pueda servir este pequeño truco y lo puedan adaptar a sus necesidades, todavia no tengo nada entregable pero en cuanto lo tenga publicaré la ruta de mi proyecto en github para que puedan usar mi código si así lo desean. Hasta pronto.

acciones custom en Rails 3 (Parte 1 borrar multiples registros)

Muchas veces necesitamos tener o realizar operaciones especiales mas allá del CRUD (Create, Read, Update and Delete) para nuestros modelos, como por ejemplo poder elimiar varios registros a la vez o editar varios registros, etc.

Estuve buscando en varios sitios como poder realizar esto, yo tenia precisamente la problematica de necesitar borrar y editar varios registros en vez de uno a la vez, por ello aqui describo los pasos que realizé para lograr mi cometido.

Primero hay que editar el archivo routes.rb
Aqui hay que crear nuestras rutas a las acciones que queremos realizar, en mi caso mi controlador de usuarios está anidado en el controlador de administrador, entonces necesitamos nuestras rutas REST para el CRUD basico y aparte nuestras acciones custom para borrar y editar varios registros, para ello describimos nuestras rutas custom dentro del bloque collection de esta manera Rails interpreta dichas rutas para manipular varios registros, así pues quedaría de la siguiente manera:

    
namespace :admin do |admin|
resources :users do
collection do
post :delete_many, :as => :delete
end
end
end

Ahora toca agregar las acciones en el controlador, para ello edito mi archivo users_controller.rb quedando así:

    
def delete_many
if !(params[:users_ids] == nil)
params[:users_ids].each do |id|
User.delete_all(["id = ?" , id.to_i])
end
flash[:notice] = "Users deleted successfully."
redirect_to admin_users_path
end
end

Y por ultimo editamos el archivo index.html.erb (la vista donde se muestran los usuarios:

    



Users catalog


<% if @users.blank? %>



The are no users yet!


<% else %>
<%= form_tag delete_admin_users_path do %>
<%= submit_tag 'Delete Selected', :confirm => 'Are you sure?' %>

<% @users.each do |user| %>

<% end %>






















Selected Username Name Last name Email Role Status
<%= check_box_tag "users_ids[]", user.id %> <%= user.username %> <%= user.name %> <%= user.last_name %> <%= user.email %> <%= @roles[user.role] %> <%= @status_desc[user.status.to_sym] %> <%= link_to 'Edit', edit_admin_user_path(user) %> <%= link_to 'Delete', admin_user_path(user), :method => :delete,
:confirm => 'Are you sure?' %>

<% end %>
<% end %>


<%= link_to 'New User', new_admin_user_path %>

Aqui destacan varias cosas, primero, estoy usando el helper form_tag en vez de form_for porque no estoy enfocando este formulario a un modelo en particular, o dicho de otra manera este formulario no realiza operaciones CRUD, solo despliega datos, así mismo estoy usando la magia de rails para encontrar la ruta de mi controlador#acción al llamar a delete_admin_users_path, si quieres ver como utilizar las rutas basta con correr “rake routes” en una consola para ver las rutas que rails ha generado y basta con agregarles el prefijo _path para que detecte a que ruta estás apuntando, segundo, para poder tener selección multiple estoy usando el helper check_box_tag cuyo nombre del componente es “user_ids[]” y se declara así porque de esta forma rails detecta los registros seleccionados y los envia al controlador como un arreglo, por ello yo itero dicho arreglo en la acción del controlador.

Bueno por lo pronto es todo, esperen la segunda y ultima parte de este post donde describo como editar varios registros a la vez, cabe señalar que estoy aprendiendo a programar en ruby y rails mientras desarrollo esta aplicación, proximamente pondré la ruta de donde puedes descargar el código fuente de mi proyecto, pues está liberado bajo licencia AGPL v3 🙂 Hasta pronto!

Internacionalizar aplicaciones java

Continuando con los posts relacionados con i18n (internacionalización) aquí les dejo un snippet para leer archivos de propiedades, estos son usados en java para guardar texto en formato llave=valor.

ResourceBundle bundle = java.util.
                    ResourceBundle.getBundle(“ruta_archivo_properties”);

String value = bundle.getString(“llave”)

Si tenemos un archivo por ejemplo “resource.properties” en el paquete net.edokun.resources, entonces el código sería algo asi:

ResourceBundle bundle = java.util.
                    ResourceBundle.getBundle(“net/edokun/resources/resource.properties”);

los archivos properties deben tener la información arreglada de la siguiente manera:

llave1=Hola
llave2=Adios

Una vez que obtenemos el archivo con la clase ResourceBundle para obtener el texto lo hacemos con el método getString(“llave”) donde “llave” es el key en el archivo properties en este caso puede ser llave1 ó llave2 y lo que regresa es el valor, Hola o Adios según la llave.

Por ultimo, si queremos hacer nuestra aplicación internacional lo podemos hacer creando más archivos properties uno por cada idioma adicional, siempre poniendo el sufijo _CodigoLocale ejemplo:

resource_en_US.properties – para inglés
resource_ja_JP.properties -> para japonés
resource_es_MX.properties ->para español Mexico

y obviamente en cada uno el valor de las llaves está en el respectivo idioma.
Así como todos los archivos properties deben estár en la misma ruta.

 Ya solo es necesario indicarle a nuestra aplicación que idioma debe usar, para ello usamos el snippet anterior para cambiar el locale y eso es todo.

Como cambiar el idioma de tu aplicación en Java

Muchas veces cuando desarrollamos aplicaciónes queremos darle un toque mas amigable al mostrar información en el idioma del usuario, aqui les dejo un pequeño snippet para cambiar el idioma y la configuración regional para la aplicación en Java.

Dentro del bloque main y antes que todo deberá ir lo siguiente para que la aplicación cambie el locale exitosamente:

            Locale locale = null;
            //el primer parametro es el idioma, el segundo es el país, siempre en MAYUSCULAS.
            // ejemplo: es “español”, en “ingles”, US “Estados Unidos”, MX “Mexico”
            locale = new Locale(“en”,”US”);
            Locale.setDefault(locale);

Con esto todos los mensajes de java como excepciones lanzadas, el formato númerico, separador decimal, formato de fechas, etc. será ajustado a la nueva configuración regional.

Es importante recalcar que esta configuración sobreescribe el locale por defecto que se lanza cuando la JVM es ejecutada, esto quiere decir que si la JVM está instalada en una computadora con el sistema operativo en ingles, y el país es Estados unidos, por defecto la JVM siempre usará el locale en_US, pero si en nuestra aplicación lo configuramos como es_MX automáticamente nuestra aplicación funcionará con el locale distinto sin alterar otras aplicaciones java que tengamos corriendo.

Como obtener los componentes de un JFrame

Aqui les dejo un pequelo snippet para cargar todos los componentes que tiene un JFrame o JPanel (practicamente cualquier componente gráfico que herede de Container) basicamente con esto obtienen todos los componentes en un mapa el cual acceden a cada elemento desde el mapa con el nombre del elemento. como pueden ver es un método recursivo lo que hace que si hay componentes contenedores dentro del JFrame también los agregará.

public static Map getAllComponents(Container parent, Map componentsMap){
Map map;
Component[] components;

if(componentsMap==null)
map = new HashMap();
else
map = componentsMap;

components = parent.getComponents();
map.put(parent.getName(), parent);
for(int i=0; i < components.length;i++){
map.put(components[i].getName(), components[i]);
if(components[i] instanceof Container){
map = getAllComponents2((Container)components[i],map);
}
}
return map;
}