Google Street View Hyperlapse
A Teehan+Lax Labs experiment for creating interactive Google Street View hyper-lapse animations. Learn more about this project.
codeAR es un Agregador de Noticias
que intenta capturar los blogs de los desarrolladores Argentinos. Para saber que piensan, que están desarrollando,
que están leyendo, que están imaginando.
Si tenes un blog sobre desarrollo de sistemas o
relacionado al tema, te invitamos a participar de este Planeta,
envianos un mail con la dirección de tu blog.
A Teehan+Lax Labs experiment for creating interactive Google Street View hyper-lapse animations. Learn more about this project.
This application is designed to help beginners grasp the powerful concepts behind branching when working with git. We hope you enjoy this application and maybe even learn something!
If you want to give your kid every opportunity to succeed, it’s hard to argue with teaching them to code. Some of the wealthiest and most influential people of our time began programming young, and who wouldn’t want that kind of future for our kids?
In this article we’re going to cover some common, and not so common smart JavaScript techniques and patterns to improve your code in both size and beauty. To follow along with this tutorial it’s important that you have a good understanding of functional programming in JS and regular expressions.
Ya tratamos el principal tema que nuestro proyecto tiene que cumplir para ser un buen proyecto: solucionar el problema al cliente. Puede que sea sólo un colaborador, entre otros proyectos, para llegar a esa solución. Por ejemplo, me pasa muchas veces que el proyecto que me toca es de programación de una aplicación, pero la solución total del problema implica su instalación, mantenimiento y adopción. Otras veces no: nuestro proyecto abarca toda su ciclo de vida, por lo menos de la primer versión.
Puede suceder algo que muchas veces se nos pasa por alto:
- No podemos estar seguros de que lo que entregamos es un buen proyecto al terminarlo y entregarlo.
Hay que ver si realmente funciona en el campo, en la vida real.
Pongamos un ejemplo. Sea nuestro cliente es una compañía de seguros y su problema es que está perdiendo clientes porque los productores de seguros tardan mucho en otorgarle una póliza o no. La solución evaluada es: poner una aplicación en línea que reduzca el tiempo de aceptación o rechazo de un día a quince minutos. Hacemos la aplicación, pero al llegar a desplegarse y ser usado se muere cada media hora por la presión de uso, y la causa es el código de nuestro proyecto. O peor, trabaja bien, soporta la carga, pero otorga aceptaciones a cualquier caso. En ambos casos, nuestro proyecto no habrá sido un “buen proyecto”.
Es por eso que en nuestro proceso es importante las pruebas de carga y las pruebas funcionales. A lo que voy, es que muchas de las actividades que realizamos terminan teniendo su origen en la necesidad de cumplir con ser un buen proyecto. Un proyecto puede parecer “bueno”: tener todo “en regla”, haber sido programado con todos los patrones, ante las entradas correctas dar el resultado correcto, pero fracasar en su implementación porque no revisamos que, así como lo tenemos programado, no soporta más de diez usuarios simultáneos.
Aparece la cuestión de la calidad de nuestro entregable. Podemos discutir luego si la calidad es responsabilidad del equipo ágil, o si hace falta un equipo aparte de QA (Quality Assurance). Pero vemos que todo esto es motivado por la necesidad de cumplir con lo que espera el cliente: la solución de su problema.
Para poner un ejemplo “al revés”: al cliente no le importa que lo que entregamos sea escalable como Facebook, si su problema y solución (digamos, un sistema de compras) necesita solamente atender a veinte usuarios (los representantes de sus proveedores principales).
En próximos posts: si una solución es exitosa, hay que mantenerla; el aporte de TDD y el proceso de desarrollo.
Nota personal: lo de no poder ver si es un buen proyecto al terminarlo, me fue sugerido por Aristóteles. No encuentro la cita ahora, pero cuando habla de “eudamonia” en su “Etica a Nicómaco”, habla de lo que yo traduzco como “buena vida”, “con los dioses a favor”. Dice Aristóteles que muchas veces, un hombre al morir no puede estar seguro de haber llegado a la “buena vida”: puede que el resultado dependa de su influencia en otros hombres, aún luego de su muerte. (me temo que Aristóteles hablaba de “hombres”, ciudadanos con derechos, y no de “seres humanos”; mujeres abstenerse, era el Borat de los filósofos ;-).
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Bunny is a wireless. meshing, darknet that uses 802.11 to hide its communications
Algunos vínculos interesantes que voy coleccionando en Delicious
MiClase ObjetoA = new MiClase();
MiClase ObjetoA = MiClase()::getInstance();
class MiClase
{
private:
MiClase(void);
static MiClase* unica_instancia;
public:
~MiClase(void);
static MiClase *getInstance()
{
if(unica_instancia == NULL)
unica_instancia = new MiClase();
return unica_instancia;
}
};
#include "MiClase.h"
MiClase* MiClase::unica_instancia = NULL;
MiClase::MiClase(void)
{
}
MiClase::~MiClase(void)
{
}
En mis charlas de TDD (Test-Driven Development) comento algunas características de lo que tendría que ser un proyecto bien terminado. Algo ya comenté en TDD y Diseño de Implementación (1). Hoy quiero escribir (es decir, pasar en limpio, compartir, explicar un tema para ver si lo entiendo) sobre un tema más amplio: lo que considero un buen proyecto. Pensé inicialmente que bastaría un solo post, pero nones: éste va a ser el primero, y luego seguiré escribiendo.
Pongo algo de contexto. Voy a escribir sobre un proyecto:
- Profesional
- Con desarrollo ágil en equipo, con iteractiones, backlog, etc..
- Cliente externo, con un representante
- Para ejecutar en producción
Es decir, no necesariamente tiene que ser de código abierto (en mi caso en general no es), no es algo que armamos en nuestro tiempo libre (no, es un proyecto de nuestro trabajo de desarrollo de software), no es una demo, va a estar en producción y tendrá un ciclo de vida (no necesariamente apoyado por nosotros: el proyecto tiene una terminación y una entrega final). Igual admito que es difícil abarcar todos los proyectos profesionales. Pero creo que con lo que voy a describir varios proyectos serán incluidos en esta exposición.
Entonces, en este marco, ¿cuáles son las características que tendría que tener un proyecto terminado para que digamos: “es un buen proyecto”? En el sentido de sentir y pensar que lo que entregamos es bueno. Claro, depende de bueno ¿para quién? Como estamos en un proyecto profesional, lo principal es que sea bueno para el cliente (empresa) que nos contrata. Puede ser bueno para nosotros (“uy, aprendí un montón de MVC”), para el equipo (“nos integramos y conocimos”), para nuestra consultora (“uy, con lo que ganamos podemos comprar nuevas oficinas”, o “ahora podemos ser conocidos por haber trabajado en este gran proyecto”), para el mundo (“ahora hay un nuevo framework que todos podrían usar para ser más productivos, etc… “). Pero lo que importa es:
TIENE QUE SER BUENO PARA EL CLIENTE
Vean que más arriba escribí “cliente (empresa)”. Es decir, tiene que ser bueno para la empresa o sector de la empresa que nos contrata. No hay que medir (en principio) que sea “bueno para Charles”, por ser Charles nuestro contacto principal en la empresa. A no ser que sea Charles el que pague la factura, no es el “cliente”. Es un representante del cliente.
Para ponerlo en claro: no es QUE NO IMPORTA absolutamente que nosotros encontremos que el proyecto haya sido bueno para Charles, para el equipo, o para nosotros mismos. No, estoy tratando de encontrar cuál es lo MAS importante.
Pues bien, después de haber participado en este siglo en varios proyectos ágiles, y también viendo el resultado de otros varios más proyectos, con casos de éxitos y fracasos, lo mejor que puedo decir es:
Un proyecto es un buen proyecto terminado y entregado, SI SOLUCIONA EL PROBLEMA DEL CLIENTE
No nos piden simplemente “necesitamos el sistema X”, sino, “necesitamos el sistema X que solucione el problema P”. Otras veces, nos dan más libertad “necesitamos una solución S que solucione el problema P”, pero es menos frecuente el caso. Pero muchas veces (la mayoría de ellas) nos piden “necesitamos el sistema X” sin poner muy en claro el problema que tiene que solucionar.
Para poner un ejemplo. Supongamos que nos piden “Necesitamos un Sistema de Producción”. Puede ser que el contexto del cliente sea:
“Somos una empresa productora familiar, que en los últimos años, con la entrada de la tercera generación en la gerencia, ha podido expandir el mercado en el exterior”
Entonces, puede el problema a solucionar puede ser uno de éstos, entre tantos:
1 - “Se nos ha ido de las manos la producción, necesitamos un sistema que nos permita manejar mejor la asignación de las máquinas. Hoy las desaprovechamos”
2 - “Las máquinas las asignamos bien, pero tenemos problemas en el seguimiento de los insumos que necesitamos y cuándo los necesitamos. No queremos tener stock de esos insumos en estos tiempos de cambio”
3 - “Nuestros principales clientes del exterior nos piden trazabilidad norma (y aquí viene una sigla desconocida para nosotros) de acá a fin de año, sino perdemos nuestro principal contrato con China”
4 – etc
Vean que entendiendo el problema podemos poner distinto énfasis en lo que vamos a construir, y con el representante del cliente, podemos tener más en claro qué es lo que aporta más valor al cliente. En el caso 1, tendremos que poner mayor esfuerzo en un plan de asignación de máquinas, y no tanto en el stock de insumos. En el caso 2, es al contrario. Y en el caso 3, tendremos que estudiar qué es eso que piden de trazabilidad.
Pero vean a lo que voy: podemos entregar el mejor sistema de producción, que asigne con algoritmos de inteligencia artificial las máquinas de la mejor forma posible, escrito con todos los patrones encima, con la mejor UI para desktop, web, tablet, y hasta TV, pero no es la solución del problema del cliente, si estamos en el caso 3.
ESO ES LO QUE HAY QUE ENTENDER PRIMERO.
A ver, de nuevo:
EL ENTREGABLE DEL PROYECTO DEBE SOLUCIONAR EL PROBLEMA DEL CLIENTE
Y acá entra la capacidad del representante del cliente para ponernos más en claro cuál es el problema real.
No quisiera terminar el post, sin comentar algo. Hay diferencia entre problema y solución. Como escribía arriba, muchas veces nos piden el sistema. Pero tenemos que esforzarnos, como profesionales, para ver si el sistema inicial pedido soluciona o no el problema, o si es el mejor camino para solucionar el problema. En general, eso ya se definió antes de llegar el proyecto a nuestro equipo. Pero igual deberíamos tenerlo en cuenta. Tal vez, en vez de hacer sistema S, podemos hacer sistema S’ que tenga algunas características sugeridas por nosotros que mejoren alcanzar la solución del problema.
Siempre recuerdo a Henry Ford, diciendo: “Si le hubiera preguntado a mis potenciales clientes qué querian, me hubieran pedido ‘caballos más rápidos’”.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Se brindarán los siguientes entrenamientos y certificaciones en San Pedro Sula, Honduras:
Ubiquiti UAC AirMAX: 10 y 11 de Junio
MTCNA: 3 al 6 de Junio
MTCTCE: 6 y 7 de Junio
La entrada Entrenamientos en Junio: Honduras aparece primero en Un Sanjuanino en Rio Cuarto.
Hace un par de meses que me pase al mundo MAC, y debo admitir que la transición de Linux a MacOS ha sido mas simple de lo que esperaba, ya que la mayorías de las aplicaciones que uso son de código libre y las puedo utilizar en cualquier plataforma.
En relación a la administración de redes, el otro día tuve la necesidad de saber cuantos dispositivos conectados habían en un LAN, podría haber utilizado un escaneador de IP como Nmap, pero googleando encontré una solución mucho mas fácil y sin necesidad de instalar nada.
Si hacemos ping a la ip de broadcast y luego visualizamos los ARP podremos conocer los host disponibles en la LAN.
EJ: Teniendo el IP 192.168.10.4/24, el comando quedaría:
ping 192.168.10.255
Luego hacemos un:
arp -a
El resultado sería algo así:
internet.local.com (192.168.10.1) at 0:c:cc:cc:fa:7d on en0 ifscope [ethernet]
? (192.168.10.12) at 0:b:fa:aa:aa:dc on en0 ifscope [ethernet]
? (192.168.10.13) at 0:b:fa:aa:aa:dd on en0 ifscope [ethernet]
Excelente Tip. Vía: superuser
La entrada Conociendo los hosts conectados en una red local aparece primero en Un Sanjuanino en Rio Cuarto.
Algunos vínculos interesantes que voy coleccionando en Delicious
Como ya había anunciado, ayer dí una charla de introducción a Ruby, pueden ver y descargar la presentación en mi Skydrive.
En la presentación hay tres slides todavía en blanco, y slides al final de temas que quedaron expresamente afuera. Pero lean más abajo donde está toda la presentación explicada en detalle, y los ejemplos que usamos.
Para la instalación de Ruby, comenté:
http://www.ruby-lang.org/en/downloads/
En Windows http://rubyinstaller.org/
Dev Kit https://github.com/oneclick/rubyinstaller/wiki/Development-Kit
Mingw, Minimalist GNU for Windows
http://www.mingw.org/
Estuvimos viendo temas de Ruby como lenguaje dinámico e interpretado, sintaxis básica, todo es un objeto, todo es un valor, módulos (comentando al pasar include, faltó extend), evaluación dinámica, su relación con Smalltalk, clases abiertas, ejemplo de Domain-Specific Language, y levantamos un sitio con tres páginas simples, con Sinatra y ERB.
Algunos temas más:
Mencioné que Sinatra usa WeBrick http://www.ruby-doc.org/stdlib-2.0/libdoc/webrick/rdoc/WEBrick.html incorporado desde hace un tiempo directamente en Ruby.
Mencioné Rack http://rack.github.io/ que habría que estudiar alguna vez para entender la infraestructura web de Sinatra y Ruby On Rails (no es necesario pero es intersante). Rack se inspira en trabajos anteriores, principalmente en Python ver http://en.wikipedia.org/wiki/Web_Server_Gateway_Interface
Los ejemplos (tres páginas en Sinatra, y un DSL), quedaron en:
https://github.com/ajlopez/AprendiendoRuby/tree/master/ejemplos
El ejemplo de DSL fue una simple traducción a español del ejemplo de http://jroller.com/rolsen/entry/building_a_dsl_in_ruby
Si les interesa el tema DSL, estoy publicado enlaces en mi otro blog: http://ajlopez.wordpress.com/category/domain-specific-languages/
Y finalmente, la presentación me sirvió para ir escribiendo las primeras páginas de mi tutorial de Ruby en línea:
https://github.com/ajlopez/AprendiendoRuby#aprendiendo-ruby
Lo voy a ir completando con más capítulos, detalle, referencias, fuentes consultadas, ejercicios. También tengo que poner en línea lo que armé alguna vez en PHP: sitio con exámenes por preguntas y respuestas. Tengo también material (si recuerdan este blog, publicado hace ya un tiempo) de PHP y Java para poner en páginas GitHub. Algo más demandante sería escribir sobre Node.js, pero es candidato. Y sobre Clojure. Como mencioné en otro post, al explicar terminamos entendiendo ;-)
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
sudo gedit /etc/X11/xorg.confSe nos abrira un editor de texto y colocamos lo siguiente:
# xorg.conf (X.Org X Window System server configuration file)
#
# This file was generated by dexconf, the Debian X Configuration tool, using
# values from the debconf database.
#
# Edit this file with caution, and see the xorg.conf manual page.
# (Type "man xorg.conf" at the shell prompt.)
#
# This file is automatically updated on xserver-xorg package upgrades *only*
# if it has not been modified since the last upgrade of the xserver-xorg
# package.
#
# Note that some configuration settings that could be done previously
# in this file, now are automatically configured by the server and settings
# here are ignored.
#
# If you have edited this file but would like it to be automatically updated
# again, run the following command:
# sudo dpkg-reconfigure -phigh xserver-xorg
Section "Device"
Identifier "Configured Video Device"
EndSection
Section "Monitor"
Identifier "Configured Monitor"
Vendorname "Generic LCD Display"
modelname "LCD Panel 1024x768"
Horizsync 31.5-64.0
Vertrefresh 56.0 - 65.0
modeline "1024x768_60.00" 63.50 1024 1072 1176 1328 768 771 775 798 -hsync +vsync
Gamma 1.0
# modeline "640x480@60" 25.2 640 656 752 800 480 490 492 525 -vsync -hsync
# modeline "800x600@56" 36.0 800 824 896 1024 600 601 603 625 +hsync +vsync
# modeline "800x600@60" 40.0 800 840 968 1056 600 601 605 628 +hsync +vsync
# modeline "1024x768_60.00" 63.50 1024 1072 1176 1328 768 771 775 798 -hsync +vsync
# modeline "1280x800_60.00" 40.0 800 840 968 1056 600 601 605 628 +hsync +vsync
EndSection
Section "Screen"
Identifier "Default Screen"
Monitor "Configured Monitor"
Device "Configured Video Device"
EndSection
Algunos vínculos interesantes que voy coleccionando en Delicious
En la implementación del lenguaje Mass, tengo una enumeración y una clase:
Un Token representa una palabra del código a procesar. El encargado de separar el código en palabras es el Lexer. Y con el Parser se transforma esa corriente de Tokens en expresiones y comandos:
El constructor de Lexer recibe un string:
public Lexer(string text) { this.text = text; }
Y ese string es procesado para separarlo en tokens. Vean que el Lexer distingue entre operadores (como +) y separadores (como los paréntesis). También toma en cuenta al fin de línea como token (en otros lenguajes, como C, un fin de línea se puede tomar como un espacio en blanco en muchas situaciones). El principal método de Lexer es NextToken, que devuelve el próximo Token del texto. En algunas pocas situaciones, se hace necesario devolver el Token consumido, y para eso está PushToken y varianes.
El Parser interamente maneja un Lexer. Le podemos pedir el próximo comando con ParseCommand, y la próxima expresión con ParseExpression. Cuando el texto en proceso se acaba, esos métodos devuelven null.
Voy a modificar el Lexer para consumir un stream de texto, para poder procesar, por ejemplo, entrada de consola
Tengo que seguir pensando si internamente, unifico comandos y expresiones, como pasa en Ruby, donde cada “comando” tiene un valor (en Mass también es así), y no solamente eso, sino que puede ser usado como expresión en el contexto de un comando.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Algunos vínculos interesantes que voy coleccionando en Delicious
Gracias a la gente del Microsoft User Group de Argentina, el próximo lunes daré una charla sobre
Introducción a Ruby para Programadores .NET (o para programadores)
http://www.mug.org.ar/Eventos/3893.aspx
(vean de visitar la página porque hay que inscribirse)
El evento es gratuito, y es el lunes 13 de Mayo, desde las 18:30 hasta las 20:30. La idea es explicar algo de Ruby, introductorio, para programadores (sean de .NET o de otros lenguajes/tecnologías) que no sepan Ruby.
Los temas a visitar:
- Sintaxis básica
- Valores básicos: números, string, arreglos, hashes
- Comandos if, for, ciclos
- Clases y objetos
- Herencia
-
Creación de objetos
- Variables de instancia y de clase
- Módulos
-
Elementos de metaprogramación
- Definiendo DSL (Domain Specific Languages)
internos en Ruby
- Gemas (paquetes de Ruby)
- Ecosistema de desarrollo
- Desarrollo Web, especialmente Sinatra, que usa Rack
Espero poder explicar en dos horas cuál es el panorama de desarrollo Ruby, para cualquier programador interesado en comenzar con este lenguaje.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Algunos vínculos interesantes que voy coleccionando en Delicious
Hace un par de semana comente la posibilidad en Estados Unidos de probar o ser parte del proyecto Google Glass.
Hoy me encuentro que está disponible el Kernel (código fuente GPL) de Google Glass.

Excelente noticias para quienes les guste la fantasia
La entrada Kernel de Google Glass disponible aparece primero en Un Sanjuanino en Rio Cuarto.
Acabo de encontrar algo que me ha llamado la atención y hasta me ha agradado mucho. Haciendo unas conversiones de divisas en XE.com, me encontré que tienen a las Islas Malvinas como Argentina.
En la siguiente captura se puede apreciar que al intentar colocar Pesos Argentinos, me daba como opción a las Islas Malvinas.
Esto es bueno porque no la toman como Islas Falklands como las llaman los británicos y si por el nombre que les llamamos el resto del mundo, Islas Malvinas.
Internamente me da mucha bronca que en los tiempos que estamos viviendo y los maduras que están las sociedades, aún hayan este tipo de colonialismo, acto de pirateria y demás en un territorio. Discusión que será a lo mejor tratada en otro post.
Tan solo quería notar el llamado de Islas Malvinas como soberanía Argentina.
La entrada Las Malvinas son Argentina… aparece primero en Un Sanjuanino en Rio Cuarto.


# nano /etc/apt/sources.list
deb http://http.kali.org/kali kali main contrib non-free
deb http://security.kali.org/kali-security kali/updates main contrib non-free

# apt-get update && apt-get upgrade && apt-get dist-upgrade



Hola amigos.
Tal como lo habíamos anunciado en la Segunda parte, vamos a dar un caso de uso real,
en esta ocasión dedicado para el señor Nemox de Micromax Computación R.L. (Barinas – Venezuela) El nos pidio hacer algo especifico: Poder controlar la lista de “Hotspot > IP-Bindings” desde su celular; y para comprobar que con el API se puede hacer prácticamente todo, tome su caso como un desafió.
A la izquierda esta visto desde el Iphone de Nemox. Y a la derecha desde el google chrome.
Muestra la lista de Hotspot – Ip Bindings y permite eliminar, habilitar y deshabilitar un cliente. El boton “agregar” no esta programado, pero dejo el código abierto para que cualquiera pueda editarlo y agregar o quitar funcionaliedades.
Esta armado el esqueleto del sitio en HTML5 y CSS3, los eventos y funcionalidades estan hechos con JQuery y el manejo del API con PHP5.
Vamos por partes:
El codigo de los 4 botones, Agregar, Eliminar, Habilitar, Deshabilitar, esta en el archivo index.html; si lo abrimos y vamos hacia el final, mas precisamente en la linea 110 veremos el codigo de cada boton. Pueden notar que cada boton tiene un codigo muy parecido. Lo que hace es, si esta seleccionado algun cliente (binding), toma su ID de un campo oculto (hidden field) para luego enviarlo como parametro al PHP que ejecuta la accion dentro del routerOS.
En la linea 119 vemos como ejemplo la ruta api/hotspot_general.php?ac=enable&id=numero que tiene 2 parametros: “ac” (accion) que en nuestro caso son las de los botones e “id” que es el codigo que identifica al IP Binding seleccionado con 1 click.
api/hotspot_general.php
Este es el archivo que se comunica con tu RouterOS por medio del API, tienes que editar las primeras lineas con los datos de tu servidor: Revisen los otros archivos de la carpeta “api”.
$ipRouteros=”192.168.33.200″;
$Username=”usuario”;
$Pass=”contraseña”;
$api_puerto=8727;
A partir de la linea 30 comenzamos a ver los casos para el parametro “ac” y depende el parametro que le pasemos es lo que ira a ejecutar. Creo que esta muy facil de entender. Para el boton “Agregar” debemos añadir un nuevo “case” con el parametro correspondiente.
El codigo que ejecuta la accion en el Mikrotik es este:
case “enable”:
$API->write(“/ip/hotspot/ip-binding/enable“,false);
$API->write(“=.id=”.$id,true);
$READ = $API->read(false);
$API->parse_response($READ);
break;
Es muy facil de entender:
Hay comandos que nos solicitan datos. Antes de ejecutar el codigo con PHP lo probamos en la consola. Escribimos /ip hotspot ip-binding print y vamos a saber quien esta desabilitado y su codigo ID.
Tomemos cualquier nro para testear y probemos: /ip hotspot ip-binding enable.(enter) y nos va a pedir el ID, en nuestro ejemplo de prueba ponemos el 7 que esta deshabilitado.
Bien, aqui tenemos estas 2 lineas:
$API->write(“/ip/hotspot/ip-binding/enable”,false);
$API->write(“=.id=”.$id,true);
El flag false o true se refiere a que si este comando requiere de un dato, id, etc todavia no ejecuta el comando hasta no tener todo lo que necesita. Como vemos en la segunda linea el flag es true ya que el comando esta completo y lo manda a ejecutar.
Las siguientes 2 lineas…
$READ = $API->read(false);
$API->parse_response($READ);
son la respuesta de lo que ejecutamos, que en nuestro codigo no la estamos mostrando. Si el numero de ID no existiera, nos devolvería un error de “no such item”. O si el comando ejecutado nos traeria una lista deberiamos recorrer el array $READ con un for para mostrar lo que se nos antoje.
Hay cosas que no las estoy explicando porque estan muy bien comentadas. Si no se entiende algo por favor pregunten.
Acá va el código abierto del ejemplo: mikrotik-test
Enjoy the saturday!
_______________________________________
Primero en tech-nico.com Autor Nicolas Daitsch
Estaremos brindando una excelente jornada de especialización Wireless tanto de MikroTik RouterOS como Ubiquti en Rosario a mediados de Mayo.
MTCWE: 13 y 14 de Mayo – Ubiquiti AirMAX 15 y 16 de Mayo.
Mas información en www.AcademiaDeEntrenamientos.com
La entrada Especialización Wireless en Rosario, Argentina aparece primero en Un Sanjuanino en Rio Cuarto.
Continúo con el tutorial práctico de Emacs, hoy aprendí las teclas básicas para mover el cursos através del texto, les dejo un pequeño resúmen:
C-f Move forward a character C-b Move backward a character M-f Move forward a word M-b Move backward a word C-n Move to next line C-p Move to previous line C-a Move to beginning of line C-e Move to end of line M-a Move back to beginning of sentence M-e Move forward to end of sentence
Ahora a practicar!
Hoy empecé a hacer el tutorial de emacs (estoy usando emacs24) que viene “de fábrica”, Learn by doing.
Aprendí cosas básicas que no sabía (muy mal lo mío), por ejemplo, como moverme en la pantalla:
C-v moverme hacia adelante un pantalla M-v moverme hacia atrás una pantalla
Y algo que me gustó mucho es esto, apretando
C-l
hacemos que la pantalla se redibuje y deje en el centro
el texto que tenemos dónde está el cursor, genial!
Otra cositas para moverme por el texto:
Previous line, C-p : : Backward, C-b .... Current cursor position .... Forward, C-f : : Next line, C-n
Estas combinaciones de teclas no son caprichosas y uno de los objetivos que
tiene es que mantengamos las manos en la posición standard.
Para arrancar el tutorial presionar las teclas C-h t dentro del editor emacs.

Cuando borramos datos en nuestro disco (ya sea intencional o accidentalmente), lo que estamos haciendo en realidad es marcar los sectores que antes ocupaban como espacios libres. Es por eso que si nos damos cuenta a tiempo que esta acción no era adrede, es posible recuperar parte de los archivos eliminados con la ayuda de alguna herramienta de análisis forense como por ejemplo, Autopsy Forensic Browser. Claro que para que este tipo de herramientas sea funcional, no deberíamos seguir escribiendo en la unidad a recuperar para evitar pisar el espacio libre con nuevos archivos. Es por eso que lo primero que debemos hacer es crear una imagen del disco y trabajar sobre dicha imagen.
Entonces antes que nada lo que debemos hacer es crear la imagen de disco, para lo cual no existe mejor herramienta que el comando dd de linux.
$ dd if=/dev/sdd of=/media/hd/imagen_a_recuperar.dd |
Si no contamos aún con Autopsy, procedemos a su instalación descargando la aplicación desde el sitio web o desde los repositorios propios de cada distribución y luego ejecutando la misma desde la linea de comandos y accediendo desde un browser vía http://localhost:9999/autopsy .
$ sudo aptitude install autopsy $ autopsy ============================================================================ Autopsy Forensic Browser http://www.sleuthkit.org/autopsy/ ver 2.24 ============================================================================ Evidence Locker: /var/lib/autopsy Start Time: Thu Apr 4 15:26:19 2013 Remote Host: localhost Local Port: 9999 Open an HTML browser on the remote host and paste this URL in it: http://localhost:9999/autopsy Keep this process running and use <ctrl-c> to exit |
Una vez que accedemos a la interfaz, se debe crear un nuevo caso y agregar la imagen del disco a recuperar. Los siguientes pasos son bastante intuitivos, en donde debemos elegir la unidad a analizar, y luego los archivos que encontramos y los borrados que se puedan recuperar. Toda esta información tiene varias formas de revisión (ascii, hexa) y desde la misma herramienta se pueden generar reportes con la información general, los meta-datos y el contenido de los archivos.
Generación de reportes
Por cada evidencia encontrada Autopsy genera un completo reporte sobre el estado, atributos, características y contenido de dicha evidencia. Estos reportes son de gran ayuda en el momento del análisis de la evidencia y como elemento probatorio, en caso de que exista un proceso legal llevado a juicio. El reporte permite visualizar el estado de MD5 y SHDA1, con el fin de comprobar que la evidencia examinada desde una copia no ha sido modificada o alterada con respecto a la evidencia que reside originalmente.
Escuchando los gritos del disco!
Generalmente antes de perdidas de datos por falla en el disco, este nos avisa pero hay que estar atentos y saber escuchar. Para identificar estos avisos podemos utilizar SmartMonTools, quien nos señalará los errores de I/O de la unidad.
Al igual que Autopsy, SmartMonTools se encuentra en los repositorios de casi todas las distribuciones de GNU/Linux, sino se puede instalar descargando desde la página web oficial.
$ sudo aptitude install smartmontool |
Descomentamos y editamos las siguientes lineas del archivo de configuración /etc/default/smartmontools:
enable_smart="/dev/sda /dev/sdb" start_smartd=yes |
e iniciamos el servicio:
$ sudo /etc/init.d/smartmontool start |
Para verificar que funciona correctamente usaremos el siguiente comando
$ sudo smartctl -i /dev/sda smartctl 5.41 2011-06-09 r3365 [x86_64-linux-3.0.0-32-generic] (local build) Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net === START OF INFORMATION SECTION === Model Family: Western Digital Caviar SE16 Serial ATA Device Model: WDC WD2500KS-00MJB0 Serial Number: WD-WCANKK622193 Firmware Version: 02.01C03 User Capacity: 250.059.350.016 bytes [250 GB] Sector Size: 512 bytes logical/physical Device is: In smartctl database [for details use: -P show] ATA Version is: 7 ATA Standard is: Exact ATA specification draft version not indicated Local Time is: Thu Apr 4 17:13:40 2013 ART SMART support is: Available - device has SMART capability. SMART support is: Enabled |
Para proceder al test de un disco duro de los listados anteriormente, ejecutamos
$ sudo smartctl -d scsi -H /dev/sda |
Y si todo va bien, en ese disco duro deberíamos obtener un mensaje parecido a éste:
smartctl 5.41 2011-06-09 r3365 [x86_64-linux-3.0.0-32-generic] (local build) Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net SMART Health Status: OK |
Hace un tiempo atrás tuve que renombrar un conjunto de archivos, como soy vago, no quería hacerlos a mano uno por uno, así que buscando un poquito
me encontré con este hermoso script en perl: rename, que en realidad es un symlink a /usr/bin/prename. Rename sirve para renombrar un conjunto de archivos
utilizando un regex, por ejemplo para eliminar la extensión .bak de todos los archivos:
rename 's/\.bak$//' *.bak
o para cambiar todas la letras mayúsculas por minúsculas:
rename 'y/A-Z/a-z/' *
como pueden ver las limitaciones están en la imaginación y el conocimiento de regex de cada uno.
Este fué el primer tip Linux/Bash, dicho sea esto, me comprometo a escribir uno por semana.
Los ejemplos de este artículo fueron extraídos/copiados del manual de rename (man rename).
En la primera parte, explicamos cual podría ser su uso y para que sirve.
Ahora vamos a explicar como se configura el API en pocos pasos, con un poco de PHP y usando las clases creadas por Denis Basta. (version 1.3 o 1.4), con apenas un minimo cambio hecho para que la clase “connect” permita pasar ademas el numero de puerto del RouterOS como parametro.
Yo estoy familiarizado con programar en PHP pero para el que no, pueden hacerlo con el lenguaje que desee. En la Wiki de Mikrotik podran encontrar ejemplos para:
Paso 1: Configura tu RouterOS
a) Habilitar el servicio API.
desde IP > Services. Seleccionas la fila que dice “api” y la habilitas, luego doble click sobre ella para editar. Puedes asignarle el puerto que quieras, pero por defecto usa el 8728 tcp. Si te gusta tener todo ecualizado podrías agregarlo en los mangles para darle QoS. Finalmente donde dice “Avaliable From” es la direccion IP desde donde estara el API corriendo. En nuestro caso, como usaremos PHP puede ser el servidor Apache. (sigue los pasos de la imagen).

b) Crear un grupo
Para darle seguridad necesitamos crear un usuario y un grupo nuevo dentro del RouterOS donde queremos ordenar nuestras tareas diarias. Para ello vamos a “System > Users > Groups” y presionamos en el icono “+”. En esta ventana simplemente escribimos el nombre del grupo, (para este ejemplo yo le puse “tugrupoapi”) y elegi las politicas “read, write, api”. Damos click en OK

c) Crear un usuario
Luego de crear el Grupo, nos movemos a la pestaña Users como esta en la imagen a continuacion. Presionamos el icono “+” para crear un usuario nuevo.
Name: aqui escribiremos nuestro nuevo nombre de usuario: Ejemplo blog.tech-nico.com, (puedes crear el tuyo).
Group: elegimos el grupo “tugrupoapi” (ver el punto “b”),
Address allowed: Es la IP que tiene permitido acceder a nuestro RouterOS a través del API. “El apache server en nuestro caso”,
Password: tipeamos nuestro password, asegurate que sea fuerte.
Finalmente click en el boton “OK”.
Paso 2: Crear un script para testear el acceso: conectar_test_api.php
<?php require_once(‘api_mt_include2.php’); ?>
<?php
$ipRouteros=”200.20.30.40″; // tu RouterOS.
$Username=”blog.tech-nico.com”;
$Pass=”tupassword”;
$api_puerto=8728;$API = new routeros_api();
$API->debug = false;
if ($API->connect($ipRouteros , $Username , $Pass, $api_puerto)) {
$API->write(“/system/ident/getall”,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
$name = $ARRAY[0]["name"];
if(count($ARRAY)>0){ // si esta conectado
$API->write(“/system/licen/getall”,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
$nlevel = $ARRAY[0]["nlevel"];
$API->write(“/system/reso/getall”,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
$cpu = $ARRAY[0]["cpu"];
$cpu_frequency = $ARRAY[0]["cpu-frequency"];
$arquitectura = $ARRAY[0]["board-name"];
$API->write(“/system/pack/getall”,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
$version = $ARRAY[0]["version"];echo ‘<img src=”icon_led_green.png” /> ’;
echo “<strong>”.$name.”(” .$arquitectura. “)</strong> ”;
echo “v:” . $version. “ ”;
echo “level:” . $nlevel . “ ”;
echo $cpu.”(“.$cpu_frequency.” Mhz.)”;
}else{ //el usuario esta of line
echo ‘<img src=”icon_led_grey.png” /> ’.$ARRAY['!trap'][0]['message'];
}}else{
echo “<font color=’#ff0000′>La conexion ha fallado. Verifique si el Api esta activo.</font>”;
}
$API->disconnect();
?>
Paso 3: Editamos las lineas que dicen:
$ipRouteros=”200.20.30.40″; // tu RouterOS.
$Username=”blog.tech-nico.com”;
$Pass=”tupassword”
$api_puerto=8728;
Paso 4: Finalmente subimos por FTP los archivos a nuestro servidor Web y ejecutamos en el navegador el archivo conectar_test_api.php;

Si todo salio bien, vamos a ver una pantalla parecida a la de arriba. Lo que hicimos fue loguearnos mediante el API a nuestro servidor, y luego traer el nombre “Identity”, la plataforma, la version del ROS, que licencia tiene instalada, etc.
Descarga aqui todos los archivos de este ejemplo.
Como veran, este seria el primer paso para comenzar a programar tus scripts. Ya teniendo esto funcionando vamos a poder realizar varios ejemplos que voy ir posteando en mi tiempo libre.
Cualquier cosa comenten que les respondo enseguida.
_______________
Nicolas tech-nico.com/blog
Hace poco adquirí una laptop Sony Vaio S series ultrabook con teclado US, y por unos días estuve escribiendo sin acentos, obviamente esta no era una forma correcta de escribir, así que después de un poco de investigación encontré la forma de configurar el teclado correctamente, así:
Editar el archivo /etc/default/keyboard
XKBMODEL="pc105" XKBLAYOUT="us" XKBVARIANT="intl" XKBOPTIONS="lv3:ralt_switch,terminate:ctrl_alt_bksp" BACKSPACE="guess"
básicamente lo que tengo es un teclado pc105, pero el detalle
a tener en cuenta es en XKBOPTIONS la opción “lv3:ralt_switch”
que hace que cuando apretamos la tecla alt derecho, las funciones de algunas teclas cambien, entonces para escribir una a acentuada, lo que tenemos que hacer es apretar “alt-der” + “‘” y luego la “a”.
Así que ahora podemos disfrutar de los acentos, y para escribir una “ñ” tenemos que apretar: “alt-der” + “shift” + “~” y luego la “n”.
Ultima Actualización:
May 25, 2013
Botón para Enlazarnos:
Sitio mantenido por
netFlux

Este trabajo es distribuido bajo una Licencia Creative Commons Atribución-NoComercial 2.5 Argentina.
Construido con Eco v0.1