Sondaż, ping, PubSub, pubsubhub, pubsubhubbub
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
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
# Includeint 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
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
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
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
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
$. / Test.sh przekieruje hi jak hii do out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
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
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.



































