Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

Publicaciones sobre linux (publicaciones antiguas, página 18)

The day we saw the dinosaur (an Ada Lovelace Day story)

To­day, March 24th is Ada Lovelace day, a day of blog­ging to cel­e­brate the achieve­ments of wom­en in tech­nol­o­gy and sci­ence.. I am tak­ing the lib­er­ty to tag this as python so it ap­pears in the right plan­et­s, but that's just to pro­mote Ada Lovelace day. Sor­ry 'bout that.

I will write about the on­ly per­son who ev­er taught me pro­gram­ming, Clau­di­a. I was young, so the earth was still luke­war­m, the day we saw the di­nosaur.

I was just a green sopho­more in the School of Chem­i­cal En­gi­neer­ing where, para­dox­i­cal­ly I would nev­er take a chem­istry class, be­ing an ap­plied math stu­dent and all that, and at the time "per­son­al com­put­er­s" were a nov­el­ty, a toy of the up­per mid­dle class.

We had spent the first two months of the se­mes­ter learn­ing how to pro­gram the ob­vi­ous way: writ­ing as­sem­bler for a fic­tion­al ma­chine on pa­per by hand, when Clau­dia broke the news, we were go­ing to see a re­al com­put­er.

No, not a PC, not even an XT, but a re­al com­put­er, the one re­al com­put­er in all the uni­ver­si­ty, and you could hear the type switch­ing to bold as she spoke about it. Sad­ly it was not as re­al as the one at the re­search fa­cil­i­ty (A Mini­VAX!) but it was a re­al enough PDP.

We would not be al­lowed to ac­tu­al­ly use it un­til the fol­low­ing year, but ... well, it was still some­thing spe­cial.

I had been programming for years, even for a year before I saw my first (seriosuly not real) computer, I had followed BASIC programs in my head for days, imagining the space invaders float on the screen of my mind, and stepped into writing machine code inside REM statements in my Timex Sinclair 1000 onto the luxury of a C64, but never noone had taught me anything.

Our small class (maybe 10 stu­dents) spent end­less hours do­ing things like tra­verse a ma­trix, first by rows, thn by column­s, then in a spi­ral from the top-left, writ­ing pro­grams that fol­lowed our end­less source of al­go­rithm­s, the nu­mer­i­cal so­lu­tions guide.

First as­sem­bler, then For­tran, we learned.

She was my Mr. Miyag­i, I was a het­ero­sex­u­al Ralph Mac­chio, and I fig­ured out the most im­por­tant thing about pro­gram­ming: I was aw­ful at it.

Over the next 20 years that sit­u­a­tion has been slow­ly im­prov­ing, but I nev­er again had some­one teach me pro­gram­ming. Clau­dia had al­ready taught me ev­ery­thing I need­ed to know, that code can al­ways im­prove, that there's more than one way to skin a cat.

That the di­nosaur was re­al and that some day soon my com­put­er would be faster and nicer than the di­nosaur was then, and that pro­gram­ming was cool, and that if I could find a way to draw a poly­no­mi­al graph hor­i­zon­tal­ly on a print­er with­out ev­er hav­ing the whole graph in mem­o­ry (it did­n't fit), those fu­ture com­put­ers would do awe­some things, and that I was one of the many who would help bring that to re­al­i­ty.

That talk­ing about code was fun in it­self, that you could make a mod­est liv­ing and be hap­py about it, that you could in any case make jig­saw puz­zles in your spare time and keep on teach­ing or what­ev­er.

And lat­er the di­nosaur's bones were scav­enged in­to a line of racks hold­ing router­s, and its glass ter­mi­nals are de­stroyed, and the gold in its teeth was stolen and the rare bus ca­bles sol­d, and its cir­cuits scrapped, but I saw the di­nosaur alive, and Clau­dia taught me how to make it jump, and for that, I will al­ways be grate­ful.

Marave 0.5 publicado

¡Has­ta in­clu­ye un pe­que­ño re­pro­duc­tor mu­si­cal pa­ra que no ten­gas que pen­sar en otra apli­ca­ció­n!

Es­ta ver­sión tie­ne va­rios bugs arre­gla­do­s, y se ve un po­co más bo­ni­ta.

El nue­vo fea­tu­re es... in­ter­na­cio­na­li­za­ció­n. Por aho­ra só­lo una tra­duc­ción al cas­te­lla­no, pe­ro si al­guien quie­re ayu­dar tra­du­cién­do­lo a otro idio­ma, por fa­vo­r, ade­lan­te!

Hay só­lo unas 60 fra­ses, por lo que no de­be­ría ser más de una ho­ra de tra­ba­jo.

Aquí hay una cap­tu­ra de pan­ta­lla de es­ta ver­sió­n:

.. raw:: ht­ml marave7

Ma­ra­ve es so­ftwa­re li­bre ba­jo la GPL­v2, y de­be­ría fun­cio­nar en cual­quier pla­ta­for­ma don­de fun­cio­ne Py­Q­t, lo que quie­re de­cir Ma­c, Win­do­ws, y sis­te­mas ope­ra­ti­vos ti­po unix, por lo me­no­s.

Empaquetar es DIFÍCIL

O ni si­quie­ra eso, quie­ro que la gen­te ten­ga la opor­tu­ni­dad de usar­lo.

Eso sig­ni­fi­ca que quie­ro que fun­cio­ne en Win­do­ws (y tal vez en OSX al­gún día, si al­guien me da una ma­no­). Lo que sig­ni­fi­ca que ten­go que ha­cer una ver­sión pa­ra Win­do­ws.

ha­ga­mos una com­pa­ra­ción rá­pi­da des­de el pun­to de vis­ta del usua­rio y del de­sa­rro­lla­do­r.

El usuario, en Linux

Es­to es en Ar­ch Li­nu­x, que es lo que yo uso, en otras va­rian­tes es más o me­nos lo mis­mo una vez que Ma­ra­ve sea mas co­no­ci­do.

yaourt -S marave-svn --noconfirm

Eso ob­tie­ne el có­di­go de SVN (por aho­ra es lo me­jo­r, más ade­lan­te em­pa­que­ta­ré re­lea­ses), to­das las de­pen­den­cia­s, y lo ins­ta­la. Tar­da unos 15 se­gun­dos en mi no­te­book.

Des­pués de eso, te­nés un Ma­ra­ve fun­cio­nan­do.

En ca­so de que no es­té en tu dis­tro, te­nés que ins­ta­lar Py­Qt (que se­gu­ro si es­tá) y co­rre­r:

easy_install marave

El usuario, en windows

Vas a http://­ma­ra­ve.­google­co­de.­com, cli­ck en "Ma­ra­ve-0.5.wi­n32.exe" (No lo bus­ques, to­da­vía no es­tá) ba­jás un pro­gra­ma de 10M­B. Eso es un pro­gra­ma de 10MB por­que win­do­ws no cree en pa­que­tes y en de­pen­den­cia­s. En Li­nux un pa­que­te de Ma­ra­ve se­ría 1MB (ca­si to­do imá­ge­nes), y se­ría da­to­s, no eje­cu­ta­ble.

Por su­pues­to hoy en día un bro­w­ser no te eje­cu­ta un pro­gra­ma que ba­jas­te, asi que... ha­ga­mos una ga­le­ría!

110111105613-My-Desktop

Sí, guar­da­r.

11011111220-My-Desktop

Do­ble cli­ck pa­ra abri­r.

11011111417-My-Desktop

Sí, es­toy de acuer­do.

11011111514-My-Desktop

Hm­m­m, bue­no.

1101111167-My-Desktop

Bár­ba­ro­...

11011111750-My-Desktop

Ge­nia­l!

Aho­ra es­te Ma­ra­ve pue­de fun­cio­nar o no pe­ro eso es pa­ra más ade­lan­te...

El desarrollador, en Linux

Pri­me­ro, es­te es el ma­yor pro­ble­ma un "em­pa­que­ta­do­r" pue­de te­ner en Li­nu­x:

Co­mo Ma­ra­ve es una apli­ca­ción nue­va, y la de­sa­rro­llo en Ar­ch Li­nux que es me­dio cu­tting edge, usa fea­tu­res que só­lo es­tán en ver­sio­nes nue­vas de Py­Q­t. De he­cho no fun­cio­na con Py­Qt < 4.6, que no es­tá en al­gu­nas dis­tros "len­ta­s" o en un Ubun­tu que no es el úl­ti­mo.

So­lu­ció­n? Bue­no, po­dría ig­no­rar­lo, pe­ro que tan­to, va­mos a arre­glar­lo!

Graias a PyIns­ta­ller ni si­quie­ra es tan di­fí­ci­l, es­te es el ar­chi­vo spe­c:

a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), 'marave/main.py'],
            pathex=['/home/ralsina/trunk/trunk'])

pyz = PYZ(a.pure)
exe = EXE(pyz,
        a.scripts,
        exclude_binaries=1,
        name=os.path.join('build/pyi.linux2/main', 'marave.exe'),
        debug=False,
        strip=False,
        upx=True,
        console=0 )

coll = COLLECT( exe,
            a.binaries,
            [('radios.txt','marave/radios.txt','DATA')],
            Tree('marave/icons','icons'),
            Tree('marave/backgrounds','backgrounds'),
            Tree('marave/clicks','clicks'),
            Tree('marave/stylesheets','stylesheets'),
            Tree('marave/themes','themes'),
            a.zipfiles,
            a.datas,
            strip=False,
            upx=True,
            name=os.path.join('dist', 'marave'))

Usan­do es­to, PyIns­ta­ller pro­du­ce una lin­da car­pe­ta lle­na de to­do lo que Ma­ra­ve ne­ce­si­ta pa­ra fun­cio­nar en cual­quier Li­nu­x.

Por otro la­do, si se pue­de con­tar con que ha­ya un Py­Qt re­cien­te dis­po­ni­ble, tam­bién es fá­ci­l. És­te es el ar­chi­vo de con­fi­gu­ra­ción pa­ra un pa­que­te si­mi­lar en Ar­ch Li­nux (to­da­vía no hi­ce uno pa­ra Ma­ra­ve). Pa­ra otros Li­nux es más o me­nos lo mis­mo, y nor­mal­men­te al­guien te lo ha­ce:

# Contributor: Roberto Alsina <ralsina@kde.org>
pkgname=python-rst2pdf
pkgver=0.12.1
pkgrel=4
pkgdesc="Create PDFs from simple text markup, no LaTeX required."
arch=('i686' 'x86_64')
url="http://rst2pdf.googlecode.com"
license=('custom')
depends=('python' 'setuptools' 'docutils' 'pygments' 'python-reportlab' 'python-simplejson' 'pil')
source=(http://rst2pdf.googlecode.com/files/rst2pdf-$pkgver.tar.gz LICENSE.txt)
optdepends=('uniconvertor: vector images support'
            'python-svglib: SVG support'
            'python-wordaxe: hyphenation'
            'pythonmagick: PDF images support')
build() {
cd $startdir/src/rst2pdf-$pkgver
python setup.py install --root=$startdir/pkg || return 1
install -D ../LICENSE.txt $startdir/pkg/usr/share/licenses/python-rst2pdf/COPYING
install -D doc/rst2pdf.1 $startdir/pkg/usr/share/man/man1/rst2pdf.1
}
md5sums=('ea6beda9a46f34ba42c4c94d48cc607a'
        '416f8046c66b9476cdbacda69a673afe')

Y eso es to­do lo que hay que sa­ber del pro­ce­so de em­pa­que­tar tu apli­ca­ción pa­ra Li­nu­x, es fá­cil de ha­ce­r, y la ma­yor par­te del tiem­po, fá­cil de ha­cer bien.

Aho­ra, la sec­ción fi­na­l...

Windows para el desarrollador

¿Pri­me­ro, te acor­dás de eso de de­pen­der de la ver­sión de sis­te­ma de Qt? Ol­ví­da­lo, no hay ver­sión de sis­te­ma. Tam­po­co hay Py­tho­n, así que no im­por­ta. Y na­die los va a ins­ta­lar pa­ra tu apli­ca­ció­n, así que te­ne­mos que me­ter to­do no­so­tro­s, o na­da.

Pe­ro lo bue­no es que PyIns­ta­ller fun­cio­na pa­ra Win­do­ws! En­ton­ce­s, usan­do el mis­mo spec fun­cio­na, no?

Bue­no, hay dos pro­ble­ma­s...

Problema 1: El instalador

Los usua­rios de Win­do­ws no van a abrir un zip y co­nec­tar el bi­na­rio con el me­nú de ini­cio ni na­da pa­re­ci­do, así que hay que ha­cer un ins­ta­la­do­r.

Es­to es lo que hi­ce pa­ra NSIS, un crea­dor de ins­ta­la­do­res gra­tui­to:

;--------------------------------
;Include Modern UI

!include "MUI2.nsh"

;--------------------------------
;General

;Name and file
Name "Marave"
OutFile "Marave-0.5.win32.exe"

;Default installation folder
InstallDir "$LOCALAPPDATA\Marave"

;Get installation folder from registry if available
InstallDirRegKey HKCU "Software\Marave" ""

;Request application privileges for Windows Vista
RequestExecutionLevel user

;--------------------------------
;Interface Settings

!define MUI_ABORTWARNING

;--------------------------------
;Pages

!insertmacro MUI_PAGE_LICENSE "LICENSE"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

;--------------------------------
;Languages

!insertmacro MUI_LANGUAGE "English"

;--------------------------------
;Installer Sections

Section "Install"

SetOutPath "$INSTDIR"
File /r "dist\marave"


;Store installation folder
WriteRegStr HKCU "Software\Marave" "" $INSTDIR

;Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"

;Create shortcuts
CreateDirectory $SMPROGRAMS\Marave
CreateShortCut "$SMPROGRAMS\Marave\Marave.lnk" "$INSTDIR\marave\marave.exe" ; use defaults for parameters, icon, etc.
CreateShortCut "$SMPROGRAMS\Marave\Uninstall Marave.lnk" "$INSTDIR\Uninstall.exe" ; use defaults for parameters, icon, etc.

SectionEnd


;--------------------------------
;Uninstaller Section

Section "Uninstall"

Delete "$INSTDIR\Uninstall.exe"
RMDir /r "$INSTDIR"

DeleteRegKey /ifempty HKCU "Software\Marave"

SectionEnd

Es com­pa­ra­ble al es­fuer­zo de ha­cer un arhi­vo de em­pa­que­ta­do, ex­cep­to que ca­da vez que lo que­rés pro­ba­r... lo ins­ta­lá­s. No hay ma­ne­ra (que yo vea) de sa­ber qué hay aden­tro del ins­ta­la­dor ex­cep­to co­rrer­lo.

Cuan­do las co­sas fa­llan, no hay men­sa­jes de erro­r, por lo me­nos no del ti­po que es útil pa­ra un de­sa­rro­lla­do­r, el que ne­ce­si­ta sa­ber que salió mal.

Des­pués de que ter­mi­na, tal vez no fun­cio­ne por­que...

Problema 2: bibliotecas de sistema. Ja!

Los bi­na­rios de Py­thon 2.6 es­tán com­pi­la­dos con Vi­sual Stu­dio. Eso quie­re de­cir que ne­ce­si­tan el Vi­sual Stu­dio Runti­me, es­pe­cí­fi­ca­men­te MS­V­CR90.D­LL. És­ta con­tie­ne co­sas que en Li­nux se­rían con­si­de­ra­do par­te de la li­bc (li­nu­xe­ro: ima­gi­na­te apli­ca­cio­nes que de­pen­den de una li­bc es­pe­cí­fi­ca... ¡no es fá­ci­l!)

En Li­nux eso es par­te del sis­te­ma. Más aú­n, si lo ne­ce­si­ta­s, lo re­dis­tri­buís. En Win­do­ws... es di­fe­ren­te.

  1. Es pa­r­­te del "Vi­­sual C++ re­­dis­­tri­­bu­­ta­­ble­s"

  2. In­s­­ta­­la­r­­lo no es ga­­ran­­tía de que an­­de (sí, lo pro­­­bé)

  3. La li­­cen­­cia de esos 're­­dis­­tri­­bu­­ta­­ble­s' di­­ce que no lo po­­­dés ha­­cer dis­­po­­­ni­­ble pa­­ra des­­ca­r­­ga.

    Me han di­­cho que in­­cluír­­lo en tu in­s­­ta­­la­­dor es le­­ga­­l, pe­­ro a mí me pa­­re­­ce que eso es ha­­ce­r­­lo dis­­po­­­ni­­ble pa­­ra des­­ca­r­­ga!

¿Qué se ha­ce cuan­do ne­ce­si­tás una bi­blio­te­ca, no la po­dés dis­tri­buir y el usua­rio no la va a ins­ta­la­r?

Bue­no, por al­go no hay bi­na­rios de Ma­ra­ve pa­ra Win­do­ws to­da­vía ;-) Por su­pues­to si al­guien lo pue­de re­sol­ve­r, me en­can­ta­ría!

Feliz cumpleblog para mí!

To­do em­pe­zó en ad­vo­ga­to don­de se lo pue­de leer aún hoy! (Por fa­vor léan­lo acá ;-)

Des­pués cam­bió a Py­D­S, una pla­ta­for­ma de blog py­thon de es­cri­to­rio con in­ter­fa­ce we­b, y hos­tea­do en Py­CS, un ser­vi­cio gra­tui­to.

En­ton­ces Py­CS se mu­rió, y em­pe­cé a ge­ne­rar un blog es­tá­ti­co hos­tea­do en el hos­ting gra­tis de mi IS­P. Eso era una ba­zo­fia.

Des­pués fun­dé mi pro­pia com­pa­ñía, tu­ve mis pro­pios ser­ver­s, y em­pe­cé a hos­tear­lo allí (¡Aún hoy es­te blog es HT­ML com­ple­ta­men­te es­tá­ti­co! ¿No se no­ta, no­?)

En­ton­ces Py­DS em­pe­zó a fun­cio­nar ma­l, y es­cri­bí mi pro­pio so­ftwa­re, que es una por­que­ría, tal vez 25% ter­mi­na­do pe­ro ha­ce las co­sas exac­ta­men­te co­mo yo quie­ro.

Ho­y, es­te blog es­tá agre­ga­do en Pla­ne­ta PyA­r, Pla­net Py­tho­n, Pla­net Qt, Pla­ne­ta LU­GLI, Y al­gún otro lu­ga­r.

Es­te año de­ci­dí ha­cer que sea bi­lin­güe (in­glés y es­pa­ño­l) pe­ro odio tra­du­cir­lo (lo es­cri­bo pri­me­ro en in­glé­s).

De acuer­do a las es­ta­dís­ti­cas dis­po­ni­ble­s, es, en pro­me­dio, más po­pu­lar que nun­ca (pe­ro mis pos­ts mas po­pu­la­res son vie­jo­s).

stats

És­tas son las pá­gi­nas más po­pu­la­res del úl­ti­mo año:

Lec­cio­nes:

  1. Ne­­ce­­si­­to es­­cri­­bir más so­­­bre Qt y/o em­­pe­­zar fla­­mes con gen­­te que es­­cri­­be so­­­bre IT.

  2. Ne­­ce­­si­­to bus­­car el ma­­te­­rial ob­­so­­­le­­to y po­­­ner no­­­ta­s.

  3. Te­­ner tu pro­­­pio ho­s­­ting y so­­­ft es me­­jo­­­r.

  4. 10 años es mu­­cho tie­m­­po: 860 po­s­­ts (o 913, de­­pen­­de co­­­mo los cuen­­te)

Con iterpipes, python puede reemplacar a bash para scripting. En serio.

O al me­nos así era has­ta que hoy me en­contré con iter­pi­pes en py­tho­n.­re­ddi­t.­com

Iter­pi­pes es "u­na bi­blio­te­ca pa­ra usar pi­pe­li­nes de she­ll usan­do sin­ta­xis pa­re­ci­da al she­ll" y ¿sa­bés qué? Es bri­llan­te.

Acá hay un ejem­plo de su pá­gi­na de PY­PI:

# Total lines in *.py files under /path/to/dir,
# use safe shell parameters formatting:

>>> total = cmd(
...     'find {} -name {} -print0 | xargs -0 wc -l | tail -1 | awk {}',
...     '/path/to/dir', '\*.py', '{print $1}')
>>> run(total | strip() | join | int)
315

Así se­ría en she­ll:

find /path/to/dir -name '*.py' -print0 | xargs -0 wc -l | tail -1 | awk '{print $1}'

Tal vez di­gas que la ver­sión de she­ll es más sen­ci­lla. Eso es una ilu­sión cau­sa­da por la den­si­dad del cam­po ma­li­co del she­ll: esa ver­sión tie­ne bugs.

Porqué tiene bugs? Porque si controlo qué hay adentro de /path/to/dir puedo hacer que falle [1], pero en python puedo manejar el error.

Tam­bién en la ma­yo­ría de los in­ten­tos de es­cri­bir ese co­man­do se­ría in­se­gu­ro por­que las re­glas de co­mi­llas y ca­rac­te­res de es­ca­pe de she­ll son de­men­tes.

La ver­sión de iter­pi­pes usa el equi­va­len­te de pre­pa­red sta­te­men­ts de SQL que de­be­ría ser más se­gu­ro.

Es ca­si im­po­si­ble ha­cer ese co­man­do en pu­ro she­ll y es­tar se­gu­ro de que es se­gu­ro.

Ade­más la ver­sión en she­ll pro­du­ce un string en vez de un en­te­ro, que es una ba­zo­fia si lo ne­ce­si­tás usar pa­ra al­go.

Y el be­ne­fi­cio más im­por­tan­te es, por su­pues­to, no cuan­do tra­tás de ha­cer que py­thon fun­cio­ne co­mo un she­ll, sino cuan­do po­dés de­jar de ha­cer co­mo que el she­ll es un len­gua­je de ver­da­d.

Comsideremos esta gema del script /etc/rc.shutdown en Arch Linux. DAEMONS es una lista de cosas que se arrancaron al inicio, y este script intenta detenerlas en orden inverso, a menos que el nombre empiece con "!":

# Shutdown daemons in reverse order
let i=${#DAEMONS[@]}-1
while [ $i -ge 0 ]; do
        if [ "${DAEMONS[$i]:0:1}" != '!' ]; then
                ck_daemon ${DAEMONS[$i]#@} || stop_daemon ${DAEMONS[$i]#@}
        fi
        let i=i-1
done

¿No es lin­do?

¿Y có­mo se ve­ría en py­tho­n? (tal vez ha­ya in­ver­ti­do el sig­ni­fi­ca­do de ck_­dae­mo­n):

# Shutdown daemons in reverse order
for daemon in reversed(DAEMONS):
    if daemon[0]=='!':
        continue
    if ck_daemon(daemon):
        stop_daemon(daemon)

Mien­tras que sto­p_­dae­mon so­lía ser es­to:

stop_daemon() {
    /etc/rc.d/$1 stop
}

Aho­ra se­rá es­to:

.. code-block:: python
def stop_daemon(daemon):

run(­cm­d('/e­tc/r­c.­d/{} sto­p',­dae­mo­n))

Va­mos gen­te, es­ta­mos en pleno si­glo 21, y el she­ll scrip­ting ya era feo en el 20.


Contents © 2000-2023 Roberto Alsina