Hi han molts bons programes d'agenda i de calendari. Amb Linux (Ubuntu) n'hi ha un en mode text que ja ve de fàbrica: Es tracta del programa calendar.
calendar és un altre dels molts petits programes que es poden trobar als sistemes UNIX que fan una cosa senzilla, que la fan bé, i que es poden ajuntar amb altres petits programes per a realitzar tasques útils per a l'usuari. La tradicional i efectiva filosofia UNIX, ni més ni menys.
N'hi ha prou amb crear el fitxer calendar a la carpeta .calendar i afegir-hi línies amb les dates que ens interessin amb el format data <tabulació> descripció de la data. Finalment, si afegeixo calendar al fitxer .bashrc sempre que obri una finestra de terminal em revisarà el calendari.
Una altre forma d'utilitzar aquest petit programa podria ser invocant-lo des d'una aplicació que fem servir de forma habitual, potser una macro d'OpenOffice.org/LibreOffice o des d'un menú de llançament d'aplicacions fet amb zenity.
El que ve a continuació és la traducció lliure de la pàgina del manual de calendar.
Us:
calendar [-ab] [-A num] [-B num] [-l num] [-w num] [-f fitxer_de_calendari] [-t [[[cc]aa][mm]]dd]
Descripció:
Aquesta utilitat busca al directori actual, o al directori especificat a la variable d'entorn CALENDAR_DIR, un fitxer amb el nom calendar i mostra les línies que comencen amb la data d'avui i demà. Els divendres es mostren els events de tot el cap de setmana.
Les opcions són:
-A num Mostra els propers esdeveniments d'avui i dels propers num dies. Per defecte és un dia.
-a Processa els fitxers “calendar” de tots els usuaris i els envia un corru amb els resultats a cadascun d'ells. requereix privilegis de súper-usuari.
-B num Mostra els fets esdevinguts entre d'avui i els passats num dies.
-b Força mode de càlcul especial de dates per als calendaris KOI8.
-l num Mostra els propers esdeveniments d'avui i dels propers num dies. Per defecte és un dia.
-w num Mostra els propers esdeveniments d'avui i dels propers dos dies, però només si avui és divendres. És dir, mostra els esdeveniments del cap de setmana.
-f fitxer_de_calendari fa servir fitxer_de_calendari en comptes del fitxer per defecte calendar.
-t [[[cc]aa][mm]]dd fa servir la data especificada per cc, centúria; aa, any; mm, mes; dd, dia; en comptes de la data d'avui.
Les línies poden començar amb mes i dia. Si estan ben definides les característiques locals del sistema es poden fer servir els noms dels mesos i els dies de la setmana.
Un asterisc ('*') vol dir cada mes.
Un dia sense mes vol dir aquell dia cada setmana
Un mes sense dia vol dir el primer dia d'aquell mes.
Dos números volen dir mes i dia.
les línies que comencen amb un caràcter de tabulació es refereixen a l'última data entrada, permetent d'aquesta forma línies d'especificacions múltiples per a una data
Els dies de la setmana poden anar seguits de “-4” ... “+5” (àlies last, first, second, third, fourth) per esdeveniments amb data variable del tipus “el darrer dilluns d'abril”.
El diumenge de pasqua és 'Easter' en anglès. Es pot posar un àlies fent Easter=àlies i fer servir l'àlies
Per conveni, les dates seguides d'un asterisc (‘*’) no són fixes, és dir, canvien d'any en any.
Les descripcions del dia inicien després del primer caràcter de tabulació de la línia. Si una línia no té caràcter de tabulació, no es mostra. Si el primer caràcter d'una línia és una tabulació aleshores es tracta de la continuació de la descripció prèvia.
El calendari és preprocessa amb el preprocessador de C, cpp, permetent la inclusió de fitxers compartits com poden ser, per exemple, les vacances de l'empresa, el calendari de reunions, o l'agenda de cursos.
Si el fitxer compartit no es referencia per una ubicació absoluta aleshores es mira primer al directori actual (o home) i després a /etc/calendar, i finalment a /usr/share/calendar.
Les línies buides o protegides amb comentaris amb la sintaxi de C son ignorades.
On busca el calendari?
calendar fitxers al directori actual.
~/.calendar directori ocult ubicat al directori de l'usuri.
~/.calendar/calendar fitxers que fa servir si no hi un fitxer calendar al directori actual.
~/.calendar/nomail si el fitxer nomail existeix, no s'envia el calendari del dia a aquel usuari (opció -a).
Els següents fitxers es poden trobar a /usr/share/calendar i contenen llistes d'efemèrides
calendar.all fitxers calendar nacionals i internacionals.
calendar.birthday dates de naixement i decés de personatges famosos.
calendar.christian calendari cristià (però no està de més revisar-ne les dates).
calendar.computer efemèrides rel·lacionades amb el món de la informàtica.
calendar.croatian calendari croata.
calendar.discordian el calendari de la discòrdia.
calendar.fictional dates i efemèrides fantàstiques i de ficció .
calendar.french calendari francès.
calendar.german calendari alemany.
calendar.history miscel·lània d'efemèrides.
calendar.holiday altres festes.
calendar.judaic calendari jueu.
calendar.music dates del món del rock and roll.
calendar.openbsd esdeveniments rel·lacionats amb el bsd.
calendar.pagan festes paganes.
calendar.russian calendari rus.
calendar.space història de cursa espacial.
calendar.ushistory esdeveniments històrics dels EUA.
calendar.usholiday festes dels EUA.
calendar.world esdeveniments mundials.
Exemple (\t és el caràcter de tabulació):
LANG=C
Easter=DiumengePasqua
#include <calendar.usholiday>
#include <calendar.birthday>
6/15\tJune 15 (Si és ambigu, es prem mes/dia).
Jun. 15\tJuny 15.
15 June\tJuny 15.
Thursday\tCada dijous.
June\tCada primer de juny.
15 *\tEl 16 de cada mes.
May Sun+2\tsegon diumenge de maig (Muttertag)
04/SunLast\túltim diumenge d'abril,
\tentra l'horari d'estiu a europa
Easter\tdiumenge de pasqua
DiumengePasqua\tdiumenge de pasqua (amb àlies)
Easter-2\tdivendres sant (2 dies abans de diumenge de pasqua)
DiumengePasqua\t-2\tdivendres sant(com abans, però amb àlies)
Paskha\tPasqua ortodoxa
Un altre exemple, més senzill:
#include <calendar.usholiday>
#include <calendar.russian>
#include <calendar.discordian>
#include <calendar.christian>
#include <calendar.computer>
#include <calendar.birthday>
07/31 últim dia de les vacances d'estiu 2011
08/01 Sant Tornem-Hi
El resultat avui és (30 de juliol):
dissabte, 30 de juliol del 2011
dijous, 21 de juliol del 2011
Groovy, un altre llenguatge per a la JVM
Al darrer post on parlava de BeanShell vaig esmentar Groovy. Però esmentar-lo no és suficient. Groovy es mereix un post. Vostès perdonaran, però fent el joc de paraules, Groovy és meravellós.
Groovy és un llenguatge per a la Java Virtual Machine (JVM). Si la seva sintaxi fos molt diferent a la de Java no tindríem cap dubte en veure'l com quelcom de diferent a la família Java. El cas, però, és que tot programa en Java és també un programa en Groovy. La inversa no és certa perquè Groovy incorpora canvis i extensions diverses. Groovy pot importar i utilitzar els packages de Java.
Igual com ho fa BeanShell importa un grup de packages java per defecte (els d'ús més habitual).
Moltes de les característiques del llenguatge que vaig comentar per a BeanShell segueixen sent vàlides per a Groovy. Però BeanShell, a diferència de Groovy, està pensat i dissenyat per a ser un llenguatge d'scripting per a Java. Mentre que Groovy, tot i que també pot actuar com llenguatge d'scripting per a Java, és un llenguatge de construcció d'aplicacions.
Ara bé, el mode de funcionament habitual de Groovy és interpretat (realment es fa un compilat JIT a bytecode de Java, però es descarta el bytecode un cop s'ha utilitzat), a diferència del Java que és compilat. Això situa Groovy en el grup de llenguatges com Python, o Perl, o Ruby que es compilen al moment. Tanmateix, amb el JDK de Groovy s'entrega el compilador groovyc que permet compilar a bytecode de Java. És dir que podrem generar fitxers .class i executar-los a una JVM.
Per començar amb Groovy n'hi ha prou amb crear un script amb l'extensió .groovy i executar-lo amb l'aplicació groovy. De cara a depurar-ne el funcionament, però, pot ser útil fer servir l'intèrpret interactiu groovysh. Una versió gràfica de groovysh és la groovyConsole. El JDK inclou els quatre programes esmentats: groovy, groovyc, groovysh i groovyConsole.
Al cas de Linux Ubuntu, la instal·lació de Groovy es pot realitzar des del Centre de Programari de l'Ubuntu. Convé instal·lar també la documentació, que queda ubicada a /usr/share/doc/groovy-doc. La documentació inclou els javadoc. Per a una introducció al llenguatge, o guies d'usuari cal anar a la web de Groovy, a la secció de documentació.
La forma fàcil d'accedir al llenguatge és partint de Java, si més no per a tots aquells que coneixem aquest llenguatge.
Una classe Java o un programa Java són executables per Groovy sense fer res més. Ara bé, si es vol treure profit de Groovy cal utilitzar-ne les seves característiques, aleshores el que es pot fer és anar despullant el Java de tot allò que és redundant o no necessari en Groovy:
- Els següents packages estan importats per defecte:
- 'in' és paraula clau.
- A Java un array es pot declarar com int[] a= {1,2,3}; a Groovy cal fer-ho int[] a= [1,2,3]; és dir amb [].
- Els llaços 'for' admeten construccions alternatives.
Per exemple, en Java es pot fer for (int i=0; i < len; i++) {...}
A Groovy també i, a més, són possibles les construccions alternatives amb 'in'
for (i in 0..len-1) {...}
for (i in 0..<len) {...}
i aquesta última que aprofita que a Groovy tot són objectes
len.times {...}
Aquesta última és una diferència important. A Java hi han uns tipus primitius, per exemple int, que en ocasions cal envoltar amb uns wrapper, per exemple, Integer per a poder utilitzar-los com objectes. Igualment, en ocasionsm cal passar de Integer a int. Això és el boxing/unboxing. A Groovy no cal. Tot són objectes. Un número té mètodes, com el mètode times, per exemple.
- El ';' al final de línia és opcional (però recomanable si es vol claredat).
- El 'return' de les funcions és opcional (però, també, recomanable per claredat).
- 'this' es pot fer servir dins de mètodes estàtics.
- Per defecte, les classes i mètodes són públics.
- Groovy, com BeanShell, o com es fa JavaScript, permet definir objectes a partir de funcions. En realitat, pot fer-ho a partir de blocs. Això és el que s'anomenen closures (o clausures).
- A Java cal posar blocs try-catch, o throws. A Groovy no cal (evidentment, si es produeix una excepció, no serà capturada).
- Groovy només detectara errors com l'ús de mètodes no declarats, o el pas d'arguments de tipus equivocat en temps d'execució. A Java aquesta mena d'errors es detecten en temps de compilació.
Una bona referència per veure diferències entre Java i Groovy (i també amb Ruby) són aquestes pàgines de A. Sundararajan's Weblog. No és un llistat exhaustiu de les diferències.
http://blogs.oracle.com/sundararajan/entry/java_groovy_and_j_ruby
http://blogs.oracle.com/sundararajan/entry/java_groovy_and_j_ruby1
Finalment, un altre bon lloc on trobar snippets de Groovy és http://www.groovyexamples.org/
I fins aquí la presentació de Groovy. El següent pas és, doncs, posar a treballar Groovy. El llenguatge és potent. Prou potent com per ser la base de Grails. Grails ve a ser l'equivalent amb Groovy al framework web Ruby on Rails, basat en Ruby. De Grails, com no, caldrà parlar-ne en un proper post.
Groovy és un llenguatge per a la Java Virtual Machine (JVM). Si la seva sintaxi fos molt diferent a la de Java no tindríem cap dubte en veure'l com quelcom de diferent a la família Java. El cas, però, és que tot programa en Java és també un programa en Groovy. La inversa no és certa perquè Groovy incorpora canvis i extensions diverses. Groovy pot importar i utilitzar els packages de Java.
Igual com ho fa BeanShell importa un grup de packages java per defecte (els d'ús més habitual).
Moltes de les característiques del llenguatge que vaig comentar per a BeanShell segueixen sent vàlides per a Groovy. Però BeanShell, a diferència de Groovy, està pensat i dissenyat per a ser un llenguatge d'scripting per a Java. Mentre que Groovy, tot i que també pot actuar com llenguatge d'scripting per a Java, és un llenguatge de construcció d'aplicacions.
Ara bé, el mode de funcionament habitual de Groovy és interpretat (realment es fa un compilat JIT a bytecode de Java, però es descarta el bytecode un cop s'ha utilitzat), a diferència del Java que és compilat. Això situa Groovy en el grup de llenguatges com Python, o Perl, o Ruby que es compilen al moment. Tanmateix, amb el JDK de Groovy s'entrega el compilador groovyc que permet compilar a bytecode de Java. És dir que podrem generar fitxers .class i executar-los a una JVM.
Per començar amb Groovy n'hi ha prou amb crear un script amb l'extensió .groovy i executar-lo amb l'aplicació groovy. De cara a depurar-ne el funcionament, però, pot ser útil fer servir l'intèrpret interactiu groovysh. Una versió gràfica de groovysh és la groovyConsole. El JDK inclou els quatre programes esmentats: groovy, groovyc, groovysh i groovyConsole.
Al cas de Linux Ubuntu, la instal·lació de Groovy es pot realitzar des del Centre de Programari de l'Ubuntu. Convé instal·lar també la documentació, que queda ubicada a /usr/share/doc/groovy-doc. La documentació inclou els javadoc. Per a una introducció al llenguatge, o guies d'usuari cal anar a la web de Groovy, a la secció de documentació.
La forma fàcil d'accedir al llenguatge és partint de Java, si més no per a tots aquells que coneixem aquest llenguatge.
Una classe Java o un programa Java són executables per Groovy sense fer res més. Ara bé, si es vol treure profit de Groovy cal utilitzar-ne les seves característiques, aleshores el que es pot fer és anar despullant el Java de tot allò que és redundant o no necessari en Groovy:
- Els següents packages estan importats per defecte:
- java.io.*
- java.lang.*
- java.math.BigDecimal
- java.math.BigInteger
- java.net.*
- java.util.*
- groovy.lang.*
- groovy.util.*
- 'in' és paraula clau.
- A Java un array es pot declarar com int[] a= {1,2,3}; a Groovy cal fer-ho int[] a= [1,2,3]; és dir amb [].
- Els llaços 'for' admeten construccions alternatives.
Per exemple, en Java es pot fer for (int i=0; i < len; i++) {...}
A Groovy també i, a més, són possibles les construccions alternatives amb 'in'
for (i in 0..len-1) {...}
for (i in 0..<len) {...}
i aquesta última que aprofita que a Groovy tot són objectes
len.times {...}
Aquesta última és una diferència important. A Java hi han uns tipus primitius, per exemple int, que en ocasions cal envoltar amb uns wrapper, per exemple, Integer per a poder utilitzar-los com objectes. Igualment, en ocasionsm cal passar de Integer a int. Això és el boxing/unboxing. A Groovy no cal. Tot són objectes. Un número té mètodes, com el mètode times, per exemple.
- El ';' al final de línia és opcional (però recomanable si es vol claredat).
- El 'return' de les funcions és opcional (però, també, recomanable per claredat).
- 'this' es pot fer servir dins de mètodes estàtics.
- Per defecte, les classes i mètodes són públics.
- Groovy, com BeanShell, o com es fa JavaScript, permet definir objectes a partir de funcions. En realitat, pot fer-ho a partir de blocs. Això és el que s'anomenen closures (o clausures).
- A Java cal posar blocs try-catch, o throws. A Groovy no cal (evidentment, si es produeix una excepció, no serà capturada).
- Groovy només detectara errors com l'ús de mètodes no declarats, o el pas d'arguments de tipus equivocat en temps d'execució. A Java aquesta mena d'errors es detecten en temps de compilació.
Una bona referència per veure diferències entre Java i Groovy (i també amb Ruby) són aquestes pàgines de A. Sundararajan's Weblog. No és un llistat exhaustiu de les diferències.
http://blogs.oracle.com/sundararajan/entry/java_groovy_and_j_ruby
http://blogs.oracle.com/sundararajan/entry/java_groovy_and_j_ruby1
Finalment, un altre bon lloc on trobar snippets de Groovy és http://www.groovyexamples.org/
I fins aquí la presentació de Groovy. El següent pas és, doncs, posar a treballar Groovy. El llenguatge és potent. Prou potent com per ser la base de Grails. Grails ve a ser l'equivalent amb Groovy al framework web Ruby on Rails, basat en Ruby. De Grails, com no, caldrà parlar-ne en un proper post.
Etiquetes de comentaris:
groovy,
java,
programari lliure
dimarts, 19 de juliol del 2011
BeanShell, scripting per a Java
BeanShell (bsh) és un interpret de Java estès amb característiques de llenguatge d'scripting. BeanShell està desenvolupat en Java i s'entrega i es pot executar com aplicació standalone des del jar, però també es pot afegir com a llibreria en una aplicació standalone Java que incorporaria d'aquesta forma un llenguatge d'scripting per a fer macros, per exemple.
A tall d'exemple, BeanShell és un dels llenguatges de macros que incorpora OpenOffice.org/LibreOffice (OOo/LO). També és el llenguatge de macros de l'editor JEdit, també es pot trobar com a llenguatge de macros a l'IDE de Java NetBeans.
Encastat a una aplicació Java, i pel fet d'executar-se en la mateixa JVM de l'aplicació hoste, és capaç d'interactuar amb els objectes de l'aplicació. Com que és interpretat i no cal compilar els scripts de bsh obre una porta a l'extensió de l'aplicació hoste. I amb tota la potència de Java, doncs BeanShell és capaç d'importar packages java.
BeanShell és un jar que ocupa menys de 300KB. És considerablement més petit, doncs, que alternatives més potents com Groovy (De fet, Groovy va molt més enllà del que seria un llenguatge d'scripting. Per exemple, el framework Grails està basat en Groovy).
Els punts forts de BeanShell són aquests: és java, ofereix facilitats per a l'scripting, és petit, és encastable i és fa servir a OOo/LO, entre d'altres.
Punts dèbils? malgrat que la llista de correu de desenvolupadors i d'usuaris de BeanShell a SourceForge mostra certa activitat enguany, la llista d'anuncis de noves versions resta aturada des de 2005 (justament quan el JCP aprovava la creació d'una JSR per al BeanShell). El punt dèbil és, doncs, que no ha evolucionat des de fa massa temps.
En tot cas, el fet de ser un interpret de Java fa que sigui immediatament utilitzable per programadors d'aquest llenguatge.
L'escenari d'us de BeanShell seria, doncs, aquell en el que cal incorporar un llenguatge de macros a una aplicació java que sigui lleuger i, a la vegada, d'aplicació immediata.
La sintaxi del llenguatge és la de Java. Res a descobrir, doncs. Tanmateix, hi han afegides característiques orientades a l'scripting, com el "tipatge relaxat", o comandes específiques per a entrada sortida per consola
Les referències són, per una banda el manual d'usuari; i per l'altre, el javadoc de beanshell. També és recomanable veure la presentació amb diapositives (en format .pdf) Un punt d'entrada és l'anàlisi dels exemples que també es poden trobar a la web.
Si hem instal·lat bsh des del Centre de Programari de l'Ubuntu, o si tenim instal·lat l'OpenOffice.org/LibreOffice, és possible que trobem el bsh.jar a les ubicacions següents:
/usr/share/java/bsh-2.0b4.jar
/usr/share/java/bsh.jar
/usr/lib/openoffice/basis3.2/program/classes/bsh.jar
Per engegar l'interpret n'hi ha prou amb escriure bsh a la línia de comandes. Però també el podem engegar com la aplicació Java que és:
java -jar /usr/share/java/bsh.jar bsh.
en aquest punt ja podem introduir ordres. tanmateix és més pràctic fer un script:
Fem la prova canònica. Creo l'script hello.bsh
i l'executo
Com era d'esperar... L'script anterior en bsh és indistingible d'altres llenguatges d'script que disposen de la comanda print.
Haviem dit que bsh és java amb característiques d'script. Vet aquí la primera: no ha calgut definir el tipus de les variables.
Hauria pogut ser més rigurós. Amplio l'script amb línies que són Java inequívocament:
i el resultat és:
albert@atenea:~$ bsh ./hello.bsh
hola món!
Serveix TIC i Programari Lliure, (http://apuntstecnologia.blogspot.com/)
Variable no inicialitzada: void, void
void, en comptes de null o "". A bsh es pot verificar si una variable està inicialitzada comparant-la amb "void".
Més coses: els "scripted objects", una forma de definir objectes a l'estil de com ho fan altres llenguatges d'scripts (recorda Javascript) que aprofiten les estructures de blocs.
ClasseBsh() {
propietat1 = 1;
propietat2 = "un text";
Metode1() {
print("Aquest és el mètode 1");
}
Metode2() {
print("Aquest és el mètode 2");
}
Metode3() {
cbsh2 = ClasseBsh2();
print("cbsh2.propietat1: " + cbsh2.propietat1);
print("cbsh2.propietat2: " + cbsh2.propietat2);
cbsh2.Metode1();
cbsh2.Metode2();
}
ClasseBsh2() {
propietat1 = 1;
propietat2 = "un altre text";
Metode1() {
print("Aquest és el mètode 1 intern");
}
Metode2() {
print("Aquest és el mètode 2 intern");
}
return this;
}
return this;
}
cbsh1 = ClasseBsh();
print("cbsh1.propietat1: " + cbsh1.propietat1);
print("cbsh1.propietat2: " + cbsh1.propietat2);
cbsh1.Metode1();
cbsh1.Metode2();
cbsh1.Metode3();
El resultat és:
albert@atenea:~$ bsh ./classes.bsh
cbsh1.propietat1: 1
cbsh1.propietat2: un text
Aquest és el mètode 1
Aquest és el mètode 2
cbsh2.propietat1: 1
cbsh2.propietat2: un altre text
Aquest és el mètode 1 intern
Aquest és el mètode 2 intern
Remarcar la sintaxi simplificada, i també com es poden fer classes dins de classes sense ĺímit de nivell.
Com encastar BeanShell a una aplicació Java?
Res més senzill. Podem fer una petita classe java que carrega un interpret de BeanShell que executa un script:
package com.sticipl.proves;
public class ProvaBshRun {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new ProvaBshRun();
}
public ProvaBshRun() {
try {
// carrega script i l'executa
System.out.println("carrega script i l'executa");
Interpreter beanshellInterpret = new Interpreter();
beanshellInterpret.source("/home/albert/hello.bsh");
} catch(Exception e) {
System.out.println("Error: " + e.toString());
}
}
}
Per a fer l'execució més senzilla, empaqueto la classe anterior en un jar. Faig servir el següent build.xml per a l'ant
<project name="provabsh" default="build" basedir=".">
<description>
proves amb beanshell
</description>
<!-- estableix propietats globals -->
<property name="src" location="src"/>
<property name="bin" location="bin"/>
<property name="build" location="build"/>
<property name="lib" location="lib"/>
<target name="init">
<!-- time stap -->
<tstamp/>
<!-- Crea el directory bin utilitzat en la compilació -->
<mkdir dir="${bin}"/>
</target>
<target name="compile" depends="init" description="compila els fitxers font" >
<!-- Compila les fonts java de ${src} en ${build} -->
<javac srcdir="${src}" destdir="${bin}">
<classpath>
<pathelement location="${lib}/bsh-2.0b4.jar"/>
</classpath>
</javac>
</target>
<target name="build" depends="compile" description="genera el jar">
<!-- Crea el directori de distribució -->
<mkdir dir="${build}"/>
<jar jarfile="${build}/provabsh.jar" basedir="${bin}">
<include name="**/*.class"/>
<manifest>
<attribute name="Main-Class" value="com.sticipl.proves.ProvaBshRun"/>
<attribute name="Class-Path" value="bsh-2.0b4.jar"/>
</manifest>
</jar>
<copy file="${lib}/bsh-2.0b4.jar" todir="${build}" />
</target>
</project>
Amb el build.xml anterior obtinc una carpeta build on he deixat el jar provabsj.jar que conté la classe ProvaBshRun. El manifest del jar indica que cal fer servir la llibreria bsh-2.0b4.jar.
Puc executar la classe amb:
albert@atenea:~/wk-java/ProvaBsh/build$ java -jar ./provabsh.jar
o bé amb:
albert@atenea:~/wk-java/ProvaBsh/build$ java -jar -cp ./bsh-2.0b4.jar ./provabsh.jar
i el resultat de l'execució és:
carrega script i l'executa
hola món!
Serveis TIC i Programari Lliure, (http://apuntstecnologia.blogspot.com/)
Variable no inicialitzada: void, void
data: Tue Jul 19 18:38:08 CEST 2011
Un cop carregat l'script també es poden manipular-ne els mètodes i propietats. Per exemple, carrego l'script classes.bsh i n'executo mètodes i en canvio propietats:
System.out.println("Error: " + e.toString());
}
}
}
El resultat de l'anterior és
Carrega script
cbsh1.propietat1: 1
cbsh1.propietat2: un text
Aquest és el mètode 1
Aquest és el mètode 2
cbsh2.propietat1: 1
cbsh2.propietat2: un altre text
Aquest és el mètode 1 intern
Aquest és el mètode 2 intern
iPropietat1: 1
sPropietat2: un altre text
des de l'aplicació
iPropietat1: 25
sPropietat2: aquest és el text canviat des de l'aplicació
des de beanshell
cbsh1.propietat1: 25
cbsh1.propietat2: aquest és el text canviat des de l'aplicació
Executa mètode 1:
Aquest és el mètode 1
Executa mètode 2:
Aquest és el mètode 2
Executa mètode 3:
cbsh2.propietat1: 1
cbsh2.propietat2: un altre text
Aquest és el mètode 1 intern
Aquest és el mètode 2 intern
En el jar de BeanShell es poden trobar classes per a l'execució remota d'scripts, i també per l'execució en mode servlet. Deixo per a futurs posts la revisió d'aquestes opcions.
En resum s'ha presentat l'aplicació BeanShell i les seves característiques que més immediatament es poden utilitzar en aplicacions java.
A tall d'exemple, BeanShell és un dels llenguatges de macros que incorpora OpenOffice.org/LibreOffice (OOo/LO). També és el llenguatge de macros de l'editor JEdit, també es pot trobar com a llenguatge de macros a l'IDE de Java NetBeans.
Encastat a una aplicació Java, i pel fet d'executar-se en la mateixa JVM de l'aplicació hoste, és capaç d'interactuar amb els objectes de l'aplicació. Com que és interpretat i no cal compilar els scripts de bsh obre una porta a l'extensió de l'aplicació hoste. I amb tota la potència de Java, doncs BeanShell és capaç d'importar packages java.
BeanShell és un jar que ocupa menys de 300KB. És considerablement més petit, doncs, que alternatives més potents com Groovy (De fet, Groovy va molt més enllà del que seria un llenguatge d'scripting. Per exemple, el framework Grails està basat en Groovy).
Els punts forts de BeanShell són aquests: és java, ofereix facilitats per a l'scripting, és petit, és encastable i és fa servir a OOo/LO, entre d'altres.
Punts dèbils? malgrat que la llista de correu de desenvolupadors i d'usuaris de BeanShell a SourceForge mostra certa activitat enguany, la llista d'anuncis de noves versions resta aturada des de 2005 (justament quan el JCP aprovava la creació d'una JSR per al BeanShell). El punt dèbil és, doncs, que no ha evolucionat des de fa massa temps.
En tot cas, el fet de ser un interpret de Java fa que sigui immediatament utilitzable per programadors d'aquest llenguatge.
L'escenari d'us de BeanShell seria, doncs, aquell en el que cal incorporar un llenguatge de macros a una aplicació java que sigui lleuger i, a la vegada, d'aplicació immediata.
La sintaxi del llenguatge és la de Java. Res a descobrir, doncs. Tanmateix, hi han afegides característiques orientades a l'scripting, com el "tipatge relaxat", o comandes específiques per a entrada sortida per consola
Les referències són, per una banda el manual d'usuari; i per l'altre, el javadoc de beanshell. També és recomanable veure la presentació amb diapositives (en format .pdf) Un punt d'entrada és l'anàlisi dels exemples que també es poden trobar a la web.
Si hem instal·lat bsh des del Centre de Programari de l'Ubuntu, o si tenim instal·lat l'OpenOffice.org/LibreOffice, és possible que trobem el bsh.jar a les ubicacions següents:
/usr/share/java/bsh-2.0b4.jar
/usr/share/java/bsh.jar
/usr/lib/openoffice/basis3.2/program/classes/bsh.jar
Per engegar l'interpret n'hi ha prou amb escriure bsh a la línia de comandes. Però també el podem engegar com la aplicació Java que és:
java -jar /usr/share/java/bsh.jar bsh.
en aquest punt ja podem introduir ordres. tanmateix és més pràctic fer un script:
Fem la prova canònica. Creo l'script hello.bsh
a = "hola ";
b = " món!";
print (a + b);
b = " món!";
print (a + b);
i l'executo
bsh ./hello.bsh
hola món!
Com era d'esperar... L'script anterior en bsh és indistingible d'altres llenguatges d'script que disposen de la comanda print.
Haviem dit que bsh és java amb característiques d'script. Vet aquí la primera: no ha calgut definir el tipus de les variables.
Hauria pogut ser més rigurós. Amplio l'script amb línies que són Java inequívocament:
a = "hola ";
b = " món!";
print (a + b);
String s_Nom = "Serveix TIC i Programari Lliure";
String s_llocweb = " (http://apuntstecnologia.blogspot.com/)";
System.out.println(s_Nom + ", " + s_llocweb);
System.out.println("Variable no inicialitzada: " + sNom + ", " + s_LlocWeb);
b = " món!";
print (a + b);
String s_Nom = "Serveix TIC i Programari Lliure";
String s_llocweb = " (http://apuntstecnologia.blogspot.com/)";
System.out.println(s_Nom + ", " + s_llocweb);
System.out.println("Variable no inicialitzada: " + sNom + ", " + s_LlocWeb);
i el resultat és:
albert@atenea:~$ bsh ./hello.bsh
hola món!
Serveix TIC i Programari Lliure, (http://apuntstecnologia.blogspot.com/)
Variable no inicialitzada: void, void
void, en comptes de null o "". A bsh es pot verificar si una variable està inicialitzada comparant-la amb "void".
Més coses: els "scripted objects", una forma de definir objectes a l'estil de com ho fan altres llenguatges d'scripts (recorda Javascript) que aprofiten les estructures de blocs.
ClasseBsh() {
propietat1 = 1;
propietat2 = "un text";
Metode1() {
print("Aquest és el mètode 1");
}
Metode2() {
print("Aquest és el mètode 2");
}
Metode3() {
cbsh2 = ClasseBsh2();
print("cbsh2.propietat1: " + cbsh2.propietat1);
print("cbsh2.propietat2: " + cbsh2.propietat2);
cbsh2.Metode1();
cbsh2.Metode2();
}
ClasseBsh2() {
propietat1 = 1;
propietat2 = "un altre text";
Metode1() {
print("Aquest és el mètode 1 intern");
}
Metode2() {
print("Aquest és el mètode 2 intern");
}
return this;
}
return this;
}
cbsh1 = ClasseBsh();
print("cbsh1.propietat1: " + cbsh1.propietat1);
print("cbsh1.propietat2: " + cbsh1.propietat2);
cbsh1.Metode1();
cbsh1.Metode2();
cbsh1.Metode3();
El resultat és:
albert@atenea:~$ bsh ./classes.bsh
cbsh1.propietat1: 1
cbsh1.propietat2: un text
Aquest és el mètode 1
Aquest és el mètode 2
cbsh2.propietat1: 1
cbsh2.propietat2: un altre text
Aquest és el mètode 1 intern
Aquest és el mètode 2 intern
Remarcar la sintaxi simplificada, i també com es poden fer classes dins de classes sense ĺímit de nivell.
Com encastar BeanShell a una aplicació Java?
Res més senzill. Podem fer una petita classe java que carrega un interpret de BeanShell que executa un script:
package com.sticipl.proves;
public class ProvaBshRun {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new ProvaBshRun();
}
public ProvaBshRun() {
try {
// carrega script i l'executa
System.out.println("carrega script i l'executa");
Interpreter beanshellInterpret = new Interpreter();
beanshellInterpret.source("/home/albert/hello.bsh");
} catch(Exception e) {
System.out.println("Error: " + e.toString());
}
}
}
Per a fer l'execució més senzilla, empaqueto la classe anterior en un jar. Faig servir el següent build.xml per a l'ant
<project name="provabsh" default="build" basedir=".">
<description>
proves amb beanshell
</description>
<!-- estableix propietats globals -->
<property name="src" location="src"/>
<property name="bin" location="bin"/>
<property name="build" location="build"/>
<property name="lib" location="lib"/>
<target name="init">
<!-- time stap -->
<tstamp/>
<!-- Crea el directory bin utilitzat en la compilació -->
<mkdir dir="${bin}"/>
</target>
<target name="compile" depends="init" description="compila els fitxers font" >
<!-- Compila les fonts java de ${src} en ${build} -->
<javac srcdir="${src}" destdir="${bin}">
<classpath>
<pathelement location="${lib}/bsh-2.0b4.jar"/>
</classpath>
</javac>
</target>
<target name="build" depends="compile" description="genera el jar">
<!-- Crea el directori de distribució -->
<mkdir dir="${build}"/>
<jar jarfile="${build}/provabsh.jar" basedir="${bin}">
<include name="**/*.class"/>
<manifest>
<attribute name="Main-Class" value="com.sticipl.proves.ProvaBshRun"/>
<attribute name="Class-Path" value="bsh-2.0b4.jar"/>
</manifest>
</jar>
<copy file="${lib}/bsh-2.0b4.jar" todir="${build}" />
</target>
</project>
Amb el build.xml anterior obtinc una carpeta build on he deixat el jar provabsj.jar que conté la classe ProvaBshRun. El manifest del jar indica que cal fer servir la llibreria bsh-2.0b4.jar.
Puc executar la classe amb:
albert@atenea:~/wk-java/ProvaBsh/build$ java -jar ./provabsh.jar
o bé amb:
albert@atenea:~/wk-java/ProvaBsh/build$ java -jar -cp ./bsh-2.0b4.jar ./provabsh.jar
i el resultat de l'execució és:
carrega script i l'executa
hola món!
Serveis TIC i Programari Lliure, (http://apuntstecnologia.blogspot.com/)
Variable no inicialitzada: void, void
data: Tue Jul 19 18:38:08 CEST 2011
Un cop carregat l'script també es poden manipular-ne els mètodes i propietats. Per exemple, carrego l'script classes.bsh i n'executo mètodes i en canvio propietats:
package com.sticipl.proves;
import bsh.Interpreter;
import java.util.Date;
public class ProvaBshRun {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new ProvaBshRun();
}
public ProvaBshRun() {
Interpreter beanshellInterpret = new Interpreter();
try {
// Avaluació d'instruccions i expressions
// Carrega script i en modifica propietats
System.out.println("Carrega script");
beanshellInterpret.source("/home/albert/classes.bsh");
int iPropietat1 = ((Integer) beanshellInterpret.get("cbsh1.propietat1")).intValue();
String sPropietat2 = (String) beanshellInterpret.get("cbsh1.propietat2");
System.out.println("iPropietat1: " + iPropietat1);
System.out.println("sPropietat2: " + sPropietat2);
iPropietat1 = 25;
beanshellInterpret.set("cbsh1.propietat1", iPropietat1);
sPropietat2 = "aquest és el text canviat des de l'aplicació";
beanshellInterpret.set("cbsh1.propietat2", sPropietat2);
System.out.println("des de l'aplicació");
System.out.println("iPropietat1: " + iPropietat1);
System.out.println("sPropietat2: " + sPropietat2);
System.out.println("des de beanshell");
beanshellInterpret.eval("print(\"cbsh1.propietat1: \" + cbsh1.propietat1);");
beanshellInterpret.eval("print(\"cbsh1.propietat2: \" + cbsh1.propietat2);");
System.out.println("Executa mètode 1:" );
beanshellInterpret.eval("cbsh1.Metode1();");
System.out.println("Executa mètode 2:" );
beanshellInterpret.eval("cbsh1.Metode2();");
System.out.println("Executa mètode 3:" );
beanshellInterpret.eval("cbsh1.Metode3();");
} catch(Exception e) {import bsh.Interpreter;
import java.util.Date;
public class ProvaBshRun {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new ProvaBshRun();
}
public ProvaBshRun() {
Interpreter beanshellInterpret = new Interpreter();
try {
// Avaluació d'instruccions i expressions
// Carrega script i en modifica propietats
System.out.println("Carrega script");
beanshellInterpret.source("/home/albert/classes.bsh");
int iPropietat1 = ((Integer) beanshellInterpret.get("cbsh1.propietat1")).intValue();
String sPropietat2 = (String) beanshellInterpret.get("cbsh1.propietat2");
System.out.println("iPropietat1: " + iPropietat1);
System.out.println("sPropietat2: " + sPropietat2);
iPropietat1 = 25;
beanshellInterpret.set("cbsh1.propietat1", iPropietat1);
sPropietat2 = "aquest és el text canviat des de l'aplicació";
beanshellInterpret.set("cbsh1.propietat2", sPropietat2);
System.out.println("des de l'aplicació");
System.out.println("iPropietat1: " + iPropietat1);
System.out.println("sPropietat2: " + sPropietat2);
System.out.println("des de beanshell");
beanshellInterpret.eval("print(\"cbsh1.propietat1: \" + cbsh1.propietat1);");
beanshellInterpret.eval("print(\"cbsh1.propietat2: \" + cbsh1.propietat2);");
System.out.println("Executa mètode 1:" );
beanshellInterpret.eval("cbsh1.Metode1();");
System.out.println("Executa mètode 2:" );
beanshellInterpret.eval("cbsh1.Metode2();");
System.out.println("Executa mètode 3:" );
beanshellInterpret.eval("cbsh1.Metode3();");
System.out.println("Error: " + e.toString());
}
}
}
El resultat de l'anterior és
cbsh1.propietat1: 1
cbsh1.propietat2: un text
Aquest és el mètode 1
Aquest és el mètode 2
cbsh2.propietat1: 1
cbsh2.propietat2: un altre text
Aquest és el mètode 1 intern
Aquest és el mètode 2 intern
iPropietat1: 1
sPropietat2: un altre text
des de l'aplicació
iPropietat1: 25
sPropietat2: aquest és el text canviat des de l'aplicació
des de beanshell
cbsh1.propietat1: 25
cbsh1.propietat2: aquest és el text canviat des de l'aplicació
Executa mètode 1:
Aquest és el mètode 1
Executa mètode 2:
Aquest és el mètode 2
Executa mètode 3:
cbsh2.propietat1: 1
cbsh2.propietat2: un altre text
Aquest és el mètode 1 intern
Aquest és el mètode 2 intern
En el jar de BeanShell es poden trobar classes per a l'execució remota d'scripts, i també per l'execució en mode servlet. Deixo per a futurs posts la revisió d'aquestes opcions.
En resum s'ha presentat l'aplicació BeanShell i les seves característiques que més immediatament es poden utilitzar en aplicacions java.
Etiquetes de comentaris:
ant,
eines,
java,
programari lliure
dissabte, 16 de juliol del 2011
Fer servir zenity per a construir scripts bash amb interfície gràfica
La creació d'scripts de shell és una tasca habitual en l'administració i explotació de sistemes Unix. En algunes ocasions pot ser que calgui la interacció amb l'usuari. Per exemple, la presentació de menús d'opcions o l'usuari ha de triar què vol fer.
A Linux Ubuntu hom pot trobar eines com el programa Dialog que permet crear elements de interfície gràfica com caixes de text, llistes, botons de sel·lecció... en mode de text. Dialog es feia servir, per exemple, en els instal·ladors de moltes distribucions.
Una opció alternativa és fer servir Zenity. Zenity és la re-escriptura de GDialog, que al seu torn era la versió GNOME de Dialog. Zenity proporciona una forma senzilla de crear interfícies gràfiques per a scripts.
Zenity es pot instal·lar des del Centre de Programari de l'Ubuntu, si cal.
Anem a fer alguns experiments amb aquesta eina. Primer de tot cal conéixer la versió que tenim instal·lada i les opcions.
La versió s'obté amb zenity --version. En el meu cas és la 2.30.
Les diferents opcions s'obtenen amb: zenity --help-all a la línia d'ordres i el resultat és:
Forma d'ús:
zenity [OPCIÓ...]
Opcions d'ajuda:
-h, --help Mostra les opcions d'ajuda
--help-all Mostra totes les opcions d'ajuda
--help-general Mostra les opcions generals
--help-calendar Mostra les opcions del calendari
--help-entry Mostra les opcions de l'entrada de text
--help-error Mostra les opcions d'error
--help-info Mostra les opcions d'informació
--help-file-selection Mostra les opcions del selector de fitxers
--help-list Mostra les opcions de llistes
--help-notification Mostra les opcions de la icona de notificació
--help-progress Mostra les opcions del progrés
--help-question Mostra les opcions de preguntes
--help-warning Mostra les opcions d'avisos
--help-scale Mostra les opcions de l'escala
--help-text-info Mostra les opcions de text informatiu
--help-misc Mostra les opcions miscel·lànies
--help-gtk Mostra les opcions del GTK+
General options
--title=TÍTOL Estableix el títol del diàleg
--window-icon=CAMÍ D'ICONA Estableix la icona de la finestra
--width=AMPLADA Estableix l'amplada
--height=ALÇADA Estableix l'alçada
--timeout=TEMPS D'ESPERA Estableix el temps d'espera del diàleg (en segons)
Calendar options
--text=TEXT Estableix el text del diàleg
--day=DIA Estableix el dia del calendari
--month=MES Estableix el mes del calendari
--year=ANY Estableix l'any del calendari
--date-format=PATRÓ Estableix el format de la data de tornada
Text entry options
--text=TEXT Estableix el text del diàleg
--entry-text=TEXT Estableix el text de l'entrada
--hide-text Amaga el text de l'entrada
Error options
--text=TEXT Estableix el text del diàleg
--no-wrap No habilites l'ajustament del text
Info options
--text=TEXT Estableix el text del diàleg
--no-wrap No habilites l'ajustament del text
File selection options
--filename=NOM DE FITXER Estableix el nom del fitxer
--multiple Permet la selecció de múltiples fitxers
--directory Activa la selecció de només directoris
--save Activa el mode d'estalvi
--separator=SEPARADOR Estableix el caràcter de separació de la sortida
--confirm-overwrite Confirmeu la selecció del fitxer si el nom del fitxer ja existeix
--file-filter=PATRÓ 1 PATRÓ 2 ... Estableix un filtre per al nom de fitxer
List options
--text=TEXT Estableix el text del diàleg
--column=COLUMNA Estableix la capçalera de la columna
--checklist Utilitza quadres de verificació per a la primera columna
--radiolist Utilitza botons de grup per a la primera columna
--separator=SEPARADOR Estableix el caràcter de separació de la sortida
--multiple Permet la selecció de múltiples files
--editable Permet canvis al text
--print-column=NOMBRE Imprimeix una columna específica (el valor per defecte és 1. Es pot usar 'ALL' per a imprimir totes les columnes)
--hide-column=NOMBRE Amaga una columna específica
--hide-header Oculta les capçaleres de la columna
Notification icon options
--text=TEXT Estableix el text de la notificació
--listen Espera ordres de l'entrada estàndard
Progress options
--text=TEXT Estableix el text del diàleg
--percentage=PERCENTATGE Estableix el percentatge inicial
--pulsate Barra de progrés parpellejant
--auto-close Tanca el diàleg quan s'arribi al 100%
--auto-kill Mata el procés para si es prem el botó de cancel·lar
Question options
--text=TEXT Estableix el text del diàleg
--ok-label=TEXT Estableix l'etiqueta del botó D'acord
--cancel-label=TEXT Estableix l'etiqueta del botó Cancel·la
--no-wrap No habilites l'ajustament del text
Warning options
--text=TEXT Estableix el text del diàleg
--no-wrap No habilites l'ajustament del text
Scale options
--text=TEXT Estableix el text del diàleg
--value=VALOR Estableix un valor inicial
--min-value=VALOR Estableix el valor mínim
--max-value=VALOR Estableix el valor màxim
--step=VALOR Estableix el valor dels augments
--print-partial Imprimeix valors parcials
--hide-value Amaga el valor
Text information options
--filename=NOM DE FITXER Obre un fitxer
--editable Permet canvis al text
Miscellaneous options
--about Quant a zenity
--version Imprimeix la versió
Opcions del GTK+
--class=CLASS Program class as used by the window manager
--name=NAME Program name as used by the window manager
--screen=SCREEN X screen to use
--sync Make X calls synchronous
--gtk-module=MODULES Load additional GTK+ modules
--g-fatal-warnings Make all warnings fatal
Opcions de l'aplicació:
--calendar Mostra el diàleg de calendari
--entry Mostra el diàleg d'entrada de text
--error Mostra el diàleg d'error
--info Mostra el diàleg d'informació
--file-selection Mostra el diàleg de selecció de fitxers
--list Mostra el diàleg de llista
--notification Mostra una notificació
--progress Mostra el diàleg d'indicació de progrés
--question Mostra el diàleg de pregunta
--warning Mostra el diàleg d'avís
--scale Mostra el diàleg d'escala
--text-info Mostra el diàleg de text informatiu
--display=DISPLAY X display to use
Anem a provar-los un per un:
Mostrar el diàleg de calendari:
Mostrar una caixa d'entrada de text
El següent script mostra com obtenir el text introduït
#!/bin/bash
textPregunta="Text de la pregunta"
textPredet="Text predeterminat a l'entrada"
textTitol="Títol de la finestra"
resp=$(/usr/bin/zenity --entry --text="$textPregunta" --entry-text="$textPredet" --title="$textTitol" --width=400 --height=200)
echo "la meva resposta ha estat: $resp"
Mostrar una finestra de missatge d'error
Mostrar el diàleg de sel·lecció de fitxers
Mostrar una finestra amb un text informatiu
Mostrar una llista de sel·lecció
Mostrar una icona de notificació al quadre del Gnome
Mostrar una barra de progrés. El truc per a que funcioni és el tub (pipe) que alimenta la progressió de la barra.
Demanar a l'usuari si sí o si no a una pregunta.
Mostrar un fitxer de text
Mostrar un text d'alerta. Adonem-nos que zenity ens proporciona caixes de notificació específiques de info, warning i error, que són els tres nivells que es fan servir més habitualment per a classificar per importància o gravetat els missatges de les aplicacions.
Finalment, obtenir un valor numèric dins un rang
A Linux Ubuntu hom pot trobar eines com el programa Dialog que permet crear elements de interfície gràfica com caixes de text, llistes, botons de sel·lecció... en mode de text. Dialog es feia servir, per exemple, en els instal·ladors de moltes distribucions.
Una opció alternativa és fer servir Zenity. Zenity és la re-escriptura de GDialog, que al seu torn era la versió GNOME de Dialog. Zenity proporciona una forma senzilla de crear interfícies gràfiques per a scripts.
Zenity es pot instal·lar des del Centre de Programari de l'Ubuntu, si cal.
Anem a fer alguns experiments amb aquesta eina. Primer de tot cal conéixer la versió que tenim instal·lada i les opcions.
La versió s'obté amb zenity --version. En el meu cas és la 2.30.
Les diferents opcions s'obtenen amb: zenity --help-all a la línia d'ordres i el resultat és:
Forma d'ús:
zenity [OPCIÓ...]
Opcions d'ajuda:
-h, --help Mostra les opcions d'ajuda
--help-all Mostra totes les opcions d'ajuda
--help-general Mostra les opcions generals
--help-calendar Mostra les opcions del calendari
--help-entry Mostra les opcions de l'entrada de text
--help-error Mostra les opcions d'error
--help-info Mostra les opcions d'informació
--help-file-selection Mostra les opcions del selector de fitxers
--help-list Mostra les opcions de llistes
--help-notification Mostra les opcions de la icona de notificació
--help-progress Mostra les opcions del progrés
--help-question Mostra les opcions de preguntes
--help-warning Mostra les opcions d'avisos
--help-scale Mostra les opcions de l'escala
--help-text-info Mostra les opcions de text informatiu
--help-misc Mostra les opcions miscel·lànies
--help-gtk Mostra les opcions del GTK+
General options
--title=TÍTOL Estableix el títol del diàleg
--window-icon=CAMÍ D'ICONA Estableix la icona de la finestra
--width=AMPLADA Estableix l'amplada
--height=ALÇADA Estableix l'alçada
--timeout=TEMPS D'ESPERA Estableix el temps d'espera del diàleg (en segons)
Calendar options
--text=TEXT Estableix el text del diàleg
--day=DIA Estableix el dia del calendari
--month=MES Estableix el mes del calendari
--year=ANY Estableix l'any del calendari
--date-format=PATRÓ Estableix el format de la data de tornada
Text entry options
--text=TEXT Estableix el text del diàleg
--entry-text=TEXT Estableix el text de l'entrada
--hide-text Amaga el text de l'entrada
Error options
--text=TEXT Estableix el text del diàleg
--no-wrap No habilites l'ajustament del text
Info options
--text=TEXT Estableix el text del diàleg
--no-wrap No habilites l'ajustament del text
File selection options
--filename=NOM DE FITXER Estableix el nom del fitxer
--multiple Permet la selecció de múltiples fitxers
--directory Activa la selecció de només directoris
--save Activa el mode d'estalvi
--separator=SEPARADOR Estableix el caràcter de separació de la sortida
--confirm-overwrite Confirmeu la selecció del fitxer si el nom del fitxer ja existeix
--file-filter=PATRÓ 1 PATRÓ 2 ... Estableix un filtre per al nom de fitxer
List options
--text=TEXT Estableix el text del diàleg
--column=COLUMNA Estableix la capçalera de la columna
--checklist Utilitza quadres de verificació per a la primera columna
--radiolist Utilitza botons de grup per a la primera columna
--separator=SEPARADOR Estableix el caràcter de separació de la sortida
--multiple Permet la selecció de múltiples files
--editable Permet canvis al text
--print-column=NOMBRE Imprimeix una columna específica (el valor per defecte és 1. Es pot usar 'ALL' per a imprimir totes les columnes)
--hide-column=NOMBRE Amaga una columna específica
--hide-header Oculta les capçaleres de la columna
Notification icon options
--text=TEXT Estableix el text de la notificació
--listen Espera ordres de l'entrada estàndard
Progress options
--text=TEXT Estableix el text del diàleg
--percentage=PERCENTATGE Estableix el percentatge inicial
--pulsate Barra de progrés parpellejant
--auto-close Tanca el diàleg quan s'arribi al 100%
--auto-kill Mata el procés para si es prem el botó de cancel·lar
Question options
--text=TEXT Estableix el text del diàleg
--ok-label=TEXT Estableix l'etiqueta del botó D'acord
--cancel-label=TEXT Estableix l'etiqueta del botó Cancel·la
--no-wrap No habilites l'ajustament del text
Warning options
--text=TEXT Estableix el text del diàleg
--no-wrap No habilites l'ajustament del text
Scale options
--text=TEXT Estableix el text del diàleg
--value=VALOR Estableix un valor inicial
--min-value=VALOR Estableix el valor mínim
--max-value=VALOR Estableix el valor màxim
--step=VALOR Estableix el valor dels augments
--print-partial Imprimeix valors parcials
--hide-value Amaga el valor
Text information options
--filename=NOM DE FITXER Obre un fitxer
--editable Permet canvis al text
Miscellaneous options
--about Quant a zenity
--version Imprimeix la versió
Opcions del GTK+
--class=CLASS Program class as used by the window manager
--name=NAME Program name as used by the window manager
--screen=SCREEN X screen to use
--sync Make X calls synchronous
--gtk-module=MODULES Load additional GTK+ modules
--g-fatal-warnings Make all warnings fatal
Opcions de l'aplicació:
--calendar Mostra el diàleg de calendari
--entry Mostra el diàleg d'entrada de text
--error Mostra el diàleg d'error
--info Mostra el diàleg d'informació
--file-selection Mostra el diàleg de selecció de fitxers
--list Mostra el diàleg de llista
--notification Mostra una notificació
--progress Mostra el diàleg d'indicació de progrés
--question Mostra el diàleg de pregunta
--warning Mostra el diàleg d'avís
--scale Mostra el diàleg d'escala
--text-info Mostra el diàleg de text informatiu
--display=DISPLAY X display to use
Anem a provar-los un per un:
Mostrar el diàleg de calendari:
zenity --calendar
Mostrar una caixa d'entrada de text
zenity --entry --text="Entra un text de prova"
El següent script mostra com obtenir el text introduït
#!/bin/bash
textPregunta="Text de la pregunta"
textPredet="Text predeterminat a l'entrada"
textTitol="Títol de la finestra"
resp=$(/usr/bin/zenity --entry --text="$textPregunta" --entry-text="$textPredet" --title="$textTitol" --width=400 --height=200)
echo "la meva resposta ha estat: $resp"
Mostrar una finestra de missatge d'error
zenity --error --text="Descripció de l'error"
Mostrar el diàleg de sel·lecció de fitxers
zenity --file-selection
Mostrar una finestra amb un text informatiu
zenity --info --text="Aquest és el text informatiu"
Mostrar una llista de sel·lecció
zenity --list --text="Llista de prova" \
--column="ID" --column="Nom" --column="Valor" \
"1" "nom1" "valor1" \
"2" "nom2" "valor2" \
"3" "nom3" "valor3" \
"4" "nom4" "valor4"
Mostrar una icona de notificació al quadre del Gnome
zenity --notification --text="Text de la notificació"
Mostrar una barra de progrés. El truc per a que funcioni és el tub (pipe) que alimenta la progressió de la barra.
(
for i in {1..100}
do
echo $i
done
) | zenity --progress --text="Exemple de barra de progrés" --auto-close --percentage=0
for i in {1..100}
do
echo $i
done
) | zenity --progress --text="Exemple de barra de progrés" --auto-close --percentage=0
Demanar a l'usuari si sí o si no a una pregunta.
if zenity --question --text="Vols continuar?" --ok-label="Sí, està molt interessant" --cancel-label="No, m'avorreixo com una ostra"
then
zenity --info --text="Ok, doncs seguim."
else
zenity --error --text="Cap problema, un altre dia serà."
fi
then
zenity --info --text="Ok, doncs seguim."
else
zenity --error --text="Cap problema, un altre dia serà."
fi
Mostrar un fitxer de text
zenity --text-info --filename="help.txt" --height=400 --width=500
Mostrar un text d'alerta. Adonem-nos que zenity ens proporciona caixes de notificació específiques de info, warning i error, que són els tres nivells que es fan servir més habitualment per a classificar per importància o gravetat els missatges de les aplicacions.
zenity --warning --text="Aquest és un text d'alerta"
Finalment, obtenir un valor numèric dins un rang
zenity --scale --text="Quants anys tens?" --min-value=0 --max-value=150
Subscriure's a:
Missatges (Atom)