sondaj de opinie, ping, pubsub, pubsubhub, pubsubhubbub

06 septembrie 2009 de Prashant · Comentarii
Filed under: tehnologie

Î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

29 august 2009 de Prashant · Comentarii
Filed under: tehnologie

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

 # Include 
 int 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

20 august 2009 de Prashant · Comentarii
Filed under: tehnologie

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

17 august 2009 de Prashant · Comentarii
Filed under: tehnologie

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

31 iulie 2009 de Prashant · Comentarii
Filed under: tehnologie

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

10 mai 2009 de Prashant · Comentarii
Filed under: tehnologie

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

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh va redirecţiona hi hii, precum şi la out.txt

Î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ă

11 ianuarie 2009 de Prashant · Comentarii
Filed under: tehnologie

Î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ă.