Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

Nikola Ideas para PyCamp

Si vas a Py­Camp (o si no vas tam­bién), sos bien­ve­ni­do a unir­te a mí en la im­ple­men­ta­ción de es­tas co­sas en una ma­ra­tón de pro­gra­ma­ción em­pe­zan­do el vier­nes y si­guien­do to­do el fin de se­ma­na.

Ten­go al­gu­nas ideas en la ca­be­za, pe­ro quie­ro más. Es­tas son las que ten­go, agre­guen en los co­men­ta­rio­s:

Galería de Código

Co­mo ga­le­rías de imá­ge­nes, pe­ro pa­ra có­di­go. Po­nés el có­di­go en una car­pe­ta y va a apa­re­cer her­mo­so. Con la adi­ción de una di­rec­ti­va "lis­tin­g" de do­cu­ti­l, va a ha­cer que mos­trar có­di­go en de­ta­lle o en con­tex­to sea sim­ple y po­de­ro­so, ha­cien­do a Niko­la más atrac­ti­vo pa­ra blo­gger­s-­pro­gra­ma­do­res.

Pulir Galerías

Las ga­le­rías de imá­ge­nes es­tán im­ple­men­ta­das y an­dan, pe­ro ne­ce­si­tan pu­li­do. Se pue­den ha­cer más efi­cien­tes en re­d, po­ner­les fee­ds RSS, ga­le­rías re­cur­si­va­s, me­ta­da­ta, tex­tos en las imá­ge­nes, y mu­cho má­s.

Pipelines

¿Que­rés mi­ni­mi­zar to CSS? ¿Em­pro­li­jar tu HT­M­L? ¿A­chi­car las imá­ge­nes? ¿A­pli­car trans­for­ma­cio­nes al HT­M­L? ¿Co­sas que no me ima­gi­no?

Los pi­pe­li­nes trae­rían el po­der del she­ll unix a un ge­ne­ra­dor de si­tio­s, per­mi­tien­do­te co­nec­tar fil­tros pro­vis­tos por niko­la o por la co­mu­ni­dad co­mo si fue­ran le­go­s.

Editor Online (Alva)

Si bien los ge­ne­ra­do­res de si­tios es­tá­ti­cos tie­nen mu­chos be­ne­fi­cio­s, tie­nen un la­do ma­lo: te­nés que edi­tar los ar­chi­vos en tu pro­pio equi­po.

Un edi­tor on­li­ne pa­ra Niko­la te per­mi­te edi­tar­los via web y pu­bli­car des­de cual­quier la­do.

Nikola Hosting (Shoreham)

¿Por qué no crear un ser­vi­cio en que el usua­rio ali­men­ta de pos­ts al ser­ver y el ser­ver pu­bli­ca? La ali­men­ta­ción pue­de ser vía un DV­CS, un ser­vi­cio de sync de ar­chi­vo­s, edi­tor on­li­ne, o lo que sea, y el re­sul­ta­do se pu­bli­ca in­me­dia­ta­men­te o to­can­do un bo­tó­n.

Borradores

Yo no ha­go bo­rra­do­res. Yo es­cri­bo y man­do. Pe­ro otros pre­fie­ren en­fo­ques mas cau­te­lo­sos y me­nos de­men­tes. En­ton­ce­s, ¿Có­mo de­be­rían fun­cio­nar los bo­rra­do­res? Si bien se­gu­ra­men­te es fá­cil de im­ple­men­tar es una ta­rea ex­ce­len­te pa­ra un prin­ci­pian­te, don­de hay que pen­sar más acer­ca de lo que se quie­re lo­grar y la ex­pe­rien­cia que se brin­da al usua­rio que acer­ca del có­di­go en sí.

En­ton­ce­s, si hay al­go que vis­te en otro ge­ne­ra­dor de blogs es­tá­ti­cos que Niko­la no tie­ne, o te­nés una idea y ne­ce­si­tás un fra­mewo­rk don­de me­ter­la, o te­nés una idea lo­ca lo­ca lo­ca que na­die quie­re to­car ni con un pun­te­ro lá­se­r...

CON­TA­ME.

Python no es un formato de archivo de configuración.

NO HA­GAS ESO, A ME­NOS QUE TEN­GAS UNA MUY BUE­NA RA­ZÓN

Si te­nés que pre­gun­tar si es bue­na idea, no te­nés una bue­na ra­zó­n. Si es­tás se­gu­ro de que te­nés una bue­na ra­zó­n, en­ton­ces tal vez ten­gas una.

Hay mu­chos mo­ti­vo­s, pe­ro voy a men­cio­nar do­s, y ofre­cer una su­ge­ren­cia.

Py­thon es só­lo lec­tu­ra, y con­fi­gu­rar no es pro­gra­ma­r.

Se­gu­ro, es fá­cil usar py­thon co­mo ar­chi­vo de con­fi­gu­ra­ció­n. Lo im­por­tás y ahí es­tán los da­to­s. Pe­ro aho­ra tu sin­ta­xis de con­fi­gu­ra­ción es un len­gua­ge de pro­pó­si­to ge­ne­ra­l, que pue­de ha­cer co­sas co­mo mos­trar un diá­lo­go cuan­do lo leé­s.

Tu con­fi­gu­ra­ción aho­ra de­pen­de de to­da la in­ter­ne­t, el har­dwa­re, el cli­ma, en­tra­da in­te­rac­ti­va, y el so­ftwa­re ins­ta­la­do en el sis­te­ma. ¿Po­de­ro­so? Sí. ¿Bue­na idea? A ve­ce­s. Pe­ro tu apli­ca­ción aho­ra no pue­de con­fi­gu­rar­se a sí mis­ma.

Si que­rés guar­dar al­gún ti­po de con­fi­gu­ra­ció­n, no vas a po­de­r. Así que pa­ra la ma­yo­ría de las apli­ca­cio­nes in­te­rac­ti­vas de es­cri­to­rio sim­ple­men­te no sir­ve, y no de­be­rías ha­cer­lo, nun­ca.

¿Y qué pa­sa con he­rra­mien­tas no in­te­rac­ti­va­s? Bue­no, usar py­thon sig­ni­fi­ca que otras he­rra­mien­tas tam­po­co pue­den es­cri­bir en ese ar­chi­vo, lo que te saca po­de­r. El po­der de he­rra­mien­tas usan­do he­rra­mien­tas es una de las co­lum­nas que sos­tie­nen la com­pu­ta­ción mo­der­na, y te aca­bás de ra­jar a vos mis­mo de ese eco­sis­te­ma. De­pen­dien­do de qué len­gua­je usa la otra he­rra­mien­ta, ca­paz que ni si­quie­ra pue­de leer tu con­fi­gu­ra­ció­n.

¿Y qué pa­sa cuan­do al­guien te di­ce "po­né es­to en tu con­fig pa­ra ha­cer X"? Bue­no, en ge­ne­ra­l, si el ar­chi­vo apro­ve­cha que es­tás usan­do py­thon pa­ra ha­cer al­go in­te­re­san­te, no po­dés es­tar se­gu­ro de que an­de. Es co­mo co­piar y pe­gar có­di­go de un fo­ro a tu pro­gra­ma. ¿Vos es­pe­ra­rías que an­de?

En­ton­ce­s, no po­dés es­cri­bir­lo, no po­dés sa­car ayu­da de in­ter­ne­t, no po­dés usar he­rra­mien­tas que ac­ce­dan a ese ar­chi­vo.

Tam­bién sig­ni­fi­ca que pa­ra ma­ne­jar el ca­so más ge­ne­ral de có­mo con­fi­gu­rar tu apli­ca­ció­n, ne­ce­si­tás ser pro­gra­ma­do­r. Pa­ra la enor­me ma­yo­ría de las apli­ca­cio­nes, eso no es ne­ce­sa­rio. Si tu apli­ca­ción só­lo pue­de ser con­fi­gu­ra­da por pro­gra­ma­do­res, es muy po­si­ble que ya ha­yas fra­ca­sa­do en su de­sa­rro­llo (hay ecep­cio­nes ob­vias y otras no tan­to­).

¡Ah, el con­se­jo! Bue­no, es "no ha­gas eso­". Y el co­ro­la­rio es "con­fi­gu­rá usan­do da­to­s, no có­di­go­". Usá INIs, XM­L, YA­M­L, JSO­N, o ar­chi­vos de tex­to, o lo que quie­ra­s, pe­ro no có­di­go.

PD: Mi úl­ti­mo pro­yec­to, Niko­la usa py­thon co­mo len­gua­je de con­fi­gu­ra­ció­n. Creí te­ner una bue­na ra­zó­n. No era cier­to.

The Future of PyQt by Example


Th­ree years ago, I started a se­ries of long pos­ts ca­lled "P­y­Qt by Exam­ple". It rea­ched fi­ve pos­ts be­fo­re I aban­do­ned for a se­ries of rea­sons that do­n't ma­tter an­y­mo­re. That se­ries is co­ming ba­ck star­ting next week, rew­ri­tten, im­pro­ved and ex­ten­de­d.

It wi­ll do so in a new si­te, and the "ol­d" pos­ts wi­ll be re­ti­red to an ar­chi­ve pa­ge. Wh­y? We­ll, the te­ch­no­lo­gies us­ed in so­me of them are ob­so­le­te or do­n't qui­te wo­rk no­wa­da­ys. So, the new ver­sions wi­ll be the pre­fe­rred ones.

And whi­le I am not pro­mi­sing an­y­thin­g, I ha­ve enou­gh wri­tten to make this so­me­thing qui­te lon­ge­r, mo­re ni­ce­ly la­youte­d, mo­re in­te­res­ting and make it co­ver mo­re groun­d. BU­T, whi­le doing so­me che­cks on the tra­ffic sta­tis­ti­cs for the old pos­ts, so­me things po­pped ou­t.

This was very popular

About 60% of my si­te's tra­ffic goes to tho­se fi­ve pos­ts. Out of about 1200 pos­ts over 12 year­s, 60% of the viewers go to the 0.4% of the pa­ges. That is a lo­t.

It's a long tail

The tra­ffic has not de­crea­sed in th­ree year­s. If an­y­thin­g, it has in­crea­sed

https://p.twimg.com/Aw0MHhoCAAAXmro.png:large

A long and ta­ll tai­l.

So, all this means the­re is a de­si­re for Py­Qt do­cu­men­ta­tion that is not sa­tis­fie­d. I am not sur­pri­s­e­d: Py­Qt is grea­t, and the re­co­m­men­ded book is not free, so the­re is bound to be a lot of de­man­d.

An­d, he­re's the no­t-­so­-­ro­sy bi­t: I had unob­tru­si­ve, re­le­van­t, ou­t-o­f-­the-wa­y-­bu­t-­vi­si­ble ads in tho­se pa­ges for mo­re than two year­s. Of the 70000 uni­que vi­si­tor­s, not even one cli­cked on an ad. Do­n't wo­rr­y, I was not ex­pec­ting to get mo­ney out of them (al­thou­gh I would lo­ve to so­me day co­llect a $100 che­ck ins­tead of ha­ving google hold my mo­ney for me ad eter­nu­m).

But rea­ll­y? Not even one ad cli­ck? In mo­re than two year­s, thou­san­ds of peo­ple? I ha­ve to won­der if I just attract cheap peo­ple ;-)

PyCamp Empieza el Viernes

Así que va a es­tar bue­ní­si­mo. Pa­ra mí es una ra­ra opor­tu­ni­dad de po­der pa­sar unos días dán­do­le ma­ni­ja a pro­yec­tos per­so­na­le­s, sin que me in­te­rrum­pan pa­va­das co­mo fa­mi­lia, tra­ba­jo, co­ci­na­r, o so­cia­li­za­r, ex­cep­to con otros ner­d­s.

Se­gu­ro, pue­de lle­gar a ha­ber al­gún oca­sio­nal pa­seo en mo­no­ci­clo, lec­cio­nes de ma­la­ba­res, o prác­ti­ca de ti­ro, pe­ro en se­rio, tres o cua­tro días só­li­dos de ha­ckin­g.

Mi idea es tra­ba­jar en pro­yec­tos re­la­cio­na­dos con Niko­la mi ge­ne­ra­dor de si­tios es­tá­ti­co­s, así que si te in­te­re­sa y vas a py­cam­p, ha­ble­mo­s.

Y si te in­te­re­sa pe­ro no vas a py­cam­p, no hay mo­ti­vo pa­ra no ha­cer un sprint vir­tua­l. Hay in­ter­ne­t. Hay IR­C. Voy a te­ner tiem­po. ¡Es un fin de se­ma­na lar­go! Por fa­vor com­par­tí ideas en el gru­po niko­la-­dis­cuss y ve­re­mos qué po­de­mos im­ple­men­ta­r, o por lo me­nos em­pe­za­r.

Un Verificador de links simple para Nikola

Es­te script es un muy sim­ple ve­ri­fi­ca­dor de li­nks que se ase­gu­ra que las pá­gi­nas que Niko­la ge­ne­ra no ten­gan li­nks ro­to­s. Va a ser par­te de Niko­la pro­pia­men­te di­cho una vez que es­té más pu­li­do y doit so­por­te lis­tar los tar­ge­ts

Para probarlo, bajalo y ejecutálo desde el mismo lugar donde está tu conf.py, inmediatamente después de un doit.

import os
import urllib
from urlparse import urlparse

import lxml.html

def analyze(filename):
    try:
        # Use LXML to parse the HTML
        d = lxml.html.fromstring(open(filename).read())
        for l in d.iterlinks():
            # Get the target link
            target = l[0].attrib[l[1]]
            if target == "#":  # These are always valid
                continue
            parsed = urlparse(target)
            # We only handle relative links.
            # TODO: check if the URL points to inside the generated
            # site and check it anyway
            if parsed.scheme:
                continue
            # Ignore the fragment, since the link will still work
            # TODO: check that the fragment is valid
            if parsed.fragment:
                target = target.split('#')[0]
            # Calculate what file or folder this points to
            target_filename = os.path.abspath(
                os.path.join(os.path.dirname(filename), urllib.unquote(target)))
            # Check if it exists, or report it
            if not os.path.exists(target_filename):
                print "In %s broken link: " % filename, target
    except Exception as exc:
        # Something bad happened, report
        print "Error with:", filename, exc

# This is hackish: we use doit to get a list of all
# generated files. Minor modifications would let you check
# the non-generated files as well.

for task in os.popen('doit list --all', 'r').readlines():
    task = task.strip()
    if task.split(':')[0] in (
        'render_tags',
        'render_archive',
        'render_galleries',
        'render_indexes',
        'render_pages',
        'render_site') and '.html' in task:
            # It looks like a generated HTML file
            analyze(task.split(":")[-1])

Contents © 2000-2023 Roberto Alsina