Há pouco lancei a versão 0.26 de awful. A principal novidade é a integração de um editor em javascript para o web REPL (o texto anterior é sobre isso).
Houve algumas modificações para tornar o web REPL mais útil para desenvolvimento interativo, como a possibilidade de redefinir e eliminar definições de páginas em tempo de execução.
Coloquei em http://wiki.call-cc.org/video/awful-guess.ogv um vídeo mostrando o desenvolvimento de um simples jogo de adivinhação de números, com o uso de ajax e do web REPL.
Em http://parenteses.org/jogos há versões mais elaboradas de jogos no mesmo estilo.
sábado, 28 de agosto de 2010
sexta-feira, 20 de agosto de 2010
Awful fancy web REPL
Estou pensando em adicionar um editor de código em Javascript ao web REPL de awful. A idéia é facilitar a prototipação rápida, execução de testes, depuração e correção de problemas de forma fácil e com o servidor em execução.
A versão de desenvolvimento de awful contém um código inicial para isso. Abaixo está um screencast do que está implementado até agora.
O arquivo do vídeo, com uma qualidade significativamente melhor do que o mostrado acima, pode ser obtido em http://parenteses.org/mario/misc/fancy-web-repl.ogv (~6.1MB).
O editor em Javascript que estou utilizando é o Codemirror.
A versão de desenvolvimento de awful contém um código inicial para isso. Abaixo está um screencast do que está implementado até agora.
O arquivo do vídeo, com uma qualidade significativamente melhor do que o mostrado acima, pode ser obtido em http://parenteses.org/mario/misc/fancy-web-repl.ogv (~6.1MB).
O editor em Javascript que estou utilizando é o Codemirror.
Emacs rápido
Uma dica para usuários de Emacs que apelam para editores mais limitados como zile, nano e vi (risada sarcástica aqui) para edição rápida de arquivos (e.g., arquivos de configuração):
Um rápido e impreciso benchmark na máquina que estou usando agora mostra os seguintes resultados para abrir e fechar o Emacs 10 vezes:
Menos de 1 segundo para abrir e fechar o Emacs 10 vezes.
Habilitar modos que tornam o uso do Emacs mais confortável, como
Novamente, menos de um segundo para abrir e fechar o Emacs 10 vezes, com coloração de sintaxe e tudo (inclusive um interpretador de Lisp). :-)
emacs -Q -nw
Um rápido e impreciso benchmark na máquina que estou usando agora mostra os seguintes resultados para abrir e fechar o Emacs 10 vezes:
$ time for i in `seq 10`; do \
> emacs -Q -nw --eval '(save-buffers-kill-emacs)'; \
> done
real 0m0.753s
user 0m0.596s
sys 0m0.140s
Menos de 1 segundo para abrir e fechar o Emacs 10 vezes.
Habilitar modos que tornam o uso do Emacs mais confortável, como
transient-mark-mode
, global-font-lock-mode
e show-paren-mode
não custa caro:
$ time for i in `seq 10`; do\
> emacs -Q -nw --eval \
> '(progn (global-font-lock-mode t)
> (transient-mark-mode t)
> (show-paren-mode t)
> (save-buffers-kill-emacs))'; \
> done
real 0m0.800s
user 0m0.616s
sys 0m0.168s
Novamente, menos de um segundo para abrir e fechar o Emacs 10 vezes, com coloração de sintaxe e tudo (inclusive um interpretador de Lisp). :-)
terça-feira, 17 de agosto de 2010
Awful 0.25
Há pouco foi lançada a versão 0.25 de awful. A seguir são descritas as novidades.
O servidor awful admite novos parâmetros de linha de comando:
O parâmetro
Para executar no modo de desenvolvimento:
Ao acessar
Quando executado em modo de desenvolvimento, o parâmetro
Outra novidade é o parâmetro
A menos que explicitamente fornecido, awful calcula automaticamente o tamanho da resposta e o atribui ao campo
Hoje também disponibilizei um pequeno texto com instruções sobre como instalar awful em sistemas Unix[-like].
O servidor awful admite novos parâmetros de linha de comando:
--development-mode
, --ip-address
e --port
. Os parâmetros --development-mode
e --port
servem, respectivamente, para fazer com que o servidor escute nos dados endereço IP e porta.O parâmetro
--development-mode
ativa o modo de desenvolvimento de awful. Neste modo, funcionalidades como o Web REPL e o Session inspector são automaticamente ativadas. O caminho /reload
também é automaticamente criado para que as aplicações possam ser recarregadas sem que seja necessário reiniciar o servidor. No modo de desenvolvimento, mensagens de erro das aplicações são exibidas no cliente (e.g., navegador). Abaixo está um exemplo (erro.scm
):#!/usr/bin/awful
(use awful)
(define-page (main-page-path)
(lambda ()
(++ "Oops " 'erro)))
Para executar no modo de desenvolvimento:
$ awful --development-mode erro.scm
Ao acessar
http://localhost:8080/
a mensagem de erro do screenshot abaixo é exibida no navegador, seguida de um link para o Web REPL.Quando executado em modo de desenvolvimento, o parâmetro
development-mode?
tem como valor #t
.Outra novidade é o parâmetro
awful-response-headers
o qual permite ajustar os campos do cabeçalho de resposta para o cliente. Abaixo está um exemplo de um procedimento para associar URIs a respostas JSON:#!/usr/bin/awful
(use awful)
(define (define-json path body)
(define-page path
(lambda ()
(awful-response-headers '((content-type "text/json")))
(body))
no-template: #t))
(define-json (main-page-path)
(lambda ()
"{a: 1}"))
A menos que explicitamente fornecido, awful calcula automaticamente o tamanho da resposta e o atribui ao campo
Content-Length
.Hoje também disponibilizei um pequeno texto com instruções sobre como instalar awful em sistemas Unix[-like].
quarta-feira, 11 de agosto de 2010
Operações em caminhos para arquivos em buffers do Emacs
Seguidamente sinto a falta de funções no Emacs para ver o caminho completo para o arquivo aberto no buffer que estou editando (poder copiar o caminho completo seria um plus). A seguir estão duas pequenas funções para fazer isso.
show-buffer-file-name
exibe na echo area do Emacs o caminho completo para o arquivo. copy-buffer-file-name
coloca o caminho completo do para o arquivo no topo do kill ring do Emacs (no X Window, também copia para a área de seleção primária, o que pode ser útil para quem, como eu, usa bastante a combinacao Emacs + emulador de terminal).(defun show-buffer-file-name ()
(interactive)
(message buffer-file-name))
(defun copy-buffer-file-name ()
(interactive)
(if buffer-file-name
(kill-new buffer-file-name)))
Assinar:
Postagens (Atom)