Archive for the '16397' Category

RubySharp, implementando Ruby en C# (3)

Saturday, June 21st, 2014

Anterior Post

En RubySharp puedo definir nuevas funciones (en realidad métodos del objeto actual) e invocarlas. Hay algunas funciones que ya están predefinidas en C#:

Veamos primero que toda función tiene que cumplir con la interfaz:

public interface IFunction
{
    object Apply(DynamicObject self, Context context, IList<object> values);
}

donde cada función, al aplicarse, recibe el objeto sobre la que es invocada como método, el contexto de variables (locales, argumentos, otros… ) actual, y una lista (posiblemente vacía) de argumentos.

Por ejemplo, la función puts está implementada así:

public class PutsFunction : IFunction
{
    private TextWriter writer;

    public PutsFunction(TextWriter writer)
    {
        this.writer = writer;
    }

    public object Apply(DynamicObject self, Context context, IList<object> values)
    {
        foreach (var value in values)
            this.writer.WriteLine(value);

        return null;
    }
}

Recibe: el objeto al que pertenece como método, el contexto, y una lista de argumentos. Cada uno de los argumentos ya lo recibe evaluado, y simplemente lo envía a un TextWriter, un argumento por línea. Vean que no imprime a la consola: el TextWriter se lo entregan cuando se crea esta función (veremos más adelante que se crea al crearse un objeto Machine). Esta inyección por constructor facilita el test de esta función predefinida, ejemplo:

[TestMethod]
public void PutsTwoIntegers()
{
    StringWriter writer = new StringWriter();
    PutsFunction function = new PutsFunction(writer);

    Assert.IsNull(function.Apply(null, null, new object[] { 123, 456 }));

    Assert.AreEqual("123\r\n456\r\n", writer.ToString());
}

Pero fue algo que nació no sólo de armar un test, sino de seguir el flujo de trabajo de TDD.

Veamos otro ejemplo de función predefinida, el require:

public class RequireFunction : IFunction
{
    private Machine machine;

    public RequireFunction(Machine machine)
    {
        this.machine = machine;
    }

    public object Apply(DynamicObject self, Context context, IList<object> values)
    {
        string filename = (string)values[0];
        return this.machine.RequireFile(filename);
    }
}

Esta vez, delega el trabajo de cargar un archivo de programa al objeto Machine que se le inyectó al comienzo.

Y finalmente, veamos el código de una función definida, con un cuerpo ya compilado de RubySharp:

public class DefinedFunction : IFunction
{
    private IExpression body;
    private IList<string> parameters;
    private Context context;

    public DefinedFunction(IExpression body, IList<string> parameters, Context context)
    {
        this.body = body;
        this.context = context;
        this.parameters = parameters;
    }

    public object Apply(DynamicObject self, Context context, IList<object> values)
    {
        Context newcontext = new Context(self, this.context);

        int k = 0;
        int cv = values.Count;

        foreach (var parameter in this.parameters) 
        {
            newcontext.SetLocalValue(parameter, values[k]);
            k++;
        }

        return this.body.Evaluate(newcontext);
    }
}

En este caso, se arma un nuevo contexto para que contenga a los argumentos de la función definida, con los valores que se pasaron ahora, y que recuerde igual al contexto desde donde fue definida. Observen que el contexto desde donde fue invocada (el Context context que recibe como parámetro Apply) no es usado. Hay una “closure” con el contexto en el que fue construida la función (el Context context que recibe en el constructor)

Hay más temas para explorar, como implementación de algunos comandos, la Machine que arranca todo, el REPL, etc.

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

Resoluciones del Nuevo Mes: Abril 2014

Sunday, April 6th, 2014

Llega revisión de mis resoluciones de marzo:

– Trabajar en DictSharp [completo] ver repo
– Dar una charala sobre Aplicaciones Distribuidas en Node.js [completo] ver repo ver presentación
– Mejorar SimpleGammon [completo] ver repo
– Mejorar Annalisa [completo] ver repo
– Agregar @for a Templie [pendiente]
– Trabajar en PreciosaAnnalisa online web services [completo] ver repo
– Mejorar mis ejemplos de Aplicaciones Distribuidas en Node.js [completo] ver repo ver repo ver repo
– Trabajar en ScalaSharp [completo] ver repo
– Mejorar ClojSharp [completo] ver repo
– Mejorar SimpleAsync, operación do (funciones en “paralelo”) [pendiente]
– Mejorar Aktores [pendiente]
– Mensajes distribuidos en AjErl [pendiente]
– Agregar alcance de variables al lenguaje Mass [pendiente]
– Comenzar a codificar generation as a service [parcial]

Adicionalmente, estuve trabajando en:

– Complexo, operaciones de números complejos en JavaScript [completo] ver repo
– Comenzar RustScript, un intérprete de Rust en JavaScript [completo] ver repo
– Continuar RuScript, intérprete de Ruby en JavaScript [completo] ver repo
– Continuar RubySharp, intérprete de Ruby en C# [completo] ver repo
– Comenzar AjLispScala, intérprete Lisp en Scala, usando TDD y SBT [completo] ver repo
– Grabar un segundo video de aprendiendo Node.js [completo] ver post

Para este nuevo mes, mis resoluciones son:

– Continuar AjLispScala
– Continuar AjGenesisNode-Express
– Continuar AjGenesisNode-PHP
– Continuar RuScript
– Continuar RustScript
– Mensajes distribuidos en AjErl
– Dar una charla de introducción a Node.js
– Publicar un nuevo video de Aprendiendo Node.js

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Resoluciones del Nuevo Mes: Febrero 2014

Saturday, February 8th, 2014

Revisión de mis Resoluciones de Enero:

– Comenzar a implementar un modelo de actores a la Akka en C# [completo] ver repo
– Comenzar a implementar un intérprete Scala en JavaScript [completo] ver repo
– Trabajar en AjErl, Erlang en C# [completo] ver repo
– Trabajar en Mass (tengo varias ideas para implementar más module pattern y scope de variables) [pendiente]
– Trabajar en DylanSharp [completo] ver repo
– Comenzar una implementacion de ML (JavaScript? C#?) [pendiente]

También trabajé en:

– Mejorar intérprete Scala en C# [completo] ver repo
– Agregar notación dot en mi intérprete Lisp en C# [completo] ver repo
– Mejorar el intérprete Ruby en JavaScript [completo] ver repo
– Mejorar el intérprete Clojure en C# [completo] ver repo
– Primeros templates y tasks generando código Sinatra desde AjGenesis para Node [completo] ver repo

Mis resoluciones para este nuevo mes:

– Completar mensajería distribuida en AjErl
– Completar notación dot en AjLisp para acceder a tipos y objetos nativos
– Mejorar ClojSharp
– Trabajar en ScaScript
– Trabajar en ScalaSharp
– Agregar alcance de variables a Mass
– Completar primera versión de model de actores Aktores en C#
– Más tareas de generación de código, plantillas, modelos en AjGenesis para Node, generando código para Express, Meteor, Sinatra

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Resoluciones del Nuevo Mes: Diciembre 2013

Friday, December 6th, 2013

Primero, revisar mis resoluciones de Noviembre:

– Comenzar un compilador de Python reducido a C, usando JavaScript [complet] repo
– Dar una charla sobre implementación de Ruby en C# [completo] slides repo
– Comenzar intérprete Ruby en JavaScrip [completo] repo
– Completar el alcance de variables en lenguaje Mass [pendiente]
– Dar una charla sobre interpretar y compilar lenguajes en JavaScript [completo] slides
– Escribir un framework web para AjTalkJs (para ser usado desde Node.js) (plano o MVC) [pendiente]
– Mejorar módulos NPM en AjTalkJs y AjTalk [parcial] repo
– Mejorar soporte de tests en AjTalkjs y AjTalk [pactial] repo
– Mejorar las estructuras de datos en AjErl [pendiente]

Mis resoluciones para Diciembre:

– Dar un curso de un día sobre Node.js
– Refactorizar y mejorar CobolScript
– Continuar escribiendo en intérprete de Ruby en JavaScript
– Terminar de definir el alcance de variables en el lenguaje Mass
– Más módulos iniciales para AjTalkJs

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

RubySharp, implementando Ruby en C# (2)

Saturday, September 21st, 2013

Anterior Post 
Siguiente Post 

Sigo trabajando en mi implementación de Ruby en C#

https://github.com/ajlopez/RubySharp

Hoy quería mostrarles que tengo implementadas varias expresiones que se pueden evaluar:

También tengo comandos, que inicialmente estaban separados:

Pero ahora, ambos implementan la interfaz

El método Evaluate recibe un Context:

Tengo que revisar si el Context tiene o no referencias al objeto actual (self y demás).

Un ejemplo de código, el .Evaluate de la NameExpression:

public object Evaluate(Context context)
{
    var result = context.GetValue(this.name);

    if (result is IFunction)
        return ((IFunction)result).Apply(null, emptyvalues);

    return result;
}

Vean que tengo que considerar qué pasa si el nombre en solitario es la llamada a una función. En Ruby, una función puede llamarse simplemente indicando el nombre, sin necesidad de poner los paréntesis de llamada como en JavaScript.

Espero seguir completando expresiones y comandos, y como todo está con TDD, puedo refactorizar Context para manejar objectos y otros escenarios.

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

Resoluciones del Nuevo Mes: Septiembre 2013

Wednesday, September 4th, 2013

Tiempo de revisar mis resoluciones del pasado mes:

– Actualizar SimpleProlog [complete] ver repo

– Actualizar Mass [pendiente] 
– Actualizar AjTalkJs [complete] ver repo

– Actualizar AjTalk [complete] ver repo

– Actualizar SimpleLisp [pendiente]

– SimpleLisp ejemplo web server [pendiente] 
– Nuevo Google Hangout usando Ruby con TDD [completo] ver post 
– Nuevo Google Hangout usando C# con TDD [completo] ver post

Otros items:

– Otro Google Hangout usando C# y TDD [completo] ver post

– Google Hangout using JavaScript and TDD [completo] ver post
– Google Hangout about Exploring MongoDB [completo] ver post
– Google Hangout about Code generation with AjGenesis for Ruby [completo] ver post

– Actualizar AjGenesis para Ruby [completo] ver repo     
– Actualizar AjGenesis para Node.js [completo] ver repo

– Nuevo módulo AjGenesisNode para Entities [completo] ver repo

– Comenzar nuevo módulo AjGenesisNode para Express [completo] ver repo

– Nuevo módulo Node SimpleUnit para testing [completo] ver repo

– Comenzar ScalaSharp, intérprete tipo Scala en C# [completo] ver repo

– Mejorar la left recursion en GrammGen [completo] ver repo

– Actualizar SimpleMongo [completo] ver repo

– Dar una charla sobre generación de código en AjGenesis para Ruby [completo] ver talks

y varios refactors de módulos node, usando SimpleUnit

Las resoluciones para el nuevo mes:

– Actualizar SimpleForth

– Dar una charla sobre SimpleMongo, SharpMongo

– Actualizar SimpleMongo

– Actualizar SharpMongo

– Actualizar PageJs

– Actualizar ScalaSharp

– Actualizar JPyScript

– Actualizar AjTalkJs

– Actualizar Mass scopes

– Empezar ejemplo Web Server usando AjTalkJs 
– Actualizar AjTalk

– Actualizar AjLispJs

– Ejemplo Web Server con AjLispJs

– Preparar charla sobre Scala

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

Ruby Meetup En Buenos Aires, Agosto 2013

Saturday, August 31st, 2013

Lo mío es un apostolado 😉 así que hoy va una corta reseña de la actividad del Ruby Meetup en Buenos Aires, que se hizo el miércoles 27 de Agosto pasado, como ya anunciara en otro post.

Esta vez fue en una zona más cerca del centro de Buenos Aires, en una dependencia del Gobierno de la Ciudad de Buenos Aires. Llegué un poco después de las 18:30 y notablemente, ya había gente (unas 8 personas, creo). En el anterior meetup, más lejos del centro, en el populoso barrio de Palermo, a esa hora sólo estaban los organizadores. Pero en esta reunión hubo algo menos de asistentes (¿12 personas?) finales.

Como otras reuniones, hubo presentaciones, discusiones y temas varios. Y como en otras reuniones, a las 20:30 yo me convertí en calabaza y me fui, así que no les puedo comentar todo lo que pasó y se discutió.

El primer expositor (a pedido propio) … ejem…. fue quien esto escribe. Pueden ver mi charla y ejemplo sobre generación de código usando AjGenesis para Ruby en:

Generación de Código con AjGenesis para Ruby (1)

Grabé en vivo y en directo (parezco Pipo Mancera ya, uy… #soytanviejo 😉 un Google Hangout, con una rápida introducción a Anglish.

Se emitió un Google Hangout con video desde otra notebook, pero tengo la URL.

Siguió una presentación de @cristianrasch sobre manejo de assets (archivos javascript, imágenes, css, etc…) en aplicaciones web basadas en Rack, como el propio Rails. Enlaces de los que tomé nota:

http://guides.rubyonrails.org/asset_pipeline.html
https://github.com/sstephenson/sprockets
https://github.com/petebrowne/sprockets-helpers

Vean la tarea Rake para procesar los assets desde algo que no sea Rails:

https://github.com/sstephenson/sprockets/blob/master/lib/rake/sprocketstask.rb

Luego mostró su sitio, viendo la carga de los assets usando el plugin para varios browsers Yslow:

http://developer.yahoo.com/yslow/

Ahí saltó @inkel mencionando que para el tema de cache de los assets y demás temas de HTTP, hay que visitar:

http://redbot.org/

y el sitio de su autor Mark Nottingham:

http://www.mnot.net/

en especial

http://www.mnot.net/cache_docs/

Algunos enlaces de Nottingham yo ya tenía anotados, pero ahora descubro algo para investigar nuevo:

http://github.com/mnot/thor

en Python.

No recuerdo si antes o despues de la charla de Rasch, hubo una presentación de cada uno de los asistentes. No tengo los nombres, algunos los conocía, otros no. Notablemente, vino alguien de InfoOil, que trabaja en Smalltalk.

Siguio como orador @tutec escribiendo en la pizarra ejemplos de reemplazo de if y otra lógica por objectos, implementando special case. Ver:

https://gist.github.com/tute/6374237#file-special-case-objects-md

y como indica ahí, ver también:

http://martinfowler.com/eaaCatalog/specialCase.html
http://devblog.avdi.org/2011/05/30/null-objects-and-falsiness/
http://www.cs.oberlin.edu/~jwalker/nullObjPattern/

Bien que haya compartido eso por Twitter.

Y finalmente, las hermosas @_ceciliarivero y @maynk presentaron @punchgirls, el equipo que formaron y fue becado por

http://railsgirls.com/

ver el detalle en:

http://railsgirlssummerofcode.org/blog/the-big-conferenc-raffle-winners/

el proyecto que están desarrollando:

https://github.com/punchgirls/job_board

Creo recordar que sus mentores en programación son @soveran, @djanowski, @inkel. Entonces armaron todo sobre Cuba, agregandole módulos a medida que los necesitaban (sori, gordi, no TDD here ;-).

Ver el avance en el blog:

http://punchgirls.wordpress.com/

Dieron la charla con una presentación, me avisan que quedó en:

https://speakerdeck.com/punchgirls/rails-girls-summer-of-code

De paso, visité:

http://en.wikipedia.org/wiki/Women_in_computing

Bueno, suficiente por hoy, si recuerdo algo más lo agrego. Ya me estoy preparando para el próximo meetup, alguna charla corta. Además, tengo que proponer este fin de semana una charla para RubyConf.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Conferencias en Argentina

Wednesday, August 28th, 2013

Ayer listé las reuniones que se vienen en Buenos Aires.

Veamos hoy una lista de conferencias en Argentina, de acá a fin de año. Primero, mañana jueves 29 comienza:

Hacks/Hackers BA Media Party 2013

en Buenos Aires

http://lanyrd.com/2013/hhba/

The Media Party http://mediaparty.info. Three awesome days of keynotes, workshops, demos and a huge hackathon; journalists, editors, designers and software developers working together for the future of media; interactive storytelling, visualizations, mapping, scraping and more.

Tengo que confesar que me aburre un poco el temario, pero cumplo con avisarles que existe esa conferencia.

PHP Conference Argentina
4-5 October 2013, Buenos Aires

http://www.phpconference.com.ar/?lang=en

his year we gathered the best of the programming world. With several talks that cover a wide range of topics related to web development, PHP Conference Argentina is a conference no programmer wishes to miss (whether or not they use PHP.) These are just some of our speakers:…

Uy, vienen todos los popes de PHP, incluido Lerdorf

PyCon Argentina

en Rosario

http://ar.pycon.org/

¡Python en Rosario! 24 y 25 de Octubre
Python es un lenguaje dinámico comparable con Java, .NET, PHP y Ruby mucho más intuitivo y fácil de aprender, alentando la colaboración. Disfruta programar tan rápido como piensas, de forma clara y expresiva. Ven y conoce porqué Google, Yahoo, Disney, Cisco, LucasFilm, Red Hat, Pixar, VMware, Canonical (Ubuntu), NASA, YouTube y varias empresas nacionales, universidades locales, docentes e investigadores usan Python!

Smalltalks 2013

October 30, 31 and November 1st
UTN Facultad Nacional Rosario

http://www.fast.org.ar/smalltalks2013

The Fundación Argentina de Smalltalk (FAST) proudly invites you to participate in the seventh edition of one of the most exciting Smalltalk conferences around

Smalltakers from every corner of the world will attend this international event. Outstanding guest personalities from the community will deliver the conference keynotes. This is an opportunity you do not want to miss!

Smalltalks 2013 will feature a research track for papers, complete with published proceedings and an outstanding program commitee. As always, the conference will also feature an industry track for those preferring a more informal setting.

RubyConf Argentina

Buenos Aires, November 27 & 28, 2013

http://rubyconfargentina.org/en/

We are very proud to announce the third edition of RubyConf Argentina,
a regional conference about Ruby and related technologies.

Bueno, falta ver dónde se hace el Día del Programador, vía el MUG. Faltaría una de .NET (ya avisé en Microsoft que todo el mundo hace conferencia anual, menos de .NET; están muy ocupados vendiendo pantallitas y programas para pantallitas, esas cosas que se llaman mobile… y bueh… )

No digan que no les avisé de estas conferencias. Lo mío es un apostolado 😉

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Próximas reuniones en Buenos Aires: Ruby, Scala, MongoDB

Tuesday, August 27th, 2013

Se viene una nueva tanda de reuniones/meetups de programación por estos lares.

Primero, antes que me olvide, se viene Ruby Meetup mañana miércoles 28. Leo en la lista RubySur

Los invitamos a asistir al próximo Ruby Meetup a realizarse en la Ciudad de Buenos Aires.

Para quienes no hayan asistido aún: nos reunimos por un par de horas para charlar y también escuchar a quienes estén interesados en dar alguna breve charla.
Luego, quienes pueden y quieren, en general van a tomar y comer algo.
El evento es totalmente libre y gratuito. 🙂

Info:

Cuándo: Miércoles 28 de Agosto de 18:30hs a 21hs.
Lugar: Av. Independencia 635 5to piso (GCBA)
Mapa: http://goo.gl/maps/JFjGT

Para inscribirse:
http://goo.gl/YPyco0

Para ver los inscriptos:
http://goo.gl/I3wDlj

Los esperamos!

Que bueno que al fin hagan la reunión en un lugar cerca del centro.

Luego, la semana que viene tenemos meetup de Scala. Miércoles Septiembre 4:

http://www.meetup.com/scala_ar/events/135765012/

  • Snacks, discusión tecnológica, y la oportunidad de conocer otros entusiastas de scala y compartir experiencias.

    Agenda tentativa:

    18:30-19:00: Recepción. Esperar a que lleguemos todos

    19:00-21:00: Charlas.

    – "Todo lo que ud quiso saber sobre Akka y no se animó a preguntar en las charlas anteriores"

    Hay un spot libre. Propongan en este mismo thread más abajo!

    21:00-21:30: Cierre

    Como dato extra: va a haber también al menos un anuncio (por ahí dos) sobre eventos extra curriculares que estamos organizando con el grupo que se agregan a las charlas mensuales.

    Detalle de las charlas:

    "Todo lo que ud quiso saber sobre Akka y no se animó a preguntar en las charlas anteriores": una charla de akka a nivel basico con la idea de que quienes apenas conocen la herramienta o no han tenido la oportunidad de usarla aclaren sus ideas y ganen una base sobre la cual seguir aportando.. Sin duda esto abrira paso otras charlas mas interesantes que no podrian darse efectivamente si el publico no conoce akka

Y en la siguiente semana, nos queda MongoDb:

http://www.meetup.com/MongoDB-Argentina/events/133864992/

El jueves 12 de Septiembre. Ver:

  • Ésta es la segunda reunión de MongoDB Argentina. La idea es compartir experiencias, dejar lista una pizarra y una pantalla gigante para hablar y mostrar MongoDB.

    No hay oradores, cualquiera puede venir, contar, conectar su laptop, exponer algo o consultar sobre algún problema.

Después no me digan que nos les avisé. Lo mío es un apostolado 😉

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

TDD Rocks! (6) Jugando con Ruby

Wednesday, August 14th, 2013

Anterior Post
Anterior Post con Ruby 
Siguiente Post 

Sigo aprendiendo Ruby haciendo un Tokenizer usando mi flujo de trabajo de TDD (Test-Driven Development)

Pueden ver el resultado en

http://www.youtube.com/watch?v=X-mTCyhm7ds

[View:http://www.youtube.com/watch?v=X-mTCyhm7ds]

Hice dos rediseños:

– Proveer el texto a tokenizar en el constructor de los tokenizadores

– Renombra el método getTokens a un nombre más “rubista” get_tokens

Luego, me líe con un gran refactor de la implementación. Me quise hacer el “smart programmer”, pero podría haber tomado un camino más fácil, al no saber Ruby tal vez hubiera sido mejor. Pero al final, salió todo bien. Ya está comenzando a alinearse con lo que tengo pensado para este tokenizador. Pueden ver una implementación ya andando en JavaScript/NodeJs:

https://github.com/ajlopez/KodeTokenizer

Mientras, esta versión Ruby la pueden ver (con sus commits prácticamente por test) en:

https://github.com/ajlopez/TddRocks/commits/master/Ruby

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez