世論調査は、ping、PubSubの、pubsubhub、pubsubhubbub
あなたが懐疑的である場合には、上記の狂気のメソッドは、ポストのタイトルに、あります。 ハイテク界では、それはあなたがpubsubhubbub聞いたことがないことはほとんどありません。 高速の数ヶ月で、それは物事について話しましたトップ3の一つとなっている。 ている他の二つの準同型暗号とGoogle 波 [ 1 ]。 現在のポストに戻ってくる - タイトルに含まれる用語は、あなたが他の人から内容を取得する方法を示しています。 あなたは、彼らが概念的ブログに限定されていない場合でも、ブログに関して起こって物事を想像する場合は、次の詳細については、より明確になります。
ポーリングは、クライアントが何か新しいものが来ている場合は、サーバーを求め続けるシナリオを指します。 どのくらいの頻度でアップデートを求めるためには、常にあまりにも頻繁すぎるかまれなポーリングに問題があるでしょうが、ある読者が指摘するようにここでポーリングを一つの大きな 、ものがそのサーバーであることの状態を維持する必要はありません。
pingは、記事を投稿するとき、あなた(またはあなたのソフトウェアが)また、いくつかの人気の(中央)の更新サービスを更新する場合を指します。 いくつかの背景ここに 。
次は、それが作られた最も早いピッチの一つ、パブリッシュ/サブスクライブの略でPubSubのですここでエヴァンHenshaw-プラスとKellanエリオット·マックリー(72スライドが通過する価値がある)で。 彼らはに対して与えた説得力のある例では、このた - 特定の日付に、6721はそれらの24時間でFlickrを訪れたと "潜在的に"写真をアップロードしたかもしれない、そのうちの45754ユーザーの最新の写真を取得するためにFlickrの290万回クロールFriendfeedで。 彼らが指摘するように彼らは何を提案したが、 "革命的な新しい20歳の技術"新技術ではなかったことに注意してください。 あなたは、ブログのためにそれを行う場合はXMPP大きな問題の1つ - 60から70パーセントと高いかもしれませんプレゼンスデータのオーバーヘッドは、多くのことを減らすことができます。
pubsubhubは、ハブとpubsubhubbubプロトコル、pubsubhubのアイデアになっているコアでサブスクライブパブリッシュを表しています。 請求項の出版社は(ブロガーと言う)、 "どこかに雲の中に"存在するプロトコルごとに、これはプロトコルごとにプッシュまたはプルすることができますが、次のリンクに進んでください(複数のハブを、お互いに話かもしれない)ハブを更新チェーン、クライアントへのハブ(読者を言う)は、常にモデルをプッシュしています。 このページはpubsubhubbubための良い出発点であり、概要スライドが良いです。 これまで説得力のあるAnil Dashは、それを説明しますここでプッシュWebサービスとして。
他の2つの関連読み取りはwebhooks基本的にHTTPコールがあります。 githubのは、 使用し 、それを、そうで支払いの非同期通知のためにPayPalを行いIPNますので、他の多くの操作を行います。 関連する概念はされていrsscloud再びPubSubのハブである。 従い、この詳細については、リンクをクリックします。
ここで、これらすべてを書くことのポイントは何か不思議に思うかもしれません、2つの1があります。 これらのことは、最低限、少なくとも、2、知っておく価値があります。 このブログは、このWordPressの使用appspotハブを介して使用できるようになりましpubsubhubbubあるプラグインとフィードもFeedBurnerは、リンクを介して有効にpubsubhubbubです。 ここで
-
[ 1 ]。 -完全に準同型暗号化のために読んでグッド入門は、 この Bruce Schneier氏の記事とこの話は、Google波の、多かれ少なかれ、唯一の情報源です。
-UPDATE - この記事は、コールバック用のパブリックサーバーの要件は、XMPPゲートウェイ(pubsubhubbub用)を使用してデスクトップクライアントのために回避する方法について説明します。
アセンブリのビット
読んだ後にこのロックフリーバッファについての記事を、CASの使用を見て(比較とスワップ)、私は同じようにアセンブリコードを投稿するように感じました。 ネイティブメソッドを記述し、Java(バック1.5、Javaの並行データ構造が多かれ少なかれ存在しない以外だったとき)からそれを呼び出すことがあった上のケースを使用しています。 さらに騒ぎがなければ、私はあなたにコードを解き放つよ
。 最初は、CAS用で、もう1つはユークリッドのアルゴリズム(このいずれかが同様に多くの場所とチュートリアルに記載されています)を使用して、コンピューティングGCDのためのものです。
コンパイルと実行命令を gcc file_name.c ; ./a.out
比較とスワップ
の#includeの#include / /交換 - newValueは、comperandは古い/期待値です。 / * *関数は、実際には、次のことを行います - * destに値が他のnewValueはそのままにしておくことによって、それを交換しOldValueプロパティに等しい場合は、次のいないすべてのこれらのアトミック * *戻り値の2つのオプションがあります。 * destの1.is初期値とoldvalにとそれを比較するfxnの呼び出しの負担を残す * 2。 ここの上でそれを行うと、0または1を返し、これはより効率的であるべき ** / / *後でマクロにそれを変更する* / 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型の結果= 1 ;/ * CASが成功したことを図1に、それは/ *失敗したが0を示す / *ところでフラグが追い払ってくれるためにCCを設定する必要があります! * / __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"は/ *同じ行にあるをロックする必要があります* / "JZは\ n \ tをDONE" "MOVL $ 0、%1は\ n \ t"は "DONEます:\ n \ t"は : "= M"(destが)、 "= G"(結果) : "G"(OldValueプロパティ)、 "G"(newValueは)、 "M"(DEST) : "%eaxに"、 "%ebxに"、 "ECX"、 "CC" 。) のprintf( "(%dは、%D、%d)が、" * destは、OldValueプロパティ、newValueは); 結果を返します。 } / * TODO * whileループでfxn上に置く別のASM fxnを書き、それが* /を成功しない限り続けようと 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、)); のprintf( "%dです\ n"、CAS(C、B、B)); * C = 6; / * C = 5; * / のprintf( "*の値を変更するC%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)); 0を返します。 }
書式設定の注意事項 - WPのシンタックスハイライトのように思えるが追加されてい 最後に、それを無視してください。
GCD
の#includeint型GCD(int型1は、int B){ int型の結果; / *ユークリッドのアルゴリズムを使用して最大公約数を計算* / __asm__ _のvolatile__( "MOVL%1、%%eaxに;" "MOVL%2、%%EBX;" "CONTD:CMPL $ 0、%%EBX;" "JEは、DONE;" "xorl%%edxを、%%EDX;" "idivl%%EBX;" "MOVL%%ebxには、%%eaxに;" "MOVL%%edxを、%%のEBX;" "JMPはCONTD;" "DONE:MOVL%%eaxに、%0;": "= G"(結果): "G"()、 "G"(B) 。) 結果を返します。 } int型のmain(){ 第二に、最初のint; のprintf( "二つの整数を入力してください:"); scanf関数( "%dは%d個"、&、最初&2番目)。 のprintf( "%d個&%dの最大公約数は%dです\ n"、第一、第二、GCD(第1、第2、第)); 0を返します。 }
ルビーハッシュを作成する1つのライナー
私の古いプログラムのひとつを通過しながら、昨日、私はこれがいつか戻って私によって書かれました:
#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
サスペンスのいくつかを殺すために私はRAW_TEXTように見えることを開示してみましょう
、右のそれはPayPalの支払い承認からカットされています。
線の上の部分で壊れた場合には、優れた読み取ります。
unescaped_array = CGI.unescape(RAW_TEXT)。分割( '&') unescaped_array = unescaped_array.collect {| x |はB = x.split( "="); b.push(nil)はb.size == 1であれば、B} flattened_array = unescaped_array.flatten ハッシュ=ハッシュ[* flattened_array]
irbで個々の手順を実行してみましょう:
IRB(メイン):009:0> unescaped_array = CGI.unescape(RAW_TEXT)スプリット( '&') => ["SUCCESS"、 "mc_gross = 10.00"、 "protection_eligibility =不適格"、 "payer_id = U7PPJJ4TSJ47E"、 "税= 0.00"、 "payment_date = 9時45分30秒2009年7月10日PDT"、 "PAYMENT_STATUSは=保留中"] IRB(メイン):013:0> unescaped_array = unescaped_array.map {| x |はB = x.split( "="); b.push(nil)はb.size == 1であれば、B} => ["SUCCESS"は、nil]、["mc_gross"、 "10.00"]、["protection_eligibility"、 "不適格"]、["payer_id"、 "U7PPJJ4TSJ47E"]、["税"、 "0.00"] 、["payment_date"、 "午前9時45分30秒2009年7月10日PDT"]、["保留"、 "PAYMENT_STATUS"]] IRB(メイン):014:0> flattened_array = unescaped_array.flatten => ["SUCCESS"は、nil、 "mc_gross"、 "10.00"、 "protection_eligibility"、 "不適格"、 "payer_id"、 "U7PPJJ4TSJ47E"、 "税"、 "0.00"、 "payment_date"、 "9時45分: 30 2009年7月10日PDT "、" PAYMENT_STATUS "、"保留中 "] IRB(メイン):015:0> ハッシュ=ハッシュ[* flattened_array] => {"税" => "0.00"、 "PAYMENT_STATUS" => "保留中"、 "payer_id" => "U7PPJJ4TSJ47E"、 "mc_gross" => "10.00"、 "SUCCESS" => nilで、 "payment_date" = > "9時45分30秒2009年7月10日PDT"、 "protection_eligibility" => "不適格"}
ところで、*はRubyでスプラット演算子と呼ばれ
'のペアの配列 "からハッシュを作成する別の方法は、注入を使用することです。
ハッシュ= [[1,2]、[3,4]]({})注入します。{|その結果、要素|結果[element.first] =結果[element.last];}結果 もう一つの方法があります
私は読者への演習として残しておきますので、ループを書く!
ここでは配列からハッシュを作成するためのビットとは無関係のユースケースは、次のとおりです。
IRB(メイン):005:0> [1,2,3,4,7,9] GROUP_BY {| X | X <5。? :低い::より} => {:低い=> [1、2、3、4]、:より大きい=> [7,9]}
基本的には、ブロックの結果、得られたハッシュでその要素のキーとして使用され、より多くのことを行うことができます。
Gmailの、muttやその他のmsmtp修正
あなたは、GmailにアクセスするにはmuttやSMTPを使用している場合。 ここで(悪い)ニュースがあります。 Googleのクールな男は、再び証明書を変更しました。 ああ、あなたが求めるなかった - それはどのようにそれを知っていますか? シンプルなmuttは悪名高い、msmpt使用しようとしたときに不適当な証明書に文句を開始 "その他のmsmtp:TLS証明書の検証に失敗しました:証明書が既知の発行元を持っていません。 ' 画面上で私を迎えた。
交差確認するには -
単に次のコマンドを実行します。
$ msmtp --serverinfo --host=smtp.gmail.com --tls=on --port=587 --tls-certcheck=off
古いThwateサーバの代わりに今では発行者·セグメント内に次のGET
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US
幸いにも修正が簡単ですが、ここでは、Debian上で行うために必要なものです。
# apt-get install ca-certificates
# dpkg -s ca-certificates|grep Version
Version: 20090814
この直後、あなたに次の行を変更し、〜/。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
へ
tls_trust_file /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt
YAML confファイルの中にハッシュをマージする
YAMLは設定ファイルを書くために非常に便利です。 主な利点は、それがテキストファイルのように読むことです。 configファイル(無階層)平らでない繰り返しを持っていない場合、これは本当によく働く。
あなたのコンフィギュレーションファイルが繰り返しがある場合、それはそれらの要素を分離し、それらを再利用することは理にかなっています。 私は何を意味することはこれである - のは、configファイルは、次のようになりますことを言ってみましょう:
開発: input_location:common_input output_location:dev_location メールアドレス: smtp_server:YOUR_SERVER ログイン:your_login パスワード:top_secret 生産: input_location:common_input output_location:dev_location メールアドレス: smtp_server:YOUR_SERVER ログイン:your_login パスワード:top_secret
ここでは/ tmp / test.ymlで上記のコードと仮定すると、PythonやRubyで読むことができる方法です。
$cat readyml.py
#!/ usr / bin / envをのpython PPとして出力の整然化のインポート出力の整然化から #Debianでのpython-yamlをインストールする必要があります YAMLインポート負荷から、load_all、ダンプ ハッシュをかざすと(開いている( 'は/ tmp / test.yml')) PP(ハッシュ['開発'])
$ cat readyml.rb
#!/ usr / bin / envをルビー "PP"を必要とする ハッシュ= YAML ::負荷(File.open( '/ tmpに/ test.yml')は。読む) ppはハッシュ['開発']
ここでルビーバージョンの便利な1ライナーです。
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]'またはIRBやPythonコンソールで同じことを試してみることができます。
上記のコードスニペットでは、すべてが出力場所は、開発と生産の部分で同じである以外のことに注意してください。 YMLノード識別子が救出に来る場所です。 アイデアは単純なデフォルト値のセットを持っていると別の場所でそれらを上書きします。
次のように、あなたはそれを引き離すこともできます。
デフォルト値:&デフォルト input_location:common_input output_location:dev_location メールアドレス: SENDER_NAME:送信 smtp_server:YOUR_SERVER ログイン:your_login パスワード:top_secret 開発: <<:*デフォルト 生産: <<:*デフォルト output_location:prod_location
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
偉大な、それは(TM)の動作!
間違いなく我々は魔法のビットのいくつかの明快さを交換した。 ここで小さな説明は、次のとおりです。&、*と。<<&アンカー·タグであるが、ノードの識別子として理解することができます*は、ノードの参照と<<次のとおりです。ハッシュ結合を表しています。
詳細については、いずれかを参照してくださいYAML仕様またはWikipediaを
これまでのところは良いが、漁獲量はここにありますが、これらのハッシュのマージは再帰的ではありません。 それは何を意味すると、この次のとおりです。ましょうあなたが2つの環境でメールを別の送信者名を持ちたいと言うあなたは、次の操作を行うように誘惑される場合があります。
デフォルト値:&デフォルト input_location:common_input output_location:dev_location メールアドレス: SENDER_NAME:送信 smtp_server:YOUR_SERVER ログイン:your_login パスワード:top_secret 開発: <<:*デフォルト メールアドレス: SENDER_NAME:sender_dev 生産: <<:*デフォルト output_location:prod_location メールアドレス: SENDER_NAME:sender_prod
確認することができます
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$
おっと、何かが間違っていた、前述したようにこの問題は、ハッシュ結合が再帰的ではないということですとマージ中には1つだけ鍵を持っている生産のメールで、デフォルトの電子メールに取って代わりました。 解決策/回避策は複数のレベルをアンロールすることです。
common_settings:&common_settings input_location:common_input output_location:dev_location mail_defaults:&mail_defaults SENDER_NAME:送信 smtp_server:YOUR_SERVER ログイン:your_login パスワード:top_secret デフォルト値:&デフォルト <<:* common_settings メールアドレス: <<:* mail_defaults 開発: <<:*デフォルト 生産: <<:*デフォルト メールアドレス: <<:* mail_defaults SENDER_NAME:sender_prod
再度確認することができます
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
あなたが入れ子の複数レベルを持って言った、よくあなたは間違いなく、複数のレベルを展開することができますが、それは混乱になります。 あなたは、confファイルにハノイの塔への解決策を記述しようとしていない場合ので、それはYAMLもしくは他の何かを掘り下げるよりも、confファイルをrestuctureすることをお勧めします。 しかし、それはとにかくあなたの呼び出しです。
シェルのリダイレクトのビット
ここでは、通常、シェルのリダイレクトを行う方法です。
$ ./pgm.sh args >out.txt 2>err.txt
私はそれを少し変更したいと次のように実行
$ ./pgm.sh args
出力とエラーは、argsに基づいてpgm.sh内で計算、いくつかのファイルに行く必要があることを要件と。 日付が引数の一部である場合、一つの例示のケースであるかもしれません。 ので、あなたの/ディレクトリ/ pgm_out_YYYYMMDD.txt /言いに行って標準出力(stdout)をご希望の1
リダイレクトするための標準的な方法で問題N>file.txtすなわち、ファイル記述子を関連付けるN File.txtには、それが現在のプロセスのために新たにforkしたプロセスとしない場合にのみ動作することです。
そう
$ echo hi 1>out.txt ; echo hii out.txtをハイに送信されますが、標準出力(stdout)にHIIが出力されます。 2
ここで、これはexec私たちの救助に来る。 我々が追加した場合exec 1>somefile.txtしてスクリプトの残りの部分からの出力はsomefile.txtに移動します
$。/ test.shは、out.txtをするだけでなく、ハイテクHIIにリダイレクトされます
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
同様に、標準出力(stdout)と同様にstderrをリダイレクトするために我々はこのような何かをやる
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
現在のシェルの内側から、いくつかのファイルにリダイレクトするの原点に戻ってくると、プログラムはいくつかの変数OUTFILEでファイル名を計算言うみましょう、我々だけで行われたかもしれないexec 1>$OUTFILE
それは、現在の問題を解決します。 しかし、あなたはシェルスクリプトでファイルの "ランダムアクセス"を実現する次の例で通過するようなことがあります。 例からです。 ここで
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
コメントで、このコードは自明です。
-
1はまた、によって行うことができます$ ./pgm.sh args >pgm_out`date +%Y%m%d`が、このアイディアはプログラム自体にいくつかのロジックに基づいて、このファイル名を生成することです。
2 1の1> out.txtを冗長ですが、それは我々がFD 1をリダイレクトしていることをここで明確に
拡大縮小したり拡大縮小しない
話をしながら水平パーティショニングのデータベース、ROR名声のDHHは、スケーリングのものは、ビジネスニーズがそれを必要とする時点まで待つ間違いなく、待つことができることを示唆している。 小さなセットアップがスタートアップを言うために彼の記事は確かに理にかなっています。 スタートアップにデモプログラムを書く必要があることを言うが、私のアプリケーションは、13142000の負荷を処理する方法について心配の上に睡眠を失うことよりも、より充実した方法で1000人のユーザーを言う料理に焦点を当てるべき日で唯一の24時間があることを考えるとしないユーザー。 あなたがそれらの多数のユーザを取得する場合には、拡張する方法を知っています。 スタートアップのスケーラビリティを解決するための良い問題ではなく持っているはるかに優れた問題は、私はスタートアップがこの問題に遭遇するのが大好きだという意味!
別の関連で記事 Jeremy Zawodny氏は 、 スケーラビリティの問題を持っていれば、ムーア氏に依存してはいけませんが書き込まれます。
これらの記事を参照して以来、 ムーアの法則私は助けることがムーアの法則は、コンピュータサイエンスの中で最も一般的な法律の一つでなければならないことを書き込むことはできません。 トランジスタ密度についての彼の当初の予測から、この法律は今どこに指数関数的成長に出くわす引用されています。



































