meningsmåling, ping, pubsub, pubsubhub, pubsubhubbub

September 6, 2009 ved Prashant · Kommentarer
Filed under: teknologi

Hvis du er skeptisk, er der en metode i galskaben ovenfor, i titlen på posten. I tech kredse er det usandsynligt, at du ikke har hørt om pubsubhubbub. I hurtige par måneder, har det været en af ​​de øverste tre talte om tingene. To andre er homomorf kryptering og Google bølge [ 1. ]. Kommer tilbage til aktuel post - udtryk i titlen angiver, hvordan du får indholdet fra andre mennesker. Følgende oplysninger bliver mere tydeligt, hvis du forestille dig ting, der sker med hensyn til blogs, selvom de begrebsmæssigt ikke begrænses til blogs.

Polling refererer til den situation, hvor kunderne med at spørge serveren, hvis noget nyt er kommet op. Hvor ofte at bede om opdateringer vil altid være et problem med polling for hyppig eller for sjældne, men som en læser påpegede her, at en stor, ting med polling er, at serveren ikke behøver at vedligeholde tilstand.

Ping refererer til det tilfælde, hvor når skrive en artikel, du (eller din software) også opdateringer af nogle populære (central) opdateringstjenester. Nogle baggrunden her .

Næste er pubsub, der står for offentliggørelse / tegne, en af de tidligste banen for det blev gjort her ved Evan Henshaw-Plath og Kellan Elliott-McCrea (72 slides, men værd at gå igennem). Overbevisende eksempel gav de imod var det - på en bestemt dato, kravlede Flickr 2,9 millioner gange for at få de nyeste billeder af 45,754 brugere, hvoraf 6.721 havde besøgt Flickr i de 24 timer, og kunne have 'potentielt' uploadet et billede FriendFeed. Bemærk, at det, de foreslog, var ikke en ny teknologi, som påpeger de "revolutionerende ny 20 år gammel teknologi". Hvis du gør det for blogs, så en af ​​de store problemer med XMPP - tilstedeværelse data overhead, som kan være så høj som 60-70% kan reduceres meget.

pubsubhub står for offentliggøre subscribe hub og pubsubhubbub er en protokol, i hvilken kernen er ideen om pubsubhub. Hvor forlag (siger bloggere) opdatere hub, der (kan være mere end én nav, som taler til hinanden) ligger "et sted i skyen", som per protokol dette kan skubbe eller trække, som pr protokollen, men det næste link i kæde, hub til klient (sige læsere) er det altid skubbe model. Denne side er godt udgangspunkt for pubsubhubbub, oversigt dias er gode. Lige veltalende Anil Dash beskriver det her som trykknap web.
To andre hits er webhooks som er dybest set http tilbagekald. GitHub bruger det, så gør paypal for asynkrone meddelelser om betaling i IPN- . så gør mange andre. Relateret koncept rsscloud som igen pubsub navet. Følg dette link for yderligere oplysninger.

Du kan være undrende hvad er pointen med at skrive alle disse her, der er to 1. Disse ting er værd at vide, minimalt mindst og 2. Denne blog er pubsubhubbub aktiveres nu via appspot hub ved hjælp af denne WordPress plugin og foder er også pubsubhubbub aktiveret via FeedBurner, link her
-
[ 1 ]. - God indledning læse for fuldt homomorf kryptering, er denne artikel af Bruce Schneier, og dette snak er mere eller mindre eneste kilde til Google Wave.

-UPDATE - Dette indlæg forklarer, hvordan kravet om offentlig server callback kan arbejdes rundt til stationære klienter ved hjælp af XMPP gateway (for pubsubhubbub).

En smule samling

August 29, 2009 ved Prashant · Kommentarer
Filed under: teknologi

Efter at have læst denne artikel om lock gratis buffere og se brugen af CAS (sammenlign og bytte), følte jeg at udgive en samling kode til at gøre det samme. Brug sag, der var at skrive en indfødt metode og kalder den fra Java (tilbage i 1,5, når samtidige datastrukturer i Java var mere eller mindre ikke eksisterende). Uden videre, vil jeg frigøre koden på dig :) . Først er for CAS, og andet er for computing GCD bruge Euklids algoritme (denne kan findes mange steder og selvstudier såvel).

Kompiler og kør instruktioner gcc file_name.c ; ./a.out

Sammenlign og Swap

   # Include 
  # Include 
 / / Ombytning - newvalue, comperand er gammel / forventet værdi
 / *
  * Funktion faktisk gør følgende ting - hvis den værdi * dest er lig med oldvalue derefter erstatte det med newvalue ellers lade det være uændret: ikke alle disse atomically
  *
  * Der er to muligheder for returværdi
  * 1.is oprindelige værdi af * dest og overlade den byrde at kalde fxn at sammenligne det med oldval
  * 2.  gøre det her over og returnere 0 eller 1, bør dette være mere effektive
  ** /

 / * Senere ændre det 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 lykkedes og 0 viser, at det mislykkede * /
	 / * Btw nødt til at indstille cc for flag 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 låsen på samme linje * /
			 "Jz FÆRDIG \ n \ t"
			 "Movl $ 0,% 1 \ n \ t"
			 "FÆRDIG: \ n \ t"
			 : "= M" (DEST), "= g" (resultat)
			 : "G" (oldvalue), "g" (newvalue), "m" (DEST)
			 : "% Eax", "% EBX", "ECx", "cc"
			 );
	 printf ("(% d,% d,% d)", * dest, oldvalue, newvalue);
	 tilbage resultat;
 }

 / * TODO
  * Skrive en anden asm fxn, der sætter over fxn i en while-løkke og holde prøver, medmindre 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 ("at ændre værdien af ​​* 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));
	 return 0;
 }

Formatering noter - synes ligesom WP syntaks highlighter tilføjer i sidste ende, ignorere det.

GCD

 # Include 
 int gcd (int a, int b) {
     int resultat;
     / * Compute største fælles divisor med Euklids algoritme * /
     __asm__ __ volatile__ ("movl% 1,%% EAX;"
                           "Movl% 2%% EBX"
                           "CONTD: cmpl $ 0,%% EBX;"
                           "Je FÆRDIG;"
                           "Xorl%% EDX,%% EDX"
                           "Idivl%% EBX"
                           "Movl%% EBX,%% EAX"
                           "Movl%% EDX,%% EBX"
                           "Jmp CONTD;"
                           "FÆRDIG: movl%% eax,% 0": "= g" (resultat): "g" (a), "g" (b)
     );

     tilbage resultat;
 }

 int main () {
     int første, andet;
     printf ("Indtast to heltal:");
     scanf ("% d% d", og første, og anden);

     printf ("GCD af% d &% d er% d \ n", første, andet, GCD (første, andet));

     return 0;
 }

rubin en foringer til at skabe hash

August 20, 2009 ved Prashant · Kommentarer
Filed under: teknologi

Går samtidig går gennem en af ​​mine gamle programmer, jeg fandt denne skrevet af mig engang tilbage:

#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

At dræbe nogle af suspense lad mig afsløre, at raw_text ligner

 

, Til højre den er blevet skåret fra paypal payment anerkendelse.

Over linje, hvis brudt i dele lyder bedre:

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

Lad os gøre de enkelte trin i IRB:

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

 => ["Succes", "mc_gross = 10,00", "protection_eligibility = Ikke-godkendt", "payer_id = U7PPJJ4TSJ47E", "skat = 0,00", "payment_date = 09:45:30 Jul 10, 2009 PDT", "payment_status = Afventer "]                                                                         

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

 => [["Succes", nil], ["mc_gross", "10,00"], ["protection_eligibility", "Ikke-godkendt"], ["payer_id", "U7PPJJ4TSJ47E"], ["skat", "0,00"] , ["payment_date", "09:45:30 Jul 10, 2009 PDT"], ["payment_status", "Afventer"]]                               

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

 => ["Succes", nul, "mc_gross", "10,00", "protection_eligibility", "Ikke-godkendt", "payer_id", "U7PPJJ4TSJ47E", "skat", "0,00", "payment_date", "09:45: 30 Jul 10, 2009 PDT "," payment_status "," Afventer "]
 IRB (hoved): 015:0>
 hash = Hash [* flattened_array]
 => {"Skat" => "0,00", "payment_status" => "Afventer", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10,00", "succes" => nul, "payment_date" = > "09:45:30 Jul 10, 2009 PDT", "protection_eligibility" => "Ikke-godkendt"} 

BTW, er * kaldes splat operatør i Ruby

En anden måde at skabe hash fra 'vifte af par' er at bruge injicere:

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

Der er endnu en måde :) Skriv en løkke, som jeg vil overlade som en øvelse til læserne!

Her er en smule relateret use case for at skabe hash fra arrays:

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

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

Du kan gøre flere ting, dybest set resultatet af blokken bruges som nøglen til dette element i den resulterende hash.

gmail, mutt og msmtp fix

August 17, 2009 ved Prashant · Kommentarer
Filed under: teknologi

Hvis du bruger mutt og smtp at få adgang til Gmail. Her er en (dårlig) nyheder. Seje fyre på Google igen ændret certifikat. Åh, har du spørge - hvordan det ved det? Enkel mutt begyndt at klage over dårlig certifikat, når de forsøger at bruge msmpt, berygtede 'msmtp: TLS-certifikat mislykkedes:. Certifikatet har ikke fået en kendt udsteder " hilste mig på skærmen.

At krydse bekræfte -
Bare køre efter

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

I stedet for den gamle Thwate Server Nu får du følger i udsteder segment
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US

Heldigvis fix er enkel, her er hvad du skal gøre på debian

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

Efter dette bare ændre følgende linje i din ~ for /. 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

Fusionerende hashes i YAML conf filer

31 Juli 2009 ved Prashant · Kommentarer
Filed under: teknologi

YAML er ganske praktisk til at skrive konfigurationsfiler. Primære fordel er, at den læser som tekstfil. Det fungerer rigtig godt, hvis din config fil er flad (ingen hierarki) og har ingen gentagelser.
Hvis din konfigurationer filen har gentagelser så giver det mening at udskille disse elementer og genbruge dem. Hvad jeg mener er dette - lad os sige, at du din config fil ser sådan her ud:

  udvikling:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: din_server
     login: your_login
     Password: top_secret
 produktion:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: din_server
     login: your_login
     Password: top_secret 

Forudsat ovenstående kode i / tmp / test.yml her er, hvordan kan du læse i Python og Ruby
$cat readyml.py

 #! / Usr / bin / env python
 fra pprint indførsel pprint som pp
 # I debian nødt til at installere python-YAML
 fra YAML import belastning, load_all, dump
 hash = belastning (åben ('/ tmp / test.yml'))
 pp (hash ['udvikling']) 


$ cat readyml.rb

  #! / Usr / bin / env rubin
 kræver 'PP'
 hash = YAML :: belastning (File.open ('/ tmp / test.yml). læst)
 pp hash ['udvikling'] 

her er en handy en liner for Ruby-version
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' , eller du kan prøve det samme i IRB eller Python konsol.

Bemærk, at i ovenstående kodestykke, er alt andet end output placering er den samme i udvikling og produktion del. Det er her yml node id kommer til at redde. Ideen er enkel have et sæt standardværdier og tilsidesætter dem på andet sted.
Du kan trække det ud som følger:

  standarder: og standarder
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAMEs: afsender
     smtp_server: din_server
     login: your_login
     Password: top_secret
 udvikling:
   <<: * Standard
 produktion:
   <<: * Standard
   output_location: prod_location 


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

Great, det virker (tm)!.
Formentlig har vi handlet lidt mere klarhed for lidt magi. Her er en lille forklaring: &, * og <<: & der er ankerkode kan forstås som node identifikator, * er node reference og <<: står for hash merge.

For flere detaljer se enten YAML specs eller wikipedia
Så langt så godt, men der er en fangst her, disse hash fusionerer ikke rekursiv. Hvad det betyder er dette: Lad os sige du vil have forskellige afsenderens navn for e-mail i to miljøer, kan du blive fristet til at gøre følgende:

  standarder: og standarder
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAMEs: afsender
     smtp_server: din_server
     login: your_login
     Password: top_secret
 udvikling:
   <<: * Standard
   mail:
     SENDER_NAMEs: sender_dev
 produktion:
   <<: * Standard
   output_location: prod_location
   mail:
     SENDER_NAMEs: sender_prod 

Lad os kontrollere

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

Ups, noget gik galt, problem, som nævnt ovenfor er, at hash fletningen ikke er rekursiv, og samtidig lægge det erstattet post af misligholdelse af post produktion, som kun har en nøgle. Løsning / arbejde omkring at oprulle en mere niveau:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: & mail_defaults
  SENDER_NAMEs: afsender
   smtp_server: din_server
   login: your_login
   Password: top_secret

 standarder: og standarder
   <<: * Common_settings
   mail:
     <<: * Mail_defaults
 udvikling:
   <<: * Standard
 produktion:
   <<: * Standard
   mail:
     <<: * Mail_defaults
     SENDER_NAMEs: sender_prod

Lad os se igen

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

Sagde du du har en større niveau af nesting, godt du kan helt sikkert oprulle en mere lige, men så bliver det noget rod. Så, hvis du ikke forsøger at skrive løsning tårne ​​i Hanoi i en conf-fil, er det bedre at restucture conf fil end at grave i YAML eller noget andet. Men det er dit opkald alligevel.

En smule shell omdirigering

10 maj 2009 ved Prashant · Kommentarer
Filed under: teknologi

Her er, hvordan vi normalt gør shell omdirigering
$ ./pgm.sh args >out.txt 2>err.txt
Jeg ønskede at ændre det lidt og køre som følger
$ ./pgm.sh args
med kravet om, at produktionen og fejl skal gå til nogle filename beregnet inde pgm.sh baseret på args. Et illustrativt tilfælde kunne være, når datoen er en del af args. Så du vil gerne stdout at gå til at sige / din / mappe / pgm_out_YYYYMMDD.txt 1

Problemet med almindelige måde at omdirigere N>file.txt dvs knytte file descriptor N til file.txt, er, at det virker kun for nyligt gaffelformet processen og ikke til den aktuelle proces.

$ echo hi 1>out.txt ; echo hii . vil sende hej til out.txt, men vil udskrive hii til stdout 2

Det er her exec kommer os til undsætning. Hvis vi tilføjer exec 1>somefile.txt derefter output fra resten af scriptet 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 at omdirigere stdout samt stderr vi vil gøre sådan noget
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

Nu kommer tilbage til den oprindelige punkt omdirigere nogle fil fra inde i skallen, lad os sige program beregnet filnavnet i nogle variable outfile, kunne vi lige har gjort exec 1>$OUTFILE

Det løser det aktuelle problem. Men du kan lide at gå gennem følgende eksempel, hvor der opnås "random access" af filen 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 kode selvforklarende.
-
1 Det kan også ske ved $ ./pgm.sh args >pgm_out`date +%Y%m%d` men tanken er at generere denne fil navn baseret på nogle logik i selve programmet.
2 1 1> out.txt er overflødigt, men det præciseres her, at vi omdirigerer fd 1

For at skalere eller ikke skalere

11 jan 2009 ved Prashant · Kommentarer
Filed under: teknologi

Når man taler om horisontal partitionering af databaser, DHH af ROR berømmelse tyder på, at skalering stuff kan vente, helt sikkert vente, indtil det punkt, dine forretningsmæssige behov kræver det. Hans artikel absolut giver mening for små opsætninger sige nystartede. Ikke at sige, at i nystartede du bør skrive demo programmer, men da der kun 24 timer på en dag, bør du fokusere på at tjene sige 1000 brugere i mere tilfredsstillende måde end at miste din søvn i løbet bekymre sig om, hvordan vil min ansøgning håndtere belastning på 13.142 tusind brugere. Hvis du får de mange brugere, vil du vide, hvordan man skalere. For nystartede skalerbarhed er et godt problem at løse, men en langt bedre problem at have, mener jeg enhver start ville elske at løbe ind i dette problem!

I en anden relateret artikel Jeremy Zawodny skriver du bør ikke afhænge af Mr. Moore, hvis du har problemer med skalerbarhed.

Da disse artikler henviser til Moores lov kan jeg ikke hjælpe, men skriver, at Moores lov må være en af de mest generelle loven i Computer Science. Fra sin oprindelige forudsigelse om transistor massefylde, er denne lov nu citeret overalt du kommer på tværs af eksponentiel vækst.