Målingen, ping, pubsub, pubsubhub, pubsubhubbub

6 september 2009 ved Prashant · Kommentarer
Arkivert under: teknologi

I tilfelle du er skeptisk, det er en metode i galskapen over, i tittelen på innlegget. I tech sirkler er det usannsynlig at du ikke har hørt om pubsubhubbub. I raske månedene har det vært en av de tre snakket om ting. Andre to er homomorphic kryptering og Google bølgen [ 1. ]. Kommer tilbake til nåværende stilling - termer i tittelen indikerer hvordan du får innholdet fra andre mennesker. Etter detaljene blir mer tydelig, hvis du forestille ting skjer med hensyn til blogger, selv om de er konseptuelt ikke begrenset til blogger.

Polling refererer til situasjonen der kunder fortsette å spørre serveren hvis noe nytt har kommet opp. Hvor ofte å spørre etter oppdateringer vil alltid være et problem med polling for hyppig eller for sjelden, men som en leser påpekte her at en flott, ting med polling er at serveren ikke trenger å vedlikeholde tilstanden.

Ping refererer til tilfelle der når poste en artikkel, du (eller programvare) oppdaterer også noen populære (sentralt) oppdateringstjenester. Noe bakgrunn her .

Neste er pubsub som står for publisere / abonnere, en av de tidligste banen for det ble gjort her av Evan Henshaw-Plath og Kellan Elliott-McCrea (72 slides, men verdt å gå igjennom). Overbevisende eksempel de ga mot var dette - på en bestemt dato, FriendFeed krøp Flickr 2,9 millioner ganger for å få de nyeste bildene av 45,754 brukere, hvorav 6721 hadde besøkt Flickr i de 24 timer og kunne ha "potensielt" lastet opp et bilde. Merk at det de foreslo var ikke en ny teknologi, som de påpeker 'revolusjonerende ny 20 år gammel teknologi ". Hvis du gjør det for blogger da en av de store problemene med XMPP - tilstedeværelse data overhead, som kan være så høy som 60-70% kan reduseres mye.

pubsubhub står for publisere Abonner hub og pubsubhubbub er en protokoll, kjerne av noe som er ideen om pubsubhub. Hvori utgivere (si bloggere) oppdatere hub som (kan være mer enn én huber, som snakker med hverandre) ligger «et sted i sky", som per protokoll dette kan skyve eller trekke i henhold til protokollen, men det neste ledd i kjeden, hub til klient (si leserne) er det skyve alltid modell. Denne siden er godt utgangspunkt for pubsubhubbub, oversikt lysbilder er gode. Helt veltalende Anil Dash beskriver det her som trykknapp web.
To andre relaterte lesninger er webhooks som er utgangspunktet http tilbakeanrop. Github bruker det, så gjør paypal for asynkrone meldinger om betaling i IPN . Så gjør mange andre. Relaterte Konseptet er rsscloud som er igjen pubsub hub. Følg denne linken for detaljer.

Du lurer kanskje på hva som er poenget med å skrive alle disse her, er det to ett. Disse tingene er verdt å vite, minimalt minst og to. Denne bloggen er pubsubhubbub aktiveres nå via appspot hub med dette wordpress plugin og fôr også er pubsubhubbub aktivert via FeedBurner, link her
-
[ 1 ]. - God innledende lese for fullt homomorphic kryptering er denne artikkelen av Bruce Schneier og denne diskusjon er mer eller mindre eneste kilden for Google Wave.

-OPPDATERING - Dette innlegget forklarer hvordan kravet om offentlig server for tilbakering kan bli jobbet rundt for stasjonære klienter ved hjelp av XMPP gateway (for pubsubhubbub).

Litt av forsamlingen

29 august 2009 ved Prashant · Kommentarer
Arkivert under: teknologi

Etter å ha lest denne artikkelen om lock gratis buffere og se bruken av CAS (sammenligne og bytte), følte jeg meg som legger forsamlingen koden for å gjøre det samme. Bruk tilfelle der borte var å skrive en innfødt metode og kalle det fra Java (tilbake i 1.5, da samtidige datastrukturer i Java var mer eller mindre ikke eksisterende). Uten videre, vil jeg utnytte koden til deg :) . Først er for CAS og andre er for databehandling GCD bruke Euklids algoritme (denne kan finnes i mange steder og opplæring i tillegg).

Kompilere og kjøre instruksjoner gcc file_name.c ; ./a.out

Sammenlign og Bytt

   # Include 
  # Include 
 / / Bytte - newvalue, er comperand gammel / forventet verdi
 / *
  * Funksjon gjør faktisk det følgende ting - hvis verdien på * dest er lik oldvalue deretter erstatte det med newvalue ellers la den uendret: å gjøre alle disse atomically
  *
  * Det er to alternativer for returverdi
  * 1.is initial verdi på * dest og la byrden av å kalle fxn å sammenligne den med oldval
  * 2.  gjør det over her og returnere 0 eller 1, bør dette være mer effektiv
  ** /

 / * Senere endre den til makro * /
 int CAS (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 resultat = 1 ;/ * 1 viser at CAS lyktes og 0 viser at det sviktet * /
	 / * Btw må sette cc for flagg clobbering!  * /
	 __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" / * skal LOCK være på samme linje * /
			 "JZ FERDIG \ n \ t"
			 "Movl $ 0,% 1 \ n \ t"
			 "FERDIG: \ n \ t"
			 : "= M" (dest), "= g" (resultat)
			 : "G" (oldvalue), "g" (newvalue), "M" (dest)
			 : "% Eax", "% EBX", "ECx", "CC"
			 );
	 printf ("(% d,% d,% d)", * dest, oldvalue, newvalue);
	 returnere resultatet;
 }

 / * TODO
  * Skrive et annet asm fxn som setter ovenfor fxn på en stund løkke og fortsette å prøve med mindre det lykkes * /

 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 ("endring verdi * c til% 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));
	 returnere 0;
 }

Formatering notater - virker som wp-syntaks highlighter er å legge til slutt, ignorere det.

GCD

 # Include 
 int gcd (int a, int b) {
     int resultat;
     / * Beregn største felles divisor bruke Euklids algoritme * /
     __asm__ __ volatile__ ("movl% 1,%% EAX;"
                           "Movl% 2,%% EBX;"
                           "Forts: cmpl $ 0,%% EBX;"
                           "Je gjort;"
                           «Xorl%% EDX,%% EDX;"
                           «Idivl%% EBX;"
                           «Movl%% EBX,%% EAX;"
                           «Movl%% EDX,%% EBX;"
                           "JMP forts;"
                           "FERDIG: movl%% eax,% 0;": "= g" (resultat): "g" (a), "g" (b)
     );

     returnere resultatet;
 }

 int main () {
     int første, andre;
     printf ("Skriv to heltall:");
     scanf ("% d% d", & første, og andre);

     printf ("GCD av% d &% d er% d \ n", første, andre, gcd (første, andre));

     returnere 0;
 }

Ruby en liners å lage hasj

20 august 2009 ved Prashant · Kommentarer
Arkivert under: teknologi

I går mens du går gjennom en av mine gamle programmer, fant jeg dette skrevet av meg en gang tilbake:

#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

Å drepe noen av spenning la meg avsløre at raw_text ser ut

 

, Rett den har blitt kuttet fra paypal betaling bekreftelse.

Over linjen hvis brutt i deler lyder bedre:

  unescaped_array = CGI.unescape (raw_text). split ('&')
   unescaped_array = unescaped_array.collect {| x | b = x.split ("="); b.push (null) hvis b.size == 1; b}
   flattened_array = unescaped_array.flatten
   hash = Hash [* flattened_array] 

La oss gjøre individuelle trinn i IRB:

  IRB (hoved):. 009:0> unescaped_array = CGI.unescape (raw_text) split ('&')    

 => ["Suksess", "mc_gross = 10,00", "protection_eligibility = ikke kvalifisert", "payer_id = U7PPJJ4TSJ47E", "skatt = 0.00", "payment_date = 09:45:30 10 juli 2009 PDT", "payment_status = Venter "]                                                                         

 IRB (hoved): 013:0> unescaped_array = unescaped_array.map {| x | b = x.split ("="); b.push (null) hvis b.size == 1; b}  

 => [["Suksess", null], ["mc_gross", "10.00"], ["protection_eligibility", "ikke kvalifisert"], ["payer_id", "U7PPJJ4TSJ47E"], ["skatt", "0.00"] , ["payment_date", "09:45:30 den 10 juli 2009 PDT"], ["payment_status", "Venter"]]                               

 IRB (hoved): 014:0> flattened_array = unescaped_array.flatten     

 => ["Suksess", null, "mc_gross", "10.00", "protection_eligibility", "ikke kvalifisert", "payer_id", "U7PPJJ4TSJ47E", "skatt", "0.00", "payment_date", "09:45: 30 10 juli 2009 PDT "," payment_status "," Venter "]
 IRB (hoved): 015:0>
 hash = Hash [* flattened_array]
 => {"Skatt" => "0.00", "payment_status" => "Pending", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10.00", "suksess" => nil, "payment_date" = > "09:45:30 den 10 juli 2009 PDT", "protection_eligibility" => "kvalifisert"} 

BTW, er * kalles feilindikator operatør i rubin

En annen måte å lage hasj fra 'utvalg av parene "er å bruke injisere:

  hash = [[1,2], [3,4]] injisere ({}). {| Resultatet, element | Resultatet [element.first] = resultat [element.last]; resultat} 

Det er enda en måte :) Skriv en loop, som jeg vil forlate som en øvelse til leserne!

Her er litt urelatert brukstilfellet med å lage hasj fra arrays:

  IRB (hoved): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.?  : Mindre :: større}

 => {: Lesser => [1, 2, 3, 4],: større => [7, 9]} 

Du kan gjøre flere ting, i utgangspunktet resultat av blokken brukes som nøkkel for at element i den resulterende hash.

gmail, Mutt og msmtp fix

17 august 2009 ved Prashant · Kommentarer
Arkivert under: teknologi

Hvis du bruker mutt og smtp tilgang til Gmail. Her er en (dårlig) nyheter. Kule gutter på Google igjen endret sertifikat. Å, fikk du spørre - hvordan vet det det? Enkelt Mutt begynte klager om dårlig attest når du prøver å bruke msmpt, beryktede «msmtp: TLS sertifikat mislyktes:. Sertifikatet har ikke fått en kjent utsteders hilste på meg på skjermen.

For å krysse bekrefte -
Bare kjør etter

$ msmtp --serverinfo --host=smtp.gmail.com --tls=on --port=587 --tls-certcheck=off

I stedet for gamle Thwate Server Nå får du følge i utsteder segment
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US

Heldigvis fix er enkel, her er hva du trenger å gjøre på debian

# apt-get install ca-certificates
# dpkg -s ca-certificates|grep Version
Version: 20090814

Etter dette bare endre følgende linje i deg ~ / må. 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

til

tls_trust_file /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt

Flette hashes i YAML KonFerAnSeGUIde filer

31 juli 2009 ved Prashant · Kommentarer
Arkivert under: teknologi

YAML er ganske hendig for å skrive konfigurasjonsfiler. Primær fordel er at, leser det som tekstfil. Dette fungerer veldig bra hvis config-filen er flat (noe hierarki) og har ingen repetisjoner.
Hvis konfigurasjoner filen har repetisjoner så det er fornuftig å skille ut disse elementene og bruke dem. Hva jeg mener er dette - la oss si at du config-filen ser slik ut:

  utvikling:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: din_server
     login: your_login
     Passord: top_secret
 produksjon:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: din_server
     login: your_login
     Passord: top_secret 

Forutsatt ovenfor koden i / tmp / test.yml her er hvordan du kan lese i python og ruby
$cat readyml.py

 #! / Usr / bin / env python
 fra pprint import pprint som pp
 # I debian må installere python-YAML
 fra YAML import belastning, load_all, dump
 hash = last (open ('/ tmp / test.yml'))
 pp (hash ['utvikling']) 


$ cat readyml.rb

  #! / Usr / bin / env rubin
 kreve 'pp'
 hash = YAML :: belastning (File.open ('/ tmp / test.yml'). lest)
 pp hash ['utvikling'] 

Her er en hendig en liner for ruby ​​versjon
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' eller du kan prøve det samme i IRB eller Python-konsollen.

Merk at i ovennevnte kodebiten, er alt annet enn utskuff er samme i utvikling og produksjon del. Det er der yml node identifikator kommer til unnsetning. Ideen er enkel ha et sett med standardverdier og overstyre dem på forskjellig sted.
Du kan trekke den fra hverandre som følger:

  standardverdier og mislighold
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: avsender
     smtp_server: din_server
     login: your_login
     Passord: top_secret
 utvikling:
   <<: * Mislighold
 produksjon:
   <<: * Mislighold
   output_location: prod_location 


$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$

Flott, det fungerer (tm)!.
Man kan hevde vi handlet litt klarhet for litt magi. Her er en liten forklaring: &, * og <<: & som er ankerkode kan forstås som node identifikator, er * node referanse og <<: står for hasj flettingen.

For flere detaljer se enten YAML specs eller wikipedia
Så langt så bra, men det er en hake her, disse hash fusjonerer er ikke rekursiv. Hva det betyr er dette: La oss si at du vil ha ulik avsender for e-post i to miljøer, kan du bli fristet til å gjøre følgende:

  standardverdier og mislighold
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: avsender
     smtp_server: din_server
     login: your_login
     Passord: top_secret
 utvikling:
   <<: * Mislighold
   mail:
     SENDER_NAME: sender_dev
 produksjon:
   <<: * Mislighold
   output_location: prod_location
   mail:
     SENDER_NAME: sender_prod 

Lar sjekk

$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$

Oops, noe gikk galt, problemer som nevnt ovenfor er at hasj flettingen er ikke rekursiv og samtidig flette den erstattet post mislighold post av produksjon som har kun én tast. Løsning / arbeid rundt er å rulle en mer nivå:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: & mail_defaults
  SENDER_NAME: avsender
   smtp_server: din_server
   login: your_login
   Passord: top_secret

 standardverdier og mislighold
   <<: * Common_settings
   mail:
     <<: * Mail_defaults
 utvikling:
   <<: * Mislighold
 produksjon:
   <<: * Mislighold
   mail:
     <<: * Mail_defaults
     SENDER_NAME: sender_prod

Lar sjekk igjen

$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$

Sa du at du har en mer nivå av hekkende, godt du kan definitivt rulle en mer nivå, men så blir det et rot. Så hvis du ikke prøver å skrive løsningen på tårnene i Hanoi i en conf fil, er det bedre å restucture conf fil enn å grave i YAML eller noe annet. Men det er samtalen uansett.

En bit av skallet omadressering

10 mai 2009 ved Prashant · Kommentarer
Arkivert under: teknologi

Her er hvordan vi vanligvis gjør shell omadressering
$ ./pgm.sh args >out.txt 2>err.txt
Jeg ønsket å endre den litt og kjøre som følger
$ ./pgm.sh args
med kravet om at produksjonen og feilen bør gå til noen filnavn beregnet inne pgm.sh basert på args. En illustrerende tilfelle kan være når datoen er en del av args. Så du ønsker stdout å gå å si / din / katalog / pgm_out_YYYYMMDD.txt 1

Problemet med standard måte å omdirigere N>file.txt dvs. knytte fil beskrivelse N å fil.txt, er at det fungerer bare for den nylig gaffelformet prosessen og ikke for den nåværende prosessen.

$ echo hi 1>out.txt ; echo hii . sender hei til out.txt men vil ut HII til stdout 2

Dette er hvor exec kommer til unnsetning vår. Hvis vi legger exec 1>somefile.txt da produksjonen fra resten av skriptet vil gå til somefile.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh vil omdirigere hi samt HII til out.txt

Tilsvarende for å omdirigere stdout samt stderr vi gjøre noe som dette
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

Nå kommer tilbake til opprinnelig punkt viderekobler til noen fil fra innsiden av skallet, la oss si program beregnet filnavnet i noen variable utfil, kunne vi nettopp har gjort exec 1>$OUTFILE

Som løser den aktuelle problemet. Men du kan gjerne gå gjennom følgende eksempel som oppnår "random access" av fil i shell script. Eksempel er fra her
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

Med kommentarer, er denne koden selvforklarende.
-
1 Det kan også gjøres ved $ ./pgm.sh args >pgm_out`date +%Y%m%d` men tanken er å generere denne filnavn basert på noen logikk i selve programmet.
2 1 i 1> out.txt er overflødig, men det klargjør her at vi omdirigere FD 1

Hvis du vil skalere eller ikke skalere

11 januar 2009 etter Prashant · Kommentarer
Arkivert under: teknologi

Mens du snakker om horisontal partisjonering av databaser, foreslår DHH av ROR berømmelse som skalering ting kan vente, definitivt vente til det punktet dine forretningsbehov krever det. Hans artikkelen gjør helt klart fornuftig for små oppsett si startups. Ikke for å si at i startups bør du skrive demo programmer, men gitt at det bare er 24 timer i en dag du bør fokusere på å betjene si 1000 brukere i mer tilfredsstillende måte enn å miste søvn over bekymre deg for hvordan vil min søknad håndtere belastningen av 13.142 million brukere. Hvis du får de mange brukere du vil vite hvordan du skal skalere. For startups skalerbarhet er en god problem å løse, men en langt bedre problem å ha, mener jeg enhver oppstart ville elske å kjøre inn i dette problemet!

I en annen relatert artikkel Jeremy Zawodny skriver du bør ikke være avhengig av Mr. Moore hvis du har skalerbarhet problemer.

Siden disse artiklene se Moore lov jeg ikke kan hjelpe, men skrive at Moores lov må være en av de mest generalisert lov i Informatikk. Fra sitt opprinnelige spådommen om transistor tetthet, er denne loven nå sitert hvor du kommer over eksponensiell vekst.