poll, ping, pubsub, pubsubhub, pubsubhubbub
Sa kaso ikaw ay may pag-aalinlangan, may ay isang paraan sa kabaliwan sa itaas, sa pamagat ng post. Ang Sa tech bilog, ito ay malamang na hindi mo pa narinig ng pubsubhubbub. Sa mabilis na ilang mga buwan, ito ay naging isa ng ang tatlong nangungunang talked tungkol sa mga bagay-bagay. Iba pang dalawang pagiging homomorphic encryption at Google alon [ 1 ]. Babalik sa kasalukuyang post - mga tuntunin sa pamagat ay nagpapahiwatig kung paano mo makuha ang mga nilalaman mula sa iba pang mga tao. Pagsunod sa mga detalye maging mas malinaw, kung isipin mo ang mga bagay na nangyayari na may paggalang sa blog, kahit na sila ay conceptually hindi limitado sa mga blog.
Botohan ay tumutukoy sa sitwasyon na kung saan ang mga kliyente ay panatilihing humihingi ng server kung may bagong ay dumating up. Gaano kadalas na magtanong para sa mga update ay palaging isang problema sa botohan masyadong madalas o masyadong madalang, ngunit bilang isang reader itinuturo dito na ang isang mahusay na, bagay sa botohan na server ay hindi upang mapanatili ang estado.
Ping ay tumutukoy sa mga kaso na kung saan kapag mag-post ng isang artikulo, ikaw (o ang iyong software) update din ng ilang mga tanyag na (gitnang) na mga serbisyo ng update. Ilang background dito .
Susunod ay pubsub na ang ibig sabihin para i-publish / mag-subscribe, isa ng pinakamaagang sukdulang para sa ito ginawa dito sa pamamagitan ng Evan Henshaw-Plath at Kellan Elliott-McCrea (72 slide ngunit nagkakahalaga ng pagpunta sa pamamagitan ng). Nakahihimok halimbawa na sila nagbigay laban ay ito - sa isang partikular na petsa, Friendfeed crawl Flickr 2,9 milyong beses upang makuha ang pinakabagong mga larawan ng 45,754 mga gumagamit, kung saan 6721 ay binisita Flickr sa mga 24 oras at sana 'potensyal na' upload photo. Tandaan na kung ano ang kanilang iminungkahi ay hindi isang bagong teknolohiya, bilang ituro nila 'rebolusyonaryo bagong 20 taong gulang na teknolohiya. Kung gagawin mo ito para sa mga blog at pagkatapos ay ang isa sa mga pangunahing problema sa xmpp - presence mga overhead data, na maaaring bilang mataas na bilang 60-70% ay maaaring mabawasan ng maraming.
ibig sabihin ng pubsubhub para i-publish ang subscribe hub at pubsubhubbub ay isang protocol, ang core ng kung saan ay ideya ng pubsubhub. Kung saan publisher (sabihin blogger) na i-update ang hub kung saan (maaaring higit pa sa isang hubs, na makipag-usap sa bawat isa) namamalagi 'saanman sa ulap', tulad ng bawat protocol na ito ay maaaring itulak o hilahin ang bilang sa bawat ang protocol ngunit ang susunod na link sa kadena, hub sa client (sabihin ang mga mambabasa) ay palaging na ito ay itulak modelo. ang pahinang ito ay mahusay na panimulang punto para sa pubsubhubbub, pangkalahatang-ideya ng mga slide ay mahusay. Ang kailanman malinaw Anil Dash naglalarawan dito bilang pindutan web.
Dalawang iba pang kaugnay na bumabasa ng webhooks na talaga http callbacks. Github gumagamit ng ito, kaya ang PayPal para sa mga mga asynchronous abiso ng pagbabayad sa ipn . Kaya marami pang iba. Mga kaugnay na konsepto ay rsscloud na muli pubsub hub. Sundin ang link na ito para sa mga detalye.
Maaari mong wondering kung ano ang punto ng pagsulat sa lahat ng mga dito, may dalawang 1. Mga bagay na ito ay nagkakahalaga ng alam, minimally sa hindi bababa sa at 2. Ang blog na ito ay pubsubhubbub pinagana ngayon sa pamamagitan ng appspot hub gamit ang WordPress plugin na ito at feed masyadong pubsubhubbub na pinagana sa pamamagitan ng FeedBurner, link dito
-
[ 1 ]. - Magandang pambungad na basahin para sa ganap na homomorphic encryption ay ang artikulong ito sa pamamagitan ng Bruce Schneier at talk na ito ay higit pa o mas mababa lamang ang pinagmulan para sa Google alon.
-Update - ito post na nagpapaliwanag kung paano ang mga kinakailangan ng pampublikong server para sa callback ay maaaring nagtrabaho sa paligid para sa mga desktop kliyente sa pamamagitan ng paggamit ng xmpp gateway (para pubsubhubbub).
A bit ng pagpupulong
Pagkatapos ng pagbabasa ng artikulong ito tungkol sa lock libreng buffers at makita ang paggamit ng Cas (ihambing at magpalitan), ako nadama tulad ng pag-post ng pagpupulong code upang gawin ang parehong. Gamitin ang kaso sa nagkaroon na magsulat ng isang katutubong paraan at tawagan ang mga ito mula sa Java (pabalik sa 1.5, kapag kasabay data na istraktura sa Java ay higit pa o mas mababa hindi umiiral). Nang walang karagdagang linggal, kukunin ko na mapalabas ang code papunta sa iyo
. Ang una ay para sa Cas at pangalawa ay para sa computing GCD gamit Euclid ng algorithm (isa na ito ay matatagpuan sa maraming lugar at mga tutorial pati na rin).
Itala at patakbuhin ang tagubilin gcc file_name.c ; ./a.out
Ihambing at magpalitan
# Include# Include / / Palitan - newvalue, comperand lumang / inaasahang halaga / * * Ang function na talaga ang mga sumusunod na bagay - kung ang halaga sa * Dest ay katumbas sa oldvalue ang pagkatapos ay palitan ito sa pamamagitan ng newvalue ibang iwanan ito hindi nagbabago: ang lahat ng mga atomically * * Mayroong dalawang mga pagpipilian para sa halaga ng pagbabalik * 1.is paunang halaga ng * Dest at iwanan ang pasanin ng pagtawag fxn upang ihambing ang mga ito sa oldval * 2. gawin ito sa dito at bumalik ng 0 o 1, ito ay dapat na maging mas episyente ** / / * Mamaya baguhin ang mga ito sa macro * / int Cas (int * Dest, ang int oldvalue, int newvalue) { printf ("(% d,% d,% d)", ang * Dest, oldvalue, newvalue); / * Int Cas (ang int Dest, int oldvalue, ang int newvalue) {* / / * Int Cas (ang int Dest, int newvalue, ang int oldvalue) {* / int resulta = 1 ;/ * 1 nagpapakita na ang Cas nagtagumpay at 0 mga palabas na ito nabigo * / / * Btw kailangan upang itakda ang cc para sa bandila clobbering! * / __asm__ na __ volatile__ ( Sa "movl% 2,%% eax \ n \ t" "Movl% 3,%% ebx \ n \ t" Sa "movl% 0,%% ecx \ n \ t" "Lock \ n \ t" "CMPXCHG%% ebx, (%% ecx) \ n \ t" / * ay dapat i-lock sa parehong linya * / "Jz DONE \ n \ t" "Movl $ 0,% 1 \ n \ t" "DONE: \ n \ t" : "= M" (Dest), "= g" (resulta) : "G" (oldvalue), "g" (newvalue), "m" (Dest) : "% Eax", "% ebx", "ecx", "cc" ); printf ("(% d,% d,% d)", ang * Dest, oldvalue, newvalue); bumalik resulta; } / * TODO * Magsulat ng isa pang asm fxn kung saan naglalagay sa itaas fxn sa isang habang loop at panatilihing sinusubukan maliban kung ito succeeds * / int pangunahing () { int a = 5, b = 6; int * c = (int *) malloc (sizeof ang (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 ("pagbabago ng halaga ng * c sa% 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, a, b)); printf ("% d \ n", Cas (c, b, a)); bumalik 0; }
Tala ng format - tila wp syntax highlighter ay pagdaragdag sa katapusan, huwag pansinin na.
GCD
# Includesa int gcd (int a, int b) { int resulta; / * Compute pinakamalaking Karaniwang na panghati gamit Euclid ng algorithm * / __asm__ __ volatile__ (sa "movl% 1,%% eax;" Sa "movl% 2,%% ebx;" "CONTD: cmpl $ 0,%% ebx;" "Je DONE;" Ang "xorl%% edx,%% edx;" Sa "idivl%% ebx;" Ang "movl%% ebx,%% eax;" Ang "movl%% edx, ebx ng%%;" "Jmp CONTD;" "DONE: movl%% eax,% 0;": "= g" (resulta): "g" (a), "g" (b) ); bumalik resulta; } int pangunahing () { int una, pangalawa; printf ("Ipasok ang dalawang integers:"); scanf ("% d% d", & unang, at segundo); printf ("GCD ng% d at% d ay% d \ n", una, pangalawa, gcd (una, ikalawa)); bumalik 0; }
mapula isa liners upang lumikha ng hash
Kahapon habang pagpunta sa pamamagitan ng isa sa aking mga lumang programa, natagpuan ko ang isinulat ko minsan likod:
#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
Upang patayin ang ilang ng pananabik hayaan mo akong ibunyag na raw_text Mukhang
, Karapatan ito ay kunin mula sa PayPal pagbabayad pagkilala.
Itaas linya kung nasira sa bahagi bumabasa ng mas mahusay na:
unescaped_array = CGI.unescape (raw_text). split ('&') unescaped_array = unescaped_array.collect {| x | b = x.split ("="); b.push (kawalan) kung sa b.size == 1; b} flattened_array = unescaped_array.flatten hash = Hash [* flattened_array ang]
Hayaan ng mga indibidwal na mga hakbang sa irb:
irb (main): 009:0> unescaped_array = CGI.unescape (raw_text) split ('&') => ["Tagumpay", "mc_gross = 10.00", "protection_eligibility = hindi karapat-dapat", "payer_id = U7PPJJ4TSJ47E", "buwis = 0.00", "payment_date = 09:45:30 Jul 10, 2009 PDT", "payment_status = Nakabinbin "] irb (main): 013:0> unescaped_array = unescaped_array.map {| x | b = x.split ("="); b.push (kawalan) kung sa b.size == 1; b} => [["Tagumpay", wala], [sa "mc_gross", "10.00"], ["protection_eligibility", "hindi karapat-dapat"], ["payer_id", "U7PPJJ4TSJ47E"], ["buwis", "0.00"] , ["payment_date ang", "09:45:30 Jul 10, 2009 PDT"], [ang "payment_status", "Pending"]] irb (main): 014:0> flattened_array = unescaped_array.flatten => ["Tagumpay", wala, "mc_gross", "10.00", "protection_eligibility", "hindi karapat-dapat", "payer_id", "U7PPJJ4TSJ47E", "buwis", "0.00", "payment_date", "09:45: 30 Jul 10, 2009 PDT ", ang" payment_status "," Pending "] irb (main): 015:0> hash = Hash [* flattened_array ang] => {"Buwis" => "0.00", "payment_status" => "Pending", "payer_id" => "U7PPJJ4TSJ47E", sa "mc_gross" => "10.00", "Tagumpay" => wala, "payment_date" = > "09:45:30 Jul 10, 2009 PDT", "protection_eligibility" => "hindi karapat-dapat"}
BTW, * ay tinatawag na splat operator sa rubi
Ang isa pang paraan upang lumikha ng hash mula sa 'array ng pares' ay upang gamitin magpaturok:
hash = [[1,2], [3,4]]-paturukan ({}). {| resulta, elemento | resulta [element.first] = resulta [element.last]; resulta} May isa pang paraan
Magsulat ng isang loop, na kukunin ko na umalis bilang isang ehersisyo sa mga mambabasa!!
Narito ang isang bit hindi kaugnay na kaso ng paggamit ng paglikha ng hash mula sa arrays:
irb (main): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.? : Mas mababang :: mas} => {: Mas mababang => [1, 2, 3, 4],: mas => [7, 9]}
Maaari mong gawin ang higit pang mga bagay, talaga ang resulta ng ang block ay ginagamit bilang ang key para sa na sangkap sa mga nagresultang hash.
gmail, ulol at msmtp na pag-aayos
Kung gumagamit ka ng ulol at ang SMTP upang ma-access ang gmail. Narito ang isang (masamang) balita. Cool guys sa Google muli nagbago sertipiko. Oh, ay mong tanungin kung paano ko ito malalaman ang mga ito? Simple ulol na nagsimula nagrereklamo tungkol sa masamang sertipiko kapag sinusubukang gamitin ang msmpt, nakahihiya 'msmtp: TLS sertipiko Nabigo ang pagpapatunay: ang sertipiko ay hindi nakuha ng isang kilalang issuer' greeted ako sa screen.
Upang tumawid kumpirmahin -
Lamang patakbuhin ang mga sumusunod na
$ msmtp --serverinfo --host=smtp.gmail.com --tls=on --port=587 --tls-certcheck=off
Sa lugar ng lumang Thwate Server ngayon ka sumusunod sa issuer segment
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US
Kabutihang palad pag-aayos ay simple, dito ay kung ano ang kailangan mong gawin sa Debian
# apt-get install ca-certificates
# dpkg -s ca-certificates|grep Version
Version: 20090814
Matapos ito lamang baguhin ang sumusunod na linya sa ~~~V mo /. 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
sa
tls_trust_file /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt
Pinagsasama hashes sa yaml file Conf
YAML ay lubos na madaling gamitin para sa pagsulat ng mga file ng configuration. Ang pangunahing bentahe ay na, ito bumabasa tulad ng text file. Talaga ito gumagana rin kung ang iyong config file ay flat (walang hierarchy) at may walang repetitions.
Kung ang iyong configuration file ay mga repetitions pagkatapos ito ang akma upang paghiwalayin ang mga elemento at muling gamitin ang mga ito. Ano ang ibig sabihin ko ay ito - sabihin natin mo ang iyong config file ay ganito ang hitsura:
pag-unlad: input_location: common_input output_location: dev_location mail: smtp_server: your_server login: your_login password: top_secret produksyon: input_location: common_input output_location: dev_location mail: smtp_server: your_server login: your_login password: top_secret
Ipagpalagay itaas code sa / tmp / test.yml na dito ay kung paano maaari mong basahin sa python at mapula
$cat readyml.py
#! / Usr / bin / env sawa mula sa ng pprint import pprint ng pp # Sa Debian kailangan i-install ang python-yaml Sa mula yaml import ng pagkarga, dump load_all, hash = load (bukas ('/ tmp / test.yml na')) pp (hash ['pagbuo'])
$ cat readyml.rb
#! / Usr / bin / env rubi nangangailangan ng 'pp' hash = YAML :: load (File.open ('/ tmp / test.yml na'). basahin) pp hash ['pagbuo']
dito ay isang madaling isa liner para sa rubi bersyon
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' o maaari mong subukan ang parehong sa irb o python console.
Tandaan na sa itaas na snippet ng code, ang lahat ay iba na output lokasyon ay parehong sa bahagi ng pag-unlad at produksyon. Ito ay kung saan yml node identifier pagdating sa iligtas. Ang ideya ay simpleng magkaroon ng isang hanay ng mga halaga ng default at sapawan ang mga ito sa ibang lugar.
Maaari mong hilahin hatiin ito bilang mga sumusunod:
default: & default input_location: common_input output_location: dev_location mail: SENDER_NAME: nagpadala smtp_server: your_server login: your_login password: top_secret pag-unlad: <<: * Default produksyon: <<: * Default output_location: prod_location
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Mahusay, ito gumagana (tm)!.
Arguably namin traded ilang kalinawan para sa isang bit ng magic. Narito ang isang maliit na paliwanag: &, * at <<: & na ang tag ng anchor ay maaaring maunawaan bilang node identifier, * ay node reference at <<: ibig sabihin para sa hash sumanib.
Para sa karagdagang detalye makita alinman yaml na panoorin o Wikipedia
Sa ngayon kaya magandang ngunit may catch dito, ang mga hash mga merges ay hindi recursive. Ano ang ibig sabihin nito ay ito: sabihin natin na nais mong magkaroon ng iba't ibang pangalan ng nagpadala para sa mail sa dalawang kapaligiran, maaaring tempted upang gawin ang mga sumusunod:
default: & default input_location: common_input output_location: dev_location mail: SENDER_NAME: nagpadala smtp_server: your_server login: your_login password: top_secret pag-unlad: <<: * Default mail: SENDER_NAME: sender_dev produksyon: <<: * Default output_location: prod_location mail: SENDER_NAME: sender_prod
Hinahayaan suriin
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$
Oops, isang bagay nagpunta mali, ang problema gaya ng nabanggit sa itaas ay na ang hash sumanib ay hindi recursive at habang pinagsasama ang pinalitan ito ang mail ng default sa pamamagitan ng koreo ng produksyon na kung saan ay may isa sa key lamang. Solusyon / trabaho sa paligid ay sa magkadkad isa pang antas:
common_settings: & common_settings input_location: common_input output_location: dev_location mail_defaults: & mail_defaults SENDER_NAME: nagpadala smtp_server: your_server login: your_login password: top_secret default: & default <<: * Common_settings mail: <<: * Mail_defaults pag-unlad: <<: * Default produksyon: <<: * Default mail: <<: * Mail_defaults SENDER_NAME: sender_prod
Hinahayaan muling suriin
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Ang sinabi mo mayroon kang isa pang antas ng nesting, well maaari mong tiyak magkadkad isa pang antas, ngunit pagkatapos ay ito ay nagiging isang gulo. Kaya, kung hindi sinusubukan mong isulat ang solusyon sa tower ng Hanoi sa isang Conf file, ito ay mas mahusay sa restucture Conf file sa paghuhukay sa yaml o iba pa. Ngunit na ay pa rin ang iyong tawag.
Ang isang piraso ng shell pag-redirect
Narito ang kung paano namin normal na gawin shell pag-redirect
$ ./pgm.sh args >out.txt 2>err.txt
Nais kong baguhin ito ng kaunti at tumakbo tulad ng mga sumusunod
$ ./pgm.sh args
sa mga kinakailangan na output at error ay dapat pumunta sa ilang mga filename nakalkula sa loob pgm.sh base sa args. Isa nakapagpapaliwanag kaso ay maaaring kapag petsa ay bahagi ng args. Kaya nais mong stdout pumunta sa sinasabi / ng iyong / directory / pgm_out_YYYYMMDD.txt 1
Ang problema sa karaniwang paraan ng pag-redirect ng N>file.txt yan, associating file descriptor N sa file.txt, ay na ito ay gumagana lamang para sa mga bagong bika proseso at hindi para sa kasalukuyang proseso.
kaya
$ echo hi 1>out.txt ; echo hii ay magpapadala hi sa out.txt ngunit-print ang hii sa stdout 2
Ito ay kung saan exec pagdating sa aming iligtas. Kung namin magdagdag ng exec 1>somefile.txt pagkatapos ay ang output mula sa mga natitirang ang script ay pumunta sa somefile.txt
$. / Test.sh ay redirect hi pati na rin bilang hii sa out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
Katulad sa redirect stdout pati na rin stderr kami gawin ang isang bagay tulad nito
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
Ngayon darating na bumalik sa orihinal na punto ng pag-redirect sa ilang mga file mula sa loob ng shell, sabihin nating programa nakalkula ang filename sa ilang mga variable OUTFILE, maaari lamang namin gawin exec 1>$OUTFILE
Na solves ang kasalukuyang problema. Ngunit maaari mo bang pumunta sa pamamagitan ng sumusunod na halimbawa na achieves 'random access' ng file sa shell script. Halimbawa ay mula dito
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
Na may mga komento, ang code na ito ay nagpapaliwanag sa sarili.
-
1 maaari din ito gawin sa pamamagitan ng $ ./pgm.sh args >pgm_out`date +%Y%m%d` ngunit ideya ay upang bumuo ng pangalan ng file na ito batay sa ilang mga lohika sa programa mismo.
2 1 sa 1> out.txt ay maulit ngunit ito clarifies dito na kami ay nagre-redirect ng fd 1
Upang masukat o hindi masukat
Habang ang pakikipag-usap tungkol sa pahalang partitioning ng database, DHH ng ROR laurel ay nagmumungkahi na ang scaling bagay-bagay ay maaaring maghintay, tiyak na maghintay hanggang sa punto na ang iyong negosyo pangangailangan na nangangailangan ito. Ang kanyang mga artikulo tiyak ang akma para sa mga maliit na setup sabihin startup. Hindi sa sabihin na sa startup dapat mong sumulat ng mga programa demo ngunit ibinigay na may lamang 24 na oras sa isang araw na dapat mong ituon sa paghahatid sabihin ng 1000 mga gumagamit sa higit pang tuparin paraan kaysa sa mawala ang iyong pagtulog sa paglipas ng worrying tungkol sa kung paano ang aking application pangasiwaan load ng 13,142 milyong gumagamit. Kung makakakuha ka ng mga maraming mga gumagamit na iyon ay alam mo kung paano upang masukat. Para sa startup kakayahang sumukat ay isang mahusay na problema sa malutas ngunit isang mas mabuti problema upang magkaroon, sabihin ko ang startup anumang ay ibigin sa tumakbo sa problemang ito!
Sa isa pang kaugnay na artikulo ang Jeremy Zawodny writes hindi ka dapat depende sa Ginoong Moore kung mayroon kang problema kakayahang sumukat.
Dahil ang mga artikulo na ito sumangguni sa batas Moore ay hindi ko maaaring makatulong ngunit sumulat na Moore ng batas ay dapat isa ng pinaka-heneralisado batas sa Computer Science. Mula sa kanyang orihinal na hula tungkol sa transistor densidad, ang batas na ito ay ngayon Binanggit kahit saan dumating ka sa buong pagpaparami paglago.



































