Inserito da
noandrea
alle
01:37
0
commenti
System.out.println(a[a.length]);
Contiuano gli esperimenti con Django.
Una quindicina di giorni di prove, letture e googlate varie mi hanno permesso di farmi un'idea più precisa di questo bellissimo framework.
Mi piace un sacco, si possono fare un sacco di cose in empi brevissimi, funzioni che, sviluppate in php secondo i metodi che uso abitualmente, richiedono un sacco di codice noioso e ripetitivo, in Django richiedono due righe di codice e un template (penso ad esempio a pagine con liste di record, o alla visualizzazione e validazione dei dati che arrivano da un form, o al modulo per l'autenticazione e la gestione degli utenti e delle sessioni, o a quello per gli rss...). Quasi tutto quello che serve per mettere su un sito web è implementato da qualche parte, e se non lo è farlo è velocissimo, estendendo le funzionalità già presenti.
E Python mi sembra davvero un bel linguaggio, con tante strutture dati comodissime da usare e una libreria standarda molto ampia, totalmente object-oriented e che permette di scrivere codice molto compatto... Bisogna solo abituarsi alla sintassi, strana per chi arriva da C/Java: l'indentazione obbligatoria, i due punti dopo i for, i while e gli if, ma tutto cose di poco conto...
Difetti di Django? Non è immediato iniziare a ragionare come vuole lui, se non si è abituati a procedere secondo il principio MCV, e bisogna smanettare un po' per farlo andare su Apache (non ci sono ancora riuscito, Andrea però sì, probabilmente sulla mia macchina c'è qualche pasticcio di troppo...).
Inserito da
Dave
alle
21:35
0
commenti
Ho una nuova fiammante cofigurazione che ha l'unico difetto di essere universal binary.
compilata a manina (tranne php)
Apache 2.2.4
Php 5.2.2
Python 2.5.1
Subversion 1.4.3 (con supporto ssl)
e poi
apr(-util) 1.2.8
libneon 0.25.5 (per forza se no subversion non va)
che bello.
come sono contento.
La top 2 delle cose che fanno girare i coglioni di brutto è:
Php
Python
il resto lisio.
ciao ciao ciao.
Inserito da
noandrea
alle
02:18
0
commenti
Tag: osx
Una notte passata a compilare.
Per avere un solo apache con subversion, php e python.
Per avere tutto NON universal ma solo per intel
Il risultato è che:
Inserito da
noandrea
alle
00:49
1 commenti
Come tutti sappiamo, è possibile settare un campo di testo in sola lettura con l'attributo readonly:
<input type="text" id="i" value="pippo" readonly="readonly" />
Funziona sia con IE7 che con Firefox.
Ma se vogliamo settare la proprietà dinamicamente, con javascript?
Sembrerebbe facile:
var i = document.getElementById("i");
i.setAttribute("readonly", "readonly");
Con FF funziona, con IE7 no.
La soluzione è fare così:
var i = document.getElementById("i");
i.readOnly = true;
che funziona con entrambi i browser.
Sarebbe bello sapere perchè la prima soluzione non va bene...
Inserito da
Dave
alle
10:35
1 commenti
Tag: firefox, html, ie7, javascript
This is a translation of "AmuleGUI sul mac"
aMuleGui is a great thing, many users can control a single aMule through a remote interface. But there are not any precompiled version of aMuleGui for Mac. So this is what you need to do for making aMuleGui working on Mac.
You will need gcc installed, this mean that you need the Developer Tools that can be find on the dvd of OSX or can be download from the Apple developer site.
Than you have to download the wxWidgets from here and naturally aMule from here. I'm talking about sources obiouvsly =).
The version that I've used are:
wxMac 2.6.4
aMule 2.1.3
Now ride the terminal and write:
>tar xzf wxMac-2.6.4.tar.gzI have used the --disable-sound parameter for the configure because I've get an error building wxWidgets on the library responsable for the sound, so fu** off sh**** library, but (maybe) this error depends on my system.
>cd wxMac-2.6.4
>mkdir macbuild
>cd mackbuid
>../configure --disable-sound
>make
>sudo make install
>cd ../../Now we make the pretty mac-style application
>tar xjf aMule-2.1.3.tar.bz2
>cd aMule-2.1.3
>mkdir macbuild
>cd macbuild
>../configure --enable-amule-gui \
--with-wx-config=/usr/local/bin/wx-config
>make
>mkdir -p amulegui.app/Contents/MacOSvoilà, aMuleGui is ready.
>cp src/amulegui amulegui.app/Contents/MacOS
Inserito da
noandrea
alle
01:11
0
commenti
Non mi ricordo quando il Dave e me abbiamo messo su questo blog ma Google Analytics la dice lunga:
la maggior parte dei visitatori usa firefox
la maggior parte dei visitatori cercava info su amulegui (seguita da django)
la maggior parte dei visitatori usa il mac
e per finire indovina un po'
la maggior parte dei visitatori è italiana
QUINDI
per amore della scienza (il Dave e io) tradurremo i post di maggior successo in inglese tanto per vedere cosa accade.
ciao a tutti.
Inserito da
noandrea
alle
01:02
1 commenti
Oslo è una città che io non so come dire quanto è bella. Magari non bella da visistare tanti giorni perchè non è che ci siano moltissime cose da vedere, ma sicuramente da viverci deve essere una gran figata.
Se non ti preoccupa il freddo.
Se non ti spaventa la notte sempre.
Insomma la cosa perfetta sarebbe abitarci durante l'estate, l'estate è proprio estate, 20 ore (o giù di lì) di sole al giorno, i fiordi le barche e poi un salto a Capo Nord.
Davvero Davvero Bella
Inserito da
noandrea
alle
10:52
0
commenti
Tag: viaggi
Grandi novità, mentre ero a Oslo è uscita la nuova versione di Ubuntu la 7.04. La sto già installando, le new features si trovano qui.
L'upgrade è davvero semplice anche da interfaccia grafica, una cosa mai vista!!!
L'unico cosa che non mi piace tanto è che nella versione server il webserver di default è apache 2.2.*, ciò significa che bisogna paioccare un po' per installare subversion.
Inserito da
noandrea
alle
10:39
0
commenti
Oilà Dave, ti ricordi quando studiavamo linguaggi e ambienti? che bei tempi.
Per ricordarli ti scrivo l'espressione regolare per riconoscere (per quanto sia possibile) se un mail è una replay analizzando il subject:
^((r|R)(e|E)?:( )?)+.*Se matcha questo con buone probabilità è una replay, ma ti dirò di più, ti dirò come strippare via il testo antico che la replay si porta dietro:
>+.*\r\nQuesto naturalmente da usare con un replaceAll.
Inserito da
noandrea
alle
00:22
1 commenti
aMuleGUI è una gran figata, permette a più utenti di collegarsi a un unico amule con un interfaccia remota. Purtroppo non ci sono versioni precompilate di aMuleGui per il mac. Perciò ecco come fare per compilarlo (sul mac).
Bisogna avere gcc installato, insomma bisogna installare i Developers Tools che sono nel dvd di OSX oppure si scaricano dal sito di Apple.
Bisogna scaricare wxWidgets da qui e naturalmente aMule da qui. Sto parlando dei sorgenti naturalmente.
Le versioni che ho usato sono
wxMac 2.6.4
aMule 2.1.3
Terminale e si parte.
>tar xzf wxMac-2.6.4.tar.gzNel configure il parametro --disable-sound l'ho messo perchè mi dava sempre un errore in compilazione sulla libreria che gestisce il suono per cui aff..... la libreria, ma non è detto che su altre macchine ci sia questo problema.
>cd wxMac-2.6.4
>mkdir macbuild
>cd mackbuid
>../configure --disable-sound
>make
>sudo make install
>cd ../../Ora facciamo la bella applicazzioncina
>tar xjf aMule-2.1.3.tar.bz2
>cd aMule-2.1.3
>mkdir macbuild
>cd macbuild
>../configure --enable-amule-gui --with-wx-config=/usr/local/bin/wx-config
>make
>mkdir -p amulegui.app/Contents/MacOSet voilà.
>cp src/amulegui amulegui.app/Contents/MacOS
Inserito da
noandrea
alle
11:39
5
commenti
Tag: osx
Una cosa che manca ad Eclipse è il soft wordwrap, che è molto comodo specie se si scrivono lunghe stringhe di testo, ad esempio delle query, o se si ha un monitor con scarsa risoluzione orizzontale.
Leggendo in giro pare che sia abbastanza problematico implementarlo, a causa dei mille controlli che Eclipse fa sulle righe (correttezza sintattica e tutte queste cose qua) e che diventano più complessi da fare se c'è il wordwrap.
Esiste però un plugin che lo permette, si chiama Virtual Word Wrap. E' ancora in beta, e quando lo si attiva la numerazione delle righe non è corretta, ma funziona ed è comodo da usare perchè lo si attiva/disattiva dal menu contestuale.
Inserito da
Dave
alle
11:52
0
commenti
Eccoci giunti finalmente alla grande transizione. Finalmente, dopo tanto (forse troppo) tempo ci si separa dal nido. L'unica speranza è di non essere costretti a tornare indietro. E' un po' come il suicidio, non lo puoi sbagliare.
Inserito da
noandrea
alle
12:07
0
commenti
Oggi stavo cercando di scrivere del testo un un'immagine generata da php 5 usando le librerie GD. Sembrava uno cosa molto semplice, bastava usare la funzione imagetfttext() passandogli tra i vari parametri anche il nome del font da usare.
E invece no, ottenevo sempre dei simpatici quadratini: il font non veniva caricato. Dopo un bel po' di ricerche sul manuale di php e su google, ho scoperto che le versioni più recenti delle GD richiedono l'uso di font OpenType, che è un formato sviluppato da Microsoft e Adobe e a quanto pare abbastanza diffuso e con dei vantaggi rispetto agli altri tipi di font.
OSX di default non ha font OpenType, ma con un'altra ricerca ho trovato un font OpenType gratuito da scaricare, l'ho downloadato, l'ho copiato nella directory dello script, ho rilanciato lo script stesso e oplà, il testo è magicamente comparso sull'immagine.
La mia prima miniapplicazione funziona: mostra l'elenco dei guestbook e l'elenco dei messaggi per ogni guestbook presente. Aggiungiamo ora l'inserimento di un nuovo messaggio.
Editiamo quindi il template messaggi.html, aggiungendovi al fondo un semplice form HTML:
[form method="post" action="ins/"]
[fieldset]
[label]Nome:[/label[input type="text" name="nome"][br /]
[label]Email:[/label][input type="text" name="mail"][br /]
[label]Messaggio:[/label][textarea name="msg"][/textarea][br /]
[input type="submit" value="Inserisci"]
[/fieldse][/form]
Notate l'action del form: punta a ins/.
Editiamo quindi il file urls.py, aggiungendo la riga
(r'^guestbook/(?P
alla variabile urlpatterns.
Ora dobbiamo solo creare la nuova view, dentro a views.py:
def insmessage(request, guestbook_id):
m = Messaggi()
m.autore = request.POST['nome']
m.email = request.POST['mail']
m.messaggio = request.POST['msg']
m.guestbook_id = guestbook_id
m.data = strftime("%Y-%m-%d %H:%M:%S")
m.save()
return HttpResponseRedirect('/guestbook/'+guestbook_id+'/')
Due parole: questa funzione crea un nuovo oggetto di tipo Messaggi (perchè ho chiamato la classe al plurale non me lo spiego), ne setta gli attributi con i dati che arrivano tramite post, attraverso il dictionary POST dell'oggetto HttpRequest, lo salva su db e fa un redirect alla pagina che mostra i messaggi.
Tutto molto semplice, ovviamente esiste anche un dictionary GET per dati in get.
Il sistema di django è molto bello, la separazione tra template, models e views è netta e molto chiara e effettivamente una volta che si prende la mano mi pare che possa essere un ottimo strumento per velocizzare lo sviluppo.
Inserito da
Dave
alle
21:30
0
commenti
Andrea ha cambiato il template, io ho aggiunto alla barra laterale il feed dei bookmark miei e suoi su del.icio.us. Ci piace? Proviamo un po' e poi vediamo.
Inserito da
Dave
alle
09:55
0
commenti
Tag: blog, del.icio.us, rss
Non mi ricordo mai i comandi at per dialogare con un modem attraverso la seriale
Questa pagina ha un bell'elenco per i modem in generale.
Questa ne ha ancora di più ma sono meno chiari.
Questi sono quelli più utili da usare con Hyper Terminal di BigM.
Da notare che dove c'è n o k bisogna sostituire con un numero.
ATEn Command Echo (0=OFF, 1=ON )
ATQn Result Code Suppression (0=OFF, 1=ON )
ATVn Define Response Format (0=NUMERIC, 1=TEXT)
AT+CMGF=n Message Format (0=PDU, 1=TEXT)
AT+CSCA Service Centre Address
AT+CMGL List Messages
AT+CMGR=k Read Message (k = message number)
AT+CMGD=k Delete Message (k = message number)
Inserito da
noandrea
alle
20:01
0
commenti
Usando java.io.DataInputStream non si può.
Si può invece con java.io.RandomAccessFile, che ha un bellissimo metodo seek() definito così:
void
seek(long pos)
Sets the file-pointer offset, measured from the beginning of this file, at which the next read or write occurs.
Così dovrei riuscire a stampare i colori dei pixel di una file bitmap dall'angolo in alto a sinistra in giù senza caricare tutta l'immagine in memoria.
Inserito da
Dave
alle
13:41
0
commenti
Tag: java, RandomAccessFile
questo post è un fake, solo per avere più tag java di tutti gli altri. anche se Dave domani mi srtozza.
Inserito da
noandrea
alle
03:00
0
commenti
Tag: java
Infinite Jest - David Foster Wallace
La figata più figosa che ciè. No davvero sto libro è una cosa, ma una cosa che neanche te lo immagini. Bè te lo immagini se qualcuno che ti conosce bene ti ha assicurato che ti piacerà, ma tant'è. E' un po' lunghetto, più di unocontrezeridietro, tanto per capirci, il che, dato lo splendore, è una feature. Le prime 2,3cento pagine sono tutte in salita, mica per scherzo, una fatica del diavolo, ma se ce la fai......ommioddio se ce la fai come te la spassi, e poi non finisce più. una meraviglia. Solo che poi ti viene un po' di tristezza a pensare che lo finirai perchè non sai se troverai mai una cosa così, multistratificata e multidimensionale. Ma tanto tutte le cose finiscono, questa un po' più lentamente del solito (con relativezza parlando); quindi meglio.
Inserito da
noandrea
alle
02:45
0
commenti
Tag: libri
Dopo aver letto e copiato pari pari il tutorial di Django, ottenendo una simpatica applicazione web per gestire sondaggi, ho deciso di provare a fare qualcosa da solo.
Cercherò di sviluppare una webapp per gestire e visualizzare un guestbook.
Per prima cosa occore creare l'applicazione con il comando
python manage.py startapp guestbookQuesto comando genera una directory di nome guestbook, con dentro 3 file: __init__.py, models.py, views.py.
from django.db import modelsOra dobbiamo dire a Django che il guetbook fa parte del progetto corrente, editando il file settigs.py e aggiungendo 'mysite.guestbook' a INSTALLED_APPS.
class Guestbook(models.Model):
nome = models.CharField(maxlength=200)
data_creazione = models.DateTimeField('data di creazione')
class Messaggi(models.Model):
guestbook = models.ForeignKey(Guestbook)
messaggio = models.TextField()
autore = models.CharField(maxlength=50)
data = models.DateTimeField('data messaggio')
email = CharField(maxlength=50)
BEGIN;Per fargliele eseguire, si usa il comando python manage.py syncdb, che sicronizza il database con gli oggetti definiti.
CREATE TABLE `guestbook_messaggi` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`guestbook_id` integer NOT NULL,
`messaggio` longtext NOT NULL,
`autore` varchar(50) NOT NULL,
`data` datetime NOT NULL,
`email` varchar(50) NOT NULL
);
CREATE TABLE `guestbook_guestbook` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`nome` varchar(200) NOT NULL,
`data_creazione` datetime NOT NULL
);
ALTER TABLE `guestbook_messaggi` ADD CONSTRAINT guestbook_id_referencing_guestbook_guestbook_id FOREIGN KEY (`guestbook_id`) REFERENCES `guestbook_guestbook` (`id`);
COMMIT;
class Guestbook(models.Model):Salviamo, puntiamo il browser su http://www.miosito.com/admin/ e vedremo l'interfaccia del backoffice.
# i vari campi
class Admin:
pass
class Messaggi(models.Model):
# i vari campi
class Admin:
pass
urlpatterns = patterns(Django usa un sistema di espressioni regolari per associare gli url alle fuzionalità di un applicazione: nel nostro caso, quando viene chiamata un url del tipo http://www.miosito.com/guestbook, il server caricherà la view contenuta in mysite.polls.views.index. Cos'è una view? E' un tipo di pagina, che serve ad una specifica funzione e ha un suo template.
(r'^guestbook/$', 'mysite.polls.views.index'),
(r'^guestbook/(?P\d+)/$', 'mysite.guestbook.views.showmessages'),
)
from django.template import Context, loaderLa view index estrae tutti gli oggetti Guestbook dal db, in ordine discendente rispetto alla data di creazione, carica il template, crea un context, ovvero un dizionario che mappa nomi di variabili del template su nomi di oggetti, renderizza il template con il context e restituisce un oggetto HttpResponse.
from mysite.guestbook.models import Guestbook
from django.http import HttpResponse
def index(request):
gb = Guestbook.objects.all().order_by('-data_creazione')
t = loader.get_template('guestbook/index.html')
c = Context({
'gb': gb
})
return HttpResponse(t.render(c))
(Ho messo le quadre al posto di <> se non blogger schizza.)
[html]
[body]
[center]Guestbook[/center]
{% if gb %}
[ul]
{% for g in gb %}
[li][a href="{{g.id}}"]{{g.nome}}[/a][/li]
[/ul]
{% endfor %}
{% else %}
[center]Nessun guestbook presente[/center]
{% endif %}
[/body]
[/html]
def showmessages(request, guestbook_id):
g = Guestbook.objects.get(pk=guestbook_id)
m = Messaggi.objects.filter(guestbook=guestbook_id).order_by('-data')
t = loader.get_template('guestbook/messaggi.html')
c = Context({
'm': m,
'g': g
})
return HttpResponse(t.render(c))
[html]
[style]
h3 {
font-size: 14px;
font-family: verdana;
font-weight: bold;
}
h1 {
font-size: 16px;
font-family: verdana;
font-weight: bold;
}
p {
font-size: 10px;
font-family: verdana;
font-weight: normal;
border: 1px solid;
width: 200px;
}
[/style]
[body]
[center]
[h1]{{ g.nome }}[/h1]
[br]
{% for mex in m %}
[div]
[h3]{{mex.autore}} {{mex.data}} {{mex.email}}[/h3]
[p]{{mex.messaggio}}[/p]
[/div]
{% endfor %}
[/center]
[/body]
[/html]
Inserito da
Dave
alle
01:50
2
commenti
Lo so che tutti conoscono log4j e che tutti lo usano e non si accorgono neanche di farlo, però io ho iniziato solo ora a usarlo e sono felice...
Quindi la prima cosa da fare è scaricarlo da qui. E' un progetto ospitato da apache e questo dovrebbe bastare per dissipare qualsivoglia dubbio (ahah come parlo bene).
Seconda cosa aggiungerlo al classpath della propria applicazione (sto parlando di java nel caso non fosse chiaro); quindi un bell'
import org.apache.log4j.Logger;poi nella dichiarazione delle variabili di classe
import org.apache.log4j.PropertyConfigurator;
static Logger logger = Logger.getLogger(MyClass.class);MyClass è il nome della classe su cui stai lavorando.A questo punto se l'applicazione ha un main ci puoi dovresti mettere un
PropertyConfigurator.configure("log4j.properties");che dice al logger dove recuperare le info di configurazione, infatti non vogliamo dover ricompilare tutte le volte che decidiamo di modificare delle impostazioni per il logger.
# Set root logger level to DEBUG and its only appender to A1.Non ciò voglia di spiegare cosa significa perciò copiare e incollare e tener presente che è una configurazione piuttosto agricola.
log4j.rootLogger=INFO, A1
#log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1=org.apache.log4j.RollingFileAppender
log4j.appender.A1.File=theLog.log
log4j.appender.A1.MaxFileSize=1024KB
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%d] %-5p %c - %m%n
logger.info("o che bello");o
logger.warn("Brrrrr");o
logger.debug("noiosezze");o
logger.error("ahiahahia");o
logger.fatal("AAAAAAAAAHHHHHHHHHHHHHHH");o farsi dei logger personalizzati tipo
logger.porcaPutt("Questo non dovrebbe mai accadere");ma per i logger personalizzati RTFM.
import org.apache.log4j.Logger;e
static Logger logger = Logger.getLogger(MyClass.class);con i vari
logger.info() logger.warn()etc..
Inserito da
noandrea
alle
23:55
0
commenti
Come si fa a convertire un numero da signed ad unsigned?
Il problema è venuto fuori cercando di leggere in Java un file bmp, formato che salva le informazioni dei colori dei pixel in tre byte per pixel, uno per componente RGB. I valori sono ovviamente solo interi positivi su 8 bit, ma leggendoli Java li interpreta come interi con segno a 7 bit, ovvero come numeri codificati in complemento a due su 8 bit.
Come si fa la conversione?
Così:private static int unsignedByteToInt(byte b) {
Il metodo legge un byte, lo mette in AND con il valore esadecimale FF e restituisce il risultato castato a int.
return (int) b & 0xFF;
}
Gli int di Java sono su 4 byte, l'AND lascia inalterati gli otto bit della variabile b e mette a zero i 24 bit in più. In questo modo il bit del segno (quello più significativo) è zero e il numero viene interpretato come positivo.
E vualà, ecco il valore che cerchiamo.
Inserito da
Dave
alle
19:44
1 commenti
Tag: complemento a 2, java
Fomentato dalla lettura di alcuni post su forum vari e dal tutorial sul sito, ho deciso di installare Django. Django è un framework scritto in python che, stando a quello che dice il sito, dovrebbe semplificare moltissimo la creazione di applicazioni web, specialmente gestionali, cms e applicazioni database-driven. Il tutorial, anche se purtroppo è incompleto al momento, fa vedere delle bellissime cose, e allora mi sono deciso a dargli un'occhiata.
L'installazione non è stata liscissima: dopo aver scaricato il tar.gz contenente Django, ho lanciato lo script di install, che ha funzionato al primo colpo. Al momento però di provare a fare delle operazioni che richiedevano accesso a mysql, ho scoperto che la distribuzione di python che c'è su OSX non ha le librerie necessarie. Allora le ho scaricate, da qui. Al momento di installarle, mi hanno richiesto setuptools versione0.6c5 o superiori (a quanto ho capito, setuptools è un sistema per python che semplifica le installazioni dei pacchetti aggiuntivi, una specie di synaptic o giù di lì). Ho scaricato anche questo, da qui, e alla fine sono riuscito a far andare il tutto.
Ora django può accedere al db, e molto presto mi dedicherò alle sue API, che sembrano molto interessanti.
E per la gioia di Andrea, ho pure trovato un plugin di Eclipse per Python, PyDev.
Inserito da
Dave
alle
02:23
2
commenti
Oggi, mentre tentavamo di studiare CPS, ad Andrea e me è venuta l'idea di aprire un blog per raccogliere frammenti di codice, programmi fatti da noi, how-to, link utili e/o interessanti e cose di questo genere.
Detto fatto, ecco il blog. Chissà se avremo la voglia e la costanza di portarlo avanti. O anche solo la voglia di customizzarlo a dovere.
E Andrea mi ha già chiamato perchè non riusciva ad accettare l'invito a diventare coautore. Iniziamo bene.
Inserito da
Dave
alle
17:30
1 commenti