Android como SO de desarrollo

Android es hoy por hoy el SO con crecimiento mas rápido en el mercado.  Todos los días se despliegan miles de veces esta tecnología para hacer funcionar celulares, tablets y otros bichos portátiles.

Recientemente me compre una Asus Transformer; que es una tablet “convertible en netbook”.  La realidad es que es un dispositivo muy cómodo, ligero y con una autonomía que llega a las 16 hs. En un principio me dispuse a instalarle un linux para utilizarla como dispositivo ultra portátil de desarrollo pero desistí por un poco de fiaca y por los motivos que acompañan a este post.

image

Android, se programa en java. Yo programo en java… y en python, php, lisp, xstl y javascript; pero bueno… prefiero python. Así que con esto en mente me instale el “Scripting Layer 4 Android” y sus componentes python me compre una aplicación genial que se llama “DroidEdit” por 4 pesos argentinos… y me puse manos a la obra.

image

Pero: todo esto no es mas que un “parche” a lo que necesito. Python no es full python… no tengo Django ni Numpy ni NADA… no tengo Qt cómodo, el editor no corre el script de una manera sencilla… bueno “es incomodo”

Pense en alternativas como entrar a un server y usar allí vim o emacs; pero siguen siendo parches (a parches)

Por que escribo esto? como descargo… todo lo demás de android es GENIAL!!!! tenemos excelentes navegadores, reproductores miles de herramientas sociales, muy buenos juegos y mil cosas mas (esto lo escribo desde el wordpress para android).

Así que cuando un Python ENSERIO para android… o al menos podes programar realmente cómodo android en android seria genial (la potencia de computo de los dispositivos se la bancan)

A la comunidad: les avise, pronto android estará en todos lados incluso mas que linux y windows.

Y digo yo Android for servers para cuando? windows parecia una utopia en su momento.

Moví el repo de las PET

Por motivos de re-orden moví el repo de las revistas de PyAr pubicadas acá: https://bitbucket.org/leliel12/pet/

Licor de vainilla

Hacia rato que no publicaba una entrada sobre alguna receta; y como tenia que hacer un regalo a una amiga (por nada especial, sino por una promesa) me digno a compartir una receta de manufactura propia.

Ingredientes:

  • 1 chaucha de vainilla (se consigue en dietéticas  por mas o menos 15 pesos argentinos)
  • Alcohol etílico (del que se puede tomar).
  • Ginebra.
  • Azúcar.
  • Agua.
  • 1 botella bonita (en mi caso elegí una de Wisky HiramWalker que es baratisimo)
  • 1 cacho de esencia de vainilla para ir catando.
  • 1 vela.

Preparación:

  • Preparar almimbar hirviendo agua con azúcar a gusto (tan dulce como prefieran) agregando al final unas gotas de esencia de vainilla.
  • Poner en la botella limpia la chaucha de vainilla.
  • Agregarle 20% del total de la botella en alcohol.
  • Agregar 20% del total de la botella en ginebra para potenciar los aromas..
  • Agregar hasta completar el almíbar preparado.
  • Dejar enfriar.
  • Una vez frío, prueben que las porporciones estén bien (la esencia de vainilla es esencial para eso ya que la chaucha es muy lenta liberando sabor y aroma)
  • Tapar y derretir la vela en la tapa.
  • Dejar reposar por 1 mes hasta que el color del liquido quede muy similar al wisky.

Terminado

Nota: Cuando la bebida se termine no tiren la chaucha. Córtenla y usen el juguito de adentro para hacer otro licor sin necesidad de comprar una nueva.

Mis promesas para el 2012

  • Terminar mi libro.
  • Adelgazar no menos de 5 Kg.
  • Darle una vuelta de rosca a infopython.
  • Terminar yatel.
  • Terminar pychicata.

dPaste.com “API”

“API” for http://dpaste.com/

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#
# THE WISKEY-WARE LICENSE
# -----------------------
#
# "THE WISKEY-WARE LICENSE":
# <jbc.develop@gmail.com> wrote this file. As long as you retain this notice you
# can do whatever you want with this stuff. If we meet some day, and you think
# this stuff is worth it, you can buy me a wiskey in return JuanBC
#

# ==============================================================================
# DOC
# ==============================================================================

"""A Simple Client for http://dpaste.com/

"""

# ==============================================================================
#
# ==============================================================================

__author__ = "JuanBC"
__mail__ = "jbc.develop@gmail.com"
__version__ = "0.1.1"
__license__ = "WISKEY_WARE"
__date__ = "2011/11/14"


# ==============================================================================
# IMPORTS
# ==============================================================================

import os
import urllib
import urllib2


# ==============================================================================
# CONSTANTS
# ==============================================================================

DPASTE_URL = "http://dpaste.com/"

FORMAT_2_EXT = {
    "Python": ["py", "pyw"],
    "PythonConsole": [],
    "Sql": ["sql"],
    "DjangoTemplate": [],
    "JScript": ["js"],
    "Css": ["css"],
    "Xml": ["xml"],
    "Diff": ["diff"],
    "Ruby": ["rb"],
    "Rhtml": ["rhtml"],
    "Haskell": ["hs"],
    "Apache": [],
    "Bash": ["sh"],
    "Plain": ["txt"]
}

EXT_2_FORMAT = {}
for k, vs in FORMAT_2_EXT.items():
    for v in vs:
        EXT_2_FORMAT[v] = k

# ==============================================================================
# FUNCTIONS
# ==============================================================================

def filename2format(filename):
    """Retrieves the format of a given filename

    """
    basename = os.path.basename(filename)
    if "." in basename:
        ext = basename.rsplit(".", 1)[1].lower()
        return EXT_2_FORMAT.get(ext, "Plain")
    return "Plain"


def paste(source, file_format="Plain", title="", poster=""):
    """Paste a given source code into dpaste.com with a given format

    """
    file_format = "" if file_format == "Plain" else file_format
    data = urllib.urlencode({"content": source,
                             "language": file_format,
                             "title": title,
                             "poster": poster})
    conn = urllib2.urlopen(DPASTE_URL, data)
    return conn.geturl()


def copy(dpaste_id):
    """Retrieve a code from a given dpaste id

    """
    return urllib2.urlopen(DPASTE_URL + str(dpaste_id) + "/plain").read()


# ==============================================================================
# MAIN
# ==============================================================================

if __name__ == "__main__":
    print(__doc__)

Pycante 0.2.1c

Actualicé Pycante el proyecto que ayuda a utilizar de manera cómoda los archivos ”.ui” de QtDesigner  los cambios principales son:

  • El proyecto ahora es BEER-WARE… osea es mas libre que antes
  • No esta mas disponible la función ”run”, ahora hay que crear la aplicación desde Qt.
  • Ahora hay una función ”EDir” que recibe por parámetro un path de un directorio y retorna una función ”E” que apunta al mismo (por ejemplo si tenemos todos nuestros archivos “.ui” en /home/tito).
  • La operatoria con files y widgets no cambia con los EDir.

Ejemplos:

import sys

import pycante

from PyQt4 import QtGui

# CONSTANTS
UI = pycante.EDir("path/to/all/my/ui/files/")

# using path "path/to/all/my/ui/files/file.ui"
class Window(UI("file.ui")):

    def on_buttonBox_accepted(self):
        # buttonBox exist inside file.ui
        ...

app = QtGui.QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())

Para instalar:

$ pip install pycante

o

$ easy_install pycante

o bajarlo de aca: https://bitbucket.org/leliel12/pycante/

Disclaimers:

  • Lo hice por una necesidad muy puntual
  • El codigo de “W3″ no lo probe aunque puede usarse asi pycante
  • Como notaran en ni un momento llame a SetupUi()… eso pycante lo hace solo.

Buscaminas Programming Challenges de la UTN-FRC en Python

Resolví 2 problemas basados en el buscaminas en Python para la competencia de programación de la UTN-FRC, aca esta el código y mas abajo esta un link al repo de mercurial para quien desee bajar el código mas la entrada.

Problema Fácil (Enunciado)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# "THE BEER-WARE LICENSE" (Revision 42):
# <jbc.develop@gmail.com> wrote this file. As long as you retain this notice you
# can do whatever you want with this stuff. If we meet some day, and you think
# this stuff is worth it, you can buy me a beer in return Juan BC

#===============================================================================
# DOCS
#===============================================================================

"""Solucion al problema del buscaminas para la competencia de programación de la
UTN-FRC.

Objetivo: Ser legible y servir de instroduccion a python

Problema originalmente propuesto:
    http://www.programming-challenges.com/pg.php?page=downloadproblem&probid=110102&format=html

Nota se simplifico para trabajar solo con matrices cuadradas

"""

#===============================================================================
# META
#===============================================================================

__author__ = "Juan BC"
__license__ = "BeerWare"
__date__ = "2011/10/26"
__version__ = "0.1"
__email__ = "jbc.develop@gmail.com"
__homepage__ = "http://jbcabral.wordpress.com/"
__twitter__ = "@juanbcabral"

#===============================================================================
# FUNCTIONS
#===============================================================================

def read_n_lines(n):
    """Esta funcion lee las siguientes n linea de la entrada y las retorna
    como una lista de listas.

    """
    lines = []
    for _ in range(n):
        line = list(raw_input())
        lines.append(line)
    return lines

def increment(board, row, col):
    """Funcion de soporte para resolve que incrementa en uno todas los vecinoa
    a una mina

    """
    for row_d in (-1, 0, 1):
        for col_d in (-1, 0, 1):
            rowp = row + row_d
            colp = col + col_d
            if rowp < 0 or colp < 0 \
               or rowp >= len(board) or colp >= len(board[rowp]) \
               or board[rowp][colp] == "*":
                continue
            if board[rowp][colp] == ".":
               board[rowp][colp] = 0
            board[rowp][colp] += 1

def resolve(board):
    """Itera sobre cada celda y si encuentra una mina (*) incrementa todos
    sus cacilleros vacios en 1

    """
    for idx_row, row in enumerate(board):
        for idx_col, cell in enumerate(row):
            if cell == "*":
                increment(board, idx_row, idx_col)

def main():
    field = 0;
    while True:

        # leemos el tamaño de nuestro board
        n = int(raw_input())

        # si el tamaño de nuestro board es 0 salimos
        if n == 0:
            break

        # incrementamos el numero de field
        field += 1

        # leemos el tablero
        board = read_n_lines(n)

        # resolvemos el tablero
        resolve(board)

        # armamos la salida
        out = "\n".join(["".join([str(c) for c in row]) for row in board])

        # imprimimos la salida con su decoradores
        # y si queda algun "." lo reemplazamos por un cero
        print "Field #{0}:".format(field)
        print out.replace(".", "0")
        print ""

#===============================================================================
# MAIN
#===============================================================================

if __name__ == "__main__":
    main()

Problema Menos Fácil (Enunciado)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# "THE BEER-WARE LICENSE" (Revision 42):
# <jbc.develop@gmail.com> wrote this file. As long as you retain this notice you
# can do whatever you want with this stuff. If we meet some day, and you think
# this stuff is worth it, you can buy me a beer in return Juan BC

#===============================================================================
# DOCS
#===============================================================================

"""Solucion al problema del buscaminas para la competencia de programación de la
UTN-FRC.

Objetivo: Ser legible y servir de instroduccion a python

Problema originalmente propuesto: http://acm.tju.edu.cn/toj/showp1330.html

"""

#===============================================================================
# META
#===============================================================================

__author__ = "Juan BC"
__license__ = "BeerWare"
__date__ = "2011/10/26"
__version__ = "0.1"
__email__ = "jbc.develop@gmail.com"
__homepage__ = "http://jbcabral.wordpress.com/"
__twitter__ = "@juanbcabral"


#===============================================================================
# FUNCTIONS
#===============================================================================

def read_n_lines(n):
    """Esta funcion lee las siguientes n lineas del file pointer

    """
    lines = []
    for _ in range(n):
        line = list(raw_input())
        lines.append(line)
    return lines

def touch2coordinates(touch):
    """Combierte los "toques" a una lista de coordenadas (fila, columna)
    donde se toco.

    """
    coords = []
    for idx_row, row in enumerate(touch):
        for idx_col, cell in enumerate(row):
            if cell == ".":
                continue
            coords.append((idx_row, idx_col))
    return coords

def coord2mine(row, col, board):
    """Retorna un "*" si el lugar donde indica la cordenada tiene una mina
    en caso contrario retorna cuantas minas rodean a ese lugar.

    """
    # primero nos fijamos en el lugar
    if board[row][col] == "*":
        return "*"
    # sino exploramos
    mines = 0
    for row_d in (-1, 0, 1):
        for col_d in (-1, 0, 1):
            rowp = row + row_d
            colp = col + col_d
            if rowp < 0 or colp < 0 \
               or rowp >= len(board) or colp >= len(board[rowp]):
                continue
            if board[rowp][colp] == "*":
                mines += 1
    return str(mines)

def main():
    """Lee desde un archivo un tablero y toques del buscaminas. Por defecto
    usa la salida estandar.

    """
    # leemos
    n = int(raw_input())
    board = read_n_lines(n)
    touchs = read_n_lines(n)

    # resolvemos
    for row, col in touch2coordinates(touchs):
        symbol = coord2mine(row, col, board)
        touchs[row][col] = symbol

    # convertimos a string para imprimir por pantalla
    print "\n".join(["".join([c for c in row]) for row in touchs])

#===============================================================================
# MAIN
#===============================================================================

if __name__ == "__main__":
    main()

Los archivos en formato archivo

Jugando con archivos FLV

Por cuestiones laborales tuve que jugar con archivos flv asi que dejo por aca dos comandos útiles

Para pegar dos videos
mencoder -of lavf -oac copy -ovc copy -o [salida] [entrada0 entrada1 ..., entradaN]

Para Cortar un cacho de video
ffmpeg -sameq --ss [hh:mm:ss.mmmm] -t [hh:mm:ss.mmmm] -i [input_file] [output_file]

  • ss: desde
  • t: hasta

BeerWare

Sencillamente encontré una licencia que me gusta mas y es mas simple  la “BeerWare“ 

Mis siguientes fuentes van a venir con la siguiente leyenda:

# "THE BEER-WARE LICENSE" (Revision 42):
# <jbc.develop@gmail.com> wrote this file. As long as you retain this notice you
# can do whatever you want with this stuff. If we meet some day, and you think
# this stuff is worth it, you can buy me a beer in return Juan BC

Source de Revista PET

Les comparto este repo con los sourcecodes de la PET #2, #3, #4, #2 en ingles, y #3 en ingles.

En este lugar voy a ir haciendo publicás, a medida que salgan, las revistas.

https://bitbucket.org/leliel12/pet-published

PD: las fuentes de PET 1 sera publicada junto con la PET 4 en inglés

Seguir

Get every new post delivered to your Inbox.

Únete a otros 89 seguidores