lunedì 28 luglio 2014

Microsoft incoraggia Oracle migrazioni a SQL Server 2014

Microsoft ha presentato ieri un aggiornamento di SQL Server Migration Assistant (SSMA) per facilitare lo spostamento dei database Oracle esistenti per SQL Server 2014 .

E 'l'ultimo sforzo avanti e indietro tra le due aziende per aiutare gli utenti dei prodotti RDBMS concorrenti passare alla propria offerta di ogni società.

Lo strumento gratuito SSMA è stato annunciato sul blog TechNet SQL Server.

"Disponibile ora, la versione SSMA 6.0 per i database Oracle semplifica notevolmente il processo di migrazione di database da database Oracle a SQL Server", ha detto Microsoft. "SSMA automatizza tutti gli aspetti della migrazione, compresa l'analisi valutazione della migrazione, lo schema e la conversione un'istruzione SQL, la migrazione dei dati, nonché le prove di migrazione per ridurre i costi e ridurre i rischi di progetti di migrazione di database."

SQL Server 2014 - ufficialmente rilasciato nel mese di aprile - presenta un nuovo, tanto pubblicizzata capacità OLTP in memoria , e il nuovo SSMA per Oracle può muoversi automaticamente tabelle Oracle in SQL Server 2014 tabelle in memoria. Microsoft ha detto SSMA in grado di elaborare fino a 10.000 oggetti Oracle in una migrazione e vanta incrementare le prestazioni e la generazione di report.

Il nuovo strumento supporta migrazioni di database Oracle 9i e poi a SQL Server 2005, edizioni e versioni successive. E 'ora disponibile per il download .

Oltre alla capacità di memoria OLTP, SQL Server 2014 funzioni in memoria columnstore per aumentare le prestazioni delle query e ibridi funzionalità cloud-correlati, come la possibilità di eseguire il backup nel cloud direttamente da SQL Server Management Studio. Microsoft ha inoltre sollecitato la sua capacità di utilizzare il Microsoft Azure il cloud come un sito di disaster recovery utilizzando SQL Server 2014 AlwaysOn. SQL Server 2014 è disponibile per la valutazione .


lunedì 21 luglio 2014

Sfruttando l'utente Modelli mentali di creare efficaci interfacce utente

I principi di grande design dell'interfaccia utente partono da un luogo diverso rispetto dei principi che portano al grande design dell'applicazione. Entrambi finiscono esattamente nello stesso posto, però.

By Peter Vogel2014/07/18

Ammettilo: Se la vostra stanza è fredda e il termostato è impostato per la temperatura più alta che si desidera, si accende il termostato più in alto, non è vero? Lo facciamo perché tutti abbiamo questo modello mentale di termostati che è organizzato attorno "realizzazione" - crediamo che se chiediamo solo nostro forno per fare un po 'di più di quanto vogliamo, quindi il forno ci arriva a quello che vogliamo, più veloce. E 'lo stesso modello mentale vostro capo usa quando si dà una scadenza impossibile ("stirata"): Un termine impossibile ti farà lavorare di più e, forse, incontrare il vero termine che il vostro capo è mantenere da voi.

Come funzionano le cose
, ma non è questo il modo in cui il termostato effettivamente funziona (e probabilmente non è il modo di lavorare, sia, ma il tuo capo non lo sa). Il termostato accende il forno su e lascia via fino a raggiungere la temperatura desiderata ... e poi il termostato dà completamente, chiudendo il forno spento. Il termostato non ottiene il forno a lavorare di più per arrivare a una temperatura, si ottiene solo il forno a lavorare più a lungo . Impostazione del termostato più alto non si fa arrivare alla temperatura desiderata più velocemente. Nel nostro cuore sappiamo che, naturalmente, ma abbiamo impostato la temperatura più alta, comunque. (Detto questo: io capisco che ci fosse un modello di Cadillac che ha funzionato in questo modo in modo che, come hai più vicino alla temperatura desiderata, la ventola che soffia aria calda rallentato Ma quella era l'eccezione, non la regola. , quindi per favore non portarlo nei commenti. prego).

Ora diamo un'occhiata al calendario. Come pensate del vostro programma? Pensi di esso come un elenco ordinato di eventi? Oppure, come molte persone fanno, pensi di vostro programma come un insieme di secchi (Lunedi, Martedì, Mercoledì e così via) con un numero limitato di slot (09:00, 09:30, 10:00 e così via) che può essere riempito? Sotto il cofano, ovviamente, Outlook probabilmente non mantenere il vostro calendario come un elenco ordinato di eventi (che è il motivo per cui si possono avere due eventi programmati per lo stesso tempo) ... ma che non è come voi, o la maggior parte delle altre persone, pensate. Probabilmente avete Outlook configurato per visualizzare la pianificazione utilizzando il modello di benna / fessura, per esempio.

Pubblicità

Un ultimo esempio: Probabilmente pensiamo dei quadranti sulla nostra frigoriferi controllo del "freddo" del frigorifero ottiene quando, in effetti, i quadranti sul controllo del frigorifero quanto calore viene rimosso dal frigorifero. Queste discrepanze tra la nostra comprensione e ciò che sta realmente accadendo, non sono sempre un problema - lo scollamento tra il nostro modello mentale per il nostro frigorifero e il meccanismo di fondo cade in una zona "nessun danno, nessun fallo", per esempio.

Tuttavia, Don Norman, nel suo meraviglioso libro, " La caffettiera del masochista ", parla di tentativo di controllare la temperatura del suo frigorifero freezer quando la disconnessione importava. Il frigorifero aveva due quadranti e Norman presume che una linea controllava la freddezza della parte principale del frigorifero, mentre l'altro quadrante controllava la freddezza del freezer. Egli era in grado di impostare la temperatura interna del congelatore per quello che voleva fino a quando non si rese conto che aveva frainteso come i quadranti lavorati. Si è scoperto che una linea controllata la temperatura globale del frigorifero e l'altra linea controllata come quella fredda è stato distribuito tra il congelatore e il corpo principale del frigorifero. Con questo nuovo modello mentale, Norman è stato finalmente in grado di gestire la temperatura del suo frigorifero. O ha comprato un frigorifero che corrispondeva il suo modello mentale ... non ricordo quale.

Abbinamento Modelli ... e mancanza
Ovviamente, quindi, il modello mentale di un'applicazione e il modello mentale dell'utente devono raggiungere una certa comprensione - anche se, come Outlook e il "nessun danno, nessun fallo" modello per la gestione dei frigoriferi dimostrano, i due non hanno identici. Ma, come ho suggerito in articoli precedenti , tutto dipende da chi sono i vostri utenti siano. Non ci sono regole dure e veloci nel design dell'interfaccia utente.

Ad esempio, pensate della vostra stufa ha muniti di una fonte di riscaldamento centralizzato che è possibile indirizzare ad un luogo o in un altro (fuochi, forno)? Probabilmente no. Ma se si possiede un fornello Aga, si sta andando a correre in problemi reali, se non si pensa in quel modo, perché più o meno, è così che funziona un fornello Aga.

E non fare l'errore di pensare questi esempi non sono correlati alla programmazione: come sviluppatore, avete a che fare con i modelli mentali degli utenti per tutto il tempo. Ad esempio, avete le tabelle del database create per sostenere l'integrità referenziale, il che significa, per esempio, che è necessario aggiungere una riga al vostro tavolo SalesOrderHeader prima di poter aggiungere una riga al vostro tavolo SalesOrderDetail. Tuttavia, i clienti probabilmente pensano delle cose che vogliono acquistare (le righe SalesOrderDetail) prima di pensare a come vogliono avere l'ordinanza (la riga SalesOrderHeader). Costruire un'applicazione che richiede all'utente di fornire informazioni sulla consegna e poi cercare di giustificare che il design per l'utente facendo riferimento alla "integrità referenziale" non è andare a lavorare (non chiedetemi come lo so questo). Dovrete scrivere l'applicazione per rendere il lavoro mentale del modello dell'utente: i dati della prima, intestazioni tardi.

E se non si ottiene mentale giusto modello dell'utente, le cose brutte accadono alle buone aziende. Ho lavorato per una società che ha fatto di gomma specialità. Siamo stati, di fatto, nel settore carta da parati: Quando si esegue fuori di carta da parati a metà una stanza, non si torna a comprare "più wallpaper" - si torna indietro e comprate più dello stesso disegno. Probabilmente torna al negozio hai il primo lotto da e anche cercare di ottenere di più da parati dallo stesso lotto della tintura come sfondo originale. Questo è stato il modello mentale clienti della mia azienda seguirono ei nostri sistemi sono stati istituiti per supportare tale modello mentale.

La mia azienda ha ottenuto acquistata da un'altra azienda che ha fatto della gomma di merce: Era più come vendere le viti di carta da parati. Quando si esegue fuori di viti non avete bisogno di una corrispondenza esatta delle viti che hai usato prima; a comprare di più, probabilmente si va al negozio di ferramenta più conveniente a vostra disposizione. Questo è stato il modello mentale dei suoi clienti e questo è ciò che le applicazioni aziendali sono stati istituiti a sostegno.

La mia azienda commutato ai sistemi software della nuova società ed è stato un incubo. I nostri clienti esistenti sarebbero richiamare, cercando più gomma da un specifico lotto di gomma. Per trovare quella partita, i nostri utenti sono stati ridotti a scorrere i record di produzione cercando di trovare il lotto e quindi correlando le informazioni di produzione con record di inventario, al fine di trovare dove è stato memorizzato tale partita. E mentre i nostri utenti che hanno fatto, i nostri clienti hanno aspettato (con impazienza) al telefono.

Perché Designing Interfaces Matter
Il modello mentale utente potrebbe significare che la scrittura di una singola applicazione potrebbe non essere possibile. Se stai progettando un servizio per aiutare la gente va a vedere un film, ci sono almeno due diversi modelli mentali avresti bisogno di prendere in considerazione. Se si sta sostenendo un fanatico di film, è necessario supportare la ricerca su filmati specifici e fare progetti su come vedere quel film - forse anche un viaggio in un'altra città per farlo. Oppure si potrebbe essere sostenendo spettatori occasionali: qualcuno che decide di andare a vedere un film e poi controlla per vedere ciò che è disponibile. Questi due diversi modelli mentali stanno andando a richiedere due applicazioni diverse.

E non sono solo gli utenti che influenzano l'interfaccia: Dipende anche su storie degli utenti. Quando stavo parlando il calendario e affermando che si pensa ad esso come una serie di secchi e non come un elenco ordinato, c'era probabilmente una voce nella tua testa dicendo: "Aspetta un minuto! A volte penso del mio programma come elenco ordinato: `Devo fare questo, allora devo fare questo, allora ho .... '" E questo è vero: Nel breve periodo (il "cosa devo fare adesso" storia dell'utente), si fa spesso pensare al vostro programma come un elenco ordinato di eventi si deve lavorare.

Tutto questo è il motivo per cui, naturalmente, Outlook consente di guardare il vostro programma come un elenco di eventi e perché a volte utilizzare tale impianto. Si può capire perché il libro di Norman era originariamente chiamata "La psicologia del masochista ".

Che cosa fare (e non fare) dovete fare
così, ancora una volta, ti sto chiedendo di strisciare dentro la testa dei vostri personaggi, questa volta per capire come gli utenti pensano il problema si sta cercando di aiutarli con . Il vostro compito è quello di decidere come l'interfaccia utente esprimerà quel modello mentale per gli utenti.

Sei libero, ovviamente, per presentare agli utenti un, migliore modello mentale più recente per affrontare il problema (come il frigorifero di Norman). Se lo fai, il vostro compito è quello di rendere quel modello chiaro per gli utenti nell'interfaccia utente e, inoltre, hanno l'interfaccia utente dimostrare una ragione convincente per cui l'utente deve cambiare il loro modello mentale. Frigorifero di Norman ha fatto nessuno dei due.

Con ogni probabilità, ci saranno differenze tra il modo in cui l'interfaccia utente presenta il problema e il modo in cui l'applicazione "realmente" funziona. Il tuo prossimo lavoro è quello di colmare questa lacuna con il codice.

Ma come programmatore, che è quello che si dovrebbe fare comunque: L '"io" e "D" delle massime codice SOLID riferimento ai principi Interface segregazione e dipendenza inversione. Nel loro insieme, un modo di guardare a questi due principi è che le interfacce nostre classi espongono dovrebbero essere progettati per il cliente che utilizza tali classi. Le nostre interfacce di classe dovranno esprimere il modo in cui il cliente vuole lavorare e per semplificare la vita del cliente. L'interfaccia non dovrebbe essere una semplice espressione degli algoritmi o strutture di tabelle che la classe incapsula sottostanti.

Quindi davvero non importa se si sta progettando un utente o un'interfaccia di classe: è il design per rendere la vita più facile per il cliente e per abbinare il modo in cui i clienti vogliono risolvere i loro problemi. L'algoritmo sottostante può funzionare in un modo completamente diverso ... ma questo non importa. Si scrive il codice per tradurre tra l'apparenza e la realtà. Questo è il tuo lavoro.

Ehi, siamo i programmatori! Siamo in grado di far funzionare nulla.
Corso Visual Studio - Corso asp.net
Corso C# - Corso PHP - Corso Joomla - Corsi asp.net - Corso Java

giovedì 17 luglio 2014

Come di refactoring per Dependency Injection, Parte 3: applicazioni di grandi dimensioni

Ondrej Balas continua la sua serie sul refactoring del codice per l'iniezione di dipendenza, concentrandosi sulle tecniche che rendono più facile refactoring di applicazioni complesse.

Con Ondrej Balas2014/07/16

Dependency Injection è un paradigma di programmazione che consente di scrivere codice molto più gestibile attraverso la promozione di accoppiamento lasco di oggetti. (Nel caso in cui li hai persi, questo articolo è una continuazione della Parte 1 e Parte 2 nella mia serie sulla dependency injection.) In una nuova o piccola applicazione, refactoring di Dependency Injection è relativamente semplice. Poiché l'applicazione di essere riorganizzata cresce più grande, tuttavia, può diventare piuttosto l'impresa. Fortunatamente, c'è un modo per semplificare il problema e refactoring tuo pezzo applicazione per pezzo.

Refactoring un'applicazione complessa
Prima di iniziare il refactoring, è necessario sapere che cosa cercare. Sono una persona molto visiva, così ogni volta che mi occupo di refactoring di un grande o complessa applicazione, comincio da lavagna tutte le componenti e le loro interazioni. Vedendo tutti i progetti sul tavolo mi permette di vedere facilmente dove il punto di ingresso nell'applicazione è, che è dove voglio mettere la mia Composizione Root.

Ho poi passo attraverso il codice, entrando in ogni costruttore, e cerco costruttori che nuovi oggetti in se stessi, come questo:

NotificationEngine pubblico ()
{
  _dataStream = new SomeDataStream ();
  _emailSender = new EmailSender ();
  . _recipientAddress = new ConfigurationReader () GetNotificationRecipientAddress ();
  _logger = new FileSystemLogger ("somepath.txt");
}
Quando vedo questo, è quasi garantito gli oggetti che vengono creati qui hanno i loro costruttori proprio come questo, creando una complessa catena di costruttori. E se questo non bastasse, gli oggetti sono probabilmente anche creati in altri luoghi, rendendo le cose ancora più confuse.

Come ho già detto in precedenza nella serie, l'obiettivo è quello di sostituire eventualmente costruttori come quella con i costruttori che prendono le loro dipendenze come parametri anziché crearli, come questo:

Pubblicità

NotificationEngine pubblico (IDataStream Datastream, IEmailSender EmailSender,
  IConfigurationReader configurationReader, ILogger logger)
{
  _dataStream = Datastream;
  _emailSender = EmailSender;
  _recipientAddress = configurationReader.GetNotificationRecipientAddress ();
  _logger = logger;
}
In un'applicazione complessa, questo è molto più facile a dirsi che a farsi. Una pietra comune passo è quello di creare la nuova costruzione, ma lasciare il costruttore predefinito originale al suo posto. Il costruttore originale deve quindi essere modificato per mettere in nuova costruzione, come questo:

NotificationEngine pubblico ()
    : Questa (nuova SomeDataStream (),
    nuovo EmailSender (),
    nuovo ConfigurationReader (),
    nuovo FileSystemLogger ("somepath.txt"))
  {
  }
Non interrompere qualsiasi codice esistente consente di refactoring dell'applicazione un pezzo alla volta. E quando si utilizza un Dependency Injection (DI) container per creare gli oggetti, la maggior parte dei contenitori selezionerà automaticamente il costruttore più complicata, piuttosto che quella di default (ne parleremo più avanti).

Questa tecnica, nota come "Bastard Injection," è controverso e generalmente considerato un anti-modello. Questo è perché è spesso usato solo come un modo per facilitare il test di unità, mentre i costruttori di default sono ancora gli unici costruttori utilizzati nel codice di produzione. Può anche causare il codice per creare implicitamente dipendenze assembly che non sarebbero altrimenti dovrebbe essere di riferimento. Ad esempio, se IEmailSender era un'interfaccia definita nello stesso progetto come costruttore, ma non era EmailSender, creando la EmailSender all'interno del costruttore creerebbe una dipendenza su tale altro gruppo.

Eppure, trovo Bastard iniezione di un ripiego incredibilmente utile in pratica - ma non dovrebbe essere l'obiettivo finale.

Una volta ho completato un primo passaggio attraverso l'applicazione, mi metto alla ricerca del "nuovo" parola chiave utilizzata in altri luoghi. Un'altra cosa comune che vedo è campi che hanno le nuove implementazioni dato a loro e nessun costruttore presente, come questo:

public class NotificationEngine
{
  readonly privato IDataStream _dataStream = new SomeDataStream ();
  readonly privato IEmailSender _emailSender = new EmailSender ();
  . stringa readonly privato _recipientAddress = new ConfigurationReader () GetNotificationRecipientAddress ();
  readonly privato ILogger _logger = new FileSystemLogger ("somepath.txt");
   
  / / Il resto della classe
}
Questo dovrebbe essere riscritta come se tutti gli oggetti di istanze stava avvenendo all'interno del costruttore predefinito.

Iniezione Setter
Finora ho usato Constructor Injection, che è di gran lunga la forma più comunemente usata di DI. A seconda dello scenario, altri modelli potrebbero essere più efficaci. Un tale modello, Iniezione Setter (noto anche come Injection proprietà), è utile quando c'è un default ragionevole e locale per la dipendenza da impostare. Prendete il codice in Listato 1 , per esempio.

Listato 1: Un'implementazione di iniezione Setter utilizzando gli attributi Ninject
privato IEmailSender EmailSender;
[Inject, Optional]
pubblico IEmailSender EmailSender
{
  ottenere
  {
    if (EmailSender == null)
    {
      EmailSender = new DefaultEmailSender ();
    }
    ritorno EmailSender;
  }
  set {EmailSender = value; }
}
Anziché impostare la proprietà EmailSender all'interno del costruttore, è etichettato con il Inject e gli attributi opzionali. L'attributo Inject dice Ninject per impostare subito che la proprietà dopo aver creato l'oggetto, ma che, da sola, potrebbe non essere sufficiente. Se l'attributo opzionale non è impostato anche, Ninject sarà un'eccezione se non c'è presente vincolante per IEmailSender. Grazie alla combinazione di entrambi gli attributi, è possibile creare una proprietà che è impostato solo se esiste un legame - altrimenti, verrà utilizzata la DefaultEmailSender.

Gestione di più Costruttori
Quando si tratta di più costruttori, è importante sapere quale sarà chiamato dal contenitore DI quando un oggetto del richiesto. Questo varia leggermente da contenitore a contenitore, ma il principio generale è che il contenitore utilizzerà il costruttore con il maggior numero di parametri può risolvere completamente. Ad esempio, si supponga di avere tre costruttori:

1: public Quirble ()
2: public Quirble (IFoo foo)
3: public Quirble (IFoo foo, bar IBar)
Se il contenitore ha solo vincolante per IFoo, ma non IBar, selezionerà costruttore No. 2. Se ha un legame sia IFoo e IBar, selezionerà costruttore No. 3. Se non ha né vincolante, selezionerà il costruttore predefinito (n. 1). Con Ninject, è possibile forzare un costruttore specifico per essere chiamato utilizzando l'attributo Inject:

1: [Inject] Quirble pubblico ()
Utilizzando l'attributo Inject, che stai dicendo Ninject usare sempre quel costruttore e ignorare tutti gli altri costruttori.

Ci sono alcuni casi particolari in cui alcuni contenitori non comportano lo stesso come gli altri. Prendete questo esempio:

1: public Quirble (IFoo foo)
2: public Quirble (IBar bar)
In questo caso, se il contenitore ha un legame sia per IFoo e IBar, Ninject genererà un'eccezione a causa di un costruttore ambigua. Nella stessa situazione, Castello di Windsor selezionerà uno dei costruttori. In realtà, secondo la sua documentazione , "Se ci sono più di un costruttore più golosi, si utilizzerà qualsiasi di essi. È indefinito che uno e non si deve dipendere da Windsor raccogliendo sempre lo stesso."

Scomposizione
Rifattorizzare un'applicazione complessa per utilizzare l'iniezione di dipendenza può sembrare complicata, ma con tecniche come Bastard iniezione può essere suddiviso in tante piccole refactoring. È inoltre possibile utilizzare tecniche come l'iniezione setter in luoghi dove il passaggio ad iniezione del costruttore sarà difficile. E sappiate che i contenitori differenti si comportano in modi diversi, quindi, quando you'e non so come si comporterà il contenitore, è sempre una buona idea di controllare la documentazione.

Up next: configurazione XML, uno sguardo a vari contenitori DI e come creare una architettura plug-in con l'uso del legame basato convenzione.
Corso Visual Studio - Corso asp.net
Corso C# - Corso PHP - Corso Joomla - Corsi asp.net - Corso Java

venerdì 11 luglio 2014

Per sincronizzare o non sincronizzare

Commenti Un lettore di in un articolo che ho scritto sulla programmazione asincrona di Entity Framework trasformato in un interessante dibattito sul ruolo della programmazione asincrona nel mondo moderno (interessante per me, in ogni caso). Back in the day, che ho usato per raccontare gli sviluppatori che il modo più sicuro per creare un bug che non avrebbero mai essere in grado di rintracciare era quello di scrivere quello che eravamo abituati a chiamare "applicazioni multi-threaded." Ho dato seminari sulla progettazione di applicazioni multi-threaded, dove, perversamente, ho passato i primi cinque minuti per spiegare perché non si dovrebbe fare multi-threading a meno che non si doveva assolutamente. E poi, naturalmente, mi piacerebbe andare a casa e scrivere applicazioni multi-threaded per i miei clienti: fare come dico, non come faccio io.

Ovviamente, i processori multi-core ei nuovi strumenti asincroni in. NET Framework hanno cambiato l'ambiente tremendamente. Ma ho scoperto durante la discussione che penso ancora di programmazione asincrona come qualcosa che si fa quando si hanno problemi specifici nell'applicazione che solo la programmazione asincrona risolverà. Nel mio modello mentale, vorrei scrivere il mio codice sincrono, vedere dove ho avuto problemi di reattività, e quindi riscrivere le parti della applicazione per utilizzare codice asincrono (che, a volte, potrebbe innescare alcune modifiche architettoniche alla domanda). Solo se potevo vedere i problemi reattività di anticipo dovrei iniziare a scrivere codice asincrono. Ma ero sempre facendo come alternativa alla mia modalità predefinita: la scrittura di codice sincrono.

I commentatori hanno contestato che, effettivamente dire che (in molti casi) la programmazione asincrona dovrebbe essere la scelta di default dello sviluppatore. Come un lettore sottolineato, un thread bloccato può richiedere fino a un megabyte di memoria mentre è al minimo. Integrare la programmazione asincrona in grado di eliminare quella perdita.

Naturalmente, vi è una questione di sapere se vi preoccupate che megabyte: per circa $ 10.000, posso ottenere un server con 256 gigabyte di RAM - che è più di un quarto di un milione di quei megabyte che stavamo preoccuparsi di salvataggio. Il chargeback a pieno carico per un programmatore di computer potrebbe inghiottire che diecimila dollari in un paio di giorni; quindi se il programmatore sta spendendo molto tempo "extra" per salvare la strana megabyte, non ha senso fiscale.

Ma ecco il punto: se i costi di scrivere il codice in modo asincrono dall'inizio è "banale" (per citare un altro lettore), non dovrei essere iscritto in modo asincrono dall'inizio? Non avrebbe bisogno di acquistare server e mentre il costo incrementale per il tempo sviluppatore iscritto async dall'inizio potrebbe non essere zero, potrebbe facilmente essere trascurabile.

Si tratta di un potente argomento. Non credo che ci sono ancora (Vedo ancora gli strumenti asincroni come è facile fare la programmazione asincrona quando ho bisogno di farlo ), ma mi può venire in giro. Ho ancora preoccupo per quei bug non è mai rintracciare, però. L'eccezione EF solleva quando si esegue più processi asincroni sullo stesso contesto mi sembra essere il tipo di problema che non si sarebbe verificato durante lo sviluppo, ma potrebbe sollevare la sua ripugnante testa in produzione, per esempio. Ma io possa essere preoccupante inutilmente.
Corso Visual Studio - Corso asp.net
Corso C# - Corso PHP - Corso Joomla - Corsi asp.net - Corso Java

venerdì 4 luglio 2014

Microsoft Open Sources suo Open XML SDK

E 'stato realizzato un progetto su Github.
L' annuncio è stato fatto da Doug Mahugh sul sito Web di Microsoft Open Technologies. Egli ha bloggato che il progetto è stato messo su Github sotto la licenza Apache 2.0, e sarà gestito da. NET Foundation di Microsoft. L'Open XML SDK è disponibile dal 2007, e "fornisce agli sviluppatori un insieme di classi fortemente tipizzate che lo rendono facile da leggere, scrivere e manipolare le parti e il contenuto in un documento Open XML come il DOCX, XLSX e PPTX creati da Microsoft Office ", ha scritto Mahugh.
Fondamentale per l'SDK è l'API System.IO.Packaging. I formati di file Office Open XML è "un dialogo aperto, internazionale,  ECMA-376, Second Edition  e  ISO / IEC 29500  standard ", secondo la documentazione Microsoft che accompagna l'SDK.
Un correlati posto di Brian Jones della piattaforma di sviluppo di Office ha detto che l'SDK è stato scaricato più di 10.000 volte al mese, in media, ed è particolarmente popolare nei settori sanitario e bancario. Un grafico a torta elencato le usi più popolari di SDK. Di gran lunga, il n ° 1 utilizzo è stato per la generazione di documenti (40 per cento), seguita dalla manipolazione dei contenuti (18 per cento), l'importazione / esportazione dati (10 per cento) e il gruppo di documenti (8 per cento).
.. NET Foundation, per gestire la crescente insieme di tecnologie Framework di Microsoft NET che vengono open source, è una nuova organizzazione; è stato presentato lo scorso aprile durante la conferenza costruzione di Microsoft. Il clou di questo spettacolo è stato quando il compilatore piattaforma. NET, già il nome in codice "Roslyn," era open source nel corso di un keynote, di tifo da parte del pubblico.