Опрос, пинг, PubSub, pubsubhub, PubSubHubbub

В случае, если вы настроены скептически, есть метод в безумие выше, в названии должности. В кругах технологий маловероятно, что вы не слышали о PubSubHubbub. В быстрых несколько месяцев, он был одним из трех крупнейших говорили о вещах. Две другие гомоморфных шифрования и Google волны [ 1. ]. Возвращаясь к нынешней должности - термины в названии указывает, как вы получите содержимое от других людей. После детали становятся более ясными, если представить, что происходит в отношении блогов, даже если они концептуально не ограничивается блогами.

Опрос относится к сценарию, где клиенты постоянно просят сервер, если что-то новое придумать. Как часто просить обновления всегда будут проблемы с избирательных слишком часто или слишком редко, но, как один из читателей отметил здесь , что одно большое, вещь с опросом в том, что сервер не должны поддерживать государство.

Ping относится к случаю, когда, где разместить статью, вы (или ваш программного обеспечения) также обновляет некоторые популярные (центральной) Update Services. Некоторые фон здесь .

Далее идет PubSub которая выступает за публикации / подписки, одним из первых шага на это было сделано здесь, Эван Хеншоу-Плат и Келлан Эллиот-Мак-Кри (72 слайдов, но стоит идти путем). Убедительным примером они дали против эта - на определенную дату, FriendFeed пополз Flickr 2900000 раз, чтобы получить последние фотографии 45 754 пользователей, из которых 6721 побывал Flickr в эти 24 часа и могли бы "потенциально" загрузил фотографию. Обратите внимание, что то, что они предложили не новые технологии, как они указывают на «революционный новый 20-летний технологии". Если вы делаете это для блогов, то одна из основных проблем, с XMPP - наличие данных накладные расходы, которые могут достигать 60-70% может быть уменьшена много.

pubsubhub выступает за публикацию подписаться ступицы и PubSubHubbub это протокол, ядром которой является идея pubsubhub. В чем издатели (например блоггеров) обновить центр которого (может быть более одного центров, которые общаются друг с другом) находится "где-то в облаках, в соответствии с протоколом этого можно толкать или тянуть в соответствии с протоколом, но в следующей ссылке цепи, центр клиента (скажем, читателей) он всегда толкать модели. Эта страница является хорошей отправной точкой для PubSubHubbub, обзор слайдов хороши. Всегда красноречивый Анил Даш описывает его здесь в качестве веб-кнопки.
Два других связанных чтении webhooks которая в основном HTTP обратного вызова. Github использует его, так же PayPal для асинхронных уведомлений оплаты в рп . Так делают многие другие. Связанные концепции rsscloud что снова PubSub центром. Следуйте этой ссылке подробнее.

Вы можете быть удивлены, что смысл писать все эти вот, есть две 1. Эти вещи надо знать, по крайней мере минимально и 2. Этот блог PubSubHubbub включен в настоящее время через appspot концентратору с помощью этого WordPress плагин и кормов тоже PubSubHubbub включен через FeedBurner, ссылка здесь
-
[ 1 ]. - Хороший вводный читать полностью гомоморфных шифрования этой статье Брюс Шнайер и это речь идет более или менее единственным источником волны Google.

ОБНОВЛЕНИЕ - Это сообщение объясняет, как требование публичного сервера для обратного вызова можно обойти для настольных клиентов с помощью XMPP шлюз (для PubSubHubbub).

Немного сборки

После прочтения этой статьи о блокировки свободных буферов и, увидев использования CAS (сравнить и своп), я чувствовал, что размещение сборки кода, чтобы сделать то же самое. Используйте случае там было написать собственный метод и вызывать его из Java (еще в 1.5, когда одновременно структур данных в Java были более или менее несуществующие). Не мудрствуя лукаво, я раскрыть код на вас :) . Во-первых, для СПС и второй для вычисления НОД по алгоритму Евклида (это могут быть найдены во многих местах и ​​учебных пособий, а).

Скомпилируйте и запустите инструкцию gcc file_name.c ; ./a.out

Сравните и Обмен

   # Include 
  # Include 
 / / Обмен - NewValue, comperand старое / ожидаемое значение
 / *
  * Функция фактически выполняет следующие вещи - если значение в * DEST равно OldValue затем заменить его NewValue еще оставить его без изменений: не все эти атомарно
  *
  * Есть два варианта возврата
  * 1.is начальное значение * DEST и оставить бремя вызова FXN сравнить его с oldval
  * 2.  сделать это здесь и вернуть 0 или 1, то это должно быть более эффективным
  ** /

 / * Позже изменить его в макросов * /
 Int CAS (Int * НАЗНАЧЕНИЕ, OldValue Int, Int NewValue) {
	 Е ("(% D,% D,% г)", * НАЗНАЧЕНИЕ, OldValue, NewValue);
	 / * Int CAS (INT DEST, Int OldValue, Int NewValue) {* /
	 / * Int CAS (INT DEST, Int NewValue, Int OldValue) {* /
	 Int результат = 1 ;/ * 1 показывает, что CAS успешно и 0 показывает, что он не * /
	 / * Кстати нужно установить флаг см для затирания!  * /
	 volatile__ __asm__ __ (
			 "Movl% 2,%% EAX \ п \ т"
			 "Movl% 3,%% EBX \ п \ т"
			 "Movl 0%,%% ECX \ п \ т"
			 "LOCK \ п \ т"
			 "CMPXCHG%% EBX, (%% ECX) \ п \ т" / * должны быть блокировки на одной строке * /
			 "Совершено JZ \ п \ т"
			 "Movl $ 0,% 1 \ п \ т"
			 "Совершено: \ п \ т"
			 : "= М" (Dest), "= г" (результат)
			 "Г" (OldValue), "г" (NewValue), «м» (Dest)
			 : "% EAX", "% EBX", "ECX", "CC"
			 );
	 Е ("(% D,% D,% г)", * НАЗНАЧЕНИЕ, OldValue, NewValue);
	 возвращение результата;
 }

 / * TODO
  * Написать еще АНМ FXN которая ставит выше FXN в то время цикла и продолжать пробовать, если он успешно * /

 Int основных () {
	 Int = 5, б = 6;
	 Int * с = (INT *) таНос (SizeOf (INT));
	 * С = 6;
	 / * Int C = 6, * /
	 Е ("% г \ п", CAS (C, B, б));
	 Е ("% г \ п", CAS (C, B));
	 Е ("% г \ п", CAS (С, А,));
	 Е ("% г \ п", CAS (C, B, б));
	 * С = 6;
	 / * С = 5, * /
	 Е ("изменение значения с * к% г \ п", * с);
	 Е ("% г \ п", CAS (C, B, б));
	 Е ("% г \ п", CAS (C, B));
	 Е ("% г \ п", CAS (С, А,));
	 Е ("% г \ п", CAS (с, а, б));
	 Е ("% г \ п", CAS (C, B));
	 return 0;
 }

Форматирование ноты - кажется WP подсветку синтаксиса добавления В конце концов, игнорировать это.

НОД

 # Include 
 Int НОД (INT A, INT B) {
     Int результат;
     / * Вычислить Наибольший общий делитель по алгоритму Евклида * /
     __asm__ __ volatile__ ("movl% 1,%% EAX;"
                           "Movl% 2,%% EBX;"
                           "ПРОДОЛЖЕНИЕ: cmpl $ 0,%% EBX;"
                           "Совершено е";
                           "Xorl%% EDX, EDX%%";
                           "Idivl%% EBX;"
                           "Movl EBX%%%% EAX;"
                           "Movl%% EDX, EBX%%";
                           "JMP ПРОДОЛЖЕНИЕ";
                           "Совершено: movl%% EAX,% 0,": "= г" (результат): "г" (а), "г" (б)
     );

     возвращение результата;
 }

 Int основных () {
     int, первое, второе;
     Е ("Введите два целых числа:");
     Scanf ("% D% D", и первое, и второе);

     Е ("НОД% D и% D% г \ п", первый, второй, НОД (первый, второй));

     return 0;
 }

рубин один вкладыши для создания хэш-

Вчера при прохождении одного из моих старых программ, я нашел это написано мной некоторое время назад:

#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.split ("="); b.push (ноль), если b.size == 1, б}
   flattened_array = unescaped_array.flatten
   хэш = Hash [* flattened_array] 

Давайте сделаем отдельные шаги в IRB:

  IRB (основной). 009:0> = unescaped_array CGI.unescape (raw_text) сплит ('&')    

 => ["Успех", "mc_gross = 10,00" "protection_eligibility = Неприемлемые", "payer_id = U7PPJJ4TSJ47E", "налоговая = 0.00", "payment_date = 9:45:30 10 июля 2009 PDT", "В ожидании payment_status = "]                                                                         

 IRB (основные): 013:0> = unescaped_array unescaped_array.map {| х | = б x.split ("="); b.push (ноль), если b.size == 1, б}  

 => [["УСПЕХ", ноль], ["mc_gross", "10.00"] ["protection_eligibility", "не имеющие права"] ["payer_id", "U7PPJJ4TSJ47E"] ["налог", "0.00"] , ["payment_date", "9:45:30 10 июля 2009 PDT"] ["payment_status", "В ожидании"]]                               

 IRB (основные): 014:0> = flattened_array unescaped_array.flatten     

 => ["Успех", ноль ", mc_gross", "10.00", "protection_eligibility", "не имеющие права", "payer_id", "U7PPJJ4TSJ47E", "налоги", "0.00", "payment_date", "9:45: 30 10 июля 2009 PDT "," payment_status "," В ожидании "]
 IRB (основные): 015:0>
 хэш = Hash [* flattened_array]
 => {"Налог" => "0.00", "payment_status" => "До", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10.00", "успех" => ноль ", payment_date" = > "9:45:30 10 июля 2009 PDT", "protection_eligibility" => "Недопустимые"} 

Кстати, * называется оператор восклицательный знак в рубине

Еще один способ создать хэш из "массива пар" является использование инъекционных:

  хэш = [[1,2], [3,4]] вводят ({}). {| результате элемент | результат [element.first] = результат [element.last];} результат 

Существует еще один способ :) Напишите цикл, который я оставляю в качестве упражнения для читателей!

Вот несколько вариантов использования не связаны создания хэш из массива:

  IRB (основные): 005:0> [1,2,3,4,7,9] Аргумент group_by {| х | х | <5.?  : Меньше больше ::}

 => {: Меньше => [1, 2, 3, 4]: большая => [7, 9]} 

Вы можете сделать больше вещей, в основном результат блока используется в качестве ключа для этого элемента в результате хэш.

Gmail, дурак и msmtp исправления

Если вы используете Mutt и SMTP для доступа к Gmail. Вот (плохие) новости. Крутые парни в Google снова изменил сертификат. Ах, вы спросите - как это знать? Просто дурак начали жаловаться на плохое сертификат при попытке использовать msmpt, печально известный "msmtp: TLS сертификат проверки не удалось. Сертификат не получил известный эмитента встретил меня на экране.

Чтобы пересечь подтвердить -
Просто запустите следующие

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

На месте старого сервера Thwate теперь вы получаете следующие эмитента в сегменте
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

После этого просто измените следующую строку в вас ~~~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

к

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

Слияние хешей в YAML файлы конф

YAML это очень удобно для записи файлов конфигурации. Основным преимуществом является то, что он читает, как текстовый файл. Это работает очень хорошо, если ваш файл конфигурации квартира (нет иерархии) и не имеет повторений.
Если ваш файл конфигурации повторов, то имеет смысл выделить те элементы и использовать их. Что я имею в виду это - скажем, вы конфигурационный файл выглядит следующим образом:

  развития:
   input_location: common_input
   output_location: dev_location
   почта:
     smtp_server: your_server
     Логин: ваш_логин
     Пароль: top_secret
 Производство:
   input_location: common_input
   output_location: dev_location
   почта:
     smtp_server: your_server
     Логин: ваш_логин
     Пароль: top_secret 

Предполагая выше код в / TMP / test.yml вот как вы можете прочитать в питоне и рубин
$cat readyml.py

 #! / USR / бен / ENV питон
 pprint от импорта pprint как пп
 # В Debian необходимо установить Python-YAML
 YAML от импорта нагрузки, load_all, самосвалы
 хэш = нагрузки (открытой ('/ TMP / test.yml))
 рр (хэш ['развитие']) 


$ cat readyml.rb

  #! / USR / бен / ENV рубин
 require 'рр'
 хэш = YAML :: нагрузки (File.Open ('/ TMP / test.yml). читать)
 стр. хэш ['развитие'] 

Здесь удобная один лайнер для версии рубиновых
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' или вы можете попробовать то же самое в IRB или питона консоли.

Обратите внимание, что в приведенном выше фрагменте кода, все, кроме выходных Место же в разработке и производстве части. Здесь ут идентификатор узла идет к спасению. Идея проста есть набор значений по умолчанию и переопределить их в другом месте.
Вы могли бы вытащить его на части следующим образом:

  По умолчанию: и по умолчанию
   input_location: common_input
   output_location: dev_location
   почта:
     SENDER_NAME: отправитель
     smtp_server: your_server
     Логин: ваш_логин
     Пароль: top_secret
 развития:
   << * По умолчанию
 Производство:
   << * По умолчанию
   output_location: prod_location 


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

Великий, он работает (тм)!.
Возможно мы обменяли некоторую ясность в немного магии. Вот небольшое объяснение: и * и <<: и которая тега может быть понята как идентификатор узла, * является узлом ссылки и <<: обозначает хэш слияния.

Для получения дополнительной информации см. или YAML спецификации или Википедии
Пока все хорошо, но есть загвоздка, эти хэш слияния не рекурсивным. Что это означает, заключается в следующем: допустим, вы хотите иметь другое имя отправителя почты в двух средах, вы можете захотеть сделать следующее:

  По умолчанию: и по умолчанию
   input_location: common_input
   output_location: dev_location
   почта:
     SENDER_NAME: отправитель
     smtp_server: your_server
     Логин: ваш_логин
     Пароль: 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
$

К сожалению, что-то пошло не так, проблема, как упоминалось выше, что хэш-слияние не является рекурсивной и при слиянии его заменить почты по умолчанию по почте производства, который имеет только один ключ. Решение / Обходной развернуть еще один уровень:

  common_settings: и common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: и mail_defaults
  SENDER_NAME: отправитель
   smtp_server: your_server
   Логин: ваш_логин
   Пароль: 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"
$

Знаете ли вы, у вас есть еще один уровень вложенности, а вы определенно можете развернуть еще один уровень, но затем она становится беспорядок. Итак, если вы не пытаетесь написать решение Башни Ханоя в конфигурационный файл, то лучше restucture конфигурационный файл, чем копаться в YAML или что-то другое. Но это ваш звонок в любом случае.

Немного оболочки перенаправления

Вот как мы обычно делаем оболочки перенаправления
$ ./pgm.sh args >out.txt 2>err.txt
Я хотел, чтобы изменить его немного, и работать как следует
$ ./pgm.sh args
с требованием вывода и ошибок должны пойти на некоторые файла вычисляется в pgm.sh на основе аргументов. Один показательный случай может быть, когда дата является частью аргументов. Итак, вы хотели бы стандартный вывод пойти сказать / файл / каталог / pgm_out_YYYYMMDD.txt 1

Проблема с стандартным способом перенаправления N>file.txt т.е. связать дескриптор файла file.txt в N, то, что он работает только для вновь раздвоенной процесс, а не для текущего процесса.
так
$ echo hi 1>out.txt ; echo hii . пошлет привет к out.txt но выведет на стандартный вывод НИ 2

Здесь exec приходит к нам на помощь. Если мы добавим exec 1>somefile.txt то выход из остальной части скрипта пойдет somefile.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh будет перенаправлять привет, а также к НИ out.txt

Точно так же, чтобы перенаправить стандартный вывод, а также стандартный поток ошибок мы будем делать что-то вроде этого
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

Для масштабирования или не в масштабе

Говоря о горизонтальной разделов базы данных, DHH из ROR известность о том, что масштабирование вещи могут подождать, безусловно, ждать до того момента вашего бизнеса требуют этого. Его статья, безусловно, имеет смысл для небольших установок сказать стартапов. Не скажу, что в стартапы вы должны написать демо-программ, но, учитывая, что есть только 24 часов в день вы должны сосредоточиться на обслуживании скажем 1000 пользователей в более чем способ выполнения потере сна из-за беспокойства о том, как будет мое заявление обрабатывать нагрузку 13142000 пользователей. Если вы получаете те многие пользователи вы узнаете, как в масштабе. Для стартапов масштабируемость хороший проблему решить, но гораздо лучше, проблема есть, я имею в виду любого стартапа хотелось бы столкнуться с этой проблемой!

В другой смежной статьи Джереми Зоодни пишет вы не должны зависеть от г-н Мур, если у вас есть проблемы масштабируемости.

Поскольку эти статьи относятся к закону Мура , я не могу не написать, что закон Мура должен быть одним из наиболее обобщенный закон в области компьютерных наук. Со своей оригинальной предсказание о плотность размещения транзисторов, этот закон в настоящее время привел везде вы столкнетесь с экспоненциальным ростом.