Prieskum, stolný, pubsub, pubsubhub, pubsubhubbub
V prípade, že sú skeptickí, je metóda v šialenstvo vyššie, v názve príspevku. V tech kruhoch je nepravdepodobné, že ste počuli o pubsubhubbub. V rýchlych niekoľko mesiacov, to bol jeden z troch najväčších hovoril o veciach. Ďalšie dva byť homomorfní šifrovanie a Google vlna [ 1. ]. Návrate do súčasnej post - termíny v názve naznačujú, ako sa dostať obsah od ostatných ľudí. Nasledujúce údaje sa viac zrejmé, že ak si predstaviť, čo sa deje s ohľadom na blogy, aj keď sú koncepčne neobmedzuje len na blogy.
Dotazovanie sa vzťahuje k situácii, kedy klienti Proste na server, ak sa niečo nové vymyslieť. Ako často žiadať o zmenách bude vždy problém s príliš častým kladením otázok alebo príliš časté, ale ako jeden čitateľ poukázal na tú , že jeden veľký, vec sa vypočúvanie je, že server nemá k udržaniu stavu.
Ping sa vzťahuje na prípad, keď písať článok, vy (alebo váš softvér) sa tiež aktualizuje niektoré populárne (centrálne) aktualizačnej služby. Niektoré pozadí tu .
Ďalšia je pubsub čo je skratka pre publish / subscribe, jeden z najbližšej ihrisko pre to bolo robené tu Evan Henshaw-Plathovej a Kellan Elliott-McCrea (72 snímok, ale stojí za to prechádza). Presvedčivé príklad dali proti bol tento - k určitému dátumu, FriendFeed plazil Flickr 2,9 milióna krát získať najnovšie fotky 45,754 užívateľov, z toho 6721 navštívil Flickr v tých 24 hodín a mohol "potenciálne" nahrali fotografie. Všimnite si, že to, čo navrhoval nie je nová technológia, pretože poukazujú na "revolučný nový 20 rokov staré technológie". Ak to pre blogy, potom jedným z hlavných problémov, s XMPP - prítomnosť dát nad hlavou, čo môže byť tak vysoko ako 60-70% môže byť znížená veľa.
pubsubhub znamená publikovať subscribe húb a pubsubhubbub je protokol, jadro je myšlienka pubsubhub. Wherein vydavateľov (teda bloggerov) aktualizovať centrum, ktoré (môže byť viac ako jeden náboje, ktoré spolu hovoria) žije "kdesi v oblaku", podľa protokolu to možné tlačiť alebo ťahať podľa protokolu, ale v ďalšej odkaz reťaz, náboje na klienta (povedzme čitateľa) je vždy presadzovať model. Táto stránka je dobrým východiskovým bodom pre pubsubhubbub, prehľad snímky sú dobré. Niekedy veľavravné Anil Dash popisuje to tu ako tlačidlom webe.
Dva ďalšie súvisiace čitateľov sú webhooks čo je v podstate http spätné volania. Github používa ho, tak sa paypal pre asynchrónne oznámenia o platbe v IPN . Tak to mnoho ďalších. Príbuzné poňatie je rsscloud čo je opäť pubsub náboj. Nasledujte tento odkaz podrobnosti.
Možno sa čudujete, čo má zmysel písať to všetko tu, sú tam dva 1. Tieto veci sú dobré vedieť, minimálne aspoň a 2. Tento blog je povolené pubsubhubbub teraz cez hubu appspot pomocou tohto wordpress plugin a krmív, príliš je povolené pubsubhubbub cez FeedBurner, odkaz tu
-
[ 1 ]. - Dobré úvodné čítanie pre plne homomorfní šifrovanie je tento článok Bruce Schneier a táto diskusia je viac či menej jediný zdroj pre Google Wave.
-UPDATE - Tento príspevok vysvetľuje, ako možno požiadavku na verejnom serveri pre spätné volanie je obísť pre desktopové klientov pomocou XMPP bránu (pre pubsubhubbub).
Trochu montáže
Po prečítaní tohto článku o nárazníky Lock Free a videl využitie CAS (porovnanie a výmena), pripadal som si ako vysielanie kód assembleri, aby urobili to isté. Use case tam bolo napísať natívne metódy a volať z Java späť do 1.5, kedy súbežné dátové štruktúry v Jave boli viac či menej neexistuje). Bez ďalších okolkov, ja sa uvoľnil kód na vás
. Prvým z nich je pre CAS a druhý je pre výpočtovú GCD pomocou Euclid algoritmus (ten možno nájsť na mnohých miestach a cvičenie i).
Kompilovať a spúšťať inštrukcie gcc file_name.c ; ./a.out
Porovnajte a Swap
# Include# Include / / Výmena - newValue, comperand je starý / očakávaná hodnota / * * Funkcia vlastne robí nasledujúce vec - ak je hodnota na * dest sa rovná oldvalue potom ho nahradiť iným newValue ponechať bezo zmeny: to všetko atomárny * * Existujú dve možnosti pre návratové hodnoty * 1.is počiatočná hodnota z * dest a nechať záťaže volajúceho FXN porovnať ju s oldval * 2. to sem a vráti 0 alebo 1, malo by to byť efektívnejšie ** / / * Neskôr zmeniť v makre * / 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 result = 1 ;/ * 1 ukazuje, že sa podarilo cas a 0 ukazuje, že sa nepodarilo * / / * Btw treba nastaviť cc pre vlajky prepisovanie! * / __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" / * LOCK by mal byť na rovnakom riadku * / "JZ Dané \ n \ t" "Movl $ 0,% 1 \ n \ t" "Dané: \ n \ t" : "= M" (dest), "= g" (výsledok) : "G" (oldvalue), "G" (newValue), "m" (dest) : "% EAX", "% EBX", "ECx", "cc" ); printf ("(% d,% d,% d)", * dest, oldvalue, newValue); return vysledok; } / * TODO * Napísať ďalšie asm FXN ktorý sa prejavuje predovšetkým FXN v cykle while a ďalej snažiť, ak uspeje * / int main () { int = 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,)); printf ("% d \ n", CAS (c,,)); printf ("% d \ n", CAS (c, b, b)); * C = 6; / * C = 5; * / printf ("meniace sa hodnota * c k% d \ n", * c); printf ("% d \ n", CAS (c, b, b)); printf ("% d \ n", CAS (c, b,)); printf ("% d \ n", CAS (c,,)); printf ("% d \ n", CAS (c, a, b)); printf ("% d \ n", CAS (c, b,)); return 0; }
Formátovanie poznámky - sa zdá byť ako zvýrazňovač syntaxe wp je pridanie nakoniec ignorovať.
GCD
# Includeint GCD (int, int b) { int vysledok; / * Počítať najväčší spoločný deliteľ pomocou Euclid algoritmus * / __asm__ __ volatile__ ("movl% 1,%% EAX;" "Movl% 2,%% EBX;" "CONTD: cMpl $ 0,%% EBX;" "Je vykonané;" "Xorl%% EDX,%% EDX;" "Idivl%% EBX;" "Movl%% EBX,%% EAX;" "Movl%% EDX,%% EBX;" "JMP CONTD;" "Dané: movl%% EAX,% 0;": "= g" (výsledok): "g" (), "G" (b) ); return vysledok; } int main () { int prvý, druhý, printf ("Zadajte dve celé čísla:"); scanf ("% d% d", a prvý a druhý); printf ("% d GCD zo &% d je% d \ n", prvá, druhá, GCD (prvá, druhá)); return 0; }
Ruby jeden vložky pre vytvorenie hash
Včera pri prechode jedného z mojich starých programov, našiel som to napísal ja niekedy späť:
#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
Zabiť niektoré z napätia dovoľte mi prezradiť, že raw_text vyzerá
, Priamo to bolo rez od paypal platby potvrdenie.
Nad riadku, ak rozdelené do častí znie lepšie:
unescaped_array = CGI.unescape (raw_text). split ('&') unescaped_array = unescaped_array.collect {| x | = b x.split ("="); b.push (nula), ak b.size == 1, b} flattened_array = unescaped_array.flatten hash = Hash [* flattened_array]
Urobme jednotlivé kroky v IRB:
IRB (hlavný):. 009:0> unescaped_array = CGI.unescape (raw_text) split ('&') => ["Úspech", "mc_gross = 10,00", "protection_eligibility = nespôsobilý", "payer_id = U7PPJJ4TSJ47E", "daň = 0,00", "payment_date = 09:45:30 10.07.2009 PDT", "payment_status = Do "] IRB (hlavný): 013:0> unescaped_array = unescaped_array.map {| x | = b x.split ("="); b.push (nula), ak b.size == 1, b} => [["Úspech", nil], ["mc_gross", "10,00"], ["protection_eligibility", "Zákaz činnosti"], ["payer_id", "U7PPJJ4TSJ47E"], ["daň", "0.00"] ["payment_date", "09:45:30 10.07.2009 PDT"], ["payment_status", "Do"]] IRB (hlavný): 014:0> flattened_array = unescaped_array.flatten => ["Úspech", nula, "mc_gross", "10,00", "protection_eligibility", "nespôsobilý", "payer_id", "U7PPJJ4TSJ47E", "daň", "0.00", "payment_date", "9:45: 30 10.07.2009 PDT "," payment_status "," Do "] IRB (hlavný): 015:0> hash = Hash [* flattened_array] => {"Daň" => "0.00", "payment_status" => "Do", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10,00", "úspech" => nula, "payment_date" = > "09:45:30 10.07.2009 PDT", "protection_eligibility" => "nespôsobilý"}
BTW, je nazývaný * ikona operátor v ruby
Ďalší spôsob, ako vytvoriť hash z 'radu párov je použiť injekciu:
hash = [[1,2], [3,4]] injekciu ({}). {| výsledok, prvok | výsledok [element.first] = výsledok [element.last];} výsledok Existuje ešte jeden spôsob, ako
Napíšte slučku, že nechám ako cvičenie na čitateľa!
Tu je trochu nesúvisí prípad použitia vytváraní hash z poľa:
IRB (hlavný): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.? : Menšie väčšie ::} => {: Menšie => [1, 2, 3, 4]: väčšie => [7, 9]}
Môžete to urobiť viac vecí, v podstate výsledok bloku sa používa ako kľúč pre tento prvok vo výslednej hodnoty hash.
gmail, mutt a msmtp oprava
Ak používate mutt a SMTP pre prístup k službe Gmail. Tu je (zlé) správy. Skvelé chlapci na Google opäť zmenil certifikát. Ach, vy ste sa opýtať - ako to vieš? Jednoduché mutt začal sťažovať na zlé certifikátu pri pokuse o použitie msmpt, neslávne známy Hasičské msmtp: TLS overenie certifikátu zlyhal:. Certifikát nemá známeho vydavateľa " privítal ma na obrazovke.
Prejsť potvrdenie -
Stačí spustiť po
$ msmtp --serverinfo --host=smtp.gmail.com --tls=on --port=587 --tls-certcheck=off
Na mieste starej Thwate serveri sa dostanete po emitenta v segmente
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US
Našťastie oprava je jednoduchá, tu je to, čo musíte urobiť na debian
# apt-get install ca-certificates
# dpkg -s ca-certificates|grep Version
Version: 20090814
Po tomto stačí zmeniť nasledujúce riadky vo vás ~ ~ ~ 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
na
tls_trust_file /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt
Zlučovanie hashe v Yamli conf súbory
Yamli je veľmi užitočná pre písanie konfiguračných súborov. Hlavnou výhodou je to, že sa číta ako textový súbor. To funguje naozaj dobre, ak váš konfiguračný súbor je plochá (bez hierarchie) a nemá žiadne opakovanie.
Ak váš súbor obsahuje opakovanie konfigurácie, potom má zmysel oddeliť tieto prvky a ich znovu použiť. Čo chcem povedať je to - povedzme, že ste si konfiguračný súbor vyzerá takto:
vývoj: input_location: common_input output_location: dev_location mail: smtp_server: vetva Váš_server Login: your_login heslo: top_secret produkcie: input_location: common_input output_location: dev_location mail: smtp_server: vetva Váš_server Login: your_login heslo: top_secret
Za predpokladu, že vyššie uvedený kód do / tmp / test.yml tu je, ako si môžete prečítať v Python a Ruby
$cat readyml.py
#! / Usr / bin / env python od dovozného pprint pprint ako pb # V Debianu je potrebné nainštalovať python-Yamli Yamli z dovozu zaťaženie, load_all výklopné hash = zaťaženie (open ("/ tmp / test.yml ')) pp (hash ['vývoj'])
$ cat readyml.rb
#! / Usr / bin / env ruby vyžadujú "PP" hash = Yamli :: load (File.open ("/ tmp / test.yml"). čítať) pb hash ['vývoj']
tu je praktickým vložka verzia ruby
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' , alebo si môžete skúsiť to isté v IRB alebo python konzole.
Všimnite si, že vo vyššie uvedenom kódu, všetko je iné, než výstup poloha je rovnaká vo vývoji a výrobe časti. To je miesto, kde yml uzol identifikátor príde zachrániť. Myšlienka je jednoduchá mať sadu predvolených hodnôt a prepísať ich na inom mieste.
Dalo by sa vytiahnite ju od seba takto:
predvolené: predvolené nastavenie a input_location: common_input output_location: dev_location mail: SENDER_NAME: odosielateľ smtp_server: vetva Váš_server Login: your_login heslo: top_secret vývoj: << * Východisková produkcie: << * Východisková output_location: prod_location
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Skvelé, to funguje (tm)!.
Pravdepodobne sa obchoduje nejakú prehľadnosť pre trochu mágie. Tu je malé vysvetlenie: a * a <<: a ktorý je kotva tag možno chápať ako identifikátor uzla, uzol * je referenčná a <<: kandiduje na hash zlúčenie.
Pre viac informácií viď buď Yamli špecifikácia alebo Wikipédie
Zatiaľ je to dobré, ale je tu jeden háčik, tieto mriežky sa spoja nie sú rekurzívne. Čo to znamená toto: povedzme, že chcete mať iné meno odosielateľa pre poštu v dvoch prostrediach, môžete byť v pokušení urobiť nasledovné:
predvolené: predvolené nastavenie a input_location: common_input output_location: dev_location mail: SENDER_NAME: odosielateľ smtp_server: vetva Váš_server Login: your_login heslo: top_secret vývoj: << * Východisková mail: SENDER_NAME: sender_dev produkcie: << * Východisková output_location: prod_location mail: SENDER_NAME: sender_prod
Umožňuje kontrolovať
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$
Jejda, niečo sa pokazilo, problém ako je uvedené vyššie, je, že hash zlúčenie nie je rekurzívne a zatiaľ čo zlučovanie nahradil mailu zlyhanie poštou produkcie, ktoré má len jeden kľúč. Riešenia / práce okolo je rozvinúť ešte jednu úroveň:
common_settings: & common_settings input_location: common_input output_location: dev_location mail_defaults: & mail_defaults SENDER_NAME: odosielateľ smtp_server: vetva Váš_server Login: your_login heslo: top_secret predvolené: predvolené nastavenie a << * Common_settings mail: << * Mail_defaults vývoj: << * Východisková produkcie: << * Východisková mail: << * Mail_defaults SENDER_NAME: sender_prod
Umožňuje kontrolovať znova
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Vedeli ste, že máte ešte jednu úroveň vnorenia, tak môžete určite rozbalí jeden stupeň, ale potom sa to stane neporiadok. Takže, ak nie ste sa snažia písať riešenie veže v Hanoji v conf súboru, je lepšie restucture conf súboru, než kopať do Yamli alebo niečo iné. Ale to je na vás tak ako tak.
Trochu plášťa presmerovania
Tu je, ako sme normálne robiť shell presmerovania
$ ./pgm.sh args >out.txt 2>err.txt
Chcel som to trochu zmeniť a spustiť takto
$ ./pgm.sh args
s požiadavkou, aby výkon a chyba by mala ísť do nejakého súboru, počítané v pgm.sh založenej na prepínači. Jeden ilustratívny prípad, kedy by mohlo byť dátum je súčasťou ARGUMENTY. Takže by ste chceli ísť na stdout povedať / your / adresár / pgm_out_YYYYMMDD.txt 1
Problém so štandardným spôsobom presmerovať N>file.txt tj združujúca deskriptora súboru file.txt na N, je, že funguje len pre novo vidlicový procesu, a nie pre aktuálny proces.
tak
$ echo hi 1>out.txt ; echo hii . pošle ahoj out.txt ale bude tlačiť hii na stdout 2
To je miesto, kde exec prichádza na záchranu. Ak pridáme exec 1>somefile.txt potom výstup zo zvyšku skriptu pôjde na somefile.txt
$. / Test.sh presmeruje hi rovnako ako hii sa out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
Podobne ako presmerovanie stdout aj stderr urobíme niečo také
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
Teraz sa vracia na pôvodné miesto presmerovanie na nejaký súbor z vnútornej strany nádrže, povedzme Program počíta názov súboru v nejakej premennej outfile, mohli sme práve urobil exec 1>$OUTFILE
, Ktorý rieši aktuálny problém. Ale môžete chcieť prejsť nasledujúcom príklade, ktorý dosahuje "Random prístupu" súboru vo skriptu shellu. Príklad je z tu
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 pripomienkami, tento kód je samozrejmý.
-
1 To môže tiež byť robené $ ./pgm.sh args >pgm_out`date +%Y%m%d` , ale nápad je vytvárať tento súbor názov založený na nejakú logiku v samotnom programe.
2 1 v 1> out.txt je nadbytočná, ale objasňuje, že sa tu presmerovanie fd 1
Ak chcete zmeniť veľkosť alebo mierku
Kým hovorí o horizontálne delenie databáz, DHH zo ROR slávy naznačuje, že škálovanie veci môže počkať, rozhodne počkať až do okamihu vaše obchodné potreby vyžadovať. Jeho článok rozhodne zmysel pre malé setup povedať štartoch. Nechcem povedať, že v začínajúcich by ste mali napísať demo programy, ale vzhľadom k tomu, že existuje len 24 hodín v deň, kedy by sa mala zamerať na poskytovanie služieb povedať 1000 užívateľov vo viac naplňujúce spôsobom, než stratí váš spánok viac ako starosti o tom, ako bude moja žiadosť zvládnuť záťaž 13.142 miliónov užívateľov. Ak sa vám tieto mnoho užívateľov, budete vedieť, ako zmeniť veľkosť. U začínajúcich škálovateľnosť je dobré problém k riešeniu, ale oveľa lepšie mať problém, mám na mysli akékoľvek spustenie rád by som narazíte na tento problém!
V ďalšom súvisiacom článku Jeremy Zawodny píše, nemali by ste závisieť na pána Moora, ak máte problémy so škálovateľnosťou.
Pretože tieto články vzťahujú na Moorov zákon Nemôžem si pomôcť, ale napísať, že Moorov zákon musí byť jedným z najviac všeobecného práva v informatike. Z jeho pôvodným predpokladom o hustoty tranzistorov, je tento zákon teraz citovaná všade narazíte na exponenciálny rast.



































