Průzkum, stolní, pubsub, pubsubhub, pubsubhubbub

V případě, že jsou skeptičtí, je metoda v šílenství výše, v názvu příspěvku. V tech kruzích je nepravděpodobné, že jste slyšeli o pubsubhubbub. V rychlých několik měsíců, to byl jeden ze tří největších mluvil o věcech. Další dva být homomorfní šifrování a Google vlna [ 1. ]. Návratu do současné post - termíny v názvu naznačují, jak se dostat obsah od ostatních lidí. Následující údaje se více zřejmé, že pokud si představit, co se děje s ohledem na blogy, i když jsou koncepčně neomezuje pouze na blogy.

Dotazování se vztahuje k situaci, kdy klienti Proste na server, pokud se něco nového vymyslet. Jak často žádat o změnách bude vždy problém s příliš častým dotazováním nebo příliš časté, ale jako jeden čtenář poukázal na tu , že jeden velký, věc se dotazování je, že server nemá k udržení stavu.

Ping se vztahuje na případ, kdy psát článek, vy (nebo váš software) se také aktualizuje některé populární (centrální) aktualizační služby. Některé pozadí zde .

Další je pubsub což je zkratka pro publish / subscribe, jeden z nejbližší hřiště pro to bylo děláno zde Evan Henshaw-Plathové a Kellan Elliott-McCrea (72 snímků, ale stojí za to prochází). Přesvědčivé příklad dali proti byl tento - k určitému datu, FriendFeed plazil Flickr 2,9 milionu krát získat nejnovější fotky 45,754 uživatelů, z toho 6721 navštívil Flickr v těch 24 hodin a mohl "potenciálně" nahráli fotografie. Všimněte si, že to, co navrhoval není nová technologie, protože poukazují na "revoluční nový 20 let staré technologie". Pokud to pro blogy, pak jedním z hlavních problémů, s xmpp - přítomnost dat nad hlavou, což může být jak vysoce jak 60-70% může být snížena hodně.

pubsubhub znamená publikovat subscribe hub a pubsubhubbub je protokol, jádro je myšlenka pubsubhub. Wherein vydavatelů (tedy bloggerů) aktualizovat centrum, které (může být více než jeden náboje, které spolu mluví) žije "kdesi v oblaku", podle protokolu to lze tlačit nebo tahat dle protokolu, ale v další odkaz řetěz, náboje na klienta (řekněme čtenáře) je vždy prosazovat model. Tato stránka je dobrým výchozím bodem pro pubsubhubbub, přehled snímky jsou dobré. Někdy výmluvné Anil Dash popisuje to tady jako tlačítkem webu.
Dva další související čtenářů jsou webhooks což je v podstatě http zpětná volání. Github používá ho, tak se paypal pro asynchronní oznámení o platbě v IPN . Tak to mnoho dalších. Příbuzné pojetí je rsscloud což je opět pubsub náboj. Následujte tento odkaz podrobnosti.

Možná se divíte, co má smysl psát to všechno tady, jsou tam dva 1. Tyto věci jsou dobré vědět, minimálně alespoň a 2. Tento blog je povoleno pubsubhubbub nyní přes hubu appspot pomocí tohoto wordpress plugin a krmiv, příliš je povoleno pubsubhubbub přes FeedBurner, odkaz zde
-
[ 1 ]. - Dobré úvodní čtení pro plně homomorfní šifrování je tento článek Bruce Schneier a tato diskuse je více či méně jediný zdroj pro Google Wave.

-UPDATE - Tento příspěvek vysvětluje, jak lze požadavek na veřejném serveru pro zpětné volání je obejít pro desktopové klienty pomocí XMPP bránu (pro pubsubhubbub).

Trochu montáže

29.srpna 2009 od Prashant · Komentáře
Soubor pod: technologie

Po přečtení tohoto článku o nárazníky Lock Free a viděl využití CAS (srovnání a výměna), připadal jsem si jako vysílání kód assembleru, aby učinily totéž. Use case tam bylo napsat nativní metody a volat z Java zpět do 1.5, kdy souběžné datové struktury v Javě byly více či méně neexistuje). Bez dalších okolků, já se uvolnil kód na vás :) . Prvním z nich je pro CAS a druhý je pro výpočetní GCD pomocí Euclida algoritmus (ten lze nalézt na mnoha místech a cvičení i).

Kompilovat a spouštět instrukce gcc file_name.c ; ./a.out

Porovnejte a Swap

   # Include 
  # Include 
 / / Výměna - newValue, comperand je starý / očekávaná hodnota
 / *
  * Funkce vlastně dělá následující věc - pokud je hodnota na * dest se rovná oldvalue pak jej nahradit jiným newValue ponechat beze změny: to vše atomicky
  *
  * Existují dvě možnosti pro návratové hodnoty
  * 1.is počáteční hodnota z * dest a nechat zátěže volajícího fxn porovnat ji s oldval
  * 2.  to sem a vrátí 0 nebo 1, mělo by to být efektivnější
  ** /

 / * Později změnit v makru * /
 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 se podařilo cas a 0 ukazuje, že se nezdařilo * /
	 / * Btw třeba nastavit cc pro vlajky přepisování!  * /
	 __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 měl být na stejném řádku * /
			 "JZ Dáno \ n \ t"
			 "Movl $ 0,% 1 \ n \ t"
			 "Dáno: \ n \ t"
			 : "= M" (dest), "= g" (výsledek)
			 : "G" (oldvalue), "G" (newValue), "m" (dest)
			 : "% Eax", "% ebx", "ecx", "cc"
			 );
	 printf ("(% d,% d,% d)", * dest, oldvalue, newValue);
	 return vysledek;
 }

 / * TODO
  * Napsat další asm fxn který se projevuje především fxn v cyklu while a dál snažit, pokud uspěje * /

 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 ("měnící se 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átování poznámky - se zdá být jako zvýrazňovač syntaxe wp je přidání nakonec ignorovat.

GCD

 # Include 
 int gcd (int, int b) {
     int vysledek;
     / * Počítat největší společný dělitel pomocí Euclida algoritmus * /
     __asm__ __ volatile__ ("movl% 1,%% eax;"
                           "Movl% 2,%% ebx;"
                           "CONTD: cMpl $ 0,%% ebx;"
                           "Je provedeno;"
                           "Xorl%% edx,%% edx;"
                           "Idivl%% ebx;"
                           "Movl%% ebx,%% eax;"
                           "Movl%% edx,%% ebx;"
                           "Jmp CONTD;"
                           "Dáno: movl%% eax,% 0;": "= g" (výsledek): "g" (), "G" (b)
     );

     return vysledek;
 }

 int main () {
     int první, druhý,
     printf ("Zadejte dvě celá čísla:");
     scanf ("% d% d", a první, a druhý);

     printf ("% d GCD ze &% d je% d \ n", první, druhá, gcd (první, druhá));

     return 0;
 }

Ruby jeden vložky pro vytvoření hash

20.srpna 2009 od Prashant · Komentáře
Soubor pod: technologie

Včera při průchodu jednoho z mých starých programů, našel jsem to napsal já někdy zpět:

#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

Zabít některé z napětí dovolte mi prozradit, že raw_text vypadá

 

, Přímo to bylo řez od paypal platby potvrzení.

Nad řádku, pokud rozděleny do částí zní lépe:

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

Udělejme jednotlivé kroky v IRB:

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

 => ["Úspěch", "mc_gross = 10,00", "protection_eligibility = nezpů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), pokud b.size == 1, b}  

 => [["Úspěch", 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     

 => ["Úspěch", nula, "mc_gross", "10,00", "protection_eligibility", "nezpů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", "úspěch" => nula, "payment_date" = > "09:45:30 10.07.2009 PDT", "protection_eligibility" => "nezpůsobilý"} 

BTW, je nazýván * ikona operátor v ruby

Další způsob, jak vytvořit hash z 'řady párů je použít injekci:

  hash = [[1,2], [3,4]] injekci ({}). {| výsledek, prvek | výsledek [element.first] = výsledek [element.last];} výsledek 

Existuje ještě jeden způsob, jak :) Napište smyčku, že nechám jako cvičení na čtenáře!

Zde je trochu nesouvisí případ užití vytváření hash z pole:

  IRB (hlavní): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.?  : Menší větší ::}

 => {: Menší => [1, 2, 3, 4]: větší => [7, 9]} 

Můžete to udělat více věcí, v podstatě výsledek bloku se používá jako klíč pro tento prvek ve výsledné hodnoty hash.

gmail, mutt a msmtp oprava

17.srpna 2009 od Prashant · Komentáře
Soubor pod: technologie

Pokud používáte mutt a SMTP pro přístup ke službě Gmail. Zde je (špatné) zprávy. Skvělé kluci na Google opět změnil certifikát. Ach, vy jste se zeptat - jak to víš? Jednoduché mutt začal stěžovat na špatné certifikátu při pokusu o použití msmpt, nechvalně známý Hasičské msmtp: TLS ověření certifikátu selhal:. Certifikát nemá známého vydavatele " přivítal mě na obrazovce.

Přejít potvrzení -
Stačí spustit po

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

Na místě staré Thwate serveru se dostanete po emitenta v segmentu
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US

Naštěstí oprava je jednoduchá, tady je to, co musíte udělat na debian

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

Po tomto stačí změnit následující řádky ve 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

Slučování hashe v YAML conf soubory

31.července 2009 od Prashant · Komentáře
Soubor pod: technologie

YAML je velmi užitečná pro psaní konfiguračních souborů. Hlavní výhodou je to, že se čte jako textový soubor. To funguje opravdu dobře, pokud váš konfigurační soubor je plochá (bez hierarchie) a nemá žádné opakování.
Pokud váš soubor obsahuje opakování konfigurace, pak má smysl oddělit tyto prvky a je znovu použít. Co chci říct je to - řekněme, že jste si konfigurační soubor vypadá takto:

  vývoj:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: větev Váš_server
     Login: your_login
     heslo: top_secret
 produkce:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: větev Váš_server
     Login: your_login
     heslo: top_secret 

Za předpokladu, že výše uvedený kód do / tmp / test.yml zde je, jak si můžete přečíst v Python a Ruby
$cat readyml.py

 #! / Usr / bin / env python
 od dovozního pprint pprint jako pb
 # V Debianu je třeba nainstalovat python-YAML
 YAML z dovozu zatížení, load_all výklopné
 hash = zatížení (open ("/ tmp / test.yml '))
 pp (hash ['vývoj']) 


$ cat readyml.rb

  #! / Usr / bin / env ruby
 vyžadují "PP"
 hash = YAML :: load (File.open ("/ tmp / test.yml"). číst)
 pb hash ['vývoj'] 

tady je praktickým vložka verze ruby
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' , nebo si můžete zkusit totéž v IRB nebo python konzole.

Všimněte si, že ve výše uvedeném kódu, všechno je jiné, než výstup poloha je stejná ve vývoji a výrobě části. To je místo, kde yml uzel identifikátor přijde zachránit. Myšlenka je jednoduchá mít sadu výchozích hodnot a přepsat je na jiném místě.
Dalo by se vytáhněte ji od sebe takto:

  výchozí: výchozí nastavení a
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: odesílatel
     smtp_server: větev Váš_server
     Login: your_login
     heslo: top_secret
 vývoj:
   << * Výchozí
 produkce:
   << * Výchozí
   output_location: prod_location 


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

Skvělé, to funguje (tm)!.
Pravděpodobně se obchoduje nějakou přehlednost pro trochu magie. Zde je malé vysvětlení: a * a <<: a který je kotva tag lze chápat jako identifikátor uzlu, uzel * je referenční a <<: kandiduje na hash sloučení.

Pro více informací viz buď YAML specifikace nebo Wikipedie
Zatím je to dobré, ale je tu jeden háček, tyto mřížky se spojí nejsou rekurzivní. Co to znamená toto: řekněme, že chcete mít jiné jméno odesílatele pro poštu ve dvou prostředích, můžete být v pokušení udělat následující:

  výchozí: výchozí nastavení a
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: odesílatel
     smtp_server: větev Váš_server
     Login: your_login
     heslo: top_secret
 vývoj:
   << * Výchozí
   mail:
     SENDER_NAME: sender_dev
 produkce:
   << * Výchozí
   output_location: prod_location
   mail:
     SENDER_NAME: sender_prod 

Umožňuje kontrolovat

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

Jejda, něco se pokazilo, problém jak je uvedeno výše, je, že hash sloučení není rekurzivní a zatímco slučování nahradil mailu selhání poštou produkce, které má jen jeden klíč. Řešení / práce kolem je rozvinout ještě jednu úroveň:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: & mail_defaults
  SENDER_NAME: odesílatel
   smtp_server: větev Váš_server
   Login: your_login
   heslo: top_secret

 výchozí: výchozí nastavení a
   << * Common_settings
   mail:
     << * Mail_defaults
 vývoj:
   << * Výchozí
 produkce:
   << * Výchozí
   mail:
     << * Mail_defaults
     SENDER_NAME: sender_prod

Umožňuje kontrolovat znovu

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

Věděli jste, že máte ještě jednu úroveň vnoření, tak můžete určitě rozbalí jeden stupeň, ale pak se to stane nepořádek. Takže, pokud nejste se snaží psát řešení věže v Hanoji v conf souboru, je lepší restucture conf souboru, než kopat do YAML nebo něco jiného. Ale to je na vás tak jako tak.

Trochu pláště přesměrování

Zde je, jak jsme normálně dělat shell přesměrování
$ ./pgm.sh args >out.txt 2>err.txt
Chtěl jsem to trochu změnit a spustit takto
$ ./pgm.sh args
s požadavkem, aby výkon a chyba by měla jít do nějakého souboru, počítané v pgm.sh založené na přepínači. Jeden ilustrativní případ, kdy by mohlo být datum je součástí ARGUMENTY. Takže byste chtěli jít na stdout říct / your / adresář / pgm_out_YYYYMMDD.txt 1

Problém se standardním způsobem přesměrovat N>file.txt tj. sdružující deskriptoru souboru soubor.txt na N, je, že funguje pouze pro nově vidlicový procesu, a ne pro aktuální proces.
tak
$ echo hi 1>out.txt ; echo hii . pošle ahoj out.txt ale bude tisknout hii na stdout 2

To je místo, kde exec přichází na záchranu. Přidáme-li exec 1>somefile.txt pak výstup ze zbytku skriptu půjde na somefile.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh přesměruje hi stejně jako hii se out.txt

Podobně jako přesměrování stdout i stderr uděláme něco takového
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

Nyní se vrací na původní místo přesměrování na nějaký soubor z vnitřní strany nádrže, řekněme Program počítá název souboru v nějaké proměnné outfile, mohli jsme právě udělal exec 1>$OUTFILE

, Který řeší aktuální problém. Ale můžete chtít projít následujícím příkladu, který dosahuje "Random přístupu" souboru ve skriptu shellu. Příklad je z zde
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 připomínkami, tento kód je samozřejmý.
-
1 To může také být děláno $ ./pgm.sh args >pgm_out`date +%Y%m%d` , ale nápad je vytvářet tento soubor název založený na nějakou logiku v samotném programu.
2 1 v 1> out.txt je nadbytečná, ale vyjasňuje, že se zde přesměrování fd 1

Chcete-li změnit velikost nebo měřítko

Zatímco mluví o horizontální dělení databází, DHH ze ROR slávy naznačuje, že škálování věci může počkat, rozhodně počkat až do okamžiku vaše obchodní potřeby vyžadovat. Jeho článek rozhodně smysl pro malé setupy říct startech. Nechci říct, že v začínajících byste měli napsat demo programy, ale vzhledem k tomu, že existuje pouze 24 hodin v den, kdy by se měla zaměřit na poskytování služeb říct 1000 uživatelů ve více naplňující způsobem, než ztratí váš spánek více než starosti o tom, jak bude moje žádost zvládnout zátěž 13.142 milionů uživatelů. Pokud se vám tyto mnoho uživatelů, budete vědět, jak změnit velikost. U začínajících škálovatelnost je dobré problém k řešení, ale mnohem lepší mít problém, mám na mysli jakékoliv spuštění rád bych narazíte na tento problém!

V dalším souvisejícím článku Jeremy Zawodny píše, neměli byste záviset na pana Moora, pokud máte problémy se škálovatelností.

Protože tyto články vztahují na Moorův zákon Nemohu si pomoci, ale napsat, že Moorův zákon musí být jedním z nejvíce všeobecného práva v informatice. Z jeho původním předpokladům o hustoty tranzistorů, je tento zákon nyní citovaná všude narazíte na exponenciální růst.