Sondaż, ping, PubSub, pubsubhub, pubsubhubbub

06 września 2009 przez Prashant · Komentarze
Opublikowane jako: technologii

W przypadku, gdy są sceptyczni, istnieje metoda w tym szaleństwie powyżej, w tytule postu. W nowoczesnych środowisk jest mało prawdopodobne, że nie słyszał o pubsubhubbub. Na szybko kilka miesięcy, to był jeden z trzech największych mówił o rzeczy. Inne dwa bycia homomorphic szyfrowanie i Google wave [ 1. ]. Wracając do obecnego postu - warunki zawarte w tytule wskazuje, w jaki sposób można uzyskać zawartość od innych ludzi. Następujące szczegóły stają się bardziej jasne, czy możesz sobie wyobrazić co dzieje się w odniesieniu do blogów, nawet jeśli nie są one koncepcyjnie ograniczony do blogów.

Polling odnosi się do sytuacji, w której klienci pytają serwer czy coś nowego wymyślił. Jak często prosić o aktualizacjach zawsze będzie problem z odpytywania zbyt częste lub zbyt rzadkie, ale jako jeden czytelnik zwrócił uwagę tutaj , że jeden wielki, co z odpytywania jest to, że serwer nie ma do utrzymania stanu.

Ping odnosi się do przypadku, kiedy pisać artykuł, użytkownik (lub oprogramowanie), jak również aktualizuje niektórych popularnych (centralne) Update Services. Niektóre tła tutaj .

Dalej jest PubSub co oznacza Publish / Subscribe, jednego z najstarszych boisku bo został tu przez Evan Henshaw-Plath i Kellan Elliott-McCrea (72 slajdów, ale warto przechodzące). Przekonujące przykład dali przeciw było to - w określonym dniu, FriendFeed czołgał Flickr 2,9 mln razy, aby uzyskać najnowsze zdjęcia 45,754 użytkowników, z których 6.721 odwiedził Flickr w tych 24 godzinach i mógł "potencjalnie" przesłane zdjęcie. Zauważ, że to, co proponuje nie nowa technologia, jak zwracają uwagę 'rewolucyjny nowy 20 lat technologii ". Jeśli robisz to dla blogów następnie jeden z głównych problemów z XMPP - obecność dane napowietrznych, które mogą sięgać nawet 60-70 procent można zredukować wiele.

pubsubhub oznacza publikować piastę subscribe i pubsubhubbub jest protokół, rdzeń, który jest idea pubsubhub. Przy czym wydawców (powiedzmy blogerów) aktualizować koncentrator, który (może być więcej niż jeden piasty, co mówią do siebie) znajduje się "gdzieś w chmury", jak w protokole tym można pchać lub ciągnąć zgodnie z protokołem, ale następnym ogniwem w łańcuch, piasty do klienta (powiedzmy czytelnikom) jest zawsze naciskać modelu. Ta strona jest dobrym punktem wyjścia dla pubsubhubbub, zjeżdżalnie Przegląd są dobre. Anil Dash kiedykolwiek wymowny opisuje go tutaj jako przyciskowym internecie.
Dwa inne związane odsłon są webhooks które jest w zasadzie http callbacks. Github wykorzystuje go, więc nie paypal dla asynchronicznych powiadomień o płatność w IPN . Tak samo wiele innych. Podobne pojęcie jest rsscloud który jest ponownie PubSub Piasta. Śledź ten związek o szczegóły.

Można się zastanawiać, jaki jest sens pisać wszystko to tutaj znajdują się dwa 1. Te rzeczy są warte poznania, w minimalnym stopniu co najmniej i 2. Ten blog jest pubsubhubbub włączony teraz przez centrum appspot przy użyciu tego wordpress wtyczki i paszy też jest pubsubhubbub włączony przez FeedBurner, link tutaj
-
[ 1 ]. - Dobry wprowadzające czytać do szyfrowania w pełni homomorphic jest to artykuł przez Bruce Schneier i ta rozmowa jest mniej lub bardziej jedynym źródłem fali Google.

-UPDATE - To po wyjaśnia wymóg publicznego serwera dla wywołania zwrotnego można obejść, dla desktopowych klientów za pomocą xmpp bramki (dla pubsubhubbub).

Trochę montażu

29 sierpnia 2009 przez Prashant · Komentarze
Opublikowane jako: technologii

Po przeczytaniu tego artykułu o Lock Free buforów i widząc wykorzystanie CAS (porównania i wymiany), czułem się jak zamieszczenie kodu assemblera zrobić to samo. Użyj przypadek tam było napisanie natywnej metody i wywołać ją z powrotem w Java (1.5, kiedy równoległe struktury danych w Javie były mniej lub bardziej nie istnieje). Bez zbędnych ceregieli, będę uwolnić kod na Ciebie :) . Pierwszy z nich to CAS i drugie jest dla komputerów GCD za pomocą algorytmu Euklidesa (ten można znaleźć w wielu miejscach i tutoriali jak również).

Skompilować i uruchomić instrukcje gcc file_name.c ; ./a.out

Porównaj i Zamień

   # Include 
  # Include 
 / / Wymiany - nowa_wartość, comperand jest stary / wartość oczekiwana
 / *
  * Funkcja faktycznie robi następującą rzecz - jeżeli wartość do * dest jest równa OldValue następnie zastąpić ją nowa_wartość jeszcze pozostawić bez zmian: czy wszystkie te atomowo
  *
  * Istnieją dwie opcje do wartości zwracanej
  * 1.is wartość początkowa od * dest i pozostawić ciężar fxn wywołującego ją porównać z oldval
  * 2.  zrobić to tu i zwraca 0 lub 1, powinno to być bardziej efektywne
  ** /

 / * Później zmienić go na makro * /
 int CAS (int * dest, int OldValue, int nowa_wartość) {
	 printf ("(% d,% d,% d)", * dest, OldValue, nowa_wartość);
	 / * Int cas (int dest, int OldValue, int nowa_wartość) {* /
	 / * Int cas (int dest, int nowa_wartość, int OldValue) {* /
	 int wynik = 1 ;/ * 1 pokazuje, że cas udało i 0 pokazuje, że nie udało * /
	 / * Btw trzeba ustawić CC flaga przebijania!  * /
	 volatile__ __ __asm__ (
			 "Movl% 2,%% eax \ n \ t"
			 "Movl% 3,%% ebx \ n \ t"
			 "Movl 0%%% ecx \ n \ t"
			 "LOCK \ n \ t"
			 "CmpXchg ebx%%%% (ECX) \ n \ t" / * powinno LOCK być na tej samej linii * /
			 "Jz SPORZĄDZONO \ n \ t"
			 "Movl 0 dolarów,% 1 \ n \ t"
			 "DONE: \ n \ t"
			 : "= M" (przeznaczenie), "= g" (wynik)
			 : "G" (OldValue), "g" (nowa_wartość), "m" (docelowy)
			 : "% Eax", "% ebx", "ecx", "cc"
			 );
	 printf ("(% d,% d,% d)", * dest, OldValue, nowa_wartość);
	 return wynik;
 }

 / * TODO
  * Napisać kolejną asm fxn który stawia przede fxn w pętli i próbować, chyba że uda * /

 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,));
	 printf ("% d \ n", cas (c,,));
	 printf ("% d \ n", cas (c, b, b));
	 * C = 6;
	 / * C = 5, * /
	 printf ("zmienia wartość * c% 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;
 }

Formatowanie zauważa - Wygląda wyróżnienia składni wp jest dodanie w końcu zignorować.

GCD

 # Include 
 int nwd (int a, int b) {
     int wynik;
     / * Oblicz Największy wspólny dzielnik za pomocą algorytmu Euklidesa * /
     volatile__ __ __asm__ ("movl% 1,%% eax;"
                           "Movl% 2,%% ebx;"
                           "Cd: cmpl 0 dolarów,%% ebx;"
                           "Je zrobić;"
                           "Xorl%% edx,%% edx;"
                           "Idivl%% ebx;"
                           "Movl%% ebx,%% eax;"
                           "Movl%% edx, ebx%%;"
                           "Jmp cd.;"
                           "DONE: movl%% eax,% 0,": "= g" (wynik): "g" (), "g" (b)
     );

     return wynik;
 }

 int main () {
     int pierwszy, drugi;
     printf ("Podaj dwie liczby całkowite:");
     scanf ("% d% d", & najpierw & sekund);

     printf ("NWD z% d &% d jest% d \ n", pierwszy, drugi, NWD (pierwsza, druga));

     return 0;
 }

ruby jeden wkładki do tworzenia skrótu

20 sierpnia 2009 przez Prashant · Komentarze
Opublikowane jako: technologii

Wczoraj podczas przechodzenia przez jednego z moich starych programów, znalazłem ten napisany przeze mnie kiedyś z powrotem:

#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

Aby zabić niektóre napięciu pozwól mi ujawnić, że raw_text wygląda

 

, Prawo to zostało wycięte z paypal potwierdzenia płatności.

Powyżej linii jeśli złamany w części brzmi lepiej:

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

Zróbmy poszczególne kroki w IRB:

  irb (main):. 009:0> unescaped_array = CGI.unescape (raw_text) split ('&')    

 => ["SUKCES", "mc_gross = 10,00", "protection_eligibility = niekwalifikowany", "payer_id = U7PPJJ4TSJ47E", "podatek = 0,00", "payment_date = 09:45:30 10 lipca 2009 PDT", "payment_status = oczekiwaniu "]                                                                         

 irb (main): 013:0> unescaped_array = unescaped_array.map {| x | b = x.split ("="); b.push (zero), jeśli b.size == 1, b}  

 => [["SUKCES", nil], ["mc_gross", "10,00"] ["protection_eligibility", "niekwalifikowany"] ["payer_id", "U7PPJJ4TSJ47E"], ["podatek", "0.00"] , ["payment_date", "09:45:30 10 lipca 2009 PDT"] ["payment_status", "W oczekiwaniu"]]                               

 irb (main): 014:0> flattened_array = unescaped_array.flatten     

 => ["SUKCES" zero ", mc_gross", "10,00", "protection_eligibility", "niekwalifikowany", "payer_id", "U7PPJJ4TSJ47E", "podatek", "0,00", "payment_date", "09:45: 30 10 lipca 2009 PDT "," payment_status "," W oczekiwaniu "]
 irb (main): 015:0>
 hash = Hash [* flattened_array]
 => {"Podatek" => "0,00", "payment_status" => "Oczekiwanie", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10,00", "Sukces" => nil "payment_date" = > "09:45:30 10 lipca 2009 PDT", "protection_eligibility" => "niekwalifikowany"} 

BTW, * nazywa się ikona operator w ruby

Innym sposobem tworzenia skrótu od 'tablicy par' jest używać wstrzyknąć:

  hash = [[1,2], [3,4]] wstrzyknąć ({}). {| wynik, element | Wyniki [element.first] = wynik [element.last]; wynik} 

Istnieje jeszcze jeden sposób :) Napisać pętlę, że zostawiam jako ćwiczenie dla czytelników!

Tutaj jest nieco niezwiązane przypadek użycia tworzenia skrótu z tablic:

  irb (main): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.?  : Mniejsze :: większy}

 => {: Mniej => [1, 2, 3, 4]: większy => [7, 9]} 

Możesz zrobić więcej rzeczy, w zasadzie wynikiem bloku jest używany jako klucz do tego elementu do mieszania wynikowego.

gmail, mutt i msmtp fix

17 sierpnia 2009 przez Prashant · Komentarze
Opublikowane jako: technologii

Jeśli korzystasz z mutt i SMTP dostęp do Gmaila. Oto (zła) wiadomość. Fajne chłopaki w Google ponownie zmienił certyfikat. Och, nie pytasz - jak to znamy? Proste mutt zaczęła narzekać na złe świadectwo, gdy próbuje użyć msmpt, Infamous strony 'msmtp: weryfikacja certyfikatu TLS nie powiodło się:. Certyfikat nie ma znanego wystawcy " powitał mnie na ekranie.

Aby przejść potwierdzić -
Wystarczy uruchomić po

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

W miejsce starego serwera Thwate teraz dostaniesz po w segmencie emitenta
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US

Na szczęście jest prosta, oto co trzeba zrobić na Debianie

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

Po prostu zmień następującą linię w tobie ~~~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

do

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

Scalanie hashe w YAML plików conf

31 lipca 2009 przez Prashant · Komentarze
Opublikowane jako: technologii

YAML jest bardzo przydatny do pisania plików konfiguracyjnych. Podstawową zaletą jest to, że czyta się ją jak plik tekstowy. To działa bardzo dobrze, jeśli plik konfiguracyjny jest płaska (bez hierarchii) i nie ma powtórzeń.
Jeśli plik konfiguracji ma powtórzeń to ma sens wyodrębnienie tych elementów i ponowne ich wykorzystanie. Chodzi mi o to - powiedzmy, że twój plik konfiguracyjny wygląda tak:

  rozwój:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: adres_IP_serwera
     login: your_login
     hasło: top_secret
 produkcja:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: adres_IP_serwera
     login: your_login
     hasło: top_secret 

Zakładając powyższy kod w / tmp / test.yml Oto jak można przeczytać w Python i Ruby
$cat readyml.py

 #! / Usr / bin / env python
 z pprint pprint importu jak PP
 # W Debianie trzeba zainstalować python-YAML
 od obciążenia YAML importu, load_all, zrzuć
 hash = obciążenie (open ("/ tmp / test.yml '))
 pp (hash ['rozwój']) 


$ cat readyml.rb

  #! / Usr / bin / env ruby
 wymagają "PP"
 hash = YAML :: load (File.open ("/ tmp / test.yml"). czytać)
 hash pp ['rozwój'] 

tu jest ciekawa liner wersji ruby
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' lub możesz spróbować sam w IRB lub konsoli Pythona.

Zauważ, że w powyższym fragmencie kodu, wszystko jest inne niż miejsce wyjścia jest taki sam w rozwoju, a część produkcji. To gdzie yml identyfikator węzła przychodzi na ratunek. Pomysł jest prosty posiada zbiór wartości domyślnych i zastąpić je w innym miejscu.
Możesz rozebrać się następująco:

  Domyślnie: i domyślnie
   input_location: common_input
   output_location: dev_location
   mail:
     sender_name: nadawca
     smtp_server: adres_IP_serwera
     login: your_login
     hasło: top_secret
 rozwój:
   << Pytanie: * defaults
 produkcja:
   << Pytanie: * defaults
   output_location: prod_location 


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

Świetnie, to działa (tm)!.
Prawdopodobnie mamy notowane na przejrzystości na odrobinę magii. Oto małe wyjaśnienie: &, * i <<: & który jest tag kotwica może być rozumiana jako identyfikator węzła, * jest węzeł odniesienia i <<: oznacza hash korespondencji seryjnej.

Więcej szczegółów można znaleźć zarówno YAML specyfikacje lub Wikipedii
Jak na razie dobrze, ale jest pewien haczyk tutaj te hash łączy nie są rekurencyjne. Co to znaczy jest to, powiedzmy, że chcesz mieć inną nazwę nadawcy poczty w dwóch środowiskach, może ulec pokusie, aby wykonać następujące czynności:

  Domyślnie: i domyślnie
   input_location: common_input
   output_location: dev_location
   mail:
     sender_name: nadawca
     smtp_server: adres_IP_serwera
     login: your_login
     hasło: top_secret
 rozwój:
   << Pytanie: * defaults
   mail:
     sender_name: sender_dev
 produkcja:
   << Pytanie: * defaults
   output_location: prod_location
   mail:
     sender_name: sender_prod 

Pozwala sprawdzić

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

Niestety, coś poszło nie tak, problem jak wspomniano powyżej jest to, że hash merge nie jest rekurencyjne i podczas łączenia go zastąpić pocztę niedotrzymania przez elektroniczną produkcji, która ma tylko jeden klucz. Rozwiązanie / praca wokół jest rozwinąć jeszcze jeden poziom:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: zewnętrzne i mail_defaults
  sender_name: nadawca
   smtp_server: adres_IP_serwera
   login: your_login
   hasło: top_secret

 Domyślnie: i domyślnie
   << Pytanie: * common_settings
   mail:
     << Pytanie: * mail_defaults
 rozwój:
   << Pytanie: * defaults
 produkcja:
   << Pytanie: * defaults
   mail:
     << Pytanie: * mail_defaults
     sender_name: sender_prod

Sprawdźmy jeszcze raz

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

Czy mówisz, że masz jeden więcej poziom zagnieżdżenia, dobrze można z pewnością rozwinąć jeszcze jeden poziom, ale to staje się bałagan. Tak więc, jeśli nie próbujesz napisać rozwiązanie Wieże Hanoi w conf pliku, to lepiej restucture conf plik niż kopanie w YAML lub coś innego. Ale to jest rozmowa tak.

Trochę Przekierowywanie powłoki

10 maja 2009 przez Prashant · Komentarze
Opublikowane jako: technologii

Oto w jaki sposób normalnie zrobić Przekierowywanie powłoki
$ ./pgm.sh args >out.txt 2>err.txt
Chciałem zmodyfikować go trochę i uruchomić w następujący sposób
$ ./pgm.sh args
z wymogiem, że produkcja i błąd powinien udać się do jakiegoś pliku obliczonego wewnątrz pgm.sh na podstawie argumentów. Jeden ilustracyjny sprawa może być, gdy data jest częścią argumentów. Więc chcesz stdout, aby przejść do powiedzenia / twój / katalog / pgm_out_YYYYMMDD.txt 1

Problem z standardowego sposobu przekierowanie N>file.txt tj. kojarzenie pliku o numerze n do plik.txt, że to działa tylko dla procesu nowo odłam, a nie dla bieżącego procesu.
tak
$ echo hi 1>out.txt ; echo hii . wyśle ​​Witam out.txt ale wypisze hii na standardowe wyjście 2

To tam exec przychodzi nam z pomocą. Jeśli dodamy exec 1>somefile.txt a następnie wyjście z resztą skrypt trafi do plik.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh przekieruje hi jak hii do out.txt

Podobnie jak przekierować stdout oraz stderr zrobimy coś takiego
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

Wracając do pierwotnego punktu przekierowanie do jakiegoś pliku od wewnątrz powłoki, powiedzmy Program oblicza nazwę pliku w jakimś zmiennym OUTFILE, moglibyśmy tylko zrobić exec 1>$OUTFILE

To rozwiązuje bieżącego problemu. Ale może chcesz przejść poniższym przykładzie, w którym osiąga 'Losowo dostęp' do pliku w skrypcie powłoki. Przykładem jest od tutaj
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

Z komentarzy, ten kod jest oczywista.
-
1 może być również wykonywane przez $ ./pgm.sh args >pgm_out`date +%Y%m%d` ale pomysł jest do wygenerowania tego nazwę pliku na podstawie jakiejś logiki w samym programie.
2 1 w 1> out.txt jest zbędna, ale wyjaśnia tu, że jesteśmy przekierowanie fd 1

Aby skalować lub nie w skali

11 stycznia 2009 przez Prashant · Komentarze
Opublikowane jako: technologii

Mówiąc o poziomej podział baz danych, DHH z ROR sławy sugeruje, że rzeczy skalowanie może poczekać, na pewno czekać aż do momentu własnymi potrzebami go. Jego artykuł na pewno ma sens dla małych konfiguracje powiedzieć uruchomień. Nie znaczy, że w firmach należy pisać programy demo ale biorąc pod uwagę, że są tylko 24 godzin w ciągu dnia należy skoncentrować się na obsłudze powiedzieć 1000 użytkowników w sposób bardziej spełniającego niż utrata snu w ciągu martwić, jak będzie moja aplikacja obsługuje obciążenie 13.142 mln użytkowników. Jeśli masz te wielu użytkowników będziesz wiedzieć, jak skalować. Na skalowalność firmach jest dobry problem do rozwiązania, ale o wiele lepiej mieć problem, to znaczy każdy startup chcielibyśmy uruchomić do tego problemu!

W innym związane z artykułem Jeremy Zawodny pisze nie powinno zależeć od pana Moore'a, jeśli masz problemy ze skalowalnością.

Ponieważ artykuły te odnoszą się do prawa Moore'a nie mogę pomóc, ale napisać, że prawo Moore'a musi być jeden z najbardziej powszechnego prawa w dziedzinie informatyki. Z jego pierwotnego przewidywania o gęstości tranzystorów, to ustawa jest obecnie cytowane wszędzie można natknąć się wykładniczego wzrostu.