sondaggio, ping, PubSub, pubsubhub, pubsubhubbub
Nel caso siate scettici, c'è un metodo nella follia sopra, nel titolo del post. Nei circoli tecnologia è improbabile che non avete sentito parlare di pubsubhubbub. In veloci pochi mesi, è stato uno dei primi tre parlato di cose. Altri due essendo la crittografia omomorfica e Google wave [ 1. ]. Tornando al post corrente - termini del titolo indicano come si ottiene il contenuto da altre persone. Seguenti dettagli diventano più chiare, se si immagina cose che accadono per quanto riguarda i blog, anche se non sono concettualmente limitato a blog.
Polling si riferisce allo scenario dove i clienti continuano a chiedere al server se qualcosa di nuovo è venuto in su. Quante volte a chiedere la disponibilità di aggiornamenti sarà sempre un problema con polling troppo frequenti o troppo poco frequenti, ma come un lettore ha sottolineato qui che una grande cosa con polling è che il server non ha bisogno di mantenere lo stato.
Ping si riferisce al caso in cui in cui pubblicare un articolo, è (o il vostro software) aggiorna anche alcuni popolari (centrale), servizi di aggiornamento. Alcuni retroscena qui .
Poi c'è PubSub che sta per publish / subscribe, uno dei primi passo per esso è stata fatta qui da Evan Henshaw-Plath e Kellan Elliott-McCrea (72 slides, ma la pena di andare attraverso). Esempio convincente hanno dato contro era questa - in una data particolare, Friendfeed strisciato Flickr 2,9 milioni di volte per ottenere le ultime foto di 45,754 utenti, di cui 6721 aveva visitato Flickr in quelle 24 ore e potrebbe essere 'potenzialmente' ha caricato una foto. Si noti che ciò che hanno proposto non era una nuova tecnologia, come fanno notare 'nuova e rivoluzionaria tecnologia vecchia 20 anni'. Se lo fate per i blog poi uno dei problemi principali con xmpp - la presenza in testa i dati, che può raggiungere il 60-70% può essere ridotto di molto.
pubsubhub sta per pubblicare hub subscribe pubsubhubbub ed è un protocollo, cui centro è un'idea di pubsubhub. Editori in cui (dicono i blogger) di aggiornare il mozzo che (può essere più di un hub, che parlano tra di loro) risiede 'da qualche parte nella nuvola', secondo il protocollo può essere spingere o tirare come da protocollo, ma il link successivo nel catena, hub al cliente (ad esempio lettori) è sempre spingere modello. Questa pagina è una buona base di partenza per pubsubhubbub, diapositive Panoramica sono buone. Sempre eloquente Anil Dash lo descrive qui come pulsante web.
Due letture collegate siano altri webhooks che sono fondamentalmente callback http. Github utilizza esso, fa paypal per le notifiche asincrone di pagamento in IPN . Lo stesso vale per molti altri. Concetto correlato è rsscloud che è di nuovo hub PubSub. Segui questo link per i dettagli.
Ci si potrebbe chiedere qual è il punto di scrivere tutte queste cose qui, ci sono due 1. Queste cose sono la pena di conoscere, almeno in minima parte e 2. Questo blog è abilitato pubsubhubbub ora tramite hub appspot utilizzando questa wordpress plug-in e dei mangimi è troppo pubsubhubbub abilitato tramite FeedBurner, link qui
-
[ 1 ]. - Buona lettura introduttiva per la crittografia completa omomorfica è questo articolo di Bruce Schneier e questo discorso è più o meno unica fonte per Google Wave.
-UPDATE - Questo messaggio spiega come l'esigenza di server pubblico per la richiamata può essere lavorato in giro per i client desktop utilizzando il gateway XMPP (per pubsubhubbub).
Un po 'di assemblaggio
Dopo aver letto questo articolo su buffer Lock Free e vedere l'uso del CAS (confrontare e scambiare), mi sentivo come la pubblicazione del codice assembly a fare lo stesso. Utilizzare caso su quello che c'era da scrivere un metodo nativo e chiamare da Java (back in 1.5, quando concomitanti strutture dati in Java erano più o meno inesistente). Senza ulteriori indugi, farò scatenare il codice su di te
. Il primo è per il CAS e la seconda è per il calcolo MCD utilizzando l'algoritmo di Euclide (questo può essere trovato in molti luoghi e tutorial e).
Compilare ed eseguire le istruzioni gcc file_name.c ; ./a.out
Confronta e Swap
# Include# Include / / Exchange - newvalue, comperand è vecchio / valore atteso / * * Funzione realmente fa la seguente cosa - se il valore a * dest è pari a OldValue poi sostituirlo con altro newvalue lasciarlo invariato: non tutti questi atomicamente * * Ci sono due opzioni per il valore di ritorno * Valore iniziale di 1.is * dest e lasciare l'onere della FXN chiama a confronto con oldval * 2. farlo qui e restituire 0 o 1, questo dovrebbe essere più efficiente ** / / * Successivamente modificare in macro * / cas int (int * dest, int OldValue, int newvalue) { printf ("(% d,% d,% d)", * dest, OldValue, newvalue); / * Int cas (int dest, int OldValue, int newvalue) {* / / * Int cas (int dest, int newvalue, int OldValue) {* / int risultato = 1 ;/ * 1 mostra che cas succeduti e 0 mostra di non aver * / / * Btw necessario impostare cc per la bandiera sovrascrivere! * / __asm__ __ volatile__ ( "Movl% 2,%% eax \ n \ t" "Movl% 3,%% ebx \ n \ t" "Movl% 0,%% ecx \ n \ t" "LOCK \ n \ t" "Cmpxchg% ebx%, (%% ecx) \ n \ t" / * deve bloccare essere sulla stessa linea * / "Jz FATTO \ n \ t" "Movl $ 0,% 1 \ n \ t" "DONE: \ n \ t" : "= M" (dest), "= g" (risultato) : "G" (OldValue), "g" (newvalue), "m" (dest) : "% Eax", "% ebx", "ECX", "cc" ); printf ("(% d,% d,% d)", * dest, OldValue, newvalue); return risultato; } / * TODO * Scrivere un altro FXN asm che mette al di sopra FXN in un ciclo while e continuare a provare meno che non riesca * / int main () { int a = 5, b = 6; int * c = (int *) malloc (sizeof (int)); * C = 6; / * Int c = 6; * / printf ("% d \ n", cas (c, b, b)); printf ("% d \ n", cas (c, b, a)); printf ("% d \ n", cas (c, a, a)); printf ("% d \ n", cas (c, b, b)); * C = 6; / * C = 5; * / printf ("valore di cambio di c * a% d \ n", * c); printf ("% d \ n", cas (c, b, b)); printf ("% d \ n", cas (c, b, a)); printf ("% d \ n", cas (c, a, a)); printf ("% d \ n", cas (c, a, b)); printf ("% d \ n", cas (c, b, a)); return 0; }
Note Formattazione - sembra evidenziatore wp sintassi è l'aggiunta di alla fine, ignorarlo.
GCD
# Includeint gcd (int a, int b) { int risultato; / * Calcola Massimo Comun utilizzando l'algoritmo di Euclide * / __asm__ volatile__ __ ("movl% 1,%% eax;" "Movl% 2,%% ebx;" "Contd: cMpl $ 0,%% ebx;" "Je FATTO;" "Xorl%% edx,%% edx;" "Idivl%% ebx;" "Movl% ebx%,%% eax;" "Movl%% edx,% ebx%;" "Jmp cont;" "DONE: movl%% eax,% 0;": "= g" (risultato): "g" (a), "g" (b) ); return risultato; } int main () { int primo, secondo; printf ("Inserire due interi:"); scanf ("% d% d", & primo, & secondo); printf ("MCD di d &%% d è% d \ n", primo, secondo, gcd (primo, secondo)); return 0; }
ruby uno rivestimenti per creare hash
Ieri, mentre sta attraversando uno dei miei vecchi programmi, ho trovato questo scritto da me qualche tempo fa:
#begin magic
hash=Hash[*CGI.unescape(raw_text).split('&').map{|x| b=x.split("=");b.push(nil) if b.size==1;b}.flatten]
#end magic
Per uccidere un po 'di suspense lasciatemi rivelare che raw_text assomiglia
, A destra è stata tagliata dal riconoscimento di pagamento paypal.
Sopra la linea in caso di rottura in più parti si legge:
unescaped_array = CGI.unescape (raw_text). split ('&') unescaped_array unescaped_array.collect = {| x | b = x.split ("="); b.push (zero) se b.size == 1; b} flattened_array = unescaped_array.flatten hash = Hash [* flattened_array]
Facciamo singole fasi IRB:
irb (main):. 009:0> unescaped_array = CGI.unescape (raw_text) split ('&') => ["SUCCESS", "mc_gross = 10,00" "protection_eligibility = non ammissibile",, "payer_id U7PPJJ4TSJ47E =" "tassa = 0.00",, "payment_date = 09:45:30 10 Luglio 2009 PDT", "In attesa di payment_status = "] irb (main): 013:0> unescaped_array unescaped_array.map = {| x | b = x.split ("="); b.push (zero) se b.size == 1; b} => [["SUCCESSO", nil], ["mc_gross", "10.00"], ["protection_eligibility", "non ammissibile"], ["payer_id", "U7PPJJ4TSJ47E"], ["tassa", "0.00"] , ["payment_date", "09:45:30 10 luglio 2009 PDT"], ["payment_status", "In attesa"]] irb (main): 014:0> flattened_array = unescaped_array.flatten => ["SUCCESSO", nil, "mc_gross", "10.00", "protection_eligibility", "non ammissibili", "payer_id", "U7PPJJ4TSJ47E", "fiscale", "0.00", "payment_date", "09:45: 30 10 luglio 2009 PDT "," payment_status "," In attesa "] irb (main): 015:0> hash = Hash [* flattened_array] => {"Fiscale" => "0.00", "payment_status" => "attesa", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10.00", "SUCCESSO" => nil, "payment_date" = > "09:45:30 10 Lug 2009 PDT", "protection_eligibility" => "non ammissibili"}
BTW, * viene chiamato operatore splat in Ruby
Un altro modo per creare hash da 'array di coppie' è quello di utilizzare iniettare:
hash = [[1,2], [3,4]] iniettare ({}). {| risultato, elemento | result [element.first] = result [element.last]; risultato} C'è un modo più
Scrivere un ciclo, che lascio come esercizio ai lettori!
Ecco un caso po utilizzo indipendente di creare hash di array:
irb (main): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.? : Minore, maggiore ::} => {: Minore => [1, 2, 3, 4],: maggiore => [7, 9]}
È possibile fare più cose, fondamentalmente frutto del blocco viene utilizzato come chiave per tale elemento nel hash risultante.
gmail, mutt e msmtp fix
Se si utilizza mutt e smtp per accedere a Gmail. Ecco una (brutta) notizia. Raffreddare i ragazzi di Google cambia nuovamente certificato. Oh, hai chiesto - come lo conosci? Mutt Simple iniziarono a lamentarsi certificato non valido quando si tenta di utilizzare msmpt, infame 'msmtp: verifica dei certificati TLS fallito:. Il certificato non ha una nota emittente' mi salutò sullo schermo.
Per attraversare confermare -
Basta eseguire a seguito di
$ msmtp --serverinfo --host=smtp.gmail.com --tls=on --port=587 --tls-certcheck=off
Al posto della vecchia Server Thwate ora si ottiene in seguito nel segmento dell'emittente
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US
Fortunatamente soluzione è semplice, ecco cosa dovete fare su debian
# apt-get install ca-certificates
# dpkg -s ca-certificates|grep Version
Version: 20090814
Dopo questo basta cambiare la seguente riga in voi ~~~V /. Msmtprc
tls_trust_file /certs/Thawte SSLWeb Server Roots/thawte Premium Server CA/Thawte Premium Server CA.pem
tls_trust_file /certs/Thawte SSLWeb Server Roots/thawte Premium Server CA/Thawte Premium Server CA.pem
a
tls_trust_file /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt
Unione di hash in conf YAML
YAML è abbastanza comoda per la scrittura di file di configurazione. Vantaggio principale è che, si legge come file di testo. Questo funziona molto bene se il vostro file di configurazione è flat (senza gerarchia) e non ha ripetizioni.
Se il file di configurazione ha ripetizioni allora ha senso per separare gli elementi e riutilizzarli. Quello che voglio dire è questo - diciamo che il file di configurazione simile a questa:
sviluppo: input_location: common_input output_location: dev_location mail: smtp_server: Your_Server Login: login_personale password: top_secret produzione: input_location: common_input output_location: dev_location mail: smtp_server: Your_Server Login: login_personale password: top_secret
Supponendo sopra il codice in / tmp / test.yml: ecco come si può leggere in Python e Ruby
$cat readyml.py
#! / Usr / bin / env python dal pprint import pprint come pp # In debian è necessario installare python-YAML da YAML carico importazione, load_all, discarica hash = carico (open ('/ tmp / test.yml')) pp (hash ['sviluppo'])
$ cat readyml.rb
#! / Usr / bin / env ruby require 'pp' hash = YAML :: load (File.open ('/ tmp / test.yml'). leggere) pp hash ['sviluppo']
ecco un pratico uno di linea per la versione ruby
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' o si può provare lo stesso in irb o console python.
Si noti che nel frammento di codice di cui sopra, tutto è diverso percorso di output è lo stesso in fase di sviluppo e parte della produzione. Questo è dove identificatore di nodo yml viene in soccorso. Idea è semplice avere un insieme di valori predefiniti e li modifichi in luogo diverso.
Si può scomporre come segue:
default: default e input_location: common_input output_location: dev_location mail: SENDER_NAME: mittente smtp_server: Your_Server Login: login_personale password: top_secret sviluppo: <<: * Le impostazioni predefinite produzione: <<: * Le impostazioni predefinite output_location: prod_location
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Grande, funziona (tm)!.
Probabilmente abbiamo scambiato po 'di chiarezza per un po' di magia. Ecco una piccola spiegazione: &, * e <<: e che è tag di ancoraggio può essere inteso come identificatore di nodo, * è il nodo di riferimento e <<: sta per unione hash.
Per maggiori dettagli vedere sia le specifiche YAML o wikipedia
Fin qui tutto bene ma c'è un fermo qui, queste si fonde hash non sono ricorsivi. Che cosa significa è questo: diciamo che si desidera avere altro nome del mittente per la posta in due ambienti, si può essere tentati di fare quanto segue:
default: default e input_location: common_input output_location: dev_location mail: SENDER_NAME: mittente smtp_server: Your_Server Login: login_personale password: top_secret sviluppo: <<: * Le impostazioni predefinite mail: SENDER_NAME: sender_dev produzione: <<: * Le impostazioni predefinite output_location: prod_location mail: SENDER_NAME: sender_prod
Consente di controllare
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$
Oops, qualcosa è andato storto, il problema di come si è detto è che l'unione hash non è ricorsiva e, mentre la fusione ha sostituito posta elettronica di default per posta di produzione che ha una sola chiave. Soluzione / lavoro intorno è quello di svolgere un livello di più:
common_settings: & common_settings input_location: common_input output_location: dev_location mail_defaults: & mail_defaults SENDER_NAME: mittente smtp_server: Your_Server Login: login_personale password: top_secret default: default e <<: * Le common_settings mail: <<: * Le mail_defaults sviluppo: <<: * Le impostazioni predefinite produzione: <<: * Le impostazioni predefinite mail: <<: * Le mail_defaults SENDER_NAME: sender_prod
Consente di controllare di nuovo
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Hai detto di avere un altro livello di nidificazione, e si può sicuramente svolgere un livello di più, ma poi diventa un casino. Quindi, se non si tenta di scrivere la soluzione alle torri di Hanoi in un file di configurazione, è meglio restucture file di configurazione che scavare in yaml o qualcos'altro. Ma questa è la chiamata comunque.
Un po 'di redirezione della shell
Ecco come si fa normalmente redirezione della shell
$ ./pgm.sh args >out.txt 2>err.txt
Volevo modificarlo un po 'ed eseguire la seguente
$ ./pgm.sh args
con il requisito che la produzione e l'errore dovrebbe andare in qualche file all'interno pgm.sh calcolato sulla base di argomenti. Un caso esemplare potrebbe essere data quando si è parte di argomenti. Così si desidera stdout andare a dire / your / directory / pgm_out_YYYYMMDD.txt 1
Il problema con il modo standard di reindirizzare N>file.txt cioè, che associa il descrittore di file N a file.txt, è che funziona solo per il processo di nuova forcella e non per il processo corrente.
così
$ echo hi 1>out.txt ; echo hii . invierà ciao a out.txt ma stamperà hii stdout 2
Questo è dove exec viene in nostro soccorso. Se aggiungiamo exec 1>somefile.txt poi uscita dal resto dello script andrà a somefile.txt
$. / Test.sh reindirizzerà hi così come hii a out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
Allo stesso modo per reindirizzare stdout e stderr faremo qualcosa di simile
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
Ora tornando al punto di partenza di riorientare a qualche file dall'interno del guscio, diciamo il nome del file del programma calcolata in qualche OUTFILE variabile, avremmo potuto appena fatto exec 1>$OUTFILE
Che risolve il problema attuale. Ma come si può passare attraverso il seguente esempio che raggiunge 'accesso casuale' di file in script di shell. Esempio è da qui
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890
Con i commenti, questo codice si spiega da sé.
-
1 Può anche essere fatto da $ ./pgm.sh args >pgm_out`date +%Y%m%d` ma l'idea è quella di generare il nome del file in base a una logica in programma stesso.
2 1 1> out.txt è ridondante, ma chiarisce qui che si stanno riorientando fd 1
Per ridimensionare o non in scala
Quando si parla di partizionamento orizzontale dei database, DHH di ROR fama suggerisce che roba scaling può aspettare, sicuramente aspettare fino al punto vostre esigenze aziendali lo richiedono. Il suo articolo rende sicuramente senso per installazioni di piccole start-up dicono. Per non dire che in start-up si dovrebbe scrivere programmi demo, ma visto che ci sono solo 24 ore in un giorno si dovrebbe concentrare sul servizio dicono che 1000 utenti in modo più appagante che perdere il sonno più preoccuparsi di come sarà la mia domanda gestire un carico di 13.142 mila utenti. Se si ottiene quei molti utenti si saprà scala. Per le start-up scalabilità è un buon problema da risolvere, ma un problema molto meglio avere, intendo ogni avvio piacerebbe correre in questo problema!
In un altro relativo articolo Jeremy Zawodny scrive non si deve dipendere da Mr. Moore se avete problemi di scalabilità.
Dal momento che questi articoli si riferiscono alla legge di Moore non posso fare a meno di scrivere che la legge di Moore deve essere uno dei più generalizzato legge in Computer Science. Dalla sua originaria previsione circa densità di transistor, questa legge è ora citata ovunque ci si imbatte in crescita esponenziale.



































