Pull to refresh
381
0.4
Дмитрий Котеров @DmitryKoterov

Пользователь

Send message

Ликбез по передаче параметров по значению в конструкторы и сеттеры (современный C++, примеры)

Reading time 4 min
Views 19K
Судя по комментам habr.com/ru/post/460831/#comment_20416435 в соседнем посте и развернувшейся там дискуссии, на Хабре не помешает статья, как правильно передавать аргументы в конструктор или сеттер. На StackOverflow подобного материала полно, но тут что-то я не припомню.

Потому что пример в той статье полностью корректен, и автор статьи абсолютно прав. Вот этот пример:

// Хорошо.
struct person {
  person(std::string first_name, std::string last_name)
    : first_name{std::move(first_name)} // верно
    , last_name{std::move(last_name)} // std::move здесь СУЩЕСТВЕНЕН!
  {}
private:
  std::string first_name;
  std::string last_name;
};

Такой код позволяет покрыть все (ну ладно, почти все) возможные варианты использования класса:
Читать дальше →
Total votes 46: ↑45 and ↓1 +44
Comments 76

PHP-расширение dom_varimport: быстрое преобразования вложенных массивов в DOMDocument

Reading time 3 min
Views 7.8K
Некоторые проекты используют XSLT в качестве основного «движка» шаблонов. Помимо известных недостатков XSLT (например, его многословности, относительной медлительности и т.д.) у него есть и преимущества: «стандартность» языка, его идеология отсутствия «побочных эффектов» и pattern matching, возможность при необходимости вызывать методы helper-классов из шаблонов (через exslt-расширение). Какое-то время назад я выкладывал библиотеку ShortXSLT, позволяющую вместо громоздких <xsl:value-of select="/root/abc"/> и <xsl:choose>...</xsl:choose> писать просто {/root/abc} и {if...}...{elseif}...{/if} без потери производительности, так что проблема многословности отчасти решается.

Но сейчас речь не о преимуществах и недостатках XSLT (я уверен, и противники, и сторонники этой технологии найдутся в изобилии). Я бы хотел описать один прием, который удобно применять в существующих проектах с XSLT-шаблонами, и привести ссылку на библиотеку, реализующую данный прием с хорошей производительностью.

Передаем данные в XSLT, минуя генерацию текстового представления XML

Представьте, что у нас есть контроллер, генерирующий некоторый вложенный PHP-список объектов для отображения на странице. Он должен этот массив преобразовать в XML, который потом пойдет на вход XSLT-шаблону. Хорошо бы, чтобы данное преобразование из структур PHP в XML выполнялось не вручную в каждом контроллере, а был некоторый промежуточный слой абстракции, который умеет применять XSLT-шаблон прямо к PHP-данным, минуя текстовое XML-представление. Так мы уменьшим вероятность ошибок, да и письмо сократится. Мы сможем работать с XSLT-шаблонами напрямую, минуя XML-представление данных.

Некоторое время назад я написал на Си PHP-расширение dom_varimport (также выложено на GitHub). Оно содержит одноименную функцию, на вход которой подается объект DOMDocument и PHP-массив любой вложенности. Функция заполняет переданный ей DOMDocument XML-представлением входного массива, и делает она это очень быстро — примерно в 20 раз быстрее, чем делал бы код, написанный на чистом PHP. Большой документ размером около 1 МБ с тысячами вложенных свойств и объектов формируется примерно за 1-2 миллисекунды.

Например, вызов:
Читать дальше →
Total votes 23: ↑20 and ↓3 +17
Comments 11

Используем MongoDB вместо memcached: быть или не быть?

Reading time 5 min
Views 15K
На тему «использование MongoDB вместо memcached» гуглится немало историй успеха. Такое ощущение, что есть широкий класс задач, для которых идея работает неплохо: прежде всего это проекты, где интенсивно используется тэгирование кэша. Но если вы попробуете, то заметите, что в MongoDB не хватает функции удаления из кэша записей, которые читаются реже всего (LRU — Least Recently Used). Как поддерживать размер кэша в разумных рамках? LRU — это, кстати, «конек» memcached; вы можете писать в memcached, не задумываясь о том, что ваш кэш переполнится; но как же быть с MongoDB?

Раздумывая над этим, я написал на Python небольшую утилиту CacheLRUd (выложена на GitHub). Это демон для поддержки LRU-удаления записей в различных СУБД (в первую очередь, конечно, в MongoDB). Ферма таких демонов (по одному на каждой MongoDB-реплике) следит за размером коллекции, периодически удаляя записи, к которым доступ на чтение производится реже всего. Отслеживание фактов чтения той или иной записи кэша происходит децентрализовано (без единой точки отказа) по протоколу, основанному на UDP (почему так? потому что «наивный» вариант — писать из приложения в мастер-базу MongoDB при каждой операции чтения — плохая идея, особенно если мастер-база окажется в другом датацентре). Читайте подробности чуть ниже.

Но зачем?
Читать дальше →
Total votes 22: ↑19 and ↓3 +16
Comments 27

Настраиваем RAID1+LVM (для снапшотов файловой системы) в Hetzner и ServerLoft

Reading time 4 min
Views 25K

Завалялась у меня тут инструкция, как включить LVM для корневой файловой системы на двух популярных dedicated-хостингах: Hetzner и ServerLoft. Публикую ее здесь.

LVM в Linux используется, в частности, чтобы единомоментно создавать «замороженные» снапшоты файловой системы, которые можно потом спокойно бэкапить, в то время как сервер продолжает работать. Это очень удобная функция, особенно для серверов баз данных: можно делать инкрементный бэкап базы данных, например, при помощи файлового rdiff-backup или duplicity (в том числе на удаленный FTP-сервер, бесплатное и быстрое место на котором предоставляют многие хостеры). Что касается RAID-1 (зеркалирование на 2 дисках), то оно абсолютно необходимо на сервере, чтобы при выходе из строя одного из дисков его можно было заменить, не останавливая машину. Конечно же, нужно ставить LVM поверх RAID-1.

Но беда в том, что ни Hetzner, ни ServerLoft не позволяют включить LVM при первичном создании машины «при помощи одной лишь мышки». Вместо этого они дают возможность установить один из фиксированных образов ОС, максимум что — с включенным RAID-1. Ниже — две инструкции, как переключить такую «налитую» машину на использование LVM для корневой файловой системы, а потом — короткий пример того, как работать со снапшотами. Работать будем с Ubuntu Server 12.04 minimal (для других ОС конфигурация может отличаться).
Читать дальше →
Total votes 19: ↑17 and ↓2 +15
Comments 13

Notifus: перенос GMail-писем, на которые вам так и не ответили, во Входящие

Reading time 3 min
Views 7.1K

Речь пойдет о микросервисе «Notifus», который я вначале делал для собственного использования, а затем выложил наружу. Notifus — это браузерное расширение, добавляющее новый функционал к GMail. Его главная цель — освободить нашу голову от беспокойства: ответят на письмо или нет? Расширение помогает нам «вспоминать» о письмах, на которые мы так и не получили ответа, перенося их обратно во Входящие и помечая непрочитанными.

Для чего же это нужно? Чтобы вы могли вежливо напомнить человеку: вы все еще ждете от него ответа (и, как часто бывает, побудить этим напоминанием к действию).

Мир, увы, несовершенен, и зачастую сценарий переписки с третьей стороной (чаще — вне вашей компании, но иногда и внутри) выглядит так:

  1. Вы пишете письмо с вопросом или предложением.
  2. Проходит неделя, ответа нет. Вы пишете письмо вида «Нет ли новостей?».
  3. Если снова нет ответа несколько дней, то вы пишете еще раз: «Ответьте, пожалуйста! Очень жду.».
  4. И в результате вы, спустя пару недель, наконец получаете ответ на свое письмо.
Читать дальше →
Total votes 39: ↑38 and ↓1 +37
Comments 28

RealSync — односторонняя синхронизация исходников в реальном времени для веб-разработчиков

Reading time 6 min
Views 30K
Представляю общественности утилиту RealSync (GPL). Ее призвание — облегчить работу тех, кто периодически мучается от лагов сетевой папки Samba при поиске/редактировании файлов веб-проекта. Идея RealSync в том, что вы теперь работаете с файлами сайта на локальной машине в привычной IDE, а результат, как и прежде, смотрите на удаленном разработческом веб-сервере, куда RealSync копирует изменения в реальном времени. В результате вы можете, например, запустить поиск по всем файлам в IDE — они же локальные, а не подключены через сетевую папку по Samba, так что поиск работает очень быстро; при этом ваш Ctrl+S продолжает попадать на сервер моментально, как и при работе через сетевую папку.

RealSync — утилита для Windows, MacOS и Linux, позволяющая в реальном времени содержать на удаленном сервере точную копию файлов (например, скриптов на PHP, Python, Ruby и др.) из папки на вашем локальном компьютере, даже в условиях плохой связи, когда вы работаете из дома. Все изменения, производимые в локальной папке, попадают на сервер практически моментально (задержка около 0.2 с), независимо от того, сколько этих изменений и каким именно образом они были внесены (хоть через IDE, хоть через Блокнот или Far).

Главное отличие RealSync от аналогов — в том, что он крайне устойчив к нестабильности интернет-соединения, реконнектам и тайм-аутам. При этом используется SSH-соединение, доступ через которое конфигурируется автоматически при первом запуске утилиты (т.е. не нужно возиться с ключами — настройка производится в интерактивном режиме).

Фактически, случайно «убить» RealSync почти невозможно. Вы можете держать его постоянно свернутым в трее и забыть про его существование (CPU он почти не ест). Если утилита видит, что соединение разорвалось на длительный срок, автоматически запускается знакомый многим алгоритм RSYNC для быстрого копирования большого количества различий. В режиме же реального времени применяется собственный протокол поверх SSH, чтобы при нажатии Ctrl+S в редакторе вы сразу же видели изменения на сервере. Передача файла сопровождается приятным «треньканьем» (отключаемым при необходимости в конфиге), а временная потеря связи — покраснением иконки (когда связь восстановится, иконка обратно станет серой, а RealSync «догонит» накопившиеся изменения).

И зачем этот велосипед, когда есть Samba или Денвер или XAMPP?

Читать подробности
Total votes 58: ↑54 and ↓4 +50
Comments 170

Logreplica: сбор логов со всего кластера в единую точку в реальном времени

Reading time 4 min
Views 7.5K
Я продолжаю делиться полезными утилитами, которые использую в различных проектах. На этот раз речь пойдет о logreplica — простом инструменте, который позволяет организовать надежную передачу логов с разных серверов кластера на единую машину с большими дисками «в реальном времени». Это очень удобно, если вы хотите централизованно мониторить или анализировать логи со всего кластера так, как будто бы они пишутся напрямую на единственную машину.

Можно сказать, что logreplica задумывался как более удобный и надежный способ сбора логов в центральное место, нежели способ использования настроек syslog/syslog-ng.

Преимущество logreplica — в простоте конфигурирования: вы единственный раз настраиваете «маску» имен лог-файлов и задаете адреса машин-источников, и в дальнейшем логи, соответствующие маске, автоматически и «на лету» складываются на центральную машину (в том числе если на машинах-источниках появляются новые лог-файлы, неизвестные на момент старта logreplica). При добавлении новой машины на ней не нужно ничего донастраивать: достаточно включить ее имя в конфиг-файл.
Читать дальше →
Total votes 30: ↑26 and ↓4 +22
Comments 47

Vzmem: визуальное непротиворечивое распределение памяти для OpenVZ

Reading time 3 min
Views 2.1K
В какой-то момент мне надоело высчитывать с калькулятором значения VMGUARPAGES и PRIVVMPAGES для OpenVZ и следить, чтобы они были согласованы для разных виртуальных машин (например, чтобы физическая память распределялась между машинами непротиворечивым образом, и одна машина не могла «отъесть» физическую память у другой и увести ее в своп, например). И я написал небольшую, но очень удобную «псевдографическую» утилитку, — vzmem, — которой сейчас и хочу поделиться. Надеюсь, она кому-нибудь пригодится.

Как использовать dklab_vzmem


Vzmem — это утилита командной строки, которая позволяет «визуально» распределять физическую память между несколькими виртуальными машинами OpenVZ так, чтобы одна машина «не залезала» на другую. Т.е. если нужно увеличить память для какой-то из машин, всегда видно, откуда эту память требуется «откусить»: от одной из существующих машин или от пула свободных блоков.
Читать дальше →
Total votes 27: ↑25 and ↓2 +23
Comments 3

У iPad от Apple все еще нет конкурентов

Reading time 3 min
Views 775
Примечание автора: Джим Далримпл пишет об Apple более 15 лет. Вы можете прочитать его статьи на Twitter @jdalrymple и на веб-сайте у The Loop.

Прошел уже почти год с тех пор, как компания Apple выпустила iPad, и осталось менее недели до официального представления iPad 2, но до сих пор у них нет никакой конкуренции.

Есть несколько хороших причин успеха Apple, а также и того, почему ее конкуренты испытывают трудности в соперничестве против короля цифровых девайсов. Все дело в инфраструктуре, а также в сочетании выпускаемых девайсов и программного обеспечения. Следует отметить и тот факт, что конкуренты не претендуют на первое место.

Давайте посмотрим на это по отдельности.
Читать дальше →
Total votes 45: ↑16 and ↓29 -13
Comments 23

AT&T запускает сервис Placecast для геолокационного шоппинга

Reading time 1 min
Views 436
AT&T запускает новый геолокационный сервис шоппинг-оповещений на платформе Placecast. Провайдер представляет ShopAlerts — сервис, оповещающий потребителей, находящихся рядом с магазином бренда, участвующего в акции, о специальных предложениях и скидках. В список входят такие бренды как HP, KMart и JetBlue.

Для оформивших подписку абонентов AT&T ShopAlerts уже доступен в Нью-Йорке, Лос Анджелесе, Чикаго и Сан-Франциско. К лету планируется развернуть программу по всей территории США и увеличить число партнеров, принимающих участие в акции.

Сервис поддерживается производимой Placecast программой рассылки текстовых сообщений от брендов потребителю, исходя из их местонахождения. Предоставляется возможность выбрать различные способы получения рассылки — в магазине, в Интернете, по sms, на мобильных вебсайтах или на Facebook.

Как только технология активирована, потребители начинают получать уведомления о том, что они находятся рядом с интересующим их местом, а также о скидках и специальных акциях. Технология ShopAlerts использует функцию geo-fence, позволяющую настраивать виртуальные границы, в пределах которых покупатель будет получать информацию от розничных продавцов. Последние, в свою очередь, могут настроить сервис в соответствие со стратегическими задачами бизнеса.

Для Placecast это уже не первая крупная сделка. Не так давно компания заключила аналогичный договор с Европейским поставщиком мобильных услуг О2. Участниками партнерской программы ShopAlerts является ряд розничных сетей, таких как, например, American Eagle Outfitters и North Face.
Total votes 6: ↑3 and ↓3 0
Comments 3

Библиотека dklab_rowlog для версионирования строк в таблицах PostgreSQL

Reading time 4 min
Views 2.9K
В продолжение сегодняшнего топика Версионность и история данных — поделюсь простеньким инструментом, который мы используем.

Dklab_rowlog — это библиотека из нескольких хранимых процедур PostgreSQL, позволяющая добавить версионирование записей к любой таблице в БД. Иными словами, что бы ни происходило с таблицей, как бы данные там ни менялись (добавлялись/удалялись), это будет отражено в специальной табличке-логе.

Преимущества:
  • Версионирование добавляется к любой таблице за 1 минуту с использованием 1 SQL-команды.
  • Можно указать, какие колонки надо сохранять, а какие — нет (что экономит место). При этом запись в лог добавится только в случае, если хотя бы одна из указанных колонок изменилась.
  • Можно указать колонку, которая будет трактоваться как «ID автора изменения».
  • Можно задать колонки, которые будут логироваться в любом случае, независимо от того, менялись они или нет.

Примеры использования


Предположим, нам нужно логировать изменения вот в такой табличке:
Читать дальше →
Total votes 57: ↑53 and ↓4 +49
Comments 13

Прямая работа с SMS-сервисом МТС: история одной интеграции

Reading time 6 min
Views 40K
Многие считают, что SMS — одна из причин того, что Твиттер так хорошо «выстрелил» на Западе. В США и ряде стран Европы твиты можно как публиковать, так и получать через SMS, при этом цена исходящего твита равна цене обыкновенной SMS, а входящие сообщения — бесплатны. Для пользователей без смартфонов (коих большинство) это значительно снижает порог на вход.

В этой статье я поделюсь опытом прямой интеграции с крупным российским сотовым оператором (обратите внимание: именно напрямую, а не через шлюзы), а также на вводном уровне порассуждаю об околоSMS-ных технологиях и протоколе SMPP — без скучных таблиц и спецификаций, в стиле короткой детективной истории.
Читать дальше →
Total votes 62: ↑53 and ↓9 +44
Comments 80

dklab vzfirewall: простое управление firewall-ом в OpenVZ

Reading time 5 min
Views 2.6K
Dklab vzfirewall — это утилита для OpenVZ, позволяющая конфигурировать firewall без утомительного ввода iptables-правил и без «завязки» на множество IP-адресов виртуальных машин. Главный принцип утилиты — быть настолько простой в использовании, насколько это возможно. Цель, которую я преследовал при создании утилиты, — избавить системного администратора от головной боли, связанной с конфигурированием iptables; надеюсь, у меня это хоть немного получилось.

Конечно, я понимаю, что вам может быть страшновато пробовать vzfirewall сразу на продакшен-сервере. Наверняка забудете какие-то порты открыть из нужных. Поэтому хороший момент, когда удобно «пощупать» vzfirewall, — это в момент установки нового сервера с OpenVZ (ну или на дев-сервере). Вот тогда-то уж можно развернуться.

Примеры


Листинг 0: Установка
cd /usr/sbin
wget http://github.com/DmitryKoterov/vzfirewall/raw/master/vzfirewall
chmod +x vzfirewall

Листинг 1: Файл /etc/sysconfig/vz-scripts/101.conf
Читать дальше →
Total votes 35: ↑28 and ↓7 +21
Comments 14

«Прямой эфир» для общения c посетителями вашего сайта

Reading time 3 min
Views 5.4K
Недавно я анонсировал Realplexor — habrahabr.ru/blogs/hi/79189 — однопоточный событийно-ориентированный Comet-сервер, написанный на Perl и имеющий готовое API для JavaScript и PHP. С его помощью можно создавать сайты, пользователи на которых взаимодействуют друг с другом в реальном времени, не перезагружая страницу и без значительного расхода трафика.

Сегодня я хочу представить и, как водится, немного «покопаться в моторе» первой версии продукта Прямой эфир, работающей на платформе РуТвит с применением Realplexor-а. Это виджет, который вебмастер может за 1 минуту установить на свой сайт, чтобы устроить микроблоггинг-общение с аудиторией в режиме реального времени.

С помощью «Прямого эфира» аудитория сайта общается между собой в реальном времени — «прямо сейчас», находясь в отдельной «чат-комнате», привязанной к вашему сайту. Виджет можно использовать для «прямого диалога» сразу со многими пользователями: например, для приема багов или фич-реквестов. Если пользователь, с которым вы общались, всё еще на сайте, вы увидите его присутствие: около его имени будет зеленый кружочек.

Для начала общения посетителю сайта нет необходимости проходить процедуру регистрации. Авторизация производится по OpenID. Т.е. ему достаточно иметь аккаунт на Яндексе, Google, LiveJournal и т.д., чтобы начать писать сообщения; не требуется даже e-mail.
Читать, как это устроено внутри
Total votes 60: ↑45 and ↓15 +30
Comments 45

Realplexor: производительный Comet-сервер с API для PHP и Javascript (realtime)

Reading time 5 min
Views 20K
Dklab Realplexor — это Comet-сервер, позволяющий держать одновремено сотни тысяч долгоживущих открытых HTTP-соединений с браузерами пользователей. JavaScript-код, запущенный в браузере, подписывается на один или несколько каналов Realplexor-а и вешает обработчик на поступление данных. Сервер может в любой момент записать сообщение в один из таких каналов, и оно будет моментально передано всем подписчикам (хоть одному, хоть тысяче), в режиме реального времени и с минимальной нагрузкой для сервера.

Хотя идейным вдохновителем Realplexor-а был предыдущий проект, dklab_multiplexor, код Realplexor-а не имеет с ним практически ничего общего. Поэтому я и решил сменить название. Несопоставимы также возможности продуктов (см. ниже), да и размер кода увеличился в 7 раз.

Realtime-направление сейчас довольно активно развивается на Западе, и в нем особенно выделяется продукт Tornado — событийно-ориентированный веб-сервер на языке Python. Правда, Tornado — это не столько Comet-сервер, сколько инструмент, с помощью которого можно запрограммировать «в том числе» и Comet-сервер. Ключевые слова: Comet, Push Server, Long polling, JavaScript, XMLHttpRequest.

Главные преимущества Realplexor-а:
  • простота использования: наличие API для JavaScript, API для PHP (в будущем — и для других языков);
  • простота конфигурирования;
  • широкий функционал (либо отстутствующий, либо недоступный напрямую в аналогах).

Лучше один раз увидеть...


Я сделал отдельную онлайн-песочницу, чтобы продемонстрировать функционал нового Realplexor-а и то, для чего вообще нужны Comet-серверы (кстати, это физически тот же самый демон Realplexor-а, что использует мой новый стартап РуТвит). Песочница реализует что-то типа многоканального чата: зайдя, вы получите как будто бы 2 независимых «браузера», запущенных на разных компьютерах.
  • Верхний «браузер» отображает каналы — в них моментально появляются новые сообщения, как только кто-то их туда отправляет на стороне сервера. Конечно же, эту страницу могут просматривать одновременно сотни тысяч пользователей, и они все будут видеть одно и то же (реализовано с использованием Realplexor JavaScript API). Можно «на лету» добавлять новые каналы (подписка) или скрывать уже имеющиеся (отписка).
  • Нижний браузер содержит формы, позволяющие добавлять сообщение в произвольный канал, указав его имя. Форма AJAX-ом отправляется на сервер, и уже там PHP-скрипт записывает в Realplexor полученный текст через PHP API. (И да, так можно чатиться.)
По умолчанию на странице открыто 3 канала с именами Alpha, Beta и RuTvit. Но, конечно, вы можете закрыть эти каналы и открыть новые. Вот, например, страница с единственным открытым каналом по имени Habrahabr: http://rutvit.ru/realplexor/demo?ids=Habrahabr.



Песочница демонстрирует следующие функции Realplexor-а:
Читать дальше →
Total votes 99: ↑92 and ↓7 +85
Comments 141

Авторесайз IFRAME и безопасный способ передачи информации с одного домена на другой

Reading time 1 min
Views 11K
Как известно, при работе с фреймами для обеспечения безопасности браузеры не позволяют JavaScript-коду обращаться со страницы одного домена на страницу другого домена. В этой краткой статье мы рассмотрим аспекты кросс-доменной работы в JavaScript, опишем один из «хороших» частных случаев, а в конце — я надеюсь в хабракомментах получить ответы на оставшиеся вопросы.

UPD1: те, кто здесь впервые, — обязательно читайте комментарии к этой статье, в них очень много интересного накидали (как я и надеялся). Спасибо!

UPD2: найдено решение задачи авторесайза для всего, кроме Opera < 10.

UPD3: полностью кроссбраузерное решение задачи с ресайзом приводится ниже. Его особенности: а) не портится history, б) работает даже в Опере 7 и IE6, в) для ускорения работы высота фрейма всегда делается кратной N=30 пикселям. Фактически, там 2 алгоритма — для IE (через location.hash) и для «не-IE» (через window.name и «простукивание» возможных высот в цикле). См. также комментарии к статье, там разъяснения, почему так, а не иначе.

UPD4: статья начала принимать черты монументальной, посему она переехала ко мне в Наблы на dkLab: dklab.ru/chicken/nablas/58.html — там же все примеры кода самой последней актуальности. Но, конечно, в случае изменений я буду их и тут тоже анонсировать, добавляя UPD5, UPD6 и т.д.
Total votes 39: ↑28 and ↓11 +17
Comments 71

OAuth: описание протокола простым и понятным языком

Reading time 16 min
Views 189K
OAuth — популярный протокол, который позволяет социальным сервисам интегрироваться между собой и дает безопасный способ обмена персональной информацией. OAuth может связать между собой 2 сервиса, каждый из которых имеет свою пользовательскую базу — именно их я в данном случае называю «социальными». Когда начинаешь работать с OAuth, первое ощущение — что протокол весьма сложен и избыточен. В этой статье я попытаюсь объяснить основы OAuth человеческим языком.

Пример кросс-авторизации


Вернемся в 2005-й год и представим, что мы пишем социальную сеть. В ней имеется форма импорта контактов из адресной книги GMail. Что нужно для доступа к контактам GMail? Конечно, логин и пароль от ящика. Но если мы попросим ввести их на нашем сайте, пользователь заподозрит неладное. Где гарантия, что мы не сохраняем на сервере введенные пароли? Поэтому нам хочется, чтобы пароль вводился только на сайте GMail, и после этого доступ к контактам через API GMail предоставлялся нашей социальной сети (возможно, на время).
Под катом - повествование с примерами
Total votes 134: ↑124 and ↓10 +114
Comments 34

Какова самая релевантная сортировка в лентах? По свежести!

Reading time 1 min
Views 947
Например, зачем нужен поиск по Хабру? Во многом для того, чтобы найти статью по принципу «я это недавно читал, где-то она должна быть». Сегодня я так искал свежий топик про SOAP и др. сайтовые API.

Уже в который раз замечаю, что для решения этой задачи приходится использовать… поиск в Google Reader. Он сортирует результаты по свежести (как и Google Mail, кстати), и это оказывается самым релевантным:



Для сравнения то, что выдает поиск этого же слова «SOAP» по Хабру (sphinx?).



Это натолкнуло меня на мысль, что в «ленточных» системах самый свежий ответ в результатах поиска и есть самый релевантный. Как считаете, так ли это?
Total votes 34: ↑27 and ↓7 +20
Comments 18

Подводные камни при использовании кэширования в nginx

Reading time 10 min
Views 56K
В web-сервер и reverse-proxy nginx встроены очень мощные возможности по кэшированию HTTP-ответов. Однако в ряде случаев документации и примеров не хватает, в результате не все получается так легко и просто, как хотелось бы. Например, мои конфиги nginx-а местами написаны кровью. Этой статьей я попробую немного улучшить ситуацию.

В этой статье: а) подводные камни при полностраничном кэшировании; б) кэширование с ротацией; в) создание динамического «окна» в закэшированной странице.

Я буду предполагать, что вы используете связку nginx+fastcgi_php. Если вы применяете nginx+apache+mod_php, просто замените имена директив с fastcgi_cache* на proxy_cache*

Если выбирать, кэшировать ли страницу на стороне PHP или на стороне nginx, я выбираю nginx. Во-первых, это позволяет отдавать 5-10 тыс. запросов в секунду без каких-либо сложностей и без умных разговоров о «высокой нагрузке». Во-вторых, nginx самостоятельно следит за размером кэша и чистит его как при устаревании, так и при вытеснении нечасто используемых данных.

Кэширование всей страницы целиком


Если на вашем сайте главная страница хоть и генерируется динамически, но меняется достаточно редко, можно сильно снизить нагрузку на сервер, закэшировав ее в nginx. При высокой посещаемости даже кэширование на короткий срок (5 минут и меньше) уже дает огромный прирост в производительности, ведь кэш работает очень быстро. Даже закэшировав страницу всего на 30 секунд, вы все равно добьетесь значительной разгрузки сервера, сохранив при этом динамичность обновления данных (во многих случаях обновления раз в 30 секунд вполне достаточно).
Читать дальше →
Total votes 91: ↑87 and ↓4 +83
Comments 83

Встречайте – РуТвит, пульс России

Reading time 3 min
Views 2.3K
RuTvitВстречайте — RuTvit, мой новый стартап.

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

Почему же пришло в голову изобретать российский велосипед, если уже есть Твиттер и Френдфид?
  • В Твиттере при поиске по-русски не учитываются словоформы: «москва», «в москве» — разные результаты.
  • «Трендеж» (trending topics) в Твиттере никогда не показывает популярные русские слова. Понятно, что россиян в Твиттере пока немного, и даже попытки организовать флэш–моб не позволяют прорваться в самые обсуждаемые темы. Однако очень хотелось бы в идеале получить картину происходящего в России и по–русски.
  • Твиттер не обновляет ленту с твитами и комментариями в реальном времени, как это делает, например, Френдфид. А ведь это очень удобно.
  • Твиттер позволяет использовать только английские хэш-теги.
  • Хотя мы все читаем по–английски, пишем мы все же по–русски, и ощущение неудобства от сугубо английских заголовков и пояснительных текстов остается.
  • Я бы хотел подписаться в одном удобном месте на российские СМИ и блоги, вместо которых Твиттер рекомендует мне англоязычных стотысячников.
  • Наконец, у меня много ящиков для разных целей, часть из них — на российских сервисах (потому что они борются с местным спамом лучше, чем это делает Гмейл). Однако у меня нет возможности посмотреть, кто из контактов по почтовой переписке использует Твиттер.
Что уже сделано в РуТвите в отличие от простого повторения Твиттера?
Читать дальше →
Total votes 72: ↑38 and ↓34 +4
Comments 69
1

Information

Rating
1,622-nd
Location
Россия
Registered
Activity