sondaj de opinie, ping, pubsub, pubsubhub, pubsubhubbub
În cazul în care sunt sceptici, există o metodă în nebunia de mai sus, în titlul postului. În cercurile tech, este puţin probabil că nu aţi auzit de pubsubhubbub. În lunile rapide ani, a fost unul dintre primii trei vorbit despre lucruri. Alte două fiind de criptare homomorphic şi Google val [ 1. ]. Revenind la postul curent - termeni din titlu indică modul în care veţi obţine conţinutul de la alte persoane. Următoarele detalii devin mult mai clar, dacă vă imaginaţi lucruri se întâmplă cu privire la bloguri, chiar dacă acestea nu sunt conceptual limitează la bloguri.
De votare se referă la scenariu în cazul în care clienţii îl tot întreabă pe server, dacă ceva nou a venit. Cât de des pentru a solicita actualizări va fi întotdeauna o problemă cu votare prea frecvente sau prea rare, dar ca un cititor a subliniat aici că un lucru mare, cu de votare este că serverul nu are de a menţine de stat.
Ping se referă la cazul în care atunci când posta un articol, vă (sau software-ul), actualizează, de asemenea, unele populare (central) servicii de actualizare. Unele fundal aici .
Următorul este pubsub, care vine de la publicarea / abonati, unul dintre cele mai vechi teren pentru care a fost făcută aici de Evan Henshaw-Plath şi Kellan Elliott-McCrea (72 de slide-uri, dar merita trece prin). Constrîngerea de exemplu au dat împotriva a fost aceasta - la o anumită dată, FriendFeed tarat Flickr 2,9 milioane de ori pentru a obţine cele mai recente fotografii de 45,754 utilizatori, dintre care 6721 au vizitat Flickr în aceste 24 de ore şi ar putea fi "potenţial", încărcat o fotografie. Act de faptul că ceea ce au propus nu a fost o tehnologie nouă, aşa cum au subliniat "revolutionara tehnologie de noi de 20 de ani". Dacă o face pentru blog-uri, apoi una dintre problemele majore cu XMPP - prezenţa aeriene de date, care poate fi la fel de mare ca 60-70% poate fi redus foarte mult.
pubsubhub vine de la publicarea abonează-te hub şi pubsubhubbub este un protocol, de bază de care este ideea de pubsubhub. Editori în cadrul căreia (spun bloggeri) actualizarea hub, care (poate fi mai mult de un hub-uri, care vorbesc intre ele) se află "undeva în nor", conform protocolului acest lucru se poate impinge sau trage ca pe protocol, dar link-ul următor, în lanţ, hub-ul la client (de exemplu cititori), care se împinge mereu modelul. Această pagină este bun punct de plecare pentru pubsubhubbub, slide-uri Privire de ansamblu sunt bune. Încă de elocvent Anil Dash, o descrie aici, ca butonul de web.
Două alte citiri aferente sunt webhooks care este de fapt callback http. Github foloseste -l, astfel încât nu paypal pentru notificările asincrone de plată în IPN . Deci, face multe altele. Conceptul aferente este rsscloud care este din nou hub pubsub. Urmaţi acest link pentru detalii.
S-ar putea fi întrebaţi care este punctul de scris toate acestea aici, există două 1. Aceste lucruri sunt în valoare de cunoaştere, cel puţin minim şi 2. Acest blog este pubsubhubbub activat acum prin intermediul hub-ul appspot folosirea acestui WordPress plug-in şi hrana pentru animale este de asemenea pubsubhubbub activat prin FeedBurner, link-ul aici
-
[ 1 ]. - Bine introductivă citit pentru criptarea în întregime homomorphic este acest articol de Bruce Schneier şi această discuţie este mai mult sau mai putin singura sursă pentru Google Wave.
-UPDATE - Acest mesaj explică modul în care cerinţa de server public pentru apel invers poate fi lucrat pentru clienti în jurul valorii de desktop prin utilizarea gateway-ul XMPP (pentru pubsubhubbub).
Un pic de asamblare
După ce aţi citit acest articol despre buffer gratuite de blocare şi de a vedea de utilizare a CAS (comparati si swap), m-am simtit ca postarea codul de asamblare să facă acelaşi lucru. Utilizaţi caz acolo a fost de a scrie o metodă de nativ şi să-l de la Java (înapoi la 1,5, atunci când structurile de concurente de date în Java au fost mai mult sau mai puţin inexistente). Fără alte introduceri, voi dezlănţui codul de pe tine
. Primul este pentru CAS şi al doilea este pentru GCD de calcul folosind algoritmul lui Euclid (acesta poate fi găsit în multe locuri şi tutoriale precum şi).
Compila si rula instrucţiuni de gcc file_name.c ; ./a.out
Compară şi Swap
# Include# Include / / De schimb - NewValue, comperand este vechi / aşteptat valoare / * * Funcţie face de fapt următorul lucru - în cazul în care valoarea de la * dest este egal cu oldvalue apoi înlocuiţi-l cu NewValue altfel se lasa neschimbat: nu toate acestea atomic * * Există două opţiuni pentru valoarea de returnare * Valoarea iniţială a 1.is * dest şi lasă povara fxn de asteptare pentru a se compara cu oldval * 2. face aici şi pentru a reveni 0 sau 1, acest lucru ar trebui să fie mai eficientă ** / / * Schimbă mai târziu, în 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) {* / Rezultatul int = 1 ;/ * 1 arată că CAS reuşit şi 0 arată că a eşuat * / / * BTW nevoie pentru a seta CC pentru pavilion platesti! * / __asm__ __ volatile__ ( "Movl% 2,%% eax \ n \ t" "Movl% 3,%% ebx \ n \ t" "0% movl,%% ecx \ n \ t" "LOCK \ n \ t" "CMPXCHG% ebx%, (%% ecx) \ n \ t" / * ar trebui să fie LOCK de pe aceeaşi linie * / "JZ DONE \ n \ t" "Movl $ 0, 1% \ n \ t" "DONE: \ n \ t" : "M =" (destinatie), "= g" (rezultat) : "G" (oldvalue), "G" (NewValue), "M" (destinatie) : "% EAX", "% ebx", "ecx", "cc" ); printf ("(% d,% d,% d)", * dest, oldvalue, NewValue); a reveni rezultat; } / * TODO * A scrie un alt fxn al AŞM, care pune mai sus, fxn într-o buclă în timp ce încerca şi să păstreze excepţia cazului în care aceasta reuşeşte * / 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 ("valoare schimbarea de la C *% 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 de formatare - se pare ca evidenţiere Sintaxa WP este adăugarea în final, că ignora.
GCD
# Includeint cmmdc (int a, int b) { int rezultat; / * Compute mai mare divizor comun folosind algoritmul lui Euclid * / __ volatile__ __asm__ ("movl% 1,%% eax;" "Movl% 2,%,% ebx;" "CONTD: cmpl $ 0,%% ebx;" "Je făcut;" "Xorl%% EDX, EDX%%;" "Idivl%% ebx;" "Movl% ebx%,%% eax;" "Movl%% EDX,% ebx%;" "JMP CONTD;" "DONE: movl%% EAX,% 0;": "= g" (rezultat): "g" (a), "G" (b) ); a reveni rezultat; } int main () { int prima secundă,; printf ("Introduceti doua numere:"); scanf ("% d% d", şi în primul rând, şi al doilea); printf ("% d de GCD &% d este% d \ n", prima, a doua, cmmdc (prima, a doua)); return 0; }
Ruby garnituri de a crea un hash
Ieri în timp ce trece printr-unul din programele mele vechi, am găsit acest lucru scris de mine cândva înapoi:
#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
Pentru a ucide o parte de suspans permiteţi-mi să dezvăluie că arată ca raw_text
, Dreapta a fost redus de la confirmarea de plată PayPal.
Deasupra liniei, dacă rupt în părţi mai prevede:
unescaped_array = CGI.unescape (raw_text). Split ("&") unescaped_array = unescaped_array.collect {| x | = b x.split ("="); b.push (zero) în cazul în b.size == 1; b} flattened_array = unescaped_array.flatten hash = Hash [* flattened_array]
Să facem pasi individuali din IRB:
IRB (principal):. 009:0> unescaped_array = CGI.unescape (raw_text), Split ("&") => ["De succes", "mc_gross = 10.00", "protection_eligibility = neeligibile", "payer_id = U7PPJJ4TSJ47E", "taxa = 0.00", "payment_date = 09:45:30 10 iulie 2009 PDT", "payment_status = aşteptare "] IRB (principal): 013:0> unescaped_array = unescaped_array.map {| x | = b x.split ("="); b.push (zero) în cazul în b.size == 1; b} => [["De succes", zero], ["mc_gross", "10.00"], ["protection_eligibility", "neeligibile"], ["payer_id", "U7PPJJ4TSJ47E"], ["impozit", "0.00"] , ["payment_date", "09:45:30 10 iulie 2009 PDT"], ["payment_status", "aşteptare"]] IRB (principal): 014:0> flattened_array = unescaped_array.flatten => ["Succes", zero, "mc_gross", "10.00", "protection_eligibility", "neeligibile", "payer_id", "U7PPJJ4TSJ47E", "impozit", "0.00", "payment_date", "09:45: 30 10 iulie 2009 PDT "," payment_status "," aşteptare "] IRB (principal): 015:0> hash = Hash [* flattened_array] => {"Impozit" => "0.00", "payment_status" => "În aşteptarea", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10.00", "succesul" => zero, "payment_date" = > "09:45:30 10 iulie 2009 PDT", "protection_eligibility" => "neeligibile"}
BTW, * se numeşte operator de bulină în Ruby
Un alt mod de a crea de distribuire de "matrice de perechi", este de a utiliza injectaţi:
hash = [[1,2], [3,4]] injecta ({}). {| urmare, elementul de | rezultat [element.first] = rezultat [element.last];} rezultat Există o modalitate mai
Scrie o buclă, pe care o voi lăsa ca un exerciţiu de cititori!
Aici este un caz pic de utilizare independent de crearea de reţele de distribuire din:
IRB (principal): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.? : Mai mică :: mai mare} => {: Mai mică => [1, 2, 3, 4],: o mai mare => [7, 9]}
Puteţi face mai multe lucruri, în principal din cauza bloc este folosit ca o cheie pentru acel element din hash rezultat.
Gmail, Mutt şi msmtp fix
Dacă utilizaţi mutt şi SMTP pentru a accesa Gmail. Aici este o veste (proastă). Baietii cool de la Google a schimbat din nou certificat. Oh, am să vă întreb - cum îl ştii? Mutt simplă început să se plângă despre certificatul de rău atunci când încearcă să utilizeze msmpt, infamul "msmtp: certificat de verificare TLS eşuat:. Certificatul nu a primit un emitent cunoscut" a salutat-mă pe ecran.
Pentru a traversa confirma -
Doar rula în urma
$ msmtp --serverinfo --host=smtp.gmail.com --tls=on --port=587 --tls-certcheck=off
În loc de Server Thwate vechi acum te-ai urma în segmentul de emitent
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US
Din fericire, fix este simplu, aici este ceea ce aveţi nevoie pentru a face pe Debian
# apt-get install ca-certificates
# dpkg -s ca-certificates|grep Version
Version: 20090814
După această schimbare doar următoarea linie în tine ~~~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
la
tls_trust_file /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt
Hash Îmbinarea în fişierele conf yaml
YAML este destul de util pentru scrierea fişierelor de configurare. Avantajul principal este că, se citeşte ca fişier text. Acest lucru functioneaza foarte bine, dacă fişierul dumneavoastră de configurare este plat (nu ierarhie) şi nu are repetiţii.
Dacă fişierul dvs. are configuraţii de repetari, atunci face sens pentru a separa aceste elemente şi reutilizarea lor. Ce vreau să spun este aceasta - să spunem că fişierul de configurare arata ca aceasta:
de dezvoltare: input_location: common_input output_location: dev_location mail: smtp_server: serverului_dvs autentificare: your_login Parola: top_secret de producţie: input_location: common_input output_location: dev_location mail: smtp_server: serverului_dvs autentificare: your_login Parola: top_secret
Presupunând că codul de mai sus, în / tmp / test.yml aici este modul în care puteţi citi în Python şi Ruby
$cat readyml.py
# / Usr! / Bin / env python din import pprint pprint ca PP # În debian trebuie să instalaţi python-yaml de la yaml de import de sarcină, load_all, benă hash = sarcina (open ('/ tmp / test.yml ")) PP (hash ["dezvoltare"])
$ cat readyml.rb
# / Usr! / Bin / env ruby nevoie de "PP" hash = YAML :: sarcina (File.open ('/ tmp / test.yml "). citeşte) PP hash ["dezvoltare"]
aici este la îndemână o linie pentru versiunea Ruby
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' sau puteţi încerca acelaşi lucru în IRB sau consola Python.
Reţineţi că, în fragmentul de cod de mai sus, totul este altfel decât în locaţie de ieşire este aceeaşi în dezvoltarea şi partea de producţie. Acest lucru este în cazul în care identificatorul de nod yml vine pentru a salva. Ideea este simpla avea un set de valori implicite şi suprascrie le în alt loc.
Ai putea trage afară, după cum urmează:
valori prestabilite: şi implicite input_location: common_input output_location: dev_location mail: SENDER_NAME: expeditor smtp_server: serverului_dvs autentificare: your_login Parola: top_secret de dezvoltare: : * << Implicite de producţie: : * << Implicite output_location: prod_location
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Mare, funcţionează (tm)!.
Se poate spune că am unele tranzacţionate claritate pentru un pic de magie. Aici este o explicaţie mic: &, * si <<: si care este tag-ul ancora poate fi înţeleasă ca identificator nod, * este nod de referinţă şi <<: standuri pentru îmbinare de distribuire.
Pentru mai multe detalii a se vedea fie Specificatii yaml sau wikipedia
Până în prezent, atât de bine, dar există o captură aici, aceste îmbinări de hash nu sunt recursiv. Ce înseamnă aceasta este: să presupunem că doriţi să aveţi nume de expeditor diferit de mail în două medii, poate fi tentat să facă următoarele:
valori prestabilite: şi implicite input_location: common_input output_location: dev_location mail: SENDER_NAME: expeditor smtp_server: serverului_dvs autentificare: your_login Parola: top_secret de dezvoltare: : * << Implicite mail: SENDER_NAME: sender_dev de producţie: : * << Implicite output_location: prod_location mail: SENDER_NAME: sender_prod
Vă permite să verificaţi
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$
Hopa, ceva a mers gresit, problema cum sa menţionat mai sus, este că îmbinarea hash nu este recursivă şi în timp ce fuzionează se înlocuieşte mail implicit prin e-mail de producţie care are doar o cheie. Soluţie / în jurul valorii de munca este de a derula un nivel mai mult:
common_settings: & common_settings input_location: common_input output_location: dev_location mail_defaults: & mail_defaults SENDER_NAME: expeditor smtp_server: serverului_dvs autentificare: your_login Parola: top_secret valori prestabilite: şi implicite : * << Common_settings mail: : * << Mail_defaults de dezvoltare: : * << Implicite de producţie: : * << Implicite mail: : * << Mail_defaults SENDER_NAME: sender_prod
Vă permite să verificaţi din nou
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Ai spune că au un nivel una mai mult de cuiburi, de bine vă puteţi derula cu siguranta un nivel mai mult, dar apoi devine un dezastru. Deci, dacă nu se încearcă să scrie soluţie pentru turnuri din Hanoi într-un fişier conf, este mai bine să restucture fişier conf mult de săpat în yaml sau altceva. Dar asta este chemarea ta, oricum.
Un pic de coajă de redirecţionare
Iată cum putem face în mod normal, coajă de redirecţionare
$ ./pgm.sh args >out.txt 2>err.txt
Am vrut să-l modifica un pic şi executaţi, după cum urmează
$ ./pgm.sh args
cu cerinţa ca ieşire de eroare şi ar trebui să meargă la un nume de fişier în interiorul pgm.sh calculate pe baza argumente. Un caz ilustrativ ar putea fi atunci când data este parte din argumente. Deci, v-ar plăcea să merg la stdout spun / dvs. / director / pgm_out_YYYYMMDD.txt 1
Problema cu modul standard de redirecţionarea N>file.txt de exemplu, asociind fişier descriptor de N a file.txt, este că funcţionează numai pentru procesul de nou bifurcată, şi nu pentru procesul curent.
astfel
$ echo hi 1>out.txt ; echo hii . va trimite la hi out.txt, dar va imprima hii la stdout 2
Acest lucru este în cazul în care exec vine vorba de salvarea noastră. Dacă am adăuga exec 1>somefile.txt apoi de ieşire de la restul de script-ul va merge la somefile.txt
$. / Test.sh va redirecţiona hi hii, precum şi la out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
În mod similar de a redirecţiona stdout, precum şi stderr vom face ceva de genul asta
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
Acum, revenind la punctul original de la redirecţionarea unor fişier din interiorul coajă, să spunem că programul de calculat numele fişierului în unele OUTFILE variabile, am fi putut face doar exec 1>$OUTFILE
Care rezolvă problema actuală. Dar ar putea să vrea să treacă prin următorul exemplu care să asigure "acces aleatoriu" de fişier în script de shell. Exemplu este de aici
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
Cu comentarii, acest cod este de la sine explicativ.
-
1 poate fi, de asemenea, face prin $ ./pgm.sh args >pgm_out`date +%Y%m%d` dar ideea este de a genera acest nume de fişier bazat pe o anumită logică în programul propriu-zis.
2 1 din 1> out.txt este redundantă, dar se precizează că aici suntem redirecţionarea fd 1
Pentru a scala sau nu la scară
În timp ce vorbesc despre împărţirea orizontală a bazelor de date, DHH de ROR faima scalarea sugerează că lucrurile se pot aştepta, cu siguranţă, aşteptaţi până când punctul de nevoile de business este nevoie. Articolul său cu siguranta face sens pentru setari mici, spune companii. Nu să spun că, în start-up ar trebui să scrie programe demo, dar având în vedere că există doar 24 de ore într-o zi, ar trebui să se concentreze pe care deservesc spun 1000 de utilizatori, în mod mai mult decât îndeplinirea pierde somnul de peste griji despre cum va gestiona cererea mea de încărcare de 13.142 milioane utilizatori. Dacă aveţi aceste mulţi utilizatori, veţi şti cum să scară. Pentru scalabilitate startup-uri este o problemă de bun pentru a rezolva o problemă, dar mult mai bine să aibă, mă refer la orice pornire-ar plăcea să curgă în această problemă!
Într-un alt legate articol Jeremy Zawodny scrie nu ar trebui să depindă de domnul Moore, dacă aveţi probleme de scalabilitate.
Din aceste articole se referă la legea lui Moore nu pot ajuta, dar scrie că legea lui Moore trebuie să fie una dintre cele mai generalizată legii in Computer Science. Din predicţie lui original despre densitatea tranzistor, această lege este acum citată oriunde vă veţi întâlni cu o creştere exponenţială.



































