_________ ____
/ ____/ | / __ \
/ /_ / /| |/ / / /
/ __/ / ___ / /_/ /
/_/ /_/ |_\___\_\
newsgroup it.comp.os.linux.development
mantainer: Ottavio Campana
Ultimo aggiornamento: 1 settembre 2004
Sezione 1: Domande generali.
1.1 Quali linguaggi sono disponibili per sviluppare sotto linux?
1.2 Quali sono gli IDE disponibili per i vari linguaggi?
1.3 Ho creato il mio primo programma in Linux, ma quando lo eseguo
ottengo "command not found".
1.4 Perché è sconsigliato includere la directory corrente nella
variabile d'ambiente PATH?
1.5 Ma scrivere "./nomeprogramma" non è equivalente a "nomeprogramma"?
1.6 Esiste Visual Basic per linux?
1.7 E Delphi?
1.8 Come faccio a fare le parentesi { } ?
1.9 Come faccio a creare un cd live?
1.10 Quanto veloce va il mio programma?
Sezione 2: Compilatore e makefiles.
2.1 Come posso compilare un programma C/C++?
2.2 Il mio programma è suddiviso su più file, come posso creare degli
object e poi linkarli in un unico esegubile?
2.3 Cosa vuol dire "undefined reference to ..."?
2.4 Se volessi imparare ad usare gli autotools?
Sezione 3: Applicazioni grafiche
3.1 Desidero fare un programma con finestre e pulsanti, che strumenti
devo usare?
3.2 E per fare un programma "multimediale"?
3.3 Programmare con la xlib.
Sezione 4: Programmazione di rete
4.1 Come implemento un timeout nella lettura da socket?
4.2 C'è un piccolo tutorial?
Sezione 5: Dubbi sulle licenze opensource
5.1 Come posso distribuire il mio programma se usa librerie lgpl?
5.2 Voglio vendere il mio software, allora non uso librerie gpl.
Sezione 6: Documentazione on line
6.1 Dove trovo una versione aggiornata di queste faq?
6.2 Documenti generali
6.3 Bash
6.4 Programmazione di rete
6.5 Usare seriali e parallele
Sezione 7: Varie ed eventuali su questa faq
7.1 Come ottenere la versione html aggiornata delle faq
------------------------------------------------------------------------
Sezione 1: Domande generali.
1.1 Quali linguaggi sono disponibili per sviluppare sotto linux?
Praticamente tutti. C/C++, Java, Perl, Pascal, Ruby, Python, PHP, Kylix
(Delphi) e molti altri ancora. Molti programmi in Linux sono scritti in
C/C++, tuttavia in questi ultimi anni si stanno affermando anche i
linguaggi interpretati come Ruby o Python. La scelta ovviamente dipende
molto da cosa si intende sviluppare.
1.2 Quali sono gli IDE disponibili per i vari linguaggi?
Tra gli IDE più "trendy" del momento ci sono senz'altro Anjuta e
KDevelop, tuttavia non è da sottovalutare l'uso di semplici editor come
gvim o emacs che hanno un ottimo interfacciamento con i compilatori più
diffusi.
1.3 Ho creato il mio primo programma in Linux, ma quando lo eseguo
ottengo "command not found".
In Linux, se non ne viene esplicitamente indicato il percorso, gli
eseguibili vengono cercati nelle directory specificate dalla variabile
d'ambiente PATH. Solitamente il PATH non include la directory corrente,
quindi devi lanciare il programma con ./nomeprogramma oppure modificare
il PATH affinché includa la directory corrente, ma questo è altamente
sconsigliato.
1.4 Perché è sconsigliato includere la directory corrente nella
variabile d'ambiente PATH?
Perché si rischia di eseguire accidentalmente un programma pericoloso
che si trova nella directory corrente magari al posto del suo omonimo
"buono" che si trova in una directory fidata (come /bin, /usr/bin etc.)
E' opportuno che nel PATH siano inclusi solo programmi "fidati".
1.5 Ma scrivere "./nomeprogramma" non è equivalente a "nomeprogramma"?
Dal punto di vista del file system si, ma poiché la seconda potrebbe far
intendere che "nomeprogramma" sia nel PATH, esso viene eseguito solo se
si trova effettivamente in una delle directory nel PATH.
Invece scrivere "./nomeprogramma" evita questa ambiguità perché
specifica esplicitamente la directory in cui si trova il file e quindi
viene eseguito anche se non si trova nelle directory in PATH.
1.6 Esiste Visual Basic per linux?
Grazie al cielo no. Tuttavia dovrebbe possibile usare Mono
(http://www.go-mono.org) per compilare il codice scritto in
VisualBasic.Net (il compilatore CIL e le librerie grafiche sono ancora
in alfa).
1.7 E Delphi?
La Borland ha sviluppato kylix, un software proprietario, che è il
porting di delphi per linux.
1.8 Come faccio a fare le parentesi { } ?
In ambiente grafico:
{ -> AltGr+7
} -> AltGr+0
In console:
{ -> AltGr+8
} -> AltGr+9
1.9 Come faccio a creare un cd live?
Non è una cosa difficile, soprattutto se si usano gli
strumenti giusti. Se freshmeat.net si trova il programma
bblcd, altrimenti questo documento può essere interessante:
http://am.xs4all.nl/phpwiki/index.php/MainModuleHowto .
1.10 Quanto veloce va il mio programma?
Per misurare le prestazioni del proprio programma ci sono un paio di
programmi che possono essere utili. Il primo si chiama gprof e richiede
che i programmi vengano compilati con i flag -pg e -fprofile-arcs. Dopo
la prima esecuzione pro programma viene generato un file gmon.out e se
lanciate quindi gprof nomefile vedrete il profiling delle funzioni del
programma.
Il secondo programma disponibile si chiama Oprofile ed è repreribile nel
sito http://oprofile.sourceforge.net/news/ . Questo programma è molto
più complesso del precedente, richiede anche che vengan compilati di
moduli per il kernel e le possibilità di analisi richiedono una attenta
lettura della documentazione.
Sezione 2: Compilatore e makefiles.
2.1 Come posso compilare un programma C/C++?
Per il C: gcc nomesorgente.c -o nome_dell'eseguibile
Per il C++ g++ nomesorgente.cpp -o nome_dell'eseguibile
2.2 Il mio programma è suddiviso su più file, come posso creare degli
object e poi linkarli in un unico esegubile?
Per fare questo devi compilare i signoli file con gcc/g++ usando
l'opzione -c che crea, per l'appunto, un object. Il link viene fatto dal
comando ld, o più banalmente si può sempre usare gcc che provvedere a
richiamare ld. L'automatizzazione del tutto è possibile ricorrendo ad un
Makefile.
2.3 Cosa vuol dire "undefined reference to ..."?
Una o più librerie necessarie per il tuo programma non sono state
indicate sulla riga di comando di gcc (o ld). Per fare questo devi
utilizzare lo switch -l. Per convenzione le librerie sono chiamate
libnome.so , se sono dinamiche, oppure libnome.a , se sono statiche. Per
linkarle dinamicamente al tuo eseguibile devi passare a gcc l'opzione
-lnome (senza il prefisso "lib" ne` il suffisso ".so"). Per linkarle
staticamente devi invece linkare il file libnome.a all'eseguibile. Se le
librerie non si trovavano nel path di ricerca (man ld.so) gcc non sara`
in grado di trovarle. Per aggiungere una diretory al path di ricerca
devi usare lo switch -L (es: -L/home/foobar/mylibdir).
2.4 Se volessi imparare ad usare gli autotools?
Un buon modo per cominciare è leggere l'autobook, che è un libro
che spiega appunto come usare gli autotools. Lo si può trovare
all'indirizzo http://sources.redhat.com/autobook e in debian è stato
messo nel pacchetto autobook .
Sezione 3: Applicazioni grafiche
3.1 Desidero fare un programma con finestre e pulsanti, che strumenti
devo usare?
Esistono molte librerie che facilitano questo compito, le più in voga
sono senz'altro le GTK+ (sito http://www.gtk.org/ ) e le QT (sito
http://www.trolltech.com/ ) . Sulle gtk si basa il framework di gnome
(sito http://developer.gnome.org/ ) mentre sulle qt si basa kde. Tra gli
altri toolkit disponibili ci sono le wxwindows.
3.2 E per fare un programma "multimediale"?
Le librerie SDL (http://www.libsdl.org), abbastanza sofisticate e
multipiattaforma, consentono anche la gestione dell'audio e altre
periferiche.
Un'altra possibilità è data dalle librerie SVGA
(http://www.svgalib.org), forse più leggere ma più limitate.
3.3 Programmare con la xlib.
Ci sono un po' di link carini alla codumentazione, tuttavia ricordatevi
che per fare programmi grafici sotto unix in generale non serve
programmare direttamente con la xlib. Vi servirebbe piuttosto se voleste
realizzare un vostro toolkit. I link sono:
http://x.holovko.ru/
http://tronche.com/gui/x/xlib/function-index.html
http://users.actcom.co.il/~choo/lupg/tutorials/xlib-programming/
http://www.cs.rit.edu/usr/local/doc/X11R6.4/X11/xlib.PS
Sezione 4: Programmazione di rete
4.1 Come implemento un timeout nella lettura da socket?
Si deve usare la funzione select. Eccone un esempio (il che non vi
esclude dall'obbligo dalla lettura della manpage della select):
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int socket;
int server;
struct timeval timeout;
fd_set read_set;
int ret;
/* Suppongo che il socket /server/ sia in ascolto su una data porta */
socket = accept(server, NULL, 0);
if (socket == -1) {
perror("accept()");
exit(EXIT_FAILURE);
}
/* Aggiungo /socket/ al set di file descriptors che verra` monitorato
* dalla select
*/
FD_ZERO(&read_set);
FD_SET(socket, &read_set);
/* Timeout dopo 10.5 secondi */
timeout.tv_sec = 10;
timeout.tv_usec = 500000;
ret = select(socket + 1, &read_set, NULL, NULL, &timeout);
if (ret == -1) {
perror("select()");
exit(EXIT_FAILURE);
} else if (ret) {
/* Ci sono dati disponibili, posso iniziare una lettura */
} else {
/* Timeout: Nessun dato disponibile entro 10.5 secondi. Il
* programma agisce di conseguenza (eg. chiude il socket).
*/
}
Nota bene: se il codice viene inserito in un loop la struttura timeout e
il set di fd *devono* essere re-inizializzati prima di ogni chiamata a
select.
4.2 C'è un piccolo tutorial?
Di libri e documentazione internet è piena, basta avere la
pazienza di cercare. Comunque se uno è pigro e vuole leggere
qualcosa in italiano un punto di partenza può essere la guida
"network programming" scritta da Foobar e reperibile all'indirizzo
http://digilander.libero.it/foobar/papers/index.html . Altrimenti un
altro sito interessante è quello del defunto W. R. Stevens, l'autore
di Unix Network Programming e TCP/IP Illustrated, all'indirizzo
http://www.kohala.com/start/ , dove si trova molto materiale.
Sezione 5: Dubbi sulle licenze opensource
5.1 Come posso distribuire il mio programma se usa librerie lgpl?
Il punto 6 della licenza lgpl parla dei lavori proprietari che si basano
sull'uso di librerie lgpl con per esempio la libc. In questo caso chi
vende il prodotto deve:
1) rilasciare pubblicamente sotto licenza lgpl eventuali modifiche
apportate alle librerie lgpl usate.
2) rilasciare i file oggetto ottenuti durante la compilazione del
programma affinché l'utente possa linkarli con versioni più aggiornate
della libreria. La distribuzione dei file .o deve essere garantita
all'utente al mero costo del supporto per almeno tre anni.
3) se non si vogliono rilasciare i file .o , l'unica cosa possibile è
l'implementazione da parte dell'autore di un sistema di caricamento
dinamico di tutte le informazioni e di tutte le funzioni della libreria
invece di includere direttamente la libreria e i suoi header nel
progetto. Questo vuol dire che non si possono includere i file di
intestazione delle librerie gpl nei programmi closed source ma vanno
riscritti e inoltre non si può usare direttamente il meccanismo del
linking dinamico del compilatore ma si devono creare delle funzioni ad
hoc che implementino il caricamento dinamico delle librerie. Per questo
scopo c'è la funzione dlopen, ma quella fornita dalla libreria c della
gnu è sotto licenza lgpl anch'essa e deve quindi essere reimplementata.
5.2 Voglio vendere il mio software, allora non uso librerie gpl.
Questo è un ragionamento poco furbo. Per prima cosa ricordate che
comunque se usate librerie sotto licenza lgpl siete comunque tenuti a
rispettare tutti i vincoli elencati nella domanda precedente. Inoltre ci
sono alcune considerazioni da non sottovalutare:
1) se il programma è scritto in un linguaggio interpretato, per esempio
in python che è molto comodo per scrivere assieme alle gtk programmi
facilmente portabili su più sistemi operativi, non si può chiudere il
sorgente. Quindi tutti gli sviluppatori che temono il furto del codice
devono usare linguaggi di programmazione compilati.
2) è molto improbabile che un vostro cliente si metta a rivendere i
programmi che ha acquistato da voi a meno che non abbia acquistato
qualcosa di banale come "il ricettario di nonna amelia".
3) perché un potenziale cliente della ditta al punto 2 dovrebbe
scegliere di acquistare il software da tale ditta piuttosto che dallo
sviluppatore che può fornire un supporto e una personalizzazione del
software migliore?
4) nell'impotesi che il cliente al punto 3 decida di farvi concorrenza
col vostro software ricordati che anche egli è vincolato dalla licenza
gpl.
Detto questo ognuno è libero di scegliere la licenza che preferisce,
sebbene rinunciare a tutte le librerie può non sempre rivelarsi la
scelta più furba.
Sezione 6: Documentazione on line
6.1 Dove trovo una versione aggiornata di queste faq?
Queste faq vengono postate all'incirca una volta al mese su usenet, in
base ad eventuali aggiornamenti delle stesse e mie dimenticanze.
Sono pubblicate sul web nel mio sito personale, all'indirizzo
http://www.campana.vi.it/ottavio/Linux/faq-icold.txt
6.2 Documenti generali
Appunti di Informatica Libera http://a2.swlibero.org
Guida alla programmazione in linux http://gapil.firenze.linux.it/
6.3 Bash
Bash Advanced Scripting Guide http://www.tldp.org/guides.html
6.4 Programmazione di rete
Network Programming http://digilander.libero.it/foobar/papers/index.html
6.5 Usare seriali e parallele
Per comunicare con la porta parallela puoi cercare
a partire da qui: http://people.redhat.com/twaugh/parport/ e
http://www.torque.net/linux-pp.html.
Per comunicare con la porta seriale puoi cercare a partire da qui:
http://www.tldp.org/HOWTO/Serial-Programming-HOWTO/
Sezione 7: Varie ed eventuali su questa faq
7.1 Come ottenere la versione html aggiornata delle faq
Probabilmente non è una cosa esistenziale, ma mi è stato passato questo
bello script in python da Alessandro Staltari che da solo scarica dal
web la versione txt delle faq e ci aggiunge i tag html. E' una bella
idea, furba e utile e lo riporto, per tutti coloro che vogliono la
versione html aggiornata e per tutti quelli che vogliono vedere un pezzo
di codice python:
######################### inizio file faq.py ###########################
import urllib
import re
output="""
<HTML>
<HEAD>
<TITLE>FAQ</TITLE>
</HEAD>
<BODY><PRE>
"""
f=urllib.urlopen("http://www.campana.vi.it/ottavio/Linux/faq-icold.txt")
input=f.read()
f.close()
i=0
firstid=""
tmp=input.replace(">",">")
input=tmp.replace("<","<")
questionid=re.compile(r"^([0-9.]+) +[^\n]+\n", re.MULTILINE)
continuation=re.compile(r"^[ \t]+.+\n")
m=questionid.search(input[i:])
while (m != None):
output=output+input[i:i+m.start()]
if (firstid!="#"):
output=output+'<A href="#'+m.group(1)+'" name="'+m.group(1)+'top">'
else:
output=output+'<A href="#'+m.group(1)+'top" name="'+m.group(1)+'">'
if firstid=="":
firstid=m.group(1)
else:
if m.group(1)==firstid:
firstid="#"
output=output+m.group(0)
i=i+m.end()
m=continuation.search(input[i:])
while m != None:
output=output+m.group(0)
i=i+m.end()
m=continuation.search(input[i:])
output=output+'</A>'
m=questionid.search(input[i:])
output=output+input[i:]
output=output+"</PRE></BODY>"
f=open(r"faq-icold.html", "w")
f.write(output)
f.close()
########################## fine file faq.py ############################
Stesso programma in ruby, contribuito da Gabriele Renzi:
######################## inizio file faq.ruby ##########################
require 'open-uri'
intestazione="<HTML><HEAD><TITLE>FAQ</TITLE></HEAD><BODY><PRE>"
input=open("http://www.campana.vi.it/ottavio/Linux/faq-icold.txt").read
# gsub effettua una. il ! indica che fa side effect,
# come in scheme (sostituisce in place)
input.gsub!("<","<")
input.gsub!(">",">")
# La regex della domanda, con questa rgx
# Becchiamo pure le domande spezzate in due linee, se sono indentate
domanda =/^(\d+\.\d+)(.*\n)?( .*\n)?/
# Usiamo un hash per tener traccia delle domande
Trovata={}
# Ogni elemento che corrisponde alla regexp viene passato al blocco.
# Se non esiste nell'hash creiamo un link verso il basso,
# se ne abbiamo gia' trovato uno lo creiamo verso l'alto.
input.gsub!(domanda) do |str|
if not Trovata[$1]
Trovata[$1]=true
'<a href="#'+$1+'" name="#'+$1+'top" >'+str+'</a>'
else
'<a href="#'+$1+'top" name="#'+$1+'" >'+str+'</a>'
end
end
open('faq-icold.html','w+').print intestazione,input,'<pre>'
########################### fine file faq.ruby #########################