Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

La gente cree todo en la Internet

Ho­y, he leí­do que es­te mes de Oc­tu­bre tie­ne 5 vier­nes, 5 sá­ba­dos y 5 do­min­go­s. Es­to só­lo pa­sa ca­da 823 año­s. En el Oc­tu­bre con más fi­nes de se­ma­na de mi vi­da es­toy CAS­TI­GA­DA SIN SALI­R.

No va­le la pe­na li­nkear­lo por­que es­tá en to­dos la­dos

Hay va­ria­cio­nes, por su­pues­to, 5 lu­nes/­mar­tes/­miérco­le­s, dis­tin­tos me­s­es, etc.

¿Pe­ro por­qué lo cree la gen­te? ¡Es ob­vio si lo pen­sás un mi­nu­to que no hay ma­ne­ra de que sea cier­to!

  1. Oc­­tu­­bre tie­­ne una lo­n­­gi­­tud fi­­ja (31 día­s)

  2. Da­­do que la se­­ma­­na son 7 día­s, eso son 4 se­­ma­­nas +3 días en oc­­tu­­bre.

  3. Si oc­­tu­­bre em­­pie­­za un vie­r­­nes, esos 3 días al fi­­nal son vie­r­­nes/­­sá­­ba­­do­­/­­do­­­mi­n­­go.

En­ton­ce­s, pa­ra que es­to fue­ra cier­to, el 1e­ro de oc­tu­bre de­be­ria caer vier­nes só­lo una vez ca­da 823 año­s. Sue­na mu­cho más es­tú­pi­do di­cho así, no?

Real­men­te no en­tien­do co­mo al­guien con me­dio ce­re­bro pue­de caer en es­to, pe­ro he vis­to gen­te a la que le fun­cio­na el bo­cho re­pe­tir­lo. Co­men­ten sus teo­rías por fa­vor :-)

Como ser un nerd en argentina y no morir en el intento

Ser un nerd en Ar­gen­ti­na tie­ne mu­chos pro­ble­ma­s. Uno de ellos es que los pre­cios que nos quie­ren co­brar por ca­si cual­quier chi­che elec­tró­ni­co es ri­dícu­lo.

Otro de los pro­ble­mas es que el 99% de la gen­te no sa­be co­mo ha­cer pa­ra que no les afa­nen de esa ma­ne­ra. Y ojo, no ha­blo de contra­ban­dea­r, ha­blo de usar tus de­re­chos y tus re­cur­sos le­ga­les. Acla­ro: no soy abo­ga­do, si si­guien­do es­tos con­se­jos vas pre­so, es co­sa tu­ya, yo di­go lo que creo que es­tá bien no­má­s.

Así que es­ti­ma­dos lec­to­res, acá es­tá mi guía pa­ra com­prar chi­ches sin te­ner que em­pe­ñar un ri­ñón (que tam­bién es ile­ga­l, ya que es­ta­mo­s).

Lo pri­me­ro que ne­ce­si­tás es pa­cien­cia. Al­gu­nos de los me­ca­nis­mos que te voy a con­tar lle­van uno o dos me­s­es, o re­quie­ren co­la­bo­ra­ción de ter­ce­ro­s. Pe­ro bue­no, so­mos ner­d­s, re­sol­ver pro­ble­mas es lo nues­tro.

Chucherías Chinas

Ten­go un bo­ni­to mi­cros­co­pio de bol­si­llo de 80x que me com­pró mi es­po­sa. Cos­to? $90. Es un ju­gue­te bue­ní­si­mo, re edu­ca­ti­vo, y cuan­do te­nía 6 años hu­bie­ra da­do la fi­gu­ri­ta di­fí­cil (e­ra la ta­rán­tu­la) por uno de es­to­s.

Cos­to en chi­na? U$S 9.39, con en­vío gra­tis

O sea, la mi­ta­d. Y co­mo sa­le me­nos de U$S 25, de he­cho es le­gal traer­lo por co­rreo y no pa­gás ta­sa de adua­na.

De to­das for­ma­s, pro­ba­ble­men­te no ten­gas que ir a la adua­na por­que....

Con­se­jo

Co­sas chi­cas == no pro­blem

Nor­mal­men­te los pa­que­tes de me­nos de me­dio ki­lo ca­si nun­ca se que­dan en la adua­na. Ese don­gle blue­tooth de U$S 1 te va a lle­gar a tu ca­sa.

Pe­ro po­né­le que pa­gás la ta­sa. Con ta­sa y to­do, son U$S 15, o sea $60. Si pa­sás por la adua­na a ve­ces y no te mo­les­ta ha­cer co­la un ra­to (lle­va­te un li­bro­)....

Pe­ro es aún me­jo­r. Por­que en http://­Dea­lEx­tre­me.­com te­nés un mo­de­lo de 150x por U$S 12! De he­cho, te­nés 36 mo­de­los de mi­cros­co­pios!

Con­se­jo

El mun­do es gran­de

Com­prar las co­sas di­rec­ta­men­te sig­ni­fi­ca ele­gir de una va­rie­dad mu­chí­si­mo ma­yor de la que te­nés acá. Su­má­le que en­ci­ma es más ba­ra­to­...

Por ejem­plo, en http://a­li­ba­ba.­com hay al­go así co­mo 35000 ven­de­do­res de ta­ble­ts con An­droi­d. Al­gu­na te va a ser­vir ;-)

Aho­ra bien, su­pon­ga­mos que te de­ci­dis­te y te en­car­gas­te al­go de Chi­na o si­mi­la­r, qué te­nés que sa­be­r:

  • Gua­r­­dá la "fa­c­­tu­­ra" que te dá el si­­tio, y la URL del pro­­­du­c­­to.

    La fa­c­­tu­­ra sue­­le ser un HT­­M­­L, im­­pri­­mí­­lo. Cuan­­do re­­ti­­rás en Adua­­na lo ne­­ce­­si­­tá­s. No lo mues­­tres de en­­tra­­da! Só­­­lo si te lo pi­­den.

  • An­­dá dis­­pues­­to a pa­­ga­­r. Es al cue­­te dis­­cu­­ti­­r. Te­­né en cuen­­ta que aún con lo de la adua­­na es ba­­ra­­to, y no te ha­­gas ma­­la san­­gre.

  • Si vas ti­­po 10:30 sue­­le ha­­ber po­­­ca gen­­te.

  • An­­dá tran­­qui­­lo, lle­­va­­te al­­go pa­­ra en­­tre­­te­­ne­r­­te po­r­­que en una de esas lle­­va un ra­­to. Igual hay si­­lla­s, que se yó, no es la mue­r­­te de na­­die.

Con­se­jo

It's a gi­ft!

Ca­si to­dos es­tos si­tios tie­nen al­gún ser­vi­cio de "gi­ft". Te sacan el pre­cio y to­do lo que ha­ga que pa­rez­ca una com­pra por in­ter­ne­t. Au­men­ta la pro­ba­bi­li­dad de que lle­gue a tu ca­sa di­rec­to.

Cómo Pagar

La más fá­cil es Pa­y­Pa­l. Si te­nés tar­je­ta de cré­di­to es tri­via­l.

Con­se­jo

Ha­blá con ner­ds ami­go­s!

Si no te­nés Pa­y­Pal ni tar­je­ta in­ter­na­cio­na­l, pe­ro co­no­cés al­guien que tra­ba­ja pa­ra el ex­te­rio­r, es muy pro­ba­ble que esa per­so­na ten­ga sal­do en Pa­y­Pal que no pue­de sa­ca­r. En Ar­gen­ti­na, con­ver­tir Pa­y­Pal en di­ne­ro es muy ca­ro. En­ton­ces se pue­de lle­gar a un acuer­do: se lo pa­gás al 95% del va­lor (o lo que arre­glen) tu ami­go tie­ne la pla­ta, vos te­nés des­cuen­to en dea­lex­tre­me o don­de sea.

Tam­bién po­dés ha­cer la com­pra con la tar­je­ta de un ami­go­/­pa­rien­te y pa­gar­le a él en efec­ti­vo.

El amigo que viene de afuera

Sí te­nés un co­no­ci­do que via­ja al ex­te­rior con re­gu­la­ri­da­d:

  • Po­­­dés co­m­­prar en USA y que te re­­ci­­ba y trai­­ga las co­­sas.

  • Ha­s­­ta U$S 300 (si el que via­­ja es ar­­gen­­ti­­no) no se pa­­ga adua­­na. Se pa­­ga el 50% por en­­ci­­ma de esa ci­­fra.

  • Si es un ex­­tran­­je­­ro que trae una co­­­sa pro­­­pia "en uso" y te la ven­­de acá, no creo que ten­­gas que pa­­gar im­­po­r­­ta­­ción (no es­­toy se­­gu­­ro)

Vea­mos un ejem­plo!

  • Una HP mi­­ni co­m­­pra­­da acá: $1999, o U$S 500

  • Co­m­­pra­­da en USA: U$S 329.

    • Pa­­­gan­­­do adua­­­na con fran­­­qui­­­cia: U$S 345

    • Pa­­­gan­­­do adua­­­na fu­­­ll: U$S 495 (ahí no co­­n­­­vie­­­ne ;-)

Con­se­jo

Los pro­duc­tos HP tie­nen ga­ran­tía in­ter­na­cio­nal

Los De­ll por ejem­plo: NO. Así que ojo, com­prá una mar­ca que te dé ser­vi­ce en Ar­gen­ti­na. En el ca­so de De­ll te­nés que com­prar apar­te una ga­ran­tía que te sir­va acá. Vos sa­brás si te ban­cás te­ner una no­te­book sin ga­ran­tía (yo sí, si es ba­ra­ta ;-)

Pe­ro que te pa­re­ce­ría te­ner la mis­ma ne­tbook por U$S 180?

Bue­no, re­sul­ta que HP (y to­das las em­pre­sas) ven­den pro­duc­tos "re­fur­bis­he­d" o sea rea­con­di­cio­na­do­s. Nor­mal­men­te no te vas a dar cuen­ta de na­da, tie­nen un ra­yón mí­ni­mo, o al­go así. Hoy la mis­ma ne­tbook es­ta­ba a U$S 179.90. Nor­mal­men­te sa­len más o me­nos la mi­ta­d. Y vie­nen con ga­ran­tía.

Y fi­já­te que la HP mi­ni por U$S 180, pa­gan­do la adua­na fu­ll... cues­ta el 54% de lo que sa­le la nue­va acá. Eso es ne­go­cio.

Con­se­jo

La en­tre­ga es allá

Nor­mal­men­te las com­pras de re­fur­bis­hed hay que ha­cer­las en USA. Por eso lo de que tie­ne que ir al­guien a re­ci­bir­la.

Al­ter­na­ti­va­men­te hay ser­vi­cios de reen­vío de mer­ca­de­ría, pe­ro no los he usa­do y no los co­noz­co.

Al­ter­na­ti­va­men­te, Ciu­dad del Es­te (Pa­ra­gua­y) es­tá muy cer­ca de Ar­gen­ti­na. Y es muy ba­ra­to com­prar elec­tró­ni­cos ahí. Y te­nés los U$S 300 de fran­qui­cia.

Pe­ro hay má­s! Un ciu­da­dano pa­ra­gua­yo que vi­si­ta ar­gen­ti­na pue­de traer cier­tas co­sas con cier­tos lí­mi­tes. Hay que ha­blar con él y coor­di­na­r!

Si no co­no­cés a na­die... bue­no, an­dá de pa­seo a ca­ta­ra­ta­s! Pa­sa­la bien! Y com­pra­te una cá­ma­ra o lo que sea en la ex­cur­sión a Ciu­dad del Es­te.

Accesorios

No com­pres ac­ce­so­rios ori­gi­na­le­s. Por ejem­plo: la ba­te­ría ori­gi­nal de re­pues­to de mi eeePC 701? U$S 110, 3 ele­men­to­s. La "tru­cha" de 6 ele­men­to­s? U$S 40.

Con­se­jo

Es ile­gal im­por­tar co­sas que se en­chu­fan

To­do lo que se en­chu­fe a la pa­red tie­ne que ho­mo­lo­gar­se y creo que es ile­gal traer­lo. Si al­guien tie­ne un car­ga­dor pa­ra su pro­pia no­te­book por ejem­plo, su­pon­go que es le­gal (a­sí me hi­ce de un car­ga­dor pa­ra la eee)

Conclusión

Oja­lá sir­va de al­go, si te­nés más tips po­ne­los en los co­men­ta­rio­s!

Modularizando tu aplicación: Yapsy

Una ma­ne­ra (si es­tás pro­gra­man­do en Py­tho­n) es usar Yap­sy..

Yap­sy es asom­bro­so. Tam­bién, ca­re­ce com­ple­ta­men­te de do­cu­men­ta­ción en­ten­di­ble. Vea­mos si es­te post arre­gla un po­co esa par­te y de­ja só­lo lo asom­bro­so.

Up­da­te: No ha­bía vis­to la do­cu­men­ta­ción nue­va de Yap­s­y. Es mu­cho me­jor que la que ha­bía an­tes :-)

Es­ta es la idea ge­ne­ral con yap­s­y:

  • Creás un Plu­­gin Ma­­na­­ger que pue­­de en­­co­n­­trar y ca­r­­gar plu­­gins de una lis­­ta de lu­­ga­­res (por eje­m­­plo, de ["/us­­r/s­ha­­re/a­­pp­­na­­me/­­plu­­gi­n­s", "~/.a­­pp­­na­­me/­­plu­­gi­n­s"]).

  • Una ca­­te­­go­­­ría de plu­­gins es una cla­­se.

  • Hay un ma­­peo en­­tre no­m­­bres de ca­­te­­go­­­ría y cla­­ses de ca­­te­­go­­­ría.

  • Un plu­­gin es un mó­­­du­­lo y un ar­­chi­­vo de me­­ta­­da­­ta. El mó­­­du­­lo de­­fi­­ne una cla­­se que he­­re­­da de una cla­­se de ca­­te­­go­­­ría, y pe­r­­te­­ne­­ce a esa ca­­te­­go­­­ría.

    El ar­­chi­­vo de me­­ta­­da­­ta tie­­ne co­­sas co­­­mo el no­m­­bre del plu­­gi­n, la des­­cri­p­­ció­­n, la UR­­L, ve­r­­sió­­n, etc.

Una de las me­jo­res co­sas de Yap­sy es que no es­pe­ci­fi­ca de­ma­sia­do. Un plu­gin va a ser sim­ple­men­te un ob­je­to Py­tho­n, po­dés po­ner lo que quie­ras ahí, o lo po­dés li­mi­tar de­fi­nien­do la inte­faz en la cla­se de ca­te­go­ría.

De he­cho, lo que ven­go ha­cien­do con las cla­ses de ca­te­go­ría es:

  • Arran­­co con una cla­­se va­­cía

  • Im­­ple­­men­­to dos plu­­gins de esa ca­­te­­go­­­ría

  • Los pe­­da­­zos en co­­­mún los mue­­vo den­­tro de la ca­­te­­go­­­ría.

Pe­ro créan­me, es­to va a ser mu­cho más cla­ro con un ejem­plo :-)

Lo voy a ha­cer con una apli­ca­ción grá­fi­ca en Py­Q­t, pe­ro Yap­sy fun­cio­na igual de bien pa­ra apli­ca­cio­nes "head­le­ss" o pa­ra lí­neas de co­man­do.

Co­men­ce­mos con al­go sim­ple: un edi­tor HT­ML con un wi­dget pre­view.

//ralsina.me/static/yapsy/editor1.jpeg

Un edi­tor sim­ple con pre­view

Es­te es el có­di­go de la apli­ca­ció­n, que es real­men­te sim­ple (no pue­de guar­dar ar­chi­vos ni na­da in­te­re­san­te, es só­lo un ejem­plo­):

edi­to­r1.­py

from PyQt4 import QtCore, QtGui, QtWebKit
import os, sys

class Main(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.layout = QtGui.QVBoxLayout()
        self.editor = QtGui.QPlainTextEdit()
        self.preview = QtWebKit.QWebView()
        self.layout.addWidget(self.editor)
        self.layout.addWidget(self.preview)
        self.editor.textChanged.connect(self.updatePreview)
        self.setLayout(self.layout)

    def updatePreview(self):
        self.preview.setHtml(self.editor.toPlainText())

def main():
    # Again, this is boilerplate, it's going to be the same on
    # almost every app you write
    app = QtGui.QApplication(sys.argv)
    window=Main()
    window.show()
    # It's exec_ because exec is a reserved word in Python
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

No­ta

De aho­ra en más los lis­ta­dos no in­clu­yen la fun­ción main por­que no cam­bia.

Pe­ro es­ta apli­ca­ción tie­ne un ob­vio lí­mi­te: hay que es­cri­bir HT­M­L! Por qué no es­cri­bir py­thon y que lo mues­tre re­sal­ta­do en HT­M­L? O ma­rkup de Wiki! O reS­truc­tu­red tex­t!

Uno po­dría, en prin­ci­pio, im­ple­men­tar to­dos esos mo­do­s, pe­ro es­tás asu­mien­do la res­pon­sa­bi­li­dad de so­por­tar ca­da co­sa-­que-se-­con­vier­te-en-HT­M­L. Tu apli­ca­ción se­ría un mo­n­oli­to. Ahí en­tra Yap­s­y.

Cree­mos en­ton­ces una ca­te­go­ría de plu­gin­s, lla­ma­da "For­ma­tte­r" que to­ma tex­to pla­no y de­vuel­ve HT­M­L. Des­pués agre­gue­mos co­sas en la UI pa­ra que el usua­rio pue­da ele­gir que for­ma­tter usar, e im­ple­men­te­mos un pa­r.

Es­ta es la cla­se de ca­te­go­ría de plu­gin­s:

ca­te­go­rie­s.­py

class Formatter(object):
    """Plugins of this class convert plain text to HTML"""

    name = "No Format"

    def formatText(self, text):
        """Takes plain text, returns HTML"""
        return text

Por su­pues­to que no sir­ve de na­da sin plu­gin­s! Asi que cree­mos un pa­r.

Pri­me­ro, un plu­gin qye to­ma có­di­go py­thon y de­vuel­ve HT­M­L, usan­do pyg­men­ts.

plu­gin­s/­p­yg­men­ti­ze.­py

from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import HtmlFormatter

from categories import Formatter

class Pygmentizer(Formatter):
    name = "Python Code"

    def formatText(self, text):
        return highlight(text, PythonLexer(), HtmlFormatter(full=True))

Co­mo ven, eso va en una car­pe­ta plu­gin­s. Des­pués le de­ci­mos a Yap­sy que bus­que los plu­gins ahi aden­tro.

Pa­ra ser re­co­no­ci­do co­mo un plu­gi­n, ne­ce­si­ta me­ta­da­ta:

plu­gin­s/­p­yg­men­ti­ze.­yap­s­y-­plu­gin

[Core]
Name = Python Code
Module = pygmentize

[Documentation]
Author = Roberto Alsina
Version = 0.1
Website = //ralsina.me
Description = Highlights Python Code

Y real­men­te, eso es to­do lo que hay que ha­cer pa­ra ha­cer un plu­gi­n. Acá hay otro pa­ra com­pa­ra­r, que usa do­cu­tils pa­ra for­ma­tear reS­truc­tu­red Tex­t:

plu­gin­s/­res­t.­py

from categories import Formatter
import docutils.core
import docutils.io


class Rest(Formatter):
    name = "Restructured Text"

    def formatText(self, text):
        output = docutils.core.publish_string(
            text, writer_name = 'html'
        )
        return output

plu­gin­s/­res­t.­yap­s­y-­plu­gin

[Core]
Name = Restructured Text
Module = rest

[Documentation]
Author = Roberto Alsina
Version = 0.1
Website = //ralsina.me
Description = Formats restructured text

Y acá es­tán en ac­ció­n:

//ralsina.me/static/yapsy/editor2.jpeg

reSt mo­de

//ralsina.me/static/yapsy/editor3.jpeg

Py­thon mo­de

Of cour­se using ca­te­go­ries you can do things like a "Tool­s" ca­te­go­r­y, whe­re the plu­gins get added to a Tools me­nu, too.

Es­te es el có­di­go del la­do de la apli­ca­ció­n:

edi­to­r2.­py

from categories import Formatter
from yapsy.PluginManager import PluginManager

class Main(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.layout = QtGui.QVBoxLayout()
        self.formattersCombo = QtGui.QComboBox()
        self.editor = QtGui.QPlainTextEdit()
        self.preview = QtWebKit.QWebView()

        self.layout.addWidget(self.formattersCombo)
        self.layout.addWidget(self.editor)
        self.layout.addWidget(self.preview)

        self.editor.textChanged.connect(self.updatePreview)
        self.setLayout(self.layout)

        # Create plugin manager
        self.manager = PluginManager(categories_filter={ "Formatters": Formatter})
        self.manager.setPluginPlaces(["plugins"])

        # Load plugins
        self.manager.locatePlugins()
        self.manager.loadPlugins()

        # A do-nothing formatter by default
        self.formattersCombo.addItem("None")
        self.formatters = {}
        print self.manager.getPluginsOfCategory("Formatters")
        for plugin in self.manager.getPluginsOfCategory("Formatters"):
            print  "XXX"
            # plugin.plugin_object is an instance of the plugin
            self.formattersCombo.addItem(plugin.plugin_object.name)
            self.formatters[plugin.plugin_object.name] = plugin.plugin_object

    def updatePreview(self):
        # Check what the current formatter is
        name =  unicode(self.formattersCombo.currentText())
        text = unicode(self.editor.toPlainText())
        if name in self.formatters:
            text = self.formatters[name].formatText(text)
        self.preview.setHtml(text)

Re­su­mien­do: es fá­ci­l, y te lle­va a me­jo­rar la es­truc­tu­ra in­ter­na de tu apli­ca­ción y ter­mi­nás con me­jor có­di­go.

Có­di­go fuen­te de to­do.


Contents © 2000-2021 Roberto Alsina