martedì 24 marzo 2015

Di Windows 10 SDK Ora Out come Anteprima

I membri di Windows Insider possono accedere al Software Development Kit di anteprima per la creazione di applicazioni universali sulla prossima piattaforma Windows 10.

By Michael Domingo2015/03/23

Una versione di anteprima di Windows 10 Software Development Kit è ora disponibile per gli sviluppatori che si sono registrati per il Programma Insider di Windows. Che, secondo Cliff Simpkins, Senior Product Manager per Windows Platform Developer Marketing, in un post del blog di oggi.

Microsoft presentato l'App Platform universale in primi di marzo in occasione della Conferenza Mobile World di Barcellona; la parte SDKis delle attrezzature che è stato annunciato con la piattaforma.

Uno degli obiettivi per Windows 10 e l'App Platform Universale è una semplificazione del processo per la creazione di applicazioni che sono, da un punto di vista degli sviluppatori, universale - costruire una sola volta e l'applicazione si adatta al dispositivo su cui sta girando. La capacità è lì adesso, con Windows 8.1 e un po 'di un work-around. Con Windows 10, è fatto un po 'più facile con l'incorporazione della UX Adaptive e la sua interfaccia utente singolare. La capacità di interfaccia utente controlla per configurarsi in fase di esecuzione in base all'interazione dell'utente con l'applicazione è anche una chiave per la nuova piattaforma, e così è il riconoscimento di API utilizzata (tramite contratti API).

Per gli sviluppatori, la salsa segreta sarà in Windows 10 SDK che è stato rilasciato in anteprima oggi. S. Somasegar, Microsoft Corporate Vice President della Divisione Developer, blog separatamente i dati degli strumenti di sviluppo per la piattaforma di Windows 10. Ha detto che gli sviluppatori possono utilizzare qualsiasi versione di Visual Studio 2015 dello strumento di programmazione di scelta, e le applicazioni dovrebbero essere in grado di funzionare su qualsiasi dispositivo Windows 10 con nessuna configurazione specifica per dispositivo aggiuntivo. L'SDK fornisce strumenti per l'utilizzo di caratteristiche che sono specifiche del dispositivo; è tutta una questione di scrivere applicazioni per verificare la presenza così API o estensioni SDK specifici.



Ha detto che questa anteprima contiene anche gli strumenti per testare le applicazioni su un test di PC con Windows 10, con emulatori per Windows 10 Phone e Xbox a venire. Somasegar chiama anche gli strumenti di debug e test che sono disponibili in anteprima che sono stati annunciati nelle settimane da MWC: " strumenti nuovi di diagnostica , XAML debug UI , e tutti gli strumenti di profiling "in varie fasi di sviluppo possono essere testati.

Somasegar scrive anche che le applicazioni potranno beneficiare di miglioramenti delle prestazioni, come applicazioni saranno compilati in .NET nativo all'interno del Windows Store prima che gli utenti li installa in Windows 10 dispositivi.

Si può leggere su altre funzionalità di Windows 10 SDK sul blog di Somasegar; per scaricare l'SDK, andate qui (dove si può anche leggere sui requisiti software prima di scaricarlo).

Chi l'Autore
You Tell 'Em, lettori: Se avete letto fino a questo punto, sapere che Michael Domingo, Visual Studio Magazine Editor in Chief, è qui per servire voi, cari lettori, e vuole ottenere le informazioni che così riccamente meritano. Che notizie, contenuti, temi, problemi non si vuole veder trattati in Visual Studio Magazine? Ha ascolto a mdomingo@1105media.com .

giovedì 5 marzo 2015

Come semplificare il temuto compito di Documentazione Pubblicazione con Pages GitHub

Non è necessario reinventare il sito Web di pubblicare alcuni documenti per il vostro progetto. Approfitta delle pagine GitHub per costruire quasi point-and-click siti doc.

Con Terrence Dorsey2015/03/04

Documentazione progetti software non deve essere difficile. La parte di scrittura è difficile da evitare (se avrò alcuni suggerimenti su che più tardi). Si può prendere cura della parte dell'editoria abbastanza facilmente, tuttavia, senza cadere nella tana del coniglio di scrivere il proprio framework CMS o Web - anche se questi continuano ad essere le strategie di procrastinazione popolari per gli sviluppatori che preferisce scrivere il codice che la documentazione.

Ecco il trucco: Se si sta utilizzando il tuo codice GitHub repository di origine, è possibile usufruire del servizio di built-in Pages GitHub dispongono di pubblicare, di accoglienza, e anche costruire e rendere la documentazione Web-based.

Basta che ospita il sito della documentazione di per sé non è una tale impresa incredibile. In questi giorni di solito è un processo semplice per far girare un server e spingere il tuo sito. Solitamente, ma non sempre. Ci sono i costi di tempo e denaro per impostare e gestire un server Web, anche se si sta lavorando da soli. E questa è la migliore delle ipotesi. Prova la navigazione del big-società la burocrazia per ottenere un server approvato ... e questo è prima di navigare il big-processi aziendali IT per ottenere installato e funzionante.

D'altra parte, se si dispone di un account di GitHub, GitHub pagine si presenta come parte del pacchetto. Se si dispone di depositi privati, come ad esempio attraverso un conto GitHub aziendale, è possibile anche sfruttare le funzioni di autenticazione e autorizzazione organizzazione built-in per limitare chi può vedere e contribuire alla documentazione pubblicata con GitHub Pages.

GitHub ha i wiki, ma sono fortemente limitato di funzionalità rispetto a GitHub Pages, che ha accesso a praticamente qualsiasi cosa si potrebbe impiegare per un sito Web normale compreso CSS personalizzato, JavaScript, framework Web, la compilazione automatica e più.

Così come funziona tutta questa magia? Prendiamo GitHub Pages per un giro con due semplici progetti che dimostrano le basi.

HTML statico
La versione più semplice di un progetto GitHub Pagine coinvolge tre elementi: un repository, un ramo GH-pagine per il progetto in file di progetto e HTML che di pronti contro termine nel ramo gh-pagine spinto al repo. Questo è tutto.



GitHub prende tutti i file HTML nel ramo GH-pagine e serve come un sito Web presso l'URL http: // [accountName] .github.io / [repoName]. Così, per esempio, ho creato un progetto di esempio che vive al http://tpdorsey.github.io/simple-docs/ . Ecco una breve passeggiata attraverso il processo per la creazione di un sito come questo.

In primo luogo, se non siete già lavorando con Git e GitHub, controllare il mio aprile 2014 articolo, " controllo del codice sorgente di Git e Mercurial , "per i collegamenti al software e tutorial. Per questo primo esempio, avrete solo bisogno Git e un account GitHub. Il Git sito ha un download per Windows che include Git Bash e Git Gui, e vi posso assicurare che sia il lavoro bene anche su Windows 10 Technical Preview.

Sulla macchina, creare una cartella per un nuovo progetto, quindi inizializzare il repository Git:

git init
Prima di fare qualsiasi altra cosa, creare e passare al ramo gh-pagine. Non c'è davvero alcun motivo per lavorare in master per questi file:

git checkout -b gh-pagine
Creare una pagine Web coppia. Ho creato un file index.html e una pagina secondaria, page1.html. Per questo progetto le pagine devono essere pagine Web reali, proprio come ci si crea per qualsiasi altro sito. La mia semplice file è in Listato 1 .

Listing 1: Il mio file index.html semplice

Può essere semplice o complicato come volete, ma devono essere file HTML statici.

Commit i file:

add git.
git commit -m "Guardate ma! Documentation"
Ora vai a GitHub e creare un repository per la documentazione. GitHub vi mostrerà un esempio del comando per impostare questo nuovo repo come il telecomando, che farete per il vostro repo doc locale:

GIT aggiungere remota origine [posizione repo]
Ora è possibile spingere i file dal repo documentazione locale di un ramo gh-pagine su GitHub:

git origine spinta gh-pagine
E questo è tutto! GitHub elabora automaticamente file validi nel ramo gh-pagine. Con pagine statiche come quello in figura 1 , le modifiche dovrebbero essere disponibili immediatamente sul sito GitHub Pages. Come ho detto prima, l'URL del sito segue un modello comune, utilizzando il nome dell'account e il nome repo. È inoltre possibile trovare l'URL nella pagina Impostazioni per il repo GitHub.


[Clicca sull'immagine per ingrandirla.] Figura 1. GitHub Renders file HTML in un GH-Pages Branch come Pages GitHub sito
Vuoi includere CSS o JavaScript? Battere se stessi fuori.

Basta ricordarsi di spingere le modifiche al ramo gh-pagine del vostro repo remoto per averli visualizzati nelle pagine ospitate. Inoltre, le pagine sono visibili agli stessi utenti che hanno accesso al tuo repo: repos pubblici hanno siti pubblici, mentre i pronti contro termine privati ​​hanno siti visibili solo agli utenti a cui hai dato accesso repo.

Utilizzando Jekyll
Un'opzione più sofisticato per la creazione di siti per le pagine GitHub è usare Jekyll (vedi figura 2 ), un rubino , su modelli generatore sito web statico basato. Jekyll è stato scritto da Tom Preston-Werner, un co-fondatore di GitHub, ed è nativamente supportato da Pages GitHub.


[Clicca sull'immagine per ingrandirla.] Figura 2. predefinito Jekyll Site
Con Jekyll, il contenuto è scritto in Markdown file di testo formattato per, insieme ad alcuni YAML metadati e configurazione. Jekyll utilizza anche il Liquid motore di template.

Quando si crea un sito Jekyll, Jekyll prende i tuoi contenuti Markdown e modelli di liquidi, insieme a tutti i CSS, script, immagini o altri contenuti che hai specificato, e costruisce un sito HTML statico che è possibile ospitare ovunque. L'aspetto interessante della relazione GitHub-Jekyll, tuttavia, è che non spingere il vostro sito al repo GitHub. Invece, il contenuto di origine e la configurazione viene spinto al repo. GitHub gestisce la costruzione del HTML e spingendolo verso il sito di hosting.

Ottenere Ruby e Jekyll impostati su sistemi Linux o Mac è semplice. "Apt-get rubino," se necessario, poi "gem install Jekyll."

Su Windows, dell'installazione e della configurazione richiede un po 'più di sforzo. La migliore guida in questo momento è di Julian Thilo " Run Jekyll su Windows . " Ho seguito questo su una macchina con Windows 10 Technical Preview e, ancora una volta, assicuro che funziona.

Una volta che tutto è impostato, aprire un prompt dei comandi con Ruby, passare alla cartella in cui si desidera impostare il progetto, ed eseguire "Jekyll nuova" seguito da un nome di cartella per il sito:

Jekyll nuovi Jekyll-docs
cd Jekyll-docs
Quando il sito è stato creato, è già impostato come un repository Git locale. Aggiungere un progetto GitHub per esso, controlla un ramo gh pagine localmente, impostare il telecomando per il vostro repo GitHub, e si è pronti a spingere tutte le modifiche fino a GitHub:

git checkout -b gh-pagine
Avanti, _config.yml aperto in un editor di testo e personalizzare i dettagli di configurazione. La documentazione Jekyll copre tutte le opzioni qui. Un dettaglio importante per i siti ospitati su GitHub Pagine sta definendo la tua "baseurl" per il nome del repository. Ad esempio, se il progetto su GitHub si chiama "Jekyll-docs," l'impostazione URL di base in _config.yml è:

baseurl: "/ Jekyll-docs"
Questo e altri suggerimenti sono spiegati nel Jekyll GitHub pagine di documentazione.

GitHub riconosce il ramo gh-pagine del progetto come progetto Jekyll e ricostruisce automaticamente ogni volta che si preme modifiche. Questo processo richiede un po 'di più di un semplice spingendo verso l'alto HTML, in modo da dare qualche minuto per riflettere i cambiamenti nel vostro sito attuale.

Jekyll Docs Template
Jekyll è un passo in avanti, ma è in realtà concepito come un motore di blog. Si può certamente usare fuori dalla scatola, ma una serie doc bel sta andando a prendere un po 'Giochi per bambini con i modelli, e ho detto questo sarebbe stato facile e veloce.

Di Byron Ruth Jekyll Docs Template (vedi figura 3 ) è un modello di progetto Jekyll personalizzato ottimizzato per flessibilità, documenti multi-pagina. Ha un built-in, tavolo sidebar completamente personalizzabile di contenuti.


[Clicca sull'immagine per ingrandirla.] Figura 3. Jekyll Docs Template è ottimizzato per Documentation Project
Per utilizzare Jekyll Docs Modello, clonare il progetto in una cartella per il progetto:

git clone https://github.com/bruth/jekyll-docs-template.git mio progetto
Dopo che funziona più o meno come qualsiasi altro progetto Jekyll, con due eccezioni. In primo luogo, il progetto include uno script per la creazione di nuovi posti, con la configurazione YAML corretta. Si usa in questo modo:

lunedì 2 marzo 2015

Storie di trincee: Dimensionamento e avarizia con i siti web Azure

Quanta capacità avrete bisogno per la vostra applicazione?

Oppure, ha chiesto un altro modo se indossare il cappello vendor, quanti soldi ya got?

Siamo generalmente schifoso a valutare i requisiti di capacità delle infrastrutture e anche quando è preso un approccio più scientifico (e non è frequente), siamo ancora schifoso a valutare il comportamento degli utenti in situazioni del mondo reale e l'impatto che avrà sulle prestazioni del sistema.

Ora, mettere la situazione in un ambiente cloud e ha il potenziale per andare un paio di modi. Uno è che avete sottovalutato e per gentile concessione del glorioso capacità di aumentare risorse molto rapidamente, la bolletta impazzisce. Un altro è che hai sopravvalutato e si finisce per pagare per le risorse che davvero non servono. Recentemente ho passato attraverso le sfide di scala sia con il sito web e il database SQL Azure su sono stato pwned? (HIBP). Per me, non è mai di avere accesso a sufficienti scala (che è più o meno limitata dal vostro portafoglio), piuttosto si tratta di cercare di entrambi mantenere il costo basso e la perf e francamente, non voglio davvero scendere a compromessi su entrambi! Ecco quello che ho fatto con il sito e scriverò di più database un'altra volta.

Il sito web
Sono stato in esecuzione su una singola piccola istanza di un sito web Azure fin dal primo giorno. 95% del tempo, va bene e l'altro 5% del tempo o scale automaticamente o ... pause. Mi spiego:

Recentemente ho scritto su Capire sito Azure auto-scala magia e ho mostrato come stavo sostenendo circa 4k richieste al minuto, mentre qualcuno martellava l'API:

Le richieste al minuto picco di oltre 5k

Questo è stato, con due istanze piccolo server web:

Chart utilizzo della CPU

Ho provato scala fuori per tre piccole istanze e ... la velocità effettiva bloccato a 4k per min. Ok, quindi il consumatore del servizio è maxing la loro capacità di trasmettere ed elaborare le richieste, giusto? Voglio dire aumentando la capacità da parte mia non migliorerà le cose, quindi deve essere colpa loro. Pensiero Sound, o almeno così pensavo ...

Per un capriccio, ho scalato fino a una dimensione di server media e quindi in modo che non ci solo uno di loro e non due ero. Questo è esattamente lo stesso costo - due Smalls equivalgono a un medio - e in test di carico prima (si sa, il genere in cui tutte le condizioni sono semplicemente perfetto ...) questa comportato esattamente la stessa velocità. Ma questa volta, è raddoppiato - sono andato a 8K richieste al minuto. Il tempo di elaborazione per ogni operazione anche andato fino in fondo da circa 60ms a circa 30ms. Chiaramente, questo è stato un miglioramento significativo. Anche chiaro era che ottenere destra scala era difficile:


Allora, perché è questo? Rob Moore ha fatto un buon punto che la piccola istanza è solo 1 core e che la raccolta .NET garbage piace avere una seconda (o più), ma su questa base, se il collo di bottiglia è una singola macchina poi due macchine deve raddoppiare la velocità (anche se potrebbe spiegare i 60ms a 30ms drop). Qualcun altro ha suggerito che era legato a obiettivi di performance del piccolo esempio macchina, ma ancora una volta, non c'è niente da suggerire che due piccole istanze non possono raddoppiare la velocità di uno, che è il punto di scalare fuori! Ma a prescindere dal flusso totale, la premessa che una macchina di medie dimensioni in grado di elaborare ogni richiesta significativamente più veloce di una piccola macchina rimane e che 60ms fino a 30ms è certamente un guadagno molto positivo.

Ma ecco ciò che veramente mi ha fatto in termini di perf: la mia soluzione è attualmente questi in esso:

Tre WebJobs nella soluzione di Visual Studio

Ecco tre WebJobs separati che vengono eseguiti come processi in background. Su ogni rilascio, devono essere compilati e distribuiti , nonché il sito schierato - allora tutti hanno bisogno di essere licenziato troppo. Schiero da GitHub sul check-in modo Kudu entra in gioco, che gestisce anche sulla stessa macchina. La linea di fondo è che quando voglio schierare, mentre io sto usando un piccolo esempio, questo accade:

Web operazione volta a chiodare 2,500ms su deploy

Whoa! Ciò significa che la mia Apdex soffre e ricordate, questo è ciò che è stato osservato nel browser:

Immersione Apdex in rosso su deploy

La velocità va anche a zip per un po ':

Throughput andare a zero su deploy

E la CPU, beh, alcuni dati è stato perso del tutto, ma chiaramente sta avvicinando l'utilizzo del 40%:

Utilizzo della CPU i dati mancanti e quasi il 40%

Questo è un periodo di carico leggero troppo (solo circa una richiesta di secondo), quindi immaginate cosa che fa una volta i pali di carico su. Perdo il traffico. Potrei cambiare il mio flusso di lavoro per la distribuzione solo per l'ambiente di gestione temporanea e quindi utilizzare gli slot di distribuzione in scena per passare il traffico (e lo faccio che a volte), ma mi piace di mantenere l'applicazione in un perpetuo stato di implementazione pronto e spingere un sacco di cambiamenti frequentemente. Utilizzando Kudu in questo modo e con il numero di progetti e aumentare la base di codice sempre più grande, ero causando un'interruzione.

Ora proviamo che ancora una volta con una media istanza di un sito web:

Medio esempio sito chiodare tempo transazione 1,000ms

Quel 2,5 secondi picco è ora 1 secondo. Sei ancora intenzione di ottenere un picco sulla distribuzione, ma chiaramente è neanche lontanamente così significativo.

Il Apdex rimane molto più felice troppo - ho brevemente immerso in "tollerare" (giallo) e non "frustrante" (rosso):

Apdex andare giallo, ma non rosso

E la velocità non azzera out, infatti non perde un colpo:

Throughput rimanendo a circa 50 richieste al secondo

E l'utilizzo della CPU rimane così in basso:

immagine

Questi risultati sono tutti chiaramente solo da una prova di campione, ma quello che posso dire con forza è che di volta in volta, mi piacerebbe vedere latenza elevata sui tempi di risposta, le connessioni caduto e anche un'interruzione totale - a volte per più di un minuto - quando si distribuisce su un piccolo esempio. Non ho mai visto la perdita di un servizio o di qualcosa di più di una leggera e momentanea degrado del servizio su un'istanza di media. Non una sola volta.

Vorrei aggiungere qualcosa penetranti per gli altri interessati a perfezionare la loro scala:

Non trattare i server come animali domestici, li trattano come bestie
Questo è per gentile concessione di Richard Campbell RunAs Radio e quello che sta dicendo è che a volte potrebbe essere necessario battere solo una tantum per il miglioramento della ascoltato. Potete farlo con Azure - flick un server con un altro e vedere come va. Non ottenere un allegato ad esso come se fosse un cane, si tratta di un servizio disponibile lì per servire voi e quando si avvia la visualizzazione come una risorsa altamente transitorio, si può fare un sacco di roba impressionante, come capire qual è la migliore scala per voi sulla base di prove ed errori.

Per me, è stato il gesso e il formaggio e il percorso in avanti è stato chiaro - ho dovuto andare da piccole a medie:

Piccolo esempio è 74,40 $ / m, medio è 148,80 dollari

Sì, è un extra di $ 74,40 al mese - letteralmente doppia - ma non è un pò e ci sono altri aspetti positivi finanziari troppo. In primo luogo, l'elaborazione di tali richieste al doppio della velocità (che è mai sarà una costante, ma è ragionevole prevedere per lavorare con base all'esperienza) ha enormi pregi per i consumatori al volume di traffico. In questo caso particolare, il consumatore stava controllando circa 10 milioni di identità (qualcosa scriverò su un altro tempo) e l'istanza medio riduce la durata di che, molte, molte ore.

L'istanza di media significa anche meno notifiche vanno a me quando rampe di carico CPU fino come lo fa a metà della velocità per gli stessi volumi di traffico. Francamente, la pace e la tranquillità è abbastanza prezioso! Ma significa anche che le scale più tardi - mi sia permanentemente in esecuzione un'istanza di media, ma ci sono un sacco di momenti in cui stavo correndo due Smalls e pagando lo stesso importo così quei periodi si annullano a vicenda.

Ma di gran lunga il più grande guadagno è che questo significa che posso lavorare in modo più attrito. Non ho per incidere intorno ai modi che rilasciare il software e non c'è bisogno di spendere tempo a cercare di mantenere le cose stabili durante il processo. Spingo di GitHub, magia accade, quindi il sito di produzione è in funzione la nuova versione e tutti sono felici. Che vale la pena di un paio di dollari al giorno!

venerdì 20 febbraio 2015

Visual Studio online Sprint 78: nuovo look Kanban Boards

In questo sprint, tavole Kanban ottenere un look spartano per consentire loro personalizzazione in futuro. Inoltre, più tester possono essere aggiunti a Visual Studio suite di test online.

By Michael Domingo2015/02/19

Un altro aggiornamento Visual Studio Online è disponibile, questa volta con miglioramenti tavole Kanban, e la possibilità di assegnare più utenti a testare suite.

"E 'probabile che prendere quattro o cinque giorni di tempo per aggiornare tutti gli account in modo da non essere sorpreso se non si vedono i cambiamenti nel vostro conto subito," Microsoft Technical Fellow Brian Harry bloggato annunciando la volata.

Le schede Kanban in Sprint 78 hanno un aspetto più semplificata, con le carte con uno sfondo bianco solido e di essere ridimensionata per essere leggermente più grande rispetto alla versione precedente. "Stiamo gettando le basi per ulteriori opzioni di personalizzazione sulle carte, tra cui ornamenti, altri campi e tag," Visual Studio online Program Manager Aaron Bjork, ha detto in una versione Web .

Le schede vengono anche con due nuove funzionalità: il supporto per l'aggiunta di nuove carte, e tutte le carte possono essere modificati direttamente; e uno Split Colonne caratteristica che è più chiara su carte come sono spostati da una persona all'altra.

Visual Studio online rende anche più facile per gli sviluppatori di aggiungere più tester di una suite di test. Ma non è solo un semplice aumento del numero. Invece, c'è qualche automazione in modo che, come tester sono aggiunti attraverso un clic di una finestra di dialogo, gli utenti vengono informati tramite una e-mail contenente un link ad una prova assegnata.

Una nota a parte, la settimana scorsa Harry blogged circa un anteprima di una nuova funzionalità di ricerca di codice per Visual Studio Online. La funzionalità è limitata a coloro che chiedono e sarà disponibile solo per un numero limitato di account. Più informazioni qui .

giovedì 5 febbraio 2015

Introduzione Fundamentals AngularJS protezione a Pluralsight

Se devo essere onesto, ho sempre trovato un po 'insolito per arrivare a questa domanda:

"Come faccio a rendere sicuro il mio applicazioni angolari?"

Voglio dire, angolare è solo JavaScript che viene eseguito nel client e alcune direttive HTML. Ok, è molto buono JavaScript e non intendo banalizzare il quadro in alcun modo, ma tutto il lavoro sporco di sicurezza deve ancora accadere sul server. Angolare farà nulla per l'iniezione SQL o la vostra mancanza di controlli di accesso alle risorse del server o di qualsiasi delle altre cose di sicurezza davvero brutto che tende ad andare male in applicazioni web. Eppure la domanda continuava e più ci pensava, più si rendeva senso mettere la sicurezza angolare in prospettiva. Quindi ho fatto questo corso Pluralsight :

Angolari Fundamentals JS sicurezza

Il fatto molto solo che gli sviluppatori continuavano a chiedere per la sicurezza angolare era una motivazione sufficiente per fare un corso di esso. Mi spiego come ho avvicinai a lui.

Inizia ottenere la vostra testa intorno ad esso
Spesso mi chiedo se la domanda di sicurezza angolare viene da coloro che sono forse più recente per lo sviluppo web e il cui mondo centri più in giro angolare come un prodotto piuttosto che dove si inserisce nel più ampio ecosistema web app. Ad esempio, come ben sintonia sono sviluppatori al fatto che è facile solo per prendere angolare fuori dal quadro del tutto e inviare richieste direttamente alla API sul server? Alcune persone potrebbero fanno beffe l'affermazione che non è ampiamente compreso, ma credetemi, è comunemente perso. In realtà questa è una delle cose che mi concentro sul mio Hack Your primo corso API ed è una mentalità particolarmente diffuso nel mondo di applicazioni mobili.

Una delle prime cose che faccio nel corso è molto chiaramente client segmento di rete da server. Chiaramente angolare è una tecnologia lato puramente client in modo che vive nel mondo del DOM, ha a che fare con le cose come site scripting e beneficia di difese, come solo i cookie sicuri e HTTP croce. Non sta andando per aiutarvi a proteggere stack di rete o server e spendere un po 'di tempo che delinea i rischi discreti e le difese non in termini di come devono essere affrontati indipendentemente dal client.

Questa è una delle cose che la gente spesso si affacciano nella progettazione dei loro app, siano essi angolare altro:

Graphic su ciò che si può controllare (solo il server)

E 'un problema di assunzione di fiducia - "Ho costruito questa Javascript e sarà sempre utilizzare quella volevo a" - ed è un presupposto pericoloso. Come ho detto prima, si può sempre sostituire il client per qualcos'altro (anche solo CURL) e si può sempre manipolare il traffico sul filo, anche se è inviato tramite HTTPS e si possiede il client. Il server è dove il vero resilienza deve essere e uno dei punti chiave che faccio molto presto è semplicemente questo: assumere sempre il client è compromesso!

Questo aiuta con il modo di pensare su angolare, next up è come iniziare a rompere pezzi di applicazioni integrate con esso.

Lavorare con i controlli di sicurezza sul server
Molto di questo si riduce a come le applicazioni vengano autenticati e quindi autorizzare le richieste di risorse del server. Alcune di queste è la stessa con applicazioni web costruite nel modo più "tradizionale", dove un muro di messaggi HTML al server, scarica dal DOM e poi afferra un nuovo muro di HTML. Ma un sacco di si differenzia anche quando si passa a richieste asincrone leggeri progettati per manipolare solo il DOM.

Identità persistenza, per esempio, assume improvvisamente una forma nuova o almeno può fare. Normalmente avremmo buttiamo un cookie di autenticazione nel browser su login e tutte le successive richieste sarebbe auth'd in virtù di quel cookie implicitamente di essere inviato. Ma i cookie non sono "RESTful" (potete leggere alcune delle mie opinioni sulla RESTfulnes qui ) e la vista di richieste API è che in genere devono essere inviate tramite token portatore invece. Ora che non è difficile da fare e ha un certo numero di vantaggi rispetto cookie comunque (CSRF difesa, per esempio), ma avete ancora a persistere sul DOM scarico. Alcuni mettono in un cookie e quindi orchestrare è il recupero tramite JavaScript in modo che possa essere aggiunto alle richieste API, ma ora il cookie non possono essere contrassegnati come HTTP solo quindi è vulnerabile a rischi di qualsiasi XSS. Ci sono altri modi, ma questo dà un senso di quel tipo di problemi affronto nel corso.

Una cosa da sottolineare è che io non vado in "Questo è esattamente come implementare questa end to end in angolare e [inserire preferito framework lato server qui]". Si tratta di un corso di agnostico piattaforma server, cioè è altrettanto relent di ASP.NET in quanto è PHP o Nodo o qualunque sia il vostro gusto preferito di roba che esegue sul server è. Questo è lo stesso approccio che ho preso con altri corsi come Hack Yourself First e sicuro Gestione Account Fundamentals e ho trovato che la larghezza piuttosto che la profondità funziona bene per questo stile, naturalmente. Quello che faccio concentro su è però comportamenti l'applicazione deve dimostrare in modo da passare attraverso entrambi anti-modelli e buone pratiche, spiegando loro rispettivi insidie ​​e meriti. C'è anche una applicazione di esempio che viene utilizzato nel corso ed è pubblico per le persone a giocare con più a awesomeplaces.troyhunt.com e tra l'altro, che è costruito su ASP.NET MVC e utilizzando API Web.

C'è un sacco di altre cose nel modulo sui controlli di sicurezza del server, ma è il modulo successivo che ho il sospetto che turbare più di un paio di sviluppatori angolari là fuori ...

Problemi di sicurezza comuni sul lato client
Cominciamo dal crogiolarsi nel caldo bagliore di questo brillantezza :

Commenti HTML rivelare account admin la password

Sai cosa c'è di sbagliato in questo. Io so cosa c'è di sbagliato in questo. Heck, anche il dev che ha scritto probabilmente sa che cosa c'è che non va, ma qui è in tutto il suo splendore. Chiaramente questo non è angolare, ma illustra un punto molto importante - nulla inviato al cliente è osservabile da parte di coloro che lo ricevono! Lo so, chi avrebbe mai thunk esso, ma è un punto importante in angolare perché fa un sacco di lavoro del server normalmente in una applicazione più tradizionale. Tutto quello che lega modello e orchestrazione di chiamate di servizio e di carico dei modelli è ora esposti al pubblico. Quando si invia un controller verso il cliente in un file di script e contiene riferimenti a quella fabbrica "nascosto" admin che poi chiama in un servizio per gestire gli utenti, questo è adesso Informazioni pubblico.

In caso di trasmettere queste informazioni al client pre-auth? Questa è una delle cose che discuto nel corso e naturalmente con forza parlare di proteggere i servizi che sono "nascosti" dal cliente. Mostrando le cose giuste alle persone giuste e fiduciosa al browser di prendere quelle decisioni per voi è meraviglioso in una AJAX'y, sorta di risposta di strada, ma niente di tutto questo nega il punto precedente - non si controlla il client.

Naturalmente anche guardare in altri attacchi che avvengono nel browser e quindi le cose come il rischio di XSS e come angolare codifica output maniglie (in realtà è piuttosto intelligente), il ruolo di biscotti e di quelli sicuri e HTTP solo gli attributi e poi un po 'su CSRF come bene. Come si è visto, angolare ha un bel modo pulito di aiutare a ottenere i tuoi gettoni anti-falsificazione sotto controllo e questo è qualcosa copro nel modulo successivo ...

Sicurezza costruisce all'interno AngularJS
Nel corso, faccio notare che la documentazione di sicurezza angolare è, beh, un po 'scarsa:

La pagina di documentazione di sicurezza angolare

Questo è tutto. Questo è l'intera pagina. C'è un collegamento fuori per ngCsp ma questo è tutto. Ora si può capire perché questa domanda su come proteggere angolare continua ad emergere!

Ma c'è in realtà una certa sicurezza molto ordinato costruisce in angolare. Ad esempio, ho detto qualche magia CSRF in precedenza: se si dispone di un cookie chiamato "XSRF-TOKEN" allora angolare converte automaticamente in un intestazione di richiesta personalizzata denominata "X-XSRF-TOKEN" e inviarlo a qualsiasi richiesta invocata tramite il $ servizio http dove il vostro quadro preferito del server può quindi validare il token e farlo magia anti-contraffazione.

Un altro trucco è il modulo ngSanitize (tutti al di fuori dell'America, fare notare l'ortografia, non succede molto altrimenti!). Questo cambia l'approccio di angolare per la codifica in uscita e implementa una whitelist di gettoni HTML consentiti mentre nudo tutto il resto fuori. Ora francamente, sanificazione è sempre un po 'di un pantano, ma angolare fa fare piuttosto un bel attuazione di esso.

Poi c'è il pieno "si è ora da soli" per quanto riguarda la codifica di uscita, che è quello di trasformare totalmente fuori escape contestuale rigorosa e solo la fiducia che tutti i dati che si collega in tale contesto è sicuro. E 'la "è il tuo piede" approccio e mi mostra come buono come angolare è, si può ancora rovinare tutto piuttosto male.

A proposito, indovinate cosa succede quando metti i dati non attendibili da input dell'utente in un modello reso sul lato server? Diciamo che non è piacevole e mi dimostrano perché questo è uno dei pochi pezzi di orientamento Google in realtà messo in quella pagina di sicurezza angolare sopra.

Il mio approccio a questo modulo e in effetti l'intero corso - come è con i miei altri - è questo: mostrare alla gente come rompere le loro cose. Far loro capire che cosa può andare storto e sperimentare in prima persona, perché a meno che siano realmente impegnati nei rischi associati a questi modelli, è molto difficile per loro di acquistare nello sforzo che è necessario per difendere le loro applicazioni.

Si tratta di un corso angolare che non si tratta di angolare
Originariamente, io non avevo intenzione di fare di questo un corso angolare. Invece, stavo per fare un corso più generico che applicato allo stesso modo a angolare come fa, per esempio, Backbone o Ember. Il mio pensiero era che l'attuazione della biblioteca lato client non era il punto, piuttosto era più di circa la comprensione dove i rischi giacciono in un'applicazione che si muove molto logica nel browser. Questa è ancora la mia visione delle cose e in questo senso, i primi quattro moduli del corso sono rilevanti indipendentemente dal vostro quadro Thing.JS preferito. Ma chiaramente angolare ha un enorme impulso al momento ed è finito per essere semplicemente un modo più ampio rilevante di descrivere il corso.

Detto questo, l'ultimo modulo sopra descritto è tutto angolare. Sembra specificamente accesso quello che abbiamo avuto modo, nel quadro e come utilizzare e cattivo uso di esso. Spero che questo dà il corso della massima utilità possibile.

Perché up slip sicurezza sono ovunque
Come ho iniziato la registrazione al corso, ho caricato il sito angolare e ...

Il sito angolare con contenuto misto

Contenuto misto. Bugger. Questo è il browser web di Google caricamento del sito web per framework di Google e mostrando gli avvisi di Google che parti della pagina sono insicuri. Hanno praticamente proprio stack end-to-end, ma ancora qui, questo è scivolato in. Non è un grosso rischio per la sicurezza, ma simboli di avvertimento tendono ad essere il genere di cose che non vuoi sul tuo sito web del prodotto!

Si tratta quasi certamente di una svista e va a illustrare molto di quello che parlo in corso, vale a dire che è facile ottenere questa roba sbagliata. Un piccolo rischio XSS, per esempio, in combinazione con un biscotto accessibile in script client (che è piuttosto comune in applicazioni angolari) e ci si va - sessioni dirottato!

In chiusura ...
Il corso dovrebbe arrivare a chiunque la costruzione di riflessione angolare su cui il quadro si inserisce nel più ampio panorama della sicurezza in un modo che ti aiutano a capire i rischi. Mette angolari - e altri JS quadri - in prospettiva e rende molto chiaro ciò che è e ciò che non è quando si tratta di sicurezza. Angolare è molte cose meravigliose, ma fornisce un semplice piccolo pezzo del quadro di sicurezza in un sito angolare.

Infine, per chi non conosce Pluralsight, si tratta di un modello di servizio di abbonamento con costi dando il via a $ 29 / m e che vi dà accesso a vicino a 4.000 corsi su un mucchio di argomenti di sviluppo e di un gruppo di informatici quelli pro e creative pure. Come autore, ricevo una royalty in base a quanto il mio contenuto è guardato e posso solo fare ciò che è che faccio perché i miei corsi ottengono occhi su di loro. Quindi, se siete in angolare o la sicurezza in generale, controllare i miei corsi Pluralsight e mi aiuta a mantenere il contenuto in arrivo!

lunedì 26 gennaio 2015

Automatizzare web creazione di hosting in Azure con PowerShell

Ecco la situazione: hai un mucchio di siti su modelli di hosting tradizionali. Contratti d'affitto condivise su macchine logiche singoli, un'infrastruttura dedicata o, peggio ancora, non proprio nessuna idea perché basta continuare a pagare quei $ 5 al mese e roba funziona. La maggior parte del tempo.

Ma avete visto la luce e si desidera spostare le cose da Azure in massa. Una piccola manciata di siti non è un dramma, c'è un po 'di lavoro di configurazione per creare le risorse Azure per ciascuno e fino a quando si segue un set predefinito di passi appena perfettamente, che stai bene. Ma come la maggior parte delle cose che richiedono operazioni manuali, è altamente soggetto a errori in termini di ottenere tutto giusto ogni volta ed è anche molto laborioso. Una volta che la manciata di siti diventa decine, inizia a sentire come un po 'di duro lavoro. Non solo, ma si sta andando a voler nuove attività in Azure in futuro e avere un modo ripetibile di farlo vicino istantaneamente sarebbe sorta di piacevole.

Ho avuto questa sfida di recente - "vogliamo la migrazione di un mucchio di siti web di Azure e faranno stare tutti in sostanza lo stesso modello" - così invece di avere persone clic sui collegamenti nel portale Azure, ho dato loro un singolo script PowerShell e li scatenato. Sto per darvi tutti i passi qui che spiegano come funziona il tutto e vi darà l'intero script PowerShell in modo che non si deve lavorare tutti i dadi e bulloni da zero. Buon divertimento!

Preparazione
Per prima cosa - avrete bisogno di un abbonamento Azure. Ok, un po 'ovvio, ma non si può semplicemente saltare in PowerShell e avviare l'esecuzione di comandi. Ho anche già avuto un sito web che significa che c'era già un piano di hosting adeguato in più ho avuto un database SQL Azure (ricordate che questo è l'offerta PaaS, non un pieno soffiato standalone SQL Server è possibile RDP), che significa che c'era già un database server e appropriate regole del firewall. Questo è il presupposto che sto facendo qui e se posso dare un suggerimento, roba che è davvero solo un setup una tantum vale la pena solo facendo nel browser piuttosto che cercare di capire i comandi per te. In realtà anche se avete intenzione di script di tutto il processo, fare un manuale e capire esattamente come volete che il vostro stato finale di essere.

Iniziare con PowerShell Azure
Ipotesi prima: Presumo che hai Azure PowerShell installato e funzionante, quindi se non è questo il caso, passano un paio di minuti sopra il Come installare e configurare Azure PowerShell tutto pagina e ottenere giocare piacevole. Assicurati si può effettivamente caricare una sessione Azure PowerShell allora continuate a leggere.

Ecco un rapido suggerimento pro: controllare l'abbonamento! In più di un'occasione ho chiedevo perché cambiamenti PowerShell che stavo facendo non apparivano nel portale web Azure e sarebbe sempre spengo che ero in un abbonamento errato. Salva te stesso il dolore se si ha accesso a più di un abbonamento e sempre eseguire prima di iniziare:

Get-AzureSubscription
Potrai vedere una lista di tutti gli abbonamenti e ognuno ha un attributo "IsCurrent". Se vedi qualcosa che non ti aspetti, flick su oltre al corretto prima di arrivare al lavoro:

Selezionare-AzureSubscription "Abbonamento di Troy"
Oh - e se avete intenzione di continuare a tornare a questo abbonamento e non è già il default, ecco quello che vi serve:

Selezionare-AzureSubscription-Default -SubscriptionName "Sottoscrizione di Troy"
Ci sono un mucchio di riferimenti sul web per i comandi che non funzionano con l'attuale generazione di API di Azure in modo che dovrebbe risparmiare qualche dolore, almeno fino a quando cambia di nuovo e questo diventa un altro riferimento non corretto! Ma sul serio, non essere consapevoli che l'API non cambia nel rompere modi e che si può anche trovare i comandi che non sono più corrette.

Con il fatto che, cominciamo creando roba!

Creazione (e rimozione) del sito web
Questo bit può essere morto facile, è solo un singolo comando:

New-AzureWebSite TroyPSTest
Ci vorrà secondi, dopo di che dovrete il seguente:

Istanze: {}
NumberOfWorkers: 1
DefaultDocuments: {Default.htm, Default.html, Default.asp, index.htm ...}
NetFrameworkVersion: v4.0
Phpversion: 5.4
RequestTracingEnabled: False
HttpLoggingEnabled: False
DetailedErrorLoggingEnabled: False
PublishingUsername: $ TroyPSTest
PublishingPassword: mZvMGi2GfDc2iCepcPm6vsEd9hLxvtk3wl5NNtHxWaMqHDjAY8Apka4fXM3W
AppSettings: {WEBSITE_NODE_DEFAULT_VERSION}
Metadati: {}
ConnectionStrings: {}
HandlerMappings: {}
Nome: TroyPSTest
Stato: Running
Nomi host: {troypstest.azurewebsites.net}
Spazio Web: AustraliaEastwebspace
SelfLink: https://waws-prod-sy3-001.api.azurewebsites.windows.net:454/subsc
                                  riptions / 62e2a1e5-4eda-4c1e-805e-44a6c8f8afbd / spazi web / Australia
                                  Eastwebspace / siti / TroyPSTest
RepositorySiteName: TroyPSTest
Cod: Gratis
UsageState: Normal
Abilitato: True
AdminEnabled: True
EnabledHostNames: {troypstest.azurewebsites.net, troypstest.scm.azurewebsites.net}
SiteProperties: Microsoft.WindowsAzure.Commands.Utilities.Websites.Services.WebEn
                                  tities.SiteProperties
AvailabilityState: Normal
HostNameSslStates: {troypstest.azurewebsites.net, troypstest.scm.azurewebsites.net}
AzureDriveTraceEnabled:
AzureDriveTraceLevel: Errore
AzureTableTraceEnabled:
AzureTableTraceLevel: Errore
AzureBlobTraceEnabled:
AzureBlobTraceLevel: Errore
ManagedPipelineMode: Integrata
WebSocketsEnabled: False
RemoteDebuggingEnabled: False
RemoteDebuggingVersion: VS2012
RoutingRules: {}
Use32BitWorkerProcess: True
AutoSwapSlotName:
SlotStickyAppSettingNames: {}
SlotStickyConnectionStringNames: {}
Avere un sfogliare che - le condizioni saranno per lo più familiare a voi se avete speso un po 'di tempo in siti web Azure, ma non siete probabilmente abituati a vederla tutti seduti lì insieme. Questo, comunque, dovrebbe essere molto familiare al stagionato Azure utente del sito:

Elenco di siti in Azure

Questo è solo il solito portale anche se con il nuovo sito ora che figura nella lista. Ricordate, PowerShell è una sola interfaccia in quello che è in ultima analisi, la stessa piattaforma di base che hai utilizzato nel browser, unico modo più veloce! C'è, però, un problema: questo sito è stato creato nel percorso "L'Australia orientale" e impostare come un omaggio. Ho molta voglia di metterlo in-occidentali e renderlo standard in modo che si siede sulla mia macchina logico esistente e non mi scongiuro più denaro. Nessun problema, facciamo solo Nuke sito:

Rimuovere-AzureWebsite -Name TroyPSTest

Otterrete una richiesta di conferma (che è possibile sostituire con il parametro "-Force") allora sì, questo è tutto, sito andato! Prendetevi un momento per bere che in - stiamo creando e rimuovendo siti web tramite la riga di comando in qualche luogo remoto lontane con la stessa facilità avremmo creiamo una cartella locale. Quando è possibile gestire le risorse in modo tale basso attrito, si può iniziare a cambiare veramente il modo di lavorare in modo molto positivo.

Creazione del sito nella giusta posizione
Passando, dobbiamo adattare tale comando originale per ottenere il sito nella giusta posizione. C'è un parametro "-La posizione" che può essere applicato sulla creazione sito web in modo che il comando originale ora cambia a questo:

New-AzureWebSite TroyPSTest -La posizione "West degli Stati Uniti"
Chiaramente posizione desiderata può essere diverso quindi fate attenzione se si sta copiando e incollando! Torna al portale nel browser e ora ci troviamo nel posto giusto:

Nuovo sito in posizione occidentale degli Stati Uniti

Ricordate - al momento non c'è ancora alcuna migrazione per mischiare automagically beni tra i data center in modo da assicurarsi che hai questo diritto prima di procedere altrimenti sei praticamente andando a ricominciare da zero. Vedrete il livello di prezzo è ancora "libero"; torneremo e ordinare che fuori a breve in quanto non è qualcosa che possiamo configurare al momento della creazione del sito.

Impostazione dei parametri del sito web
Quando ti alzi un nuovo sito web Azure, per impostazione predefinita otterrete questo:

PHP abilitato automaticamente

Ora perché sono una sicurezza abbastanza sorta cosciente della persona (e così si dovrebbe essere), davvero non voglio PHP in esecuzione sul sito. Questo non è perché c'è qualcosa intrinsecamente male su PHP, è solo che non ho bisogno di esso. Così facciamo solo disattivarlo:

Set-AzureWebsite -Name TroyPSTest -PhpVersion Off
Che è morto facile, ma c'è solo così tanto che possiamo configurare utilizzando Set-AzureWebsite. Per tutto il resto, dovremo saltare il Resource Manager Azure quindi cerchiamo di farlo ora e risolvere il livello dei prezzi.

Configurazione del livello dei prezzi
Il livello di prezzo è un po 'più complicato e non è qualcosa che possiamo impostare al momento il sito è stato creato, né utilizzando il cmdlet Set-AzureWebsite, piuttosto ci impone di modificare il sito una volta creato. Questo è bene, stiamo andando ad avere bisogno di fare un po 'di che poi comunque e sta andando a richiedere noi saltare in modalità gestore di risorse :

Switch-AzureMode AzureResourceManager
Questo vi dà una nuova serie di cmdlet che è possibile utilizzare per gestire l'ambiente che non si ottiene con i cmdlet di gestione Azure , che è quello che stavamo usando. Vedrai mi salta fuori questo modo e il modo iniziale noto come modalità di gestione dei servizi, come si richiede l'accesso a diversi set di cmdlet.

Quello che stiamo per fare ora è quello di iniziare a lavorare con i gruppi di risorse . Pensate a questi come un insieme logico di attività all'interno di un abbonamento Azure, per esempio, tutti i miei siti web sono sotto uno chiamato "Default-Web-WestUS". È possibile individuare questo nel portale Azure tramite la risorsa gruppi collegamento:

Trovare gruppi di risorse nel portale

Stiamo anche andando a bisogno della versione dell'API Azure stiamo usando così andare a prendere quello come bene e ancora una volta, di essere consapevole del fatto che potrebbe cambiare in modo rottura nel tempo. Ora possiamo recuperare il sito e assegnarlo a una variabile che chiamerò "$ r" (attenzione se si sta copiando e incollando di avere la versione corretta API):

$ R = Get-AzureResource -Name TroyPSTest -ResourceGroupName Default-Web-WestUS -ResourceType Microsoft.Web / Siti -ApiVersion 2014/04/01
Con il sito ora assegnato alla variabile, possiamo iniziare a eseguire varie azioni su di esso, tra cui messa fuori ogni attributo conosciuto semplicemente digitando $ r ed eseguire quel comando da solo. E 'un bene per la verifica a volte perché quello che stiamo andando a fare nel prossimo paio di passi renderanno modifiche al sito e non vogliamo fare inavvertitamente quelli sul sito sbagliato. Listato il valore di $ r vi darà un mucchio di JSON; un'altra cosa che possiamo fare è stampare solo un sottoinsieme delle informazioni come le proprietà dirette dell'entità:

$ R.Properties
Che ci darà una coppia di valori chiave per ogni proprietà:

Valore chiave
--- -----
nome TroyPSTest
Esecuzione Stato
nomi host {troypstest.azurewebsites.net}
spazio web westuswebspace
selfLink https: //waws-prod-bay-003.api.azurewebsites.windows.net: ...
repositorySiteName TroyPSTest
proprietario
usageState 0
abilitato Vero
adminEnabled Vero
enabledHostNames {troypstest.azurewebsites.net, troypstest.scm.azurewebsi ...
siteProperties {[metadati,], [proprietà, System.Collections.Generic.L ...
availabilityState 0
sslCertificates
CSR {}
cers
siteMode
hostNameSslStates {System.Collections.Generic.Dictionary`2 [System.String, S ...
computeMode
serverfarm Default2
webHostingPlan Default2
lastModifiedTimeUtc 22/12/2014 00:57:04
storageRecoveryDefaultState corsa
contentAvailabilityState 0
runtimeAvailabilityState 0
SiteConfig
deploymentId TroyPSTest
trafficManagerHostNames
sku gratuito
premiumAppDeployed
scmSiteAlsoStopped False
targetSwapSlot
HostingEnvironment
WebSites Microservice
cloningInfo
Quello che stiamo per fare ora è cambiare alcune proprietà che ottengono il sito nel livello dei prezzi corretta. Per impostazione predefinita, quando il sito è stato creato è andato in una nuova server farm con un nuovo piano di web hosting e, come già sappiamo, il livello dei prezzi (noto anche come SKU) è stato impostato su "Free". Quello che faremo ora è impostato gli attributi per allinearsi con i miei altri siti assegnando una serie di opportune coppie nome-valore per una nuova variabile che chiameremo $ p:

$ P = @ {"SKU" = "Standard"; "Serverfarm" = "DefaultServerFarm"; "WebHostingPlan" = "DefaultServerFarm"}
Il passo finale è ora di assegnare le proprietà di nuovo a quel nuovo sito web in questo modo:

$ R2 = Set-AzureResource -Name TroyPSTest -ResourceGroupName Default-Web-WestUS -ResourceType Microsoft.Web / Siti -ApiVersion 2014/04/01 -PropertyObject $ p
Sto in uscita il risultato di $ r2 quindi è facile per ispezionare le nuove impostazioni dopo che sono stati applicati. Solo per una sanità mentale assegno comunque, vediamo come le cose appaiono nel portale ora:

Nuovo sito web ora in "Standard" livello di prezzo

Ok, che sembra il modo migliore e solo per essere sicuri che stanno effettivamente utilizzando lo stesso piano di hosting e non mi costa di dollari in più, facciamo click attraverso il sommario:

Tutti i siti web ora nella stessa Resource Group

Questo è grande, sono tutti lì come risorse pari a tale server farm di default in modo che è quello fatto.

L'aggiunta di uno slot di distribuzione messa in scena
Una delle cose veramente pulito sul servizio web Azure è la possibilità di avere gli slot di distribuzione per la distribuzione in scena . Ciò significa che si può spingere il tuo sito web a un caso isolato in cui è possibile testare e assicurarsi che le cose bel gioco prima ancora di distribuzione al sito in diretta sul vostro dominio di produzione. Non solo, ma si può anche avviare una percentuale di routing del traffico per un altro slot con una nuova versione del sito in quello che è noto come "test in produzione". Questo renderà le teste tradizionalisti 'spin - "Prove in produzione - non si può fare questo!" - Ma fa un sacco di senso per il pronto produzione sito ad essere esposti a una piccola percentuale del tuo pubblico prima solo per essere sicuri che tutto gioca bello.

Sto andando a saltare nuovamente dentro i cmdlet di gestione Azure ora come voglio creare un nuovo servizio.

Switch-AzureMode AzureServiceManagement
Aggiunta di uno slot di distribuzione è un pezzo di torta:

New-AzureWebsite TroyPSTest -La posizione "West degli Stati Uniti" -slot "Stage"
Si noti che questo è lo stesso comando, come in precedenza, stiamo solo passando un parametro "Slot", così questa volta. Prendere attenta nota di questo - un unico "sito web" può avere molti "slot" e in seguito vedrete come comandi che non fanno riferimento esplicitamente slot fallire piuttosto male una volta che hai più di quella di default. Saltando sopra al portale, si dovrebbe ora vedere apparire sotto il sito originale, come un nuovo slot di distribuzione:

Slot Deployment ora sul sito

E 'importante notare che questo sito ha ereditato il piano e il prezzo di hosting tier abbiamo impostato in precedenza. E 'anche ereditato l'impostazione PHP che viene disattivata automaticamente per il nuovo sito.

Creazione del database SQL Azure
Ora, prima di imbarcarsi in questa nuova parte del processo, ho già avuto un DB SQL Azure e ho voluto mettere tutti gli altri sulla stessa istanza. Ciò significa che ho già avuto un name server - "snyb5o1pxk" - inoltre ho già avuto le credenziali per accedervi con "diritti Dio" e le regole del firewall appropriate per rendere le connessioni remote dal mio indirizzo IP. Come una tantum per il server, questo vale la pena di fare solo questo direttamente nel portale. Oh - e nel caso in cui si inizia a pensare di creare server separati per ogni progetto, non essere consapevoli delle Azure servizio di sottoscrizione limiti, quote e vincoli .

In termini di comando realmente disposizione il database sul server, questo è un affare molto simile a come è stato creato il sito web e sembra proprio come questo:

$ Db = New-AzureSqlDatabase "snyb5o1pxk" -servername -databasename "TroyPSTestDB" -Edizione "Basic" -MaxSizeGB 2

Non abbiamo necessariamente bisogno di assegnare il risultato alla variabile $ db, ma rende facile poi stamparlo per lo schermo in qualsiasi momento e vedere quello che abbiamo:

Nome: TroyPSTestDB
CollationName: SQL_Latin1_General_CP1_CI_AS
Edizione: di base
MaxSizeGB: 2
MaxSizeBytes: 2147483648
ServiceObjectiveName: di base
ServiceObjectiveAssignmentStateDescription: Complete
CreationDate: 22/12/2014 11:51:28
RecoveryPeriodStartDate: 22/12/2014 12:21:27
Questo è quanto di più semplice come si arriva - ora abbiamo un DB!

Tagging la risorsa
Una cosa che accade quando si inizia ad avere cumuli di risorse nel portale è che le cose si fanno disorganizzato. Etichette in Azure sono simili ai tag si ha familiarità con dire, su questo stesso blog: nullo valore funzionale, ma mantiene roba logicamente correlati raggruppati insieme.

In primo luogo, si torna alla modalità di gestione delle risorse:

Switch-AzureMode AzureResourceManager
Prima di poter applicare un tag, è necessario creare uno. Ho deciso di taggare in base al nome del progetto, si potrebbe anche tag dall'ambiente (stage, test) o qualsiasi altro tassonomia si decide di applicare. Ecco come il mio look:

New-AzureTag -Name progetto -Value TroyPSTest
Possiamo ora utilizzare questo tag in un numero di posizioni, cioè quello di individuare sia il sito e il database come appartenenti a quello gruppo logico di risorse. Vediamo ora riferimento al sito web:

$ R2 = Set-AzureResource -Name TroyPSTest -ResourceGroupName Default-Web-WestUS -ResourceType Microsoft.Web / Siti -ApiVersion 2014/04/01 -PropertyObject $ p -tag @ {Name = "progetto"; Value = "TroyPSTest"}
Si noti che la variabile proprietà abbiamo definito in precedenza viene anche passata. Mentre gli stati Doco questo come optional, ho trovato PowerShell non era reale felice quando non ha ottenuto questo (ho detto che era un po 'volubile, giusto?). Nessuna grossa delusione, è definito già così ho appena gettato di nuovo nella collezione parametri. Naturalmente la cosa più sensata da fare sarebbe quella di utilizzare un unico comando Set-AzureResource e superare sia le proprietà e le variabili in una sola volta, l'approccio di cui sopra è solo di introdurre concetti diversi uno per uno.

Diamo anche il tag DB SQL:

Set-AzureResource -Name TroyPSTestDb -ResourceGroupName server predefinito-SQL-WestUS -ParentResource / snyb5o1pxk -ResourceType Microsoft.Sql / server / database -ApiVersion 2014/04/01 -tag @ {Name = "progetto"; Value = "TroyPSTest"}
Torna sopra al portale e sia il sito web e il DB sono ora seduti uno accanto all'altro sotto il tag "TroyPSTest":

Sito web e bancadati sotto un tag

Bene, ora mi sento tutto molto organizzato!

Impostare il nome host sul sito
Ecco un po 'di pollo e uova uno per voi: si sta andando a voler un nome host sul sito web che significa che si sta andando a voler eseguire qualcosa di simile a questo:

Set-AzureWebsite -Name TroyPSTest -HostNames @ ('troypstest.troyhunt.com')
Tuttavia, che sta per darvi questo:

Set-AzureWebsite: BadRequest: un record CNAME che punta dal troypstest.troyhunt.com a troypstest.azurewebsites.net non è stato trovato. Registrare awverify.troypstest.troyhunt.com Alternativa a awverify.troypstest.azurewebsites.net non è stato trovato neanche.
Se hai mai aggiunto un nome host a un sito web attraverso il portale prima, saprete che non è possibile fino a quando hai creare un CNAME sul record dominio. Tuttavia, è necessario conoscere il nome del sito nella Azure prima di poter fare questo e mentre questo è un nome che fornisci tu stesso, deve anche essere unico e non essere utilizzato da qualsiasi sito web Azure esistenti di proprietà di nessuno . Si potrebbe andare fuori e configurare i record DNS prima di eseguire lo script sul presupposto che il nome scelto per il sito web (che va quindi nella CNAME) sarà permesso, ma se si tratta di "foo", allora si sta andando ad avere per tornare indietro e modificare DNS di nuovo in seguito.

Creazione di un account di accesso SQL e utenti
Una delle ultima cosa che dobbiamo fare è quello di assicurarsi che il sito può effettivamente connettersi al database e questo significa la creazione di un nuovo account di accesso SQL. Sì, si potrebbe avere il sito utilizza le credenziali che sono stati forniti al momento della creazione del server, ma no, non lo si fa. Se non si desidera persone anonime che vagano intorno al vostro sito web con esso quindi effettuare i collegamenti al database utilizzando un account privilegiato che può fare qualsiasi cosa che vuole. Ciò che si vuole è un conto unico per l'applicazione che si può quindi andare tutto principio del privilegio minimo su.

Quando si crea il login tramite PowerShell, non ci sono comandi nativi di fare questo in modo invece che andremo ad utilizzare SMO per eseguire i comandi SQL sul server remoto. Per fare questo, stiamo andando ad avere bisogno di importare il modulo SQLPS prima:

Import-Module SQLPS -DisableNameChecking
Ora possiamo andare avanti e connettersi al server SQL esistente e selezionare il database master in una nuova variabile $ db:

$ Conn.ConnectionString = "server = tcp: snyb5o1pxk.database.windows.net; Database = padrone, ID utente = troyhunt; Password = P @ ssw0rd;"
$ Srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" $ conn
$ Db = $ srv.Databases ["master"]
Con il fatto che, creiamo un accesso SQL che chiameremo "TroyPSTestDbUser":

$ Login = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Login -ArgumentList $ srv, "TroyPSTestDbLogin"
$ Login.LoginType = "SQLLogin"
$ = $ Login.PasswordPolicyEnforced falso
$ = $ Login.PasswordExpirationEnabled falso
$ Login.Create ("S0m3thingR3 @ Llyr @ nd0mTh @ ti $ ntThi $")
Next up creeremo un utente nel DB contro che login:

$ Db = $ srv.Databases ["TroyPSTestDb"]
$ DbUser = New-Object -TypeName Microsoft.SqlServer.Management.Smo.User -ArgumentList $ db, "TroyPSTestDbUser"
$ DbUser.Login = "TroyPSTestDbLogin"
$ DbUser.Create ()
E questo è tutto - lavoro fatto! Naturalmente avrete ancora bisogno di mettere l'utente in un ruolo all'interno del vostro DB dopo che si distribuisce a Azure e dare i diritti appropriati, ma ora è tutto seduto lì in attesa per voi. Non prendere atto di come viene definita la password e set, che non è particolarmente maneggevole (o sicuro) modo, se avete intenzione di essere orchestrare questa massa, ma tornerò a questo un po 'più tardi con lo script mega , c'è solo una cosa che voglio fare prima ...

Aggiungendo la stringa di connessione al sito
Ok, ultimo trucco nella configurazione: Voglio per assicurarsi che il sito è pre-configurato con la stringa di connessione del database. Sappiamo già tutti i dettagli di connessione, è ormai solo una questione di costruire la stringa e invocare i comandi PowerShell appropriati. Ecco tutti i bit:

$ ConnStr = "server = tcp: snyb5o1pxk.database.windows.net, 1433; Database = TroyPSTestDb; User Timeout = 30; "
$ ConnStrInfo = New-Object Microsoft.WindowsAzure.Commands.Utilities.Websites.Services.WebEntities.ConnStringInfo
$ ConnStrInfo.Name = TroyPSTestDb
$ ConnStrInfo.ConnectionString = $ connStr
$ ConnStrInfo.Type = "SQLAzure"
$ ConnStrSettings = ConnectionStrings (Get-AzureWebsite TroyPSTest -slot "produzione").
$ ConnStrSettings.Add ($ connStrInfo)
Set-AzureWebsite -Name TroyPSTest -slot "produzione" -ConnectionStrings $ connStrSettings
Ora c'è una cosa che qui voglio richiamare l'attenzione e questo è il parametro slot sul Get-AzureWebsite e comandi Set-AzureWebsite. Perdere questo e vi permetterà di trascorrere un lungo tempo di battere la testa contro il muro chiedendo perché si sta ricevendo le eccezioni sugli oggetti nulli quando il nome del sito è chiaramente corretto. Vedete, quando un sito ha più slot, come quello che quello di cui sopra fa la cortesia di uno "Stage" abbiamo aggiunto, non specificando esplicitamente lo slot vi lascerà a bocca asciutta in quanto restituisce una collezione che descrive gli slot. Se hai solo uno slot di default allora i comandi implicitamente applica a quello e si otterrà un sito web un'entità indietro in modo che quando si vede tutte quelle "come tos" là fuori che sembrano così dannatamente facile, ma semplicemente non lavorare per voi, che può ben essere il motivo! Ho già detto che può essere frustrante che esattamente lo stesso comando con gli stessi parametri può tornare completamente diversi tipi in base allo stato della risorsa?

Passando e indietro nel portale, ora abbiamo questo:

immagine

Quel nome stringa di connessione dovrà allinearsi con quello del vostro web.config in modo che può significare cambiare dopo la distribuzione del sito web in modo che sia applicata automaticamente al sito.

Suggerimenti Pro
Stuff andrà male e si otterrà errori. Gli errori non possono dire perché, per esempio, quando si aggiunge un tag al database:

Set-AzureResource:: Si è verificato un errore durante l'elaborazione di questa richiesta.
Alla linea: 1 char: 1
+ Set-AzureResource -Name $ dbName -ResourceGroupName $ dbResourceGroup -ParentResou ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo: CloseError: (:) [Set-AzureResource], CloudException
    + FullyQualifiedErrorId: Microsoft.Azure.Commands.Resources.SetAzureResourceCommand
Oh, "si è verificato un errore"! Quando roba inspiegabile va male, alzare il livello di dettaglio:

$ DebugPreference = "Continua"
Se non si desidera che il rumore extra una volta che roba è ordinato, acquietare indietro giù di nuovo:

$ DebugPreference = "SilentlyContinue"
Un'altra cosa che voglio pensare è convenzioni. Se avete intenzione di essere l'applicazione di questo processo per un mucchio di siti poi si vuole pensare alla tua denominazione. Sono andato con le seguenti convenzioni:

Nome Sito web = $ projectName
Nome database = $ projectName + "Db"
Login Database = $ databaseName + "Login"
Nome utente database = $ databaseName + "Utente"
Nome Tag = $ projectName
Un'ultima cosa - e non sei andando in questo modo - non sottovalutare l'importanza della stampa fine:

[Questo argomento rappresenta una documentazione non definitiva ed è soggetto a modifiche nelle versioni future.  Gli argomenti vuoti vengono inclusi come segnaposto.]

Io sono un grande sostenitore di Azure, ma sarò onesto e dire che ho avuto per ottenere i bambini a lasciare la sala prima di esprimere quello che provavo per la consistenza di PowerShell comandi che realmente funzionano . So che ho fatto presente in precedenza e ed è stato un vero e proprio dolore così basta tenere a mente che quando roba non funziona, non è sempre colpa tua, potrebbe essere stato qualcun altro è altrimenti un buon consiglio che ha lavorato per loro, allora, ma può non essere pertinenti ora.

Scripting tutto fuori
In primo luogo, attenzione - draghi avanti! Stiamo per lo script automaticamente il tutto che significa un solo click crea un sacco di roba che ti ha colpito la vostra linea di fondo. A buon mercato come i servizi Azure sono, di creare abbastanza di 'em abbastanza veloce e si può essere in una brutta sorpresa.

Un avvertimento rapido prima - questo script non è altro che i comandi di cui sopra in una sequenza logica e l'utilizzo di alcune variabili d'ambiente a persistere una serie di punture hardcoded dall'alto. Non è un elegante script di PowerShell quindi se volete un buon punto di riferimento per questo, controllare questo esempio per la creazione di un gruppo di risorse Azure.

Ecco il tutto:
# Per params progetto
$ ProjectName  =  " TroyPSTest "
$ HostName  =  " troypstest.troyhunt.com "

# Ambiente costanti
$ Location  =  " occidentale degli Stati Uniti "
$ WebResourceGroup  =  " Default-Web-WestUS "
$ WebHostingPlan  =  " DefaultServerFarm "
$ DbResourceGroup  =  " Default-SQL-WestUS "
$ DbServerName  =  " snyb5o1pxk "
$ DbServerLogin  =  " troyhunt "
$ DbServerPassword  =  " P @ ssw0rd "
$ ApiVersion  =  " 2014/04/01 "

# Computerizzata vars
$ DbName  =  $ projectName  +  " Db "
$ DbLoginName  =  $ dbName  +  " Accedi "
$ DbPassword  = [guid] :: NewGuid ()
$ Nomeutentedb  =  $ ​​dbName  +  " User "

• Assicurarsi si dà il via a modalità di gestione dei servizi
Switch-AzureMode AzureServiceManagement

# Creare il sito in posizione appropriata
New-AzureWebSite  $ projectName  - Location $ posizione

# Disattivare PHP
Set-AzureWebsite  - Nome $ projectName  - phpversion Off

# Aggiungere un nome host (solo se avete già messo il CNAME sul dominio)
# Set-AzureWebsite -Name $ projectName -HostNames @ ($ hostname)

# Passare al gestore risorse
Switch-AzureMode AzureResourceManager

# Prendi il sito e quindi modificare la SKU
$ P  = @ { " SKU "  =  " standard " ; " serverfarm "  =  $ webHostingPlan ; " webHostingPlan "  =  $ webHostingPlan }
Set-AzureResource  - Nome $ projectName  - ResourceGroupName Default-Web-WestUS  - ResourceType Microsoft.Web / siti - ApiVersion $ apiVersion  - PropertyObject $ p

# Passare al gestore risorse
Switch-AzureMode AzureServiceManagement

# Aggiungere uno slot di distribuzione per messa in scena (questo deve essere fatto dopo aver impostato la SKU, come non è possibile aggiungere gli slot di distribuzione sotto il default "libero" SKU)
New-AzureWebsite  $ projectName  - Location $ location  - Slot " Stadio "

# Creare un DB SQL
New-AzureSqlDatabase  - ServerName $ dbServerName  - DatabaseName $ dbName  - Edition " di base "  - MaxSizeGB 2

# Passare al gestore risorse
Switch-AzureMode AzureResourceManager

# Creare un tag
New-AzureTag  - Nome progetto - Valore $ projectName

# Impostare il tag sul sito web
Set-AzureResource  - Nome $ projectName  - ResourceGroupName $ webResourceGroup  - ResourceType Microsoft.Web / siti - ApiVersion $ apiVersion  - PropertyObject $ p  - Tags @ {Name =  " progetto " ; Valore =  $ projectName }

# Impostare il tag sul DB
Set-AzureResource  - Nome $ dbName  - ResourceGroupName $ dbResourceGroup  - server ParentResource / $ dbServerName  - ResourceType Microsoft.Sql / server / database - ApiVersion $ apiVersion  - Tags @ {Name =  " progetto " ; Valore =  $ projectName }

# Accendi SMO
Import-Module SQLPS - DisableNameChecking
$ Conn  =  New-Object System.Data.SqlClient.SqlConnection
$ Conn .ConnectionString =  " Server = tcp: "  +  $ dbServerName  +  " .database.windows.net; Database = padrone, User ID = "  +  $ dbServerLogin  +  " ; Password = "  +  $ dbServerPassword  +  " ; "
$ Srv  =  New-Object  " Microsoft.SqlServer.Management.Smo.Server "  $ conn
$ Db  =  $ ​​srv .databases [ " maestro " ]

# Creare il login
$ Login  =  New-Object  - TypeName Microsoft.SqlServer.Management.Smo.Login - ArgumentList $ srv , $ dbLoginName
$ Login .LoginType =  " SQLLogin "
$ Login .PasswordPolicyEnforced =  $ false
$ Login .PasswordExpirationEnabled =  $ false
$ Login .Create ( $ dbPassword )

# Aggiungere l'utente al DB
$ Db  =  $ ​​srv .databases [ $ dbName ]
$ DbUser  =  New-Object  - TypeName Microsoft.SqlServer.Management.Smo.User - ArgumentList $ db , $ nomeutentedb
$ DbUser .login =  $ dbLoginName
$ DbUser .Create ()

# Passare al gestore risorse
Switch-AzureMode AzureServiceManagement

# Aggiungere la stringa di connessione al sito
$ ConnStr  =  " Server = tcp: "  +  $ dbServerName  +  " .database.windows.net, 1433; Database = "  +  $ dbName  +  " ; utente             Timeout = 30; "
$connStrInfo  =  New-Object Microsoft.WindowsAzure.Commands.Utilities.Websites.Services.WebEntities.ConnStringInfo
$ ConnStrInfo .Name = $ dbName
$ ConnStrInfo .ConnectionString = $ connStr
$ ConnStrInfo .Type = " SQLAzure "
$ ConnStrSettings  = ( Get-AzureWebsite  $ projectName  - Slot " produzione " ) .ConnectionStrings
$ ConnStrSettings Add ( $ connStrInfo )
Set-AzureWebsite  - Nome $ projectName  - Slot " produzione "  - ConnectionStrings $ connStrSettings
# Sommario
" utente DB è: "  +  $ dbLoginName
" DB password è: "  +  $ dbPassword
visualizzare crudo CreateAzureResources.ps1 ospitato con ❤ da GitHub
Sembrano abbastanza facile? E ', e distruggendo tutto è altrettanto facile quindi ecco uno script per bombardare tutto ciò che avete appena creato in modo da poter giocare con lui poi rimuovere tutto ciò prima che colpisca la vostra linea di fondo:
# params ingresso
$ ProjectName  =  " TroyPSTest "

# Costanti
$ DbServerName  =  " snyb5o1pxk "
$ DbServerLogin  =  " troyhunt "
$ DbServerPassword  =  " P @ ssw0rd "
$ ApiVersion  =  " 2014/04/01 "

# Computerizzata vars
$ DbName  =  $ projectName  +  " Db "
$ DbLogin  =  $ dbName  +  " Accedi "

# Passare al gestore risorse
Switch-AzureMode AzureResourceManager

# Togliere il tag dal sito
$ P  =  Get-AzureResource  - Nome $ projectName  - ResourceGroupName $ webResourceGroup  - ResourceType Microsoft.Web / siti - ApiVersion $ apiVersion
Set-AzureResource  - Nome $ projectName  - ResourceGroupName $ webResourceGroup  - ResourceType Microsoft.Web / siti - ApiVersion $ apiVersion  - PropertyObject $ p .Properties - Tags @ {}

# Togliere il tag dal DB
Set-AzureResource  - Nome $ dbName  - ResourceGroupName $ dbResourceGroup  - server ParentResource / $ dbServerName  - ResourceType Microsoft.Sql / server / database - ApiVersion $ apiVersion  - Tags @ {}

# Eliminare il tag (se si tenta di eliminare solo, potrebbe essere ancora attaccato alle risorse, anche se li hai già eliminato!)
Remove-AzureTag  - Nome progetto - Valore $ projectName  - Forza

• Assicurarsi si dà il via a modalità di gestione dei servizi
Switch-AzureMode AzureServiceManagement

# Eliminare il sito web
Rimuovere-AzureWebsite  $ projectName  - Forza

# Eliminare il database
Remove-AzureSqlDatabase  - ServerName $ dbServerName  - DatabaseName $ dbName  - Forza

# Eliminare il login SQL
Import-Module SQLPS - DisableNameChecking
$ Conn  =  New-Object System.Data.SqlClient.SqlConnection
$ Conn .ConnectionString =  " Server = tcp: "  +  $ dbServerName  +  " .database.windows.net; Database = padrone, User ID = "  +  $ dbServerLogin  +  " ; Password = "  +  $ dbServerPassword  +  " ; "
$ Srv  =  New-Object  " Microsoft.SqlServer.Management.Smo.Server "  $ conn
$ SRV .Logins [ $ dbLogin ] .Drop ()
visualizzare crudo DeleteAzureResources.ps1 ospitato con ❤ da GitHub
E questo è tutto - facile giusto ?!

giovedì 15 gennaio 2015

The Long and Short of It

Non solo una volta, ma ripetuto in varie apps lucrativi - un pezzo gigantesco di codice che avrei dovuto essere ridotto ad una mera linea.

Di Mark Bowytz2015/01/14

Datore di lavoro di Thomas B. non è una società che offre una sola applicazione di punta - ha decine !

Per anni, l'azienda ha fatto anno dopo anno attraverso lo sviluppo e il mantenimento di applicazioni di nicchia volte a settori specifici. Fondamentalmente, si trova un'applicazione esistente che manca una caratteristica che potrebbe essere utilizzato solo da una manciata di gruppi in tutto il mondo e poi implementa.

Tuttavia, pur essendo redditizio, è un modello di business un po 'caotico, a volte portando ad alcuni incubi di supporto. Caso in questione: una delle librerie C # applicazioni aziendali elabora le immagini all'interno di un file PDF e li invia tramite una libreria di correzione automatica del colore con forse 25 utenti in tutto il mondo. L'applicazione è stata la vendita di uno o due nuovi utenti ogni anno.

Per molte aziende, questo non sarebbe un gran successo, ma considerando questi utenti erano grandi organizzazioni, tra il prezzo praticato e rinnovo delle licenze annuali di sostegno, è stata una buona, affarista stabile.

Nonostante questi lati positivi, in realtà è stato architettato in forse il modo peggiore possibile. Sepolto nella logica dell'applicazione è stato il codice che generare un thread per ogni immagine (alcuni file PDF possono avere diverse centinaia di immagini!). C'erano deadlock frequenti, più copie degli stessi oggetti in memoria per nessun motivo apparente (immagini e file PDF, in modo molto oggetti di grandi dimensioni), e tre copie del PDF sul disco (che può facilmente essere 300MB a 800MB).

Il motivo dietro la maggior parte di questi problemi? Una funzione che Thomas B. trovato durante una spedizione refactoring:

private static int GetPhysicalFileSize (byte [] Imgbyte, string InputObject, string OutFolder)
{
  int PhysicalFileSize = 0;

  provare
  {
    ExtractImage (Imgbyte, "Photo_" + InputObject + ".jpg", OutFolder);
    var outfile = OutFolder + "\\ Photo_" + InputObject + ".jpg";

    se (File.Exists (OUTFILE))
    {
      FileInfo Fi2 = new FileInfo (OUTFILE);
      PhysicalFileSize = (int) fi2.Length;
    }

    se (File.Exists (OUTFILE))
      File.Delete (OUTFILE);

  catch (Exception ex)

    Trace.WriteError (ex);

  ritorno PhysicalFileSize;


Quindi, per determinare la dimensione di un byte [] come un file, in primo luogo, il codice scriverà le informazioni sul disco, leggere le informazioni e quindi, infine, eliminare il file.

Tutto quel lavoro disco I / O per l'equivalente di questo:

ritorno Imgbyte.Length;
Le chiamate alla più grande funzione, più ingombrante erano disseminate in tutta la fonte, quindi non c'era alcun dubbio la manciata di clienti sarebbe apprezzato della correzione, in quanto i benefici sarebbero immediatamente evidente.

Thomas B. sapeva che fissare questo bug è stata una grande vittoria, ma era solo la punta di un iceberg nel grande catalogo di applicazioni che ha lavorato sul sostegno. Grazie al cielo per clienti fissi.

venerdì 9 gennaio 2015

IncrediBuild strumento aggiornato per Visual Studio 2015 Preview

Xoreax Ltd. ha annunciato oggi il suo strumento IncrediBuild progettato per accelerare lo sviluppo cross-platform costruisce in Visual Studio è stato aggiornato per supportare l'ultima versione, il Visual Studio 2015 Preview.

La società con sede a Tel Aviv utilizza la tecnologia di virtualizzazione di processo nel suo software di calcolo distribuito per approfittare di cicli di CPU di inattività e accelerare lo sviluppo costruisce dalla concomitanza diffusione del lavoro attraverso la rete. A seconda della complessità del progetto e disponibile potenza di calcolo, come ad costruisce può mangiare molto del tempo di uno sviluppatore e allungare i cicli di sviluppo.

IncrediBuild 6.0 "permette costruisce da eseguire in parallelo su tutta la rete e nel cloud, sostanzialmente aumentando le prestazioni, accelerare il tempo a costruire e migliorare la produttività degli sviluppatori", ha detto la società in un comunicato. "IncrediBuild assicura compilation Android sono molto più veloci, offrendo la compilazione parallela a livello di progetto. Per esempio, una build norma richiede più di tre minuti su una macchina a otto core con 100 due secondi compiti compilazione Android. Con IncrediBuild, lo stesso compito prende 12 secondi. "

La nuova versione aggiunge anche il supporto per progetti condivisi, lasciando che gli sviluppatori di condividere simultaneamente codice, controlli, stili, archi e altre risorse tra due progetti distinti Phone Windows e di Windows in Visual Studio. "Sostenere lo sviluppo cross-platform, IncrediBuild offre funzioni di produttività aggiuntive come la visualizzazione di costruzione, il rilevamento degli errori facili, la capacità di controllare l'uscita costruire ogni progetto, la costruzione e la gestione replay", ha detto la società.

IncrediBuild disponibile anche in "Make e costruire Tools" (Fate, gmake, VSimake, Jam, Nant e più) e "Strumenti di sviluppo" versioni (BoundsChecker, Goanna, MicroFocus, più PC-lint e). L'azienda offre una prova di 30 giorni del software e un "freemium" versione FreeDev con funzionalità completa per 30 giorni.

Nel mese di novembre, l'azienda ha lanciato una versione per Microsoft Azure IncrediBuild."In Microsoft, riconosciamo gli sviluppatori stanno lavorando sotto tremenda pressione per rilasciare grandi prodotti su più piattaforme," la società ha citato Microsoft exec Tom Lindeman come dicendo. "La tecnologia di IncrediBuild migliora ulteriormente l'offerta multipiattaforma integrati in Visual Studio, per aiutare gli sviluppatori di fornire rapidamente applicazioni di alta qualità a molte delle piattaforme più popolari."

lunedì 5 gennaio 2015

Come prendere il controllo di Amazon Web Services all'interno del tuo .NET

Amazon Web Services (AWS) fornisce una miriade di servizi Web che molti sviluppatori utilizzano come piattaforma di cloud di scelta. E mentre AWS offre un portale di gestione, c'è anche la necessità di strumentazione personalizzata che può interagire con le API AWS. Per questo, AWS offre un potente SDK .NET che consente agli sviluppatori di query o modificare lo stato di praticamente ogni aspetto del sistema, e lo fa in un modo che sia coerente in molte delle sue offerte.

Uno dei più noto dei servizi AWS è l'Elastic Compute Cloud (EC2), un Infrastructure as a Service (IaaS) che fornisce l'infrastruttura virtuale all'interno di datacenter AWS. Utilizzando questo servizio è possibile avviare le macchine virtuali (VM) che sono provisioning in pochi minuti, con la fatturazione di ora in ora. Questo può essere incredibilmente potente per una serie di motivi, soprattutto quando si può iniziare a lanciare o eliminarne l'VM all'interno del codice. Prima di tuffarsi in quel codice, ho bisogno di spiegare i componenti necessari per avviare un'istanza EC2.
I componenti di una istanza EC2
Il primo componente di un'istanza EC2 è l'AMI, o Amazon macchina Immagine. L'AMI è una immagine del disco che è copiato sul disco dell'istanza quando viene creato per la prima. La prima volta che si crea un'istanza dovrete scegliere una delle centinaia di AMIS preesistenti che vanno da OS fresco installa di dischi con software preinstallato. Fra i più importanti sono Windows Server, Windows Server con SQL Server, molte versioni di Linux, SIGNIFICANO impilare e stack LAMP. L'elenco completo è disponibile presso il Marketplace AWS .
Una volta deciso che AMI basare il vostro VM, la prossima cosa di cui ha bisogno è un gruppo di protezione. Un gruppo di protezione è fondamentalmente come un firewall; Esso contiene una serie di regole che permette connessioni sia entrata o in uscita su una determinata porta ad una serie di indirizzi IP. Se si utilizza Windows ti genere desidera aprire connessioni in ingresso sulla porta 3389 per Desktop remoto, così come qualsiasi servizi vostro VM sarà in esecuzione. Regole in uscita possono essere configurati, anche, ma per impostazione predefinita è consentito tutto il traffico in uscita.
Il componente finale è qualcosa che si chiama una coppia di chiavi. Come suggerisce il nome, una coppia di chiavi ha due parti: la chiave privata e la chiave pubblica. Quando si genera una coppia di chiavi attraverso la console di gestione si avvierà automaticamente il download di un file denominato yourkeyname.pem. Questa è la chiave privata e deve essere utilizzato per sbloccare le istanze e accedere in loro. Questo funziona in modo diverso a seconda del sistema operativo scelto, ma con Windows il file di chiave privata deve essere fornito per decifrare la password di amministratore.
All'interno di AWS ciascuno di questi componenti avranno un identificatore univoco. Perché di solito non passare questi componenti tra le VM lancio, annoto nella console di gestione AWS per ottenere gli identificatori che io poi uso nel mio codice per lanciare le istanze. La prima volta che accede al Management Console AWS verrà visualizzato un elenco dei servizi Web, come mostrato in Figura 1 .
[Clicca sull'immagine per ingrandirla.] Figura 1. Elenco dei servizi Web nella console di gestione AWS
Per seguire con me, scegliere il servizio EC2, che vi porterà al Dashboard EC2 mostrata in figura 2 .
[Clicca sull'immagine per ingrandirla.] Figura 2. Il Dashboard EC2
Quindi, selezionare gruppi di protezione sul lato sinistro per visualizzare un elenco dei gruppi di protezione e dei loro identificatori, elencati nella colonna ID gruppo. Qui è possibile aggiungere i gruppi di protezione con l'aggiunta di regole, come mostrato in figura 3 .
[Clicca sull'immagine per ingrandirla.] Figura 3. L'aggiunta di gruppi di protezione con l'aggiunta di regole
Il passo successivo è quello di creare una coppia di chiavi. Seleziona delle coppie di chiavi a sinistra, scegliere Crea coppia di chiavi, e dargli un nome. Una volta premuto il pulsante Crea file della chiave privata sarà scaricato automaticamente (vedi figura 4 ).
[Clicca sull'immagine per ingrandirla.] Figura 4. sul pulsante Crea scaricherà automaticamente la chiave privata
Il passo finale è quello di ottenere l'identificatore AMI. La prima volta che si passa attraverso questo processo non avrà un costume AMI, ma se si seleziona istanze e scegliere Launch Instance, ti verrà richiesto di selezionare un AMI. Questo schermo ha gli ID AMI per tutto il pubblico AMI, come mostrato in Figura 5 .


[Clicca sull'immagine per ingrandirla.] Figura 5. ID AMI per Tutti Amis pubblica
L'accesso alle API
La voce finale necessario per ottenere di programmazione di accedere alle istanze è un set di credenziali note come chiave di accesso e la chiave segreta (da non confondere con la coppia di chiavi che ho citato in precedenza, che non è correlato).

Per creare la chiave di accesso, è necessario tornare alla lista principale dei servizi visualizzati in figura 1 e scegliere IAM. Una volta che siete in IAM, vai alla pagina Gruppi e scegliere Crea nuovo gruppo, come in figura 6 .


[Clicca sull'immagine per ingrandirla.] Figura 6. Scegliere Crea nuovo gruppo nel IAM gruppi di pagine
Poi il sito vi guiderà attraverso i passi per creare il gruppo. Dopo aver fatto il gruppo, vai alla pagina Utenti e seguire le istruzioni per creare un utente. Assicurarsi di mantenere la casella di controllo selezionato per "Generazione di una chiave di accesso per ogni utente", se si desidera utilizzare l'utente per ottenere l'accesso attraverso l'API. Una volta che gli utenti vengono creati sarete portati ad una pagina di conferma (vedi figura 7 ), dove si può vedere la chiave di accesso e la chiave segreta, oppure è possibile scaricare un file CSV.


[Clicca sull'immagine per ingrandirla.] Figura 7. Pagina di conferma, mostrando la chiave di accesso e la chiave segreta
Una volta lasciato questa pagina sarete in grado di recuperare di nuovo queste credenziali e sarà necessario ricreare l'utente se li smarrimento. È quindi possibile entrare in pagina dei dettagli del nuovo utente e scegliere Aggiungi utente per gruppi per aggiungere l'utente al gruppo.

Le istanze di accesso di programmazione
per sfoggiare quanto sia semplice lavorare con l'SDK AWS ho intenzione di sfoggiare alcune interazioni che si possono fare con EC2. Per ottenere l'SDK è possibile scaricarlo dalla AWS Resources pagina o scarica tramite NuGet cercando "AWS SDK."

La prima cosa che farò è ottenere una lista delle mie istanze in esecuzione in una data regione:

AWSCredentials credenziali = new BasicAWSCredentials ("MyAccessKey", "MySecretKey");

Client IAmazonEC2 = AWSClientFactory.CreateAmazonEC2Client (credenziali, RegionEndpoint.USEast1);

DescribeInstancesResponse describeInstancesResponse = client.DescribeInstances ();
List <> prenotazione Prenotazioni = describeInstancesResponse.Reservations;

foreach (esempio grado nella reservations.SelectMany (x => x.Instances))
{
  Console.WriteLine ("istanza con ID {0} è attualmente {1}",
    instance.InstanceId, instance.State.Name);
}
In questo codice, ho creare un oggetto BasicAWSCredentials, passandogli la chiave di chiave di accesso e segreta ho generato in precedenza. Avanti, io uso la AWSClientFactory per creare un client di Amazon EC2, che richiede l'oggetto credenziali e la RegionEndpoint della regione che sto interrogando. Poi, chiamo il metodo DescribeInstances del cliente, che restituisce il DescribeInstancesResponse. L'oggetto risposta ha una proprietà prenotazioni, e ogni prenotazione ha una proprietà istanze. Per ottenere un elenco di tutte le istanze e scorrere li uso la query LINQ SelectMany. Si noti che questo è un modello comune quando si lavora con l'SDK, e ho illustrato in figura 8 .


[Clicca sull'immagine per ingrandirla.] Figura 8. Listing e scorrendo tutte le istanze utilizzando la SelectMany LINQ Query
Come avrete intuito dal setup che porta a questo, la creazione di un'istanza è un po 'più complesso di una semplice messa in vendita di quelli che sono già in esecuzione. Il codice completo è mostrato in Listato 1 .

Listing 1: creare e lanciare una nuova istanza EC2
stringa amiId = "ami-904be6f8";
stringa securityGroupId = "sg-ab4241ce";
stringa keyPairName = "demo";
stringa instanceSize = "t2.micro";

AWSCredentials credenziali = new BasicAWSCredentials ("MyAccessKey", "MySecretKey");
Client IAmazonEC2 = AWSClientFactory.CreateAmazonEC2Client (credenziali, RegionEndpoint.USEast1);

stringa SUBNETID = client.DescribeSubnets () Subnets.First () SUBNETID..;
InstanceNetworkInterfaceSpecification networkSpecification = new InstanceNetworkInterfaceSpecification ()
{
  DeviceIndex = 0,
  SUBNETID = SUBNETID,
  Gruppi = new List <string> () {} securityGroupId,
  AssociatePublicIpAddress = true
};
List <InstanceNetworkInterfaceSpecification> networkSpecifications = new List <InstanceNetworkInterfaceSpecification> () {} networkSpecification;