Mis promesas para el 2012
2012/01/02 Dejar un comentario
- Terminar mi libro.
- Adelgazar no menos de 5 Kg.
- Darle una vuelta de rosca a infopython.
- Terminar yatel.
- Terminar pychicata.
Hacking, food and wiskey
2012/01/02 Dejar un comentario
2011/11/14 Dejar un comentario
“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__)
2011/11/04 Dejar un comentario

Actualicé Pycante el proyecto que ayuda a utilizar de manera cómoda los archivos ”.ui” de QtDesigner los cambios principales son:
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/
2011/11/03 1 comentario
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.
#!/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()
#!/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()
2011/11/01 2 comentarios
Acabo de terminar mi primer plugin para Ninja-IDE 2.x, el cual consiste en un gestor de snippets.
Como funciona?
Los snippets deben crearse dentro de un lenguaje y una extensión (siendo un caso particular *General*) y poseen variables que se resuelven al momento de ser aplicados (la lista de todas las variables aparece si presionan el botón HELP)2011/10/27 Dejar un comentario
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]
2011/10/11 2 comentarios
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
2011/09/27 Dejar un comentario
Como saben mantengo una propuesta de materia sobre software libre. La actualice llevándola a su versión 1.5 y poniéndola a las fuentes en formato rst en bitbuket.
Version pdf:
2011/09/26 Dejar un comentario
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