jajak pendapat, ping, pubsub, pubsubhub, PubSubHubbub

September 6, 2009 oleh prashant · Komentar
Filed under: teknologi

Dalam kasus Anda yang skeptis, ada metode dalam kegilaan di atas, dalam judul posting. Dalam lingkungan teknologi tidak mungkin bahwa Anda belum pernah mendengar dari PubSubHubbub. Dalam beberapa bulan cepat, telah menjadi salah satu dari tiga besar berbicara tentang hal. Dua lainnya adalah enkripsi homomorphic dan Google gelombang [ 1. ]. Kembali ke pos saat ini - istilah dalam judul menunjukkan bagaimana Anda mendapatkan isi dari orang lain. Rincian berikut menjadi lebih jelas, jika Anda membayangkan hal yang terjadi sehubungan dengan blog, meskipun mereka secara konseptual tidak terbatas pada blog.

Polling mengacu pada skenario di mana klien terus bertanya server jika sesuatu yang baru telah datang. Seberapa sering meminta update akan selalu menjadi masalah dengan pemungutan suara terlalu sering atau terlalu jarang, tetapi sebagai satu pembaca menunjukkan di sini bahwa salah satu besar, hal dengan pemungutan suara adalah server yang tidak memiliki untuk mempertahankan negara.

Ping mengacu pada kasus dimana ketika memposting suatu artikel, Anda (atau perangkat lunak Anda) juga update beberapa (pusat) layanan populer update. Beberapa latar belakang sini .

Berikutnya adalah pubsub yang merupakan singkatan mempublikasikan / berlangganan, salah satu lapangan awal untuk itu dibuat di sini oleh Evan Henshaw-Plath dan Kellan Elliott-McCrea (72 slide tapi layak akan melalui). Contoh menarik yang mereka berikan terhadap adalah ini - pada tanggal tertentu, Friendfeed merangkak Flickr 2,9 juta kali untuk mendapatkan foto terbaru dari 45.754 pengguna, dimana 6.721 telah mengunjungi Flickr pada mereka 24 jam dan bisa 'berpotensi' upload foto. Perhatikan bahwa apa yang mereka diusulkan adalah bukan teknologi baru, karena mereka menunjukkan 'revolusioner baru 20 tahun teknologi lama'. Jika Anda melakukannya untuk blog maka salah satu masalah utama dengan XMPP - kehadiran Data overhead, yang mungkin setinggi 60-70% dapat dikurangi banyak.

pubsubhub singkatan mempublikasikan hub berlangganan dan PubSubHubbub adalah sebuah protokol, inti dari yang merupakan ide pubsubhub. Penerbit dimana (katakanlah blogger) memperbarui hub yang (mungkin lebih dari satu hub, yang berbicara satu sama lain) berada 'di suatu tempat di awan', sesuai protokol ini dapat mendorong atau menarik sesuai protokol tetapi link berikutnya dalam rantai, hub ke klien (misalnya pembaca) itu selalu mendorong model. Ini halaman adalah baik titik awal untuk PubSubHubbub, slide gambaran yang baik. Pernah fasih Anil Dash menggambarkannya sini sebagai tombol tekan web.
Dua kali dibaca terkait lainnya adalah webhooks yang pada dasarnya callback http. Github menggunakan itu, demikian juga paypal untuk pemberitahuan asynchronous pembayaran di IPN . Begitu banyak lainnya. Konsep terkait rsscloud yang lagi hub pubsub. Ikuti ini link untuk rincian.

Anda mungkin bertanya-tanya apa gunanya menulis semua ini di sini, ada dua 1. Hal-hal ini layak mengetahui, minimal setidaknya dan 2. Blog ini adalah PubSubHubbub diaktifkan sekarang melalui hub appspot menggunakan wordpress Plugin dan pakan juga adalah PubSubHubbub diaktifkan melalui feedburner, link di sini
-
[ 1 ]. - Baik pengantar membaca untuk enkripsi sepenuhnya homomorphic adalah ini artikel oleh Bruce Schneier dan ini bicara kurang lebih satu-satunya sumber untuk gelombang Google.

-UPDATE - Ini posting menjelaskan bagaimana kebutuhan server publik untuk panggilan balik dapat bekerja di sekitar untuk klien desktop dengan menggunakan gateway XMPP (untuk PubSubHubbub).

Sedikit perakitan

29 Agustus 2009 oleh prashant · Komentar
Filed under: teknologi

Setelah membaca ini artikel tentang buffer kunci gratis dan melihat penggunaan CAS (bandingkan dan swap), saya merasa seperti posting kode perakitan untuk melakukan hal yang sama. Gunakan kasus di sana adalah untuk menulis sebuah metode asli dan menyebutnya dari Jawa (pada 1,5, saat bersamaan struktur data di Jawa lebih atau kurang non ada). Tanpa basa-basi, saya akan melepaskan kode ke Anda :) . Pertama adalah untuk CAS dan kedua adalah untuk komputasi GCD menggunakan algoritma Euclid (yang satu ini dapat ditemukan di banyak tempat dan tutorial juga).

Kompilasi dan jalankan instruksi gcc file_name.c ; ./a.out

Bandingkan dan Swap

   # Include 
  # Include 
 / / Tukar - newValue, comperand sudah tua / nilai yang diharapkan
 / *
  * Fungsi sebenarnya melakukan hal yang berikut - jika nilai pada * dest sama dengan oldvalue kemudian menggantinya dengan newValue lain meninggalkannya tidak berubah: apakah semua atom
  *
  * Ada dua pilihan untuk nilai kembali
  * Nilai awal dari 1.is * dest dan meninggalkan beban fxn menelepon untuk membandingkannya dengan oldval
  2.  melakukannya di sini dan kembali 0 atau 1, ini harus lebih efisien
  ** /

 / * Kemudian mengubahnya ke makro * /
 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 menunjukkan bahwa cas berhasil dan 0 menunjukkan bahwa ia gagal * /
	 / * Btw perlu mengatur cc untuk bendera clobbering!  * /
	 __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" / * harus LOCK berada di baris yang sama * /
			 "JZ DIBUAT \ n \ t"
			 "Movl $ 0,% 1 \ n \ t"
			 "DONE: \ n \ t"
			 : "= M" (dest), "= g" (hasil)
			 : "G" (oldvalue), "g" (newValue), "m" (dest)
			 : "% Eax", "% ebx", "ecx", "cc"
			 );
	 printf ("(% d,% d,% d)", * dest, oldvalue, newValue);
	 kembali hasil;
 }

 / * TODO
  * Menulis lain fxn asm yang menempatkan di atas fxn dalam while loop dan terus mencoba kecuali jika berhasil * /

 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, a));
	 printf ("% d \ n", cas (c, a, a));
	 printf ("% d \ n", cas (c, b, b));
	 * C = 6;
	 / * C = 5; * /
	 printf ("nilai perubahan * c ke% d \ n", * c);
	 printf ("% d \ n", cas (c, b, b));
	 printf ("% d \ n", cas (c, b, a));
	 printf ("% d \ n", cas (c, a, a));
	 printf ("% d \ n", cas (c, a, b));
	 printf ("% d \ n", cas (c, b, a));
	 kembali 0;
 }

Format catatan - tampaknya seperti stabilo wp sintaks adalah menambahkan pada akhirnya, mengabaikan itu.

GCD

 # Include 
 int FPB (int a, int b) {
     int hasil;
     / * Hitung Pembagi Bersama Terbesar menggunakan Algoritma Euclid 's * /
     __asm__ __ volatile__ ("movl% 1,% eax%;"
                           "Movl% 2,%% ebx;"
                           "Lanjutan: cmpl $ 0,%% ebx;"
                           "Je DIBUAT;"
                           "% Xorl% edx,% edx%;"
                           "%% Idivl ebx;"
                           "% Movl% ebx,% eax%;"
                           "% Movl% edx,% ebx%;"
                           "Jmp lanjutan;"
                           "DONE:%% movl eax,% 0;": "= g" (hasil): "g" (a), "g" (b)
     );

     kembali hasil;
 }

 int main () {
     int pertama, kedua;
     printf ("Masukkan dua bilangan bulat:");
     scanf ("% d% d", & pertama, & kedua);

     printf ("GCD dari% d &% d adalah% d \ n", pertama, kedua, FPB (pertama, kedua));

     kembali 0;
 }

ruby satu liners untuk membuat hash

20 Agustus 2009 oleh prashant · Komentar
Filed under: teknologi

Kemarin ketika sedang memeriksa salah satu program lama saya, saya menemukan ini ditulis oleh saya kapan kembali:

#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

Untuk membunuh beberapa ketegangan biarkan aku mengungkapkan bahwa raw_text terlihat seperti

 

, Kan sudah dipotong dari pengakuan pembayaran paypal.

Di atas garis jika rusak di bagian membaca lebih baik:

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

Mari kita lakukan langkah-langkah individu dalam irb:

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

 => ["SUKSES", "mc_gross = 10,00", "protection_eligibility = tidak memenuhi syarat", "payer_id = U7PPJJ4TSJ47E", "pajak = 0,00", "payment_date = 09:45:30 Jul 10, 2009 PDT", "payment_status = Pending "]                                                                         

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

 => [["SUKSES", nil], ["mc_gross", "10,00"], ["protection_eligibility", "memenuhi syarat"], ["payer_id", "U7PPJJ4TSJ47E"], ["pajak", "0.00"] , ["payment_date", "09:45:30 Jul 10, 2009 PDT"], ["payment_status", "Pending"]]                               

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

 => ["SUKSES", nihil, "mc_gross", "10,00", "protection_eligibility", "memenuhi syarat", "payer_id", "U7PPJJ4TSJ47E", "pajak", "0.00", "payment_date", "09:45: 30 Jul 10, 2009 PDT "," payment_status "," Pending "]
 irb (main): 015:0>
 hash = Hash [* flattened_array]
 => {"Pajak" => "0.00", "payment_status" => "Pending", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10,00", "SUKSES" => nil, "payment_date" = > "09:45:30 Jul 10, 2009 PDT", "protection_eligibility" => "tidak memenuhi syarat"} 

BTW, * disebut operator yang percikan di ruby

Cara lain untuk membuat hash dari 'array dari pasangan adalah menggunakan inject:

  hash = [[1,2], [3,4]] menyuntikkan ({}). {| hasil, elemen | hasil [element.first] = hasil [element.last], hasilnya} 

Ada satu cara yang lebih :) Menulis satu lingkaran, bahwa Aku akan meninggalkan sebagai latihan bagi para pembaca!

Berikut adalah kasus penggunaan sedikit tidak berhubungan untuk menciptakan hash dari array:

  irb (main): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.  : Lebih kecil lebih besar ::}

 => {: Lebih kecil => [1, 2, 3, 4],: lebih besar => [7, 9]} 

Anda dapat melakukan lebih banyak hal, pada dasarnya hasil dari blok yang digunakan sebagai kunci untuk itu elemen dalam hash yang dihasilkan.

gmail, mutt dan msmtp memperbaiki

17 Agustus 2009 oleh prashant · Komentar
Filed under: teknologi

Jika Anda menggunakan mutt dan smtp untuk mengakses gmail. Berikut ini adalah berita (buruk). Cowok keren di Google kembali berubah sertifikat. Oh, apakah Anda bertanya - bagaimana itu mengetahuinya? Mutt sederhana mulai mengeluh tentang sertifikat yang buruk ketika mencoba menggunakan msmpt, terkenal 'msmtp: verifikasi sertifikat TLS gagal:. Sertifikat belum punya penerbit yang dikenal' menyapa saya di layar.

Untuk lintas mengkonfirmasi -
Jalankan saja mengikuti

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

Di tempat Server Thwate tua sekarang Anda bisa mengikuti segmen penerbit
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US

Untungnya memperbaiki sederhana, di sini adalah apa yang perlu Anda lakukan di debian

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

Setelah ini hanya mengubah baris berikut dalam Anda ~ /. 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

untuk

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

Penggabungan hash dalam file conf YAML

31 Juli 2009 oleh prashant · Komentar
Filed under: teknologi

YAML adalah sangat berguna untuk menulis file konfigurasi. Keuntungan utama adalah bahwa, dibaca seperti file teks. Ini bekerja sangat baik jika file konfigurasi Anda adalah datar (hirarki tidak) dan tidak memiliki pengulangan.
Jika konfigurasi file Anda memiliki pengulangan maka masuk akal untuk memisahkan unsur-unsur dan menggunakan kembali mereka. Yang saya maksud adalah ini - katakanlah Anda file konfigurasi Anda terlihat seperti ini:

  pengembangan:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: your_server
     login: your_login
     password: top_secret
 produksi:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: your_server
     login: your_login
     password: top_secret 

Dengan asumsi di atas kode dalam / tmp / test.yml sini adalah bagaimana Anda dapat membaca di python dan ruby
$cat readyml.py

 # / Usr! / Bin / env python
 dari pprint impor pprint sebagai pp
 # Di debian perlu menginstal python-YAML
 dari impor beban YAML, dump load_all,
 hash = beban (terbuka ('/ tmp / test.yml'))
 pp (hash ['pembangunan']) 


$ cat readyml.rb

  # / Usr! / Bin / env ruby
 require 'pp'
 hash = YAML :: load (File.Open ('/ tmp / test.yml'). membaca)
 pp hash ['pembangunan'] 

di sini adalah liner satu berguna untuk versi ruby
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' atau Anda dapat mencoba hal yang sama di irb atau konsol python.

Perhatikan bahwa dalam potongan kode di atas, semuanya selain lokasi output yang sama dalam pembangunan dan bagian produksi. Di sinilah pengenal simpul yml datang untuk menyelamatkan. Ide sederhana memiliki satu set nilai default dan menimpa mereka di tempat yang berbeda.
Anda bisa tarik terpisah sebagai berikut:

  default: default &
   input_location: common_input
   output_location: dev_location
   mail:
     sender_name: pengirim
     smtp_server: your_server
     login: your_login
     password: top_secret
 pengembangan:
   <<: * Defaults
 produksi:
   <<: * Defaults
   output_location: prod_location 


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

Besar, ia bekerja (tm)!.
Bisa dibilang kita diperdagangkan beberapa petunjuk untuk sedikit sihir. Berikut adalah penjelasan kecil: &, * dan <<: & yang tag anchor dapat dipahami sebagai identifier node, * adalah referensi node dan <<: singkatan dari gabungan hash.

Untuk lebih lengkapnya lihat baik spesifikasi YAML atau wikipedia
Sejauh ini cukup baik tetapi ada menangkap di sini, ini gabungan hash tidak rekursif. Artinya adalah: katakanlah Anda ingin memiliki nama pengirim yang berbeda untuk mail dalam dua lingkungan, Anda mungkin tergoda untuk melakukan hal berikut:

  default: default &
   input_location: common_input
   output_location: dev_location
   mail:
     sender_name: pengirim
     smtp_server: your_server
     login: your_login
     password: top_secret
 pengembangan:
   <<: * Defaults
   mail:
     sender_name: sender_dev
 produksi:
   <<: * Defaults
   output_location: prod_location
   mail:
     sender_name: sender_prod 

Mari kita memeriksa

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

Ups, ada yang tidak beres, masalah seperti yang disebutkan di atas adalah bahwa menggabungkan hash tidak rekursif dan saat menggabungkan diganti mail default dengan mail produksi yang hanya memiliki satu kunci. Solusi / bekerja di sekitar adalah untuk membuka gulungan satu tingkat lebih lanjut:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: & mail_defaults
  sender_name: pengirim
   smtp_server: your_server
   login: your_login
   password: top_secret

 default: default &
   <<: * Common_settings
   mail:
     <<: * Mail_defaults
 pengembangan:
   <<: * Defaults
 produksi:
   <<: * Defaults
   mail:
     <<: * Mail_defaults
     sender_name: sender_prod

Mari kita cek lagi

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

Apakah Anda mengatakan Anda memiliki tingkat satu lebih banyak bersarang, baik Anda pasti dapat membuka gulungan satu tingkat lebih, tapi kemudian menjadi berantakan. Jadi, jika Anda tidak mencoba untuk menulis solusi untuk menara hanoi dalam file conf, lebih baik untuk restucture file conf dari menggali YAML atau sesuatu yang lain. Tapi itu panggilan Anda pula.

Sedikit pengalihan shell

10 Mei 2009 oleh prashant · Komentar
Filed under: teknologi

Berikut adalah bagaimana kita biasanya melakukan pengalihan shell
$ ./pgm.sh args >out.txt 2>err.txt
Saya ingin memodifikasi sedikit dan berjalan sebagai berikut
$ ./pgm.sh args
dengan persyaratan bahwa output dan kesalahan harus pergi ke beberapa nama file dihitung dalam pgm.sh berdasarkan args. Satu kasus ilustratif bisa jadi saat saat ini adalah bagian dari args. Jadi Anda ingin stdout untuk pergi untuk mengatakan / / direktori / pgm_out_YYYYMMDD.txt 1

Masalah dengan cara standar untuk mengarahkan N>file.txt yaitu, menghubungkan file deskriptor N untuk file.txt, adalah bahwa ia bekerja hanya untuk proses yang baru bercabang dan bukan untuk proses saat ini.
jadi
$ echo hi 1>out.txt ; echo hii . akan mengirimkan hi ke out.txt tetapi akan mencetak hii ke stdout 2

Di sinilah exec datang untuk menyelamatkan kita. Jika kita menambahkan exec 1>somefile.txt maka output dari sisa script akan pergi ke somefile.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh akan mengarahkan hi hii serta untuk out.txt

Demikian pula untuk mengarahkan stdout serta stderr kita akan melakukan sesuatu seperti ini
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

Sekarang kembali ke titik awal dari mengarahkan ke beberapa file dari dalam shell, katakanlah nama file program yang dihitung dalam beberapa OUTFILE variabel, kita bisa saja dilakukan exec 1>$OUTFILE

Yang memecahkan masalah saat ini. Tapi Anda mungkin ingin pergi melalui contoh berikut yang mencapai 'random access' dari file di shell script. Contoh adalah dari sini
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

Dengan komentar, kode ini sendiri adalah jelas.
-
1 Hal ini juga dapat dilakukan dengan $ ./pgm.sh args >pgm_out`date +%Y%m%d` tetapi ide adalah untuk menghasilkan nama file ini didasarkan pada beberapa logika dalam program itu sendiri.
2 1 dalam 1> out.txt berlebihan tetapi menjelaskan di sini bahwa kita mengarahkan fd 1

Untuk skala atau tidak skala

11 Januari 2009 oleh prashant · Komentar
Filed under: teknologi

Sementara berbicara tentang partisi horisontal database, DHH dari ketenaran ROR menunjukkan bahwa hal skala sabar, pasti menunggu sampai titik kebutuhan bisnis Anda memerlukannya. Artikelnya pasti masuk akal untuk setup kecil mengatakan startups. Bukan untuk mengatakan bahwa dalam startups anda harus menulis program demo tetapi mengingat bahwa hanya ada 24 jam dalam sehari Anda harus fokus pada melayani mengatakan 1000 pengguna dengan cara lebih memuaskan daripada kehilangan tidur Anda lebih mengkhawatirkan tentang bagaimana aplikasi saya menangani beban dari 13.142.000 pengguna. Jika Anda mendapatkan orang-orang banyak pengguna Anda akan tahu bagaimana skala. Untuk skalabilitas pemula adalah masalah yang baik untuk memecahkan masalah tetapi jauh lebih baik untuk memiliki, maksudku setiap startup akan senang untuk mengalami masalah ini!

Di lain terkait artikel Jeremy Zawodny menulis Anda tidak perlu tergantung pada Mr Moore jika Anda memiliki masalah skalabilitas.

Sejak artikel ini merujuk pada hukum Moore saya tidak bisa tidak menulis bahwa hukum Moore harus menjadi salah satu hukum yang paling umum di bidang Ilmu Komputer. Dari prediksi aslinya tentang kepadatan transistor, hukum ini sekarang dikutip di mana pun Anda menemukan pertumbuhan eksponensial.