anketa, ping, pubsub, pubsubhub, pubsubhubbub
U slučaju da ste skeptični, postoji metoda u ludilu gore, u naslovu posta. U tech krugova malo je vjerojatno da niste čuli za pubsubhubbub. U brzim nekoliko mjeseci, to je bio jedan od prva tri je govorio o stvari. Ostala dva su homomorphic šifriranje i Google val [ 1. ]. Povratak na trenutnu post - odredbe u naslovu navesti kako ste se sadržaj od drugih ljudi. Nakon podaci postaju sve jasno, ako li zamisliti stvari događa s obzirom na blogovima, iako pojmovno nisu ograničeni na blogovima.
Prozivanje se odnosi na scenarij u kojem klijenti stalno postavljaju poslužitelj ako nešto novo je došao gore. Koliko često pitati za promjenama uvijek će biti problem s glasovanja previše često ili previše rijetko, ali kao jedan čitatelj istaknuo je ovdje da je jedna velika, stvar s glasovanja je da poslužitelj ne moraju održavati stanje.
Ping se odnosi na slučaju kada objaviti članak, vi (ili vaš softver) i aktualizira neke popularne (središnja) ažuriranje usluge. Neki pozadina ovdje .
Sljedeća je pubsub koja se zalaže za objavljivanje / pretplatite, jedan od najranijih terenu jer je napravio ovdje je Evan Henshaw-Plath i Kellan Elliott-McCrea (72 slajdovi ali vrijedi prolaze). Uvjerljiv primjer dali su protiv je to - na određeni datum, Friendfeed indeksirao Flickr 2,9 milijuna puta da biste dobili najnovije fotografije 45,754 korisnika, od čega 6.721 obišla Flickr u tih 24 sati, a mogao 'potencijalno' učitao fotografije. Imajte na umu da ono što predlaže nije nova tehnologija, kao što ističu revolucionarnom novu tehnologiju 20 godina '. Ako ste to učiniti za blogove, tada jedan od glavnih problema s XMPP - Prisustvo podataka iznad glave, koja može biti kao visok kao 60-70% može smanjiti puno.
pubsubhub zalaže za Jeziki čvorišta i pubsubhubbub je protokol, jezgra koja je ideja pubsubhub. Unutar kojih izdavači (recimo blogere) ažurirati hub koji (može biti više od jednog koncentratore, koji razgovaraju jedni s drugima) živi "negdje u oblaku", kao i po protokolu to može gurnuti ili povući po protokolu, ali pored vode u lanac, čvorište za klijenta (recimo čitatelje) uvijek je gurati model. Ova stranica je dobra polazna točka za pubsubhubbub, pregled slajdovi su dobri. Još rječiti Anil crtica opisuje ga ovdje kao tastera webu.
Dvije druge srodne navodi se webhooks koja je u osnovi http ponovnih poziva. Github koristi ga, tako da paypal za asinkrone obavijesti plaćanja u ZNG . A mnogi drugi. Povezano koncept rsscloud što je opet pubsub središte. Slijedite ovaj link za detalje.
Možda se pitate koja je svrha pisanja svih tih mjesta, postoje dva jedan. Ove stvari su vrijedno znati, barem minimalno i 2. Ovaj blog je pubsubhubbub omogućeno sad preko appspot razvodnika koristeći ovu WordPress plugin i hrane za životinje je također pubsubhubbub omogućena putem FeedBurner, linka ovdje
-
[ 1 ]. - Dobro pročitajte uvodni za potpuno šifriranje homomorphic je ovaj članak Bruce Schneier i ovaj razgovor je više ili manje jedini izvor za Google Wave.
-UPDATE - Ovaj nakon objašnjava kako zahtjev javnom poslužitelju za povratni poziv može biti izrađen za oko stolnih računala pomoću XMPP Gateway (za pubsubhubbub).
Malo skupštine
Nakon čitanje ovaj članak o zaključavanje bez odbojnika i vidim korištenje CAS-a (usporedi i swap), osjećao sam se kao postavljanje sklopa kod da učine isto. Koristite slučaj tamo je pisati izvorni način i poziv iz Java (natrag u 1.5, kada istodobnih strukture podataka u Javi su manje ili više ne postoji). Bez dodatnih teškoća, ja ću osloboditi kod na vas
. Prvo je za CAS i drugi je za računanje fact koristeći algoritam Euclid '(ovo se može naći u mnogim mjestima i tutoriali, kao i).
Izraditi upute i pokrenuti gcc file_name.c ; ./a.out
Usporedite Swap
# Include# Include / / Razmjena - newvalue, comperand je stara / očekivana vrijednost / * * Funkcija zapravo radi sljedeće stvari - ako je vrijednost u * DEST jednaka oldvalue zatim ga zamijeniti newvalue drugi ostaviti ista: učiniti sve ove atomically * * Postoje dvije mogućnosti za povratak vrijednosti * 1.is početna vrijednost * DEST i ostaviti teret poziva fxn ga usporediti s oldval * 2. to učiniti ovdje i vratite se 0 ili 1, to bi trebao biti učinkovitiji ** / / * Kasnije ga promijeniti u makro * / CAS int (int * odred, int oldvalue, int newvalue) { printf ("(% d,% d,% d)", * odred, oldvalue, newvalue); / * Int cas (int odred, int oldvalue, int newvalue) {* / / * Int cas (int odred, int newvalue, int oldvalue) {* / int rezultat = 1 ;/ * 1 pokazuje da cas je uspio i 0 pokazuje da nije uspio * / / * Btw potrebno za postavljanje CC za zastavu 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" / * treba LOCK biti na istom retku * / "JZ Sastavljeno \ n \ t" "Movl $ 0,% 1 \ n \ t" "Gotovo: \ n \ t" : "= M" (odred), "= g" (rezultat) : "G" (oldvalue), "g" (newvalue), "m" (odred) : "% Eax", "% ebx", "ecx", "cc" ); printf ("(% d,% d,% d)", * odred, oldvalue, newvalue); vratiti rezultat; } / * TODO * Pisati drugi ASM fxn koji stavlja iznad fxn u while petlji i držati težak, osim ako uspije * / 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)); printf ("% d \ n", cas (c, b, b)); * C = 6; / * C = 5; * / printf ("mijenja vrijednost * c% d \ n", * c); printf ("% d \ n", cas (c, b, b)); printf ("% d \ n", cas (c, b, a)); printf ("% d \ n", cas (c, a)); printf ("% d \ n", cas (c, b)); printf ("% d \ n", cas (c, b, a)); return 0; }
Oblikovanje bilješke - izgleda kao WP isticanje sintakse je dodavanje na kraju, zanemariti činjenicu da.
Fact
# Includefact int (int a, int b) { int rezultat; / * Izračunaj najveći zajednički djelitelj pomoću Euclid 's Algoritmu * / __asm__ __ volatile__ ("movl% 1,%% eax;" "Movl% 2,%% ebx;" "CONTD: cmpl $ 0,%% ebx;" "Je DONE"; "Xorl%% EDX,%% EDX;" "Idivl%% ebx;" "Movl%% ebx,%% eax;" "Movl%% EDX,%% ebx;" "JMP CONTD;" "Gotovo: movl%% eax,% 0;": "= g" (rezultat): "g" (), "g" (b) ); vratiti rezultat; } int main () { int prvi, drugi; printf ("Unesite dva cijela broja:"); scanf ("% d% d", i prvi, i drugi); printf ("fact of posto D &% d je% d \ n", prvi, drugi, fact (prvi, drugi)); return 0; }
rubin jedan linijski brodovi za stvaranje hash
Jučer dok prolazi kroz jedan od mojih starih programa, otkrio sam to napisao po meni negdje vratiti:
#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
Ubiti neke od neizvjesnosti neka mi otkriti da raw_text izgleda
, Zar to je izrezana iz PayPal plaćanja priznanja.
Iznad linije ako slomljene čita bolje:
unescaped_array = CGI.unescape (raw_text). Split ('&') unescaped_array unescaped_array.collect = {| x | = b x.split ("="); b.push (nula) ako b.size == 1, b} flattened_array = unescaped_array.flatten hash = Hash [* flattened_array]
Učinimo pojedinačne korake u IRB:
IRB (glavni). 009:0> unescaped_array = CGI.unescape (raw_text) Split ('&') => ["USPJEH", "mc_gross = 10,00", "protection_eligibility = nepodobnim", "payer_id = U7PPJJ4TSJ47E", "pristojba = 0,00", "payment_date = 9:45:30 10. srpnja 2009 PDT", "payment_status = čekanju "] IRB (glavni): 013:0> unescaped_array unescaped_array.map = {| x | = b x.split ("="); b.push (nula) ako b.size == 1, b} => [["USPJEH", nula], ["mc_gross", "10,00"], ["protection_eligibility", "nepodobnim"], ["payer_id", "U7PPJJ4TSJ47E"], ["porez", "0.00"] , ["payment_date", "9:45:30 10. srpnja 2009 PDT"], ["payment_status", "na čekanju"]] IRB (glavni): 014:0> flattened_array = unescaped_array.flatten => ["USPJEH" nula ", mc_gross", "10,00", "protection_eligibility", "nepodobnim", "payer_id", "U7PPJJ4TSJ47E", "porez", "0,00", "payment_date", "09:45: 30 10. srpnja 2009 PDT "," payment_status "," na čekanju "] IRB (glavni): 015:0> hash = Hash [* flattened_array] => {"Porez" => "0,00", "payment_status" => "na čekanju", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10,00", "USPJEH" => nula ", payment_date" = > "9:45:30 10. srpnja 2009 PDT", "protection_eligibility" => "nepodobnim"}
BTW, * zove se oznaka operator u rubin
Drugi način za stvaranje mljeveno meso iz 'niz parova' je koristiti uvelo:
hash = [[1,2], [3,4]] ubrizgati ({}). {| rezultat, element | rezultat [element.first] = rezultat [element.last];} rezultat Postoji još jedan način
Napišite petlju, da ću otići kao vježba za čitatelja!
Ovdje je malo nevezano za korištenje slučaj stvaranja mljeveno meso iz polja:
IRB (glavni): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.? : Manje :: veća} => {: Manje => [1, 2, 3, 4]: noviji => [7, 9]}
To možete učiniti više stvari, u osnovi rezultat je blok se koristi kao ključ za taj element u rezultat mljeveno meso.
Gmail, džukela i msmtp fix
Ako koristite džukela i SMTP pristup gmail. Ovdje je (loše) vijesti. Cool Dečki na Google opet promijenio certifikat. Oh, jeste li pitati - kako to znati? Jednostavno džukela započeo gunđanje o lošem certifikata kada se pokušava koristiti msmpt i zloglasne msmtp: TLS certifikat nije uspjela provjera. Potvrdu nije dobio poznatu izdavatelja ' Pozdravila me na zaslonu.
Prijeći potvrdu -
Dovoljno je pokrenuti nakon
$ msmtp --serverinfo --host=smtp.gmail.com --tls=on --port=587 --tls-certcheck=off
Na mjestu starog Thwate Server sada ste se nakon izdavatelja u segmentu
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US
Srećom popravak je jednostavan, ovdje je ono što trebate učiniti na Debian
# apt-get install ca-certificates
# dpkg -s ca-certificates|grep Version
Version: 20090814
Nakon toga samo promijenite sljedeću liniju u koju ~ e /. 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
na
tls_trust_file /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt
Spajanje hashes u yaml boys = dječaci datoteka
YAML je vrlo zgodan za pisanje konfiguracijske datoteke. Osnovna prednost je da se čita kao tekstualnu datoteku. To radi jako dobro ako je vaša config file je flat (nema hijerarhije) i nema ponavljanja.
Ako je Vaš konfiguracije datoteka ima ponavljanja onda ima smisla izdvojiti one elemente te ih ponovno. Što mislim je to - recimo da vaša config file izgleda ovako:
razvoj: input_location: common_input output_location: dev_location mail: smtp_server: your_server login: your_login lozinka: top_secret Proizvodnja: input_location: common_input output_location: dev_location mail: smtp_server: your_server login: your_login lozinka: top_secret
Uz pretpostavku iznad koda u / tmp / test.yml ovdje je kako možete pročitati u Pythonu i Ruby
$cat readyml.py
#! / Usr / bin / env python pprint iz uvoza pprint kao pp # U Debian morati instalirati python-yaml yaml iz uvoza tereta, load_all, izvatkom hash = load (open ("/ tmp / test.yml ')) pp (hash ['razvoj'])
$ cat readyml.rb
#! / Usr / bin / env rubin zahtijevaju možeš PP kontakta hash = YAML :: load (File.open ("/ tmp / test.yml '). pročitati) pp hash ['razvoj']
ovdje je pri ruci jedan brod za rubin verziji
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' ili možete isprobati isti u IRB ili python konzola.
Imajte na umu da u gore isječak koda, sve je osim izlaza lokacija je ista u razvoju i proizvodnji dio. Ovo je mjesto gdje yml čvora identifikator dolazi spasiti. Ideja je jednostavna imati set zadanih vrijednosti te ih nadjačati, na drugom mjestu.
Možete ga razvlači kako slijedi:
zadane: & defaultno input_location: common_input output_location: dev_location mail: SENDER_NAME: pošiljatelj smtp_server: your_server login: your_login lozinka: top_secret razvoj: <<: * Defaultno Proizvodnja: <<: * Defaultno output_location: prod_location
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Super, to radi (tm)!.
Uvjerljivo smo trgovali neke jasnoću za malo magije. Ovdje je malo objašnjenje: i, * i <<: i što je sidro tag se može shvatiti kao čvora identifikator, * je čvor referentni i <<: kratica za hash spajanja.
Za više pojedinosti vidi bilo yaml naočale ili Wikipedia
Do sada je tako dobro, ali postoji kvaka ovdje, ove hash stapa nisu rekurzivni. Što to znači da je ovo: recimo da želite imati drugačiji naziv pošiljatelja pošte u dva okruženja, vi svibanj biti u iskušenju da učinite sljedeće:
zadane: & defaultno input_location: common_input output_location: dev_location mail: SENDER_NAME: pošiljatelj smtp_server: your_server login: your_login lozinka: top_secret razvoj: <<: * Defaultno mail: SENDER_NAME: sender_dev Proizvodnja: <<: * Defaultno output_location: prod_location mail: SENDER_NAME: sender_prod
Omogućava provjeriti
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$
Ups, nešto je pošlo po zlu, problem kao što je spomenuto da je hash spajanje nije rekurzivna i dok spajanjem ga zamijeniti pošte u zadanom putem pošte proizvodnje koji ima samo jednu tipku. Rješenje / zaobišli je odvijati još jednu razinu:
common_settings: & common_settings input_location: common_input output_location: dev_location mail_defaults: & mail_defaults SENDER_NAME: pošiljatelj smtp_server: your_server login: your_login lozinka: top_secret zadane: & defaultno <<: * Common_settings mail: <<: * Mail_defaults razvoj: <<: * Defaultno Proizvodnja: <<: * Defaultno mail: <<: * Mail_defaults SENDER_NAME: sender_prod
Omogućuje ponovno provjeriti
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Jeste li reći da imate jedan više razine gniježđenja, i definitivno možete odmotati još jednu razinu, ali onda to postaje nered. Dakle, ako ne pokušavaju napisati rješenje kule Hanoi u conf datoteke, bolje je da restucture conf datoteke od kopanja u yaml ili nešto drugo. No, to je vaš poziv anyway.
Malo ljuske preusmjeravanja
Evo kako smo obično ljuske napraviti preusmjeravanje
$ ./pgm.sh args >out.txt 2>err.txt
Htjela sam ga malo modificirati i pokrenuti kako slijedi
$ ./pgm.sh args
uz uvjet da izlaz i greška trebao ići na neki filename unutar izračunanoga pgm.sh na temelju args. Jedan ilustrativan slučaj mogao biti datum kad je dio args. Tako da bih stdout ići reći / vaše / direktorij / pgm_out_YYYYMMDD.txt 1
Problem sa standardnim načinom preusmjeravanje N>file.txt tj. udruživanje N file deskriptora za file.txt, je da se radi samo za novo rašljastom procesa, a ne za tekući proces.
tako
$ echo hi 1>out.txt ; echo hii . poslat će pozdraviti out.txt, ali će se ispisati hii na stdout 2
Ovo je mjesto gdje exec dolazi na naše spašavanja. Dodamo exec 1>somefile.txt onda izlaz iz ostatka skriptu će ići na somefile.txt
$. / Test.sh će preusmjeravati hi hii kao i da out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
Slično preusmjeravati stdout kao stderr ćemo učiniti nešto ovako
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
Sad se vraćaju na izvornu točke preusmjeriti na neke datoteke iz unutrašnjosti ljuske, recimo program za kompjutorska naziv datoteke u nekom promjenjivom OUTFILE, mogli bismo samo napravili exec 1>$OUTFILE
To rješava trenutni problem. Ali vi svibanj želite proći kroz sljedeći primjer koji postiže možeš random access "datoteke u shell skripta. Primjer je iz ovdje
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
S komentarima, ovaj kod je samo sebi.
-
1 Također se može učiniti $ ./pgm.sh args >pgm_out`date +%Y%m%d` no ideja je da se ovaj naziv datoteke generiraju na temelju neke logike u programu samog.
2 1 u 1> out.txt je suvišan, ali ovdje pojašnjava da smo preusmjeravanjem FD 1
Na ljestvici ili ne na ljestvici
Dok govorimo o horizontalnom particioniranje baza podataka, DHH stopom povrata od slave sugerira da scaling stvari mogu čekati, svakako čekati do točke vaše poslovne potrebe zahtijevaju ga. Njegov članak definitivno ima smisla za male instrumenta reći startups. Ne kažem da je u startups trebali pisati demo programa ali s obzirom da postoji samo 24 sata na dan trebali usredotočiti na posluživanje reći 1000 korisnika u više od gubitka način ispunjava svoj san preko brige o tome kako će moj zahtjev podnijeti opterećenje 13.142 milijuna korisnicima. Ako dobijete one mnoge korisnike ćete znati kako na ljestvici. Za startups skalabilnost je dobar problem riješiti, ali daleko bolje da imaju problema, mislim bilo početak bi volio naletiti na ovaj problem!
U drugom svezi članka Jeremy Zawodny piše da ne bi trebali ovisiti o Mr. Moore, ako imate problema skalabilnost.
Budući da su ti članci odnose se na Mooreov zakon ne mogu pomoći, ali napisati da Mooreov zakon mora biti jedan od najvažnijih opće prakse u Computer Science. Od njegove izvorne predviđanja o tranzistor gustoće, ovaj zakon sada navodi gdje ste naišli eksponencijalnog rasta.



































