Escrito por guillermo.cifuentes
en June 04, 2009
(loop for path in load-path do
(byte-recompile-directory path 0))
Para ejecutar esto desde emacs: M-x eval-expression
Otra opción es ejecutar Emacs en modo batch (sin cargar el entorno interactivo) y ejecutar el script anterior con la opción eval:
bash-3.2$ emacs --batch --eval '(loop for path in load-path do (byte-recompile-directory path 0))'
Escrito por guillermo.cifuentes
en March 16, 2009
Tengo un servicio web que acepta JSON o XML (es un JAX-RS), así que para crear o modificar recursos, los envío en JSON desde el cliente hecho en GWT. En GWT cuando quieres pasar de una cadena con un objeto JSON utilizas eval a través de la interfaz JSNI.
¿Pero para serializar objetos en cadenas? Ahora suponiendo que estás enviando los datos desde un FormHandler, en el método onSubmit querrás fijar los valores del objeto JSON y enviar la cadena en el método RequestBuilder.sendRequest. Creo que GWT-Ext provee utilidades para eso, pero si no lo estás utilizando, puedes utilizar esta librería en Javascript . Hay que descargarla y situarla en un directorio accesible por los navegadores. Debes de incluirla con una etiqueta script desde la página que carga la aplicación GWT.
La interfaz JSNI:
import com.google.gwt.core.client.JavaScriptObject;
public class JSON {
protected JSON() {}
public static final native String encode(JavaScriptObject object) /*-{
return $wnd.JSON.stringify(object);
}-*/;
public static final native <T> T decode(String json) /*-{
return eval('('+json+')');
}-*/;
}
En el método encode, se utiliza el prefijo $wnd para llamar al objeto JSON que cargaste con la librería javascript; si no haces explícito que el objeto al que llamas está cargado en Window tendrás un error en tiempo de compilación, aquí tienes más información.
Nota:En el método decode se utiliza un genérico para que el compilador averigue el tipo del lado izquierdo de la asignación (para no tener que hacer una conversión), es decir, que debes asignar el valor de vuelta del método a una variable de tipo deseado, sino tendrás un error por conflicto de tipos.
Escrito por guillermo.cifuentes
en March 09, 2009
Para inaugurar este blog, a falta de botella de cava que romper; cuelgo este plugin. Poniendo en marcha este blog echaba en falta un plugin que funcionase en el lado del servidor (es decir, que no fuese necesario javascript en el cliente) para mostrar los repositorios públicos que tengas en Github.
Comencemos con el proceso de creación:
- Crear la estructura del plugin:
guillermo:typo$ script/generate plugin github_sidebar
- El plugin como Typo es una aplicación en rails, se va para /vendor/plugins/github_sidebar. Nos vamos hasta allá. Nuevo archivo, en este caso uso vim para editar:
guillermo:typo$ vim github_sidebar.rb
Una vez dentro empezamos con el código, Typo tiene una clase muy apañada para hacer barras laterales que heredaremos y que hace muy fácil la tarea, la clase Sidebar. Por cierto, si quieres ver como implementa otras barras laterales como las de tags, la barra de amazon, etc. están todos ellas en /vendor/plugins/.
require 'net/http'
require 'uri'
class GithubSidebar < Sidebar
display_name "Github" #el nombre que tendrá el plugin en el listado de Typo
description "Muestra el listado de proyectos públicos para un usuario"
# lo siguiente son las preferencias, se quedan guardadas en la base de datos,
# el primer símbolo creará un attr_accessor con ese nombre, el segundo parámetro
# es el valor predeterminado, y el :label es el texto de la etiqueta en preferencias
setting :title, 'Github projects', :label => "Sidebar title"
setting :user, 'githubuser', :label => "Github username"
setting :refresh, '300', :label => "Time to purge the cache"
USER_INFO_BASE = "http://github.com/api/v1/json/"
def repositories
data = retrieve_reposdata
return [] if data.length < 2
user = JSON.parse data
user["user"]["repositories"]
end
private
def retrieve_reposdata
now = Time.now.to_i
timestamp = Rails.cache.read('GithubSidebar_repos_stamp').to_i || refresh.to_i
data = Rails.cache.read('GithubSidebar_repos')
unless data and (now - timestamp) < refresh.to_i
final_url = USER_INFO_BASE + user
response = Net::HTTP.get_response(URI.parse(final_url))
data = response.body
Rails.cache.write 'GithubSidebar_repos', data
Rails.cache.write 'GithubSidebar_repos_stamp', now.to_s
end
data
end
end
En el método retrieve_reposdata se hace una petición a github (para más info del api), en lugar de guardar el objeto ya parseado, se guarda como cadena ya que excepto el backend en memoria, en el resto solo puedes guardar cadenas de texto; el timestamp lo guardo aparte ya que no pude encontrar como ponerle un timeout a la llave.
-
Ahora falta la vista. Para “decirle” a Typo donde está la vista, debemos modificar el archivo init.rb. Y añadir:
require 'github_sidebar'
GithubSidebar.view_root = File.dirname(__FILE__) + "/views"
La propia vista son cuatro líneas, lo único a tener en cuenta es que la instancia de nuestro “Sidebar” está en contexto como sidebar y que debemos llamar a nuestra vista content.rhtml. Así que creamos la carpeta views en nuestro plugin y editamos content.rhtml:
<h3><%= sidebar.title %></h3>
<ul id="github_repos">
<%- sidebar.repositories.each do |repo| %>
<li><a href="<%= repo["url"] %>" title="<%= repo["description"] %>"><%= repo["name"] %></a></li>
<%- end %>
</ul>
Toca reiniciar el servidor y listo. Si eres vag@ y solo quieres utilizar el plugin, desde la raíz del proyecto rails:
guillermo:typo$ script/plugin install git://github.com/guicifuentes/typo-github-sidebar.git