Ho scoperto che Firefox ha un piccolo problemino con la gestione del wordwrap in una textarea: utilizzando wrap=”hard” , al post della textare il testo scritto o incollato che sia viene rivisitato forzatamente da firefox rendendolo illegibile oltre a sballare completamente la formattazione inserita dall’utente.

Esempio:

Prima del post:
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry’s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.

Dopo il post: 
Lorem Ipsum is simply dummy
text of the printing and typesetting industry.
Lorem Ipsum has been the industry’s
standard dummy text ever since the
1500s, when an unknown
printer took a galley of type
and scrambled it to make a type
specimen book. It has survived not
only five centuries, but also the leap
into electronic typesetting,
remaining essentially unchanged.
It was popularised in the 1960s with
the release of ecc ecc…

Non è ben chiaro questo comportamento, cioè del perchè Firefox decide arbitrariamente di mandare a capo ogni 2-3 parole il testo inserito.

Per risolvere il problema però è necessario usare wrap=”soft” e non ci sarà nessuna formattazione arbitraria.

Può capitare di dover eseguitre le repliche transazionali programmaticamente da una pagina asp.net o da un webservice .net (perchè? vari motivi :) )

Con SQL Server 2000 era un grosso problema perchè il database server non offriva particolari strumenti ma con la 2005 è tutto molto più semplice potento sfruttare direttamente gli assembly .NET che lo stesso SQL Server Management Studio usa per performare queste azioni.

I namespace da usare sono:
using Microsoft.SqlServer.Replication;
using Microsoft.SqlServer.Management.Common;

Cominciamo con avere la lista delle repliche transazionali attive sul database server: 

  1. DataSet subscriptions = null;
  2. using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
  3. {
  4.    ServerConnection serverConn = new ServerConnection(conn);
  5.    ReplicationMonitor monitor = new ReplicationMonitor(serverConn);
  6.    monitor.LoadProperties();
  7.    monitor.PublisherMonitors[0].LoadProperties();
  8.    subscriptions = monitor.PublisherMonitors[0].EnumSubscriptions(PublicationType.Transactional, SubscriptionResultOption.AllSubscriptions);
  9. }
  10. return subscriptions;

La classe ReplicationMonitor offre la possibilità di avere la lista delle repliche, come in questo caso, partendo dal Publisher server prendendo come esempio una Push Subscription installata sul Publisher stesso. Il metodo LoadProperties() è importantissimo e permette di popolare la collection PublisherMonitors.

Il metodo EnumSubscriptions torna un DataSet con una sola tabella popolato con le proprietà delle repliche transazionali disponibili. Di seguito le colonne “principali” che servono per eseguire una replica:
- publication: nome della replica
- subscriber: nome SQL del subscriber della replica
- subscriber_db: nome database a cui punta la replica
- last_distsync: data ultima replica
- status: stato della replica (enum ReplicationStatus)
- warning: avviso di stato della replica (enum ReplicationWarnings)

Per lanciare la replica:

  1. using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
  2. {
  3.   ServerConnection serverConn = new ServerConnection(conn);
  4.   TransSubscription s = new TransSubscription();
  5.   s.ConnectionContext = serverConn;
  6.   s.PublicationName = publicationName;
  7.   s.DatabaseName = s.ConnectionContext.DatabaseName;
  8.   s.SubscriberName = subscriberName;
  9.   s.SubscriptionDBName = subscriberDataBaseName;
  10.   s.ConnectionContext.Connect();
  11.   s.SynchronizeWithJob();
  12.   s.ConnectionContext.Disconnect();
  13. }

L’operazione è asincrona quindi è necessario aggiornare la lista delle repliche ogni 1-2 secondi (infatti neanche il Replication Monitor del Management Studio non da lo stato della replica in realtime).

Buona replica :D

Anche se il div da mostrare ha uno z-index di 100 e l’oggetto flash non ha z-index o è inferiore, suFireFox il div viene mostrato sotto l’oggetto flash stesso. Su IE7 e IE6 funziona senza nessun workaround.

Per ovviare velocemente al problema, nel tag <embed> dell’oggetto flash inserire l’attributo wmode=”transparent” . Il div andrà sopra all’oggetto flash in modo corretto. Questo workaround è applicabile su FireFox e Netscape e Safari, ma purtroppo su Opera non funziona.

Googlando però ho trovato questo esempio: Ok, è assurda come soluzione ma a quanto pare all’autore del post funziona.

… ovvero come leggere il filesystem della memoria telefono o della memory card da Ubuntu 7.10 a un dispositivo dotato di un sistema operativo Symbian S60 3rd tramite bluetooth.

Gli strumenti che fornisce Ubuntu 7.10 “nativamente” sono abbastanza validi per le precedenti versioni. Per la 3rd bisogna installare gnome-vfs-obexftp… quindi

sudo apt-get install gnome-vfs-obexftp

Testato su un E51 :)

Raramente scrivo di cose personali sui blogs e questo doveva rimanere un contenitore di tips&tricks puramente tecnici ma oggi ho una storia da raccontare.
Ho deciso di comprare un Nokia E51, un aggegino stupendo e pieno di belle cose interessanti e mi sono messo alla ricerca del prezzo più vantaggioso fra EBay, trovaprezzi.it, ciao.it e altri aggregatori. Alla fine l’ho trovato su PianetaShop.it . Tramite le solite recensioni che si trovano in giro ho letto che ERA un negozio affidabile e mi sono convinto per l’acquisto (3 marzo 2008) e ho scelto come indirizzo di spedizione la reception del posto in cui lavoro.
La procedura post vendita è andata avanti senza intoppi e il pacchettino è stato spedito tramite corriere SDA il giorno dopo dell’acquisto (4 marzo 2008) , il venditore mi ha inviato il tracking number e la merce è arrivata il 5 marzo alla filiale Milano 1 dell’SDA.  Il 6 marzo trovo sul sito dell’SDA alla sezione di stato della spedizione la dicitura “Causa F.M. (contattare il call center): ho chiamato il call center (numero 199 a pagamento, roba da spendere 2 euro per sentire solo la voce automatica) e non mi hanno saputo dire niente di interessante.
Stendiamo un velo pietoso sull’utilità, la cortesia e la qualità in generale del call center SDA: le centraliniste sono molto scortesi e non sono assolutamente interessate ad aiutare il cliente, le informazioni che ti forniscono sono le stesse che trovi sul sito inserendo il tracking number.
Il 7 marzo, altro messaggio “Causa F.M. (contattare il call center): stessa storia del giorno prima allora decido di andarlo a prendere alla filiale e dispongo un fermo deposito.
La mattina dell’8 marzo chiamo la filiale SDA per sincerarmi che il pacchettino sia effettivamente lì e la voce automatica mi informa che gli uffici sono chiusi: richiamo il call center SDA per chiedere spiegazioni e mi viene risposto che la filiale è chiusa ma il servizio fermo deposito è attivo MA non è possibile contattarli in nessun modo (= il call center non ha il numero del fermo deposito, la spiegazione ufficiale è “NON ESISTE”).
Deciso comunque ad andare in fondo alla cosa, sono andato in filiale (40km da milano, 1.80 euro pedaggio andata e ritorno) e finalmente trovo il mio pacchettino (grande gaudio!). La persona al fermo deposito mi spiega che la spedizione ha avuto dei problemi: i corrieri hanno perso il numero di vettura ed è stato necessario riattaccarlo e il corriere che si occupa della zona di consegna “ha iniziato a lavorare da una settimana e non sa come codificare la mancata consegna” e quindi indicava sempre “Causa Forza Maggiore”.
Il pacchettino mi viene consegnato e scopro che il venditore ha sbagliato clamorosamente l’indirizzo di spedizione: nell’ordine ho indicato un indirizzo di spedizione diverso da quello di fatturazione - la mia residenza - (come tutti gli e-commerce permettono di fare) ma il venditore ha inspiegabilmente segnato sulla spedizione l’indirizzo di fatturazione.
Appena tornato a casa ho mandato una email molto arrabbiata al venditore chiedendo spiegazioni ed esigendo il rimborso delle spese di spedizione, del carburante, del pedaggio autostradale e delle telefonate all’sda.