Pull to refresh
33
0
Величко Антон @tonyvelichko

User

Send message

Как Discord хранит миллиарды сообщений

Reading time10 min
Views92K


Discord продолжает расти быстрее, чем мы ожидали, как и пользовательский контент. Чем больше пользователей — тем больше сообщений в чате. В июле мы объявили о 40 млн сообщений в день, в декабре объявили о 100 млн, а в середине января преодолели 120 млн. Мы сразу решили хранить историю чатов вечно, так что пользователи могут вернуться в любой момент и получить доступ к своим данным с любого устройства. Это много данных, поток и объём которых нарастает, и все они должны быть доступными. Как мы это делаем? Cassandra!
Читать дальше →
Total votes 61: ↑60 and ↓1+59
Comments58

Пишем универсальный UICollectionViewLayout

Reading time4 min
Views7.2K
UICollectionView может иметь практически любое расположение элементов. Элементы могут иметь как фиксированные размеры, так и динамические. В данной публикации внимание будет уделено только тем UICollectionViewLayout, размеры элементов которых фиксированы и задаются определенным алгоритмом (типичный пример — расположение иконок на экране Home вашего iPhone). Так же будет сделана попытка описать подход к формированию единого UICollectionViewLayout.

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

image

Читать дальше →
Total votes 22: ↑21 and ↓1+20
Comments0

Про хаскелль для самых маленьких на примере задачи с codefights

Reading time7 min
Views15K

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

Читать дальше →
Total votes 27: ↑27 and ↓0+27
Comments35

Swift улучшаем performSegueWithIdentifier или удобный роутер со сторибордами

Reading time3 min
Views11K
Редкий разработчик под iOS или OS X не использовал сториборды и еще меньше программистов не передавали данные между экранами.
Все мы знаем метод performSegueWithIdentifier и трудности работы с ним.

Начав проект на Swift в один момент мне стало обидно: «Почему мы должны в строго-типизированном языке использовать обертку для передачи данных?»
Через пару минут сформировалось видение решения и в скором времени реализация.

Долго думал, стоит ли писать об этом, поскольку материал крайне небольшой, но эти 50 строк могут вам очень сильно помочь

menuController?.performSegueWithIdentifier(changeItemIdentifier, sender: nil) { segue in
    let controller = segue.destinationViewController as! ChangeMenuItemController
    controller.viewModel.sourceMenuItem = item
}


Таким образом, легко использовать сториборды и роутеры вместе. Устранить разрастание prepareForSegue и увеличить контекст чтения кода. В то же время это не вынуждает отказываться от prepareForSegue при удобных ситуациях.

Разберемся как это работает? Не претендую на уникальность, но мне кажется подход интересным.
Читать дальше →
Total votes 13: ↑11 and ↓2+9
Comments6

Под капотом Redis: Хеш таблица (часть 1)

Reading time9 min
Views38K
Если вы знаете, почему после выполнения `hset mySey foo bar` мы потратим не менее 296 байт оперативной памяти, почему инженеры instagram не используют строковые ключи, зачем всегда стоит менять hash-max-ziplist-entries/hash-max-ziplist-val и почему тип данных, лежащий в основе hash это и часть list, sorted set, set — не читайте. Для остальных я попробую об этом рассказать. Понимание устройства и работы хеш таблиц в Redis критически важно при написания систем, где важна экономия памяти.

О чём эта статья — какие расходы несёт Redis на хранения самого ключа, что такое ziplist и dict, когда и для чего они используются, сколько занимают в памяти. Когда hash хранится в ziplist, когда в dicth и что нам это даёт. Какие советы из модных статей об оптимизации Redis не стоит воспринимать всерьёз и почему.
Читать дальше →
Total votes 38: ↑37 and ↓1+36
Comments2

Шпаргалка Java программиста 2: Триста пятьдесят самых популярных не мобильных Java opensource проектов на github

Reading time39 min
Views167K
Что это и зачем оно надо: Как известно, главное преимущество Java мира в том в нем существует огромное количество open-source проектов на на все случаи жизни, однако найти нужный на github'e не так просто, так как описание проекта часто мало информативно, зачастую сложно даже понять этот проект для Android'a или нет. В этой статье я автоматически и полуавтоматически собрал Java проекты, убрал старые и проекты только для Android'a, выбрал 350 набравших больше всего звезд, разделил по категориям и перевел описания.

Если вы хотите убедиться что базы данных пишут не только на C, найти проекты для работы с большими данными или нейронными сетями, пишите свой язык программирования для JVM и хотите посмотреть как это уже сделано или же просто хотите узнать какие новые возможности можно найти в Java мире open-source то это статья вам, думаю, может пригодится.

В чем смысл серии статей 'Шпаргалки Java программиста'
За время работы Java программистом я заметил, что как правило программисты постоянно и планомерно используют от силы 10-20% от возможностей той или иной технологии, при этом остальные возможности быстро забываются и при появлении новых требований, переходе на новую работу или подготовке к техническому интервью приходится перечитывать все документации и спецификации с нуля. Зато наличие краткого конспекта особенностей тех или иных технологий (шпаргалок) позволяет быстро освежить в памяти особенности той или иной технологии.


Другие статьи серии: часть 1. JPA и Hibernate в вопросах и ответах

Update: Внимание, актуальная версия со много большим количеством ссылок, находиться теперь в моем github'e проекте useful-java-links, по этой ссылке.


Читать дальше →
Total votes 51: ↑43 and ↓8+35
Comments49

Kali Linux 2.0

Reading time1 min
Views164K


Прошло уже более двух лет с момента выхода дистрибутива Kali 1.0. Сегодня вышла 2.0 версия этого дистрибутива.

Краткий экскурс: Kali linux представляет из себя дистрибутив, содержащий множество утилит для проведения тестирования на проникновение — от анализа уязвимостей веб-приложений, до взлома сетей и сервисов и закрепления в системе. Ранее этот дистрибутив был известен под названием Backtrack.
Читать дальше →
Total votes 54: ↑49 and ↓5+44
Comments23

Последовательности в Perl 6 / Rakudo

Reading time3 min
Views7.6K
В Perl 6 введён новый оператор… для задания последовательностей. Вот как это работает:

my @even-numbers  := 0, 2 ... *;    # арифметическая последовательность
my @odd-numbers   := 1, 3 ... *;
my @powers-of-two := 1, 2, 4 ... *; # геометрическая последовательность

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

> my @powers-of-two := 1, 2, 4 ... *; 1;
1
> @powers-of-two[^10]
1 2 4 8 16 32 64 128 256 512

Читать дальше →
Total votes 27: ↑27 and ↓0+27
Comments7

Очень большой Postgres

Reading time9 min
Views85K
Так уж случилось, что последнее время приходилось заниматься оптимизацией и масштабированием различных систем. Одной из задач было масштабирование PostgreSQL. Как обычно происходит оптимизация БД? Наверное, в первую очередь смотрят на то, как правильно выбрать оптимальные настройки для работы и какие индексы можно создать. Если обойтись малой кровью не вышло, переходят к наращиванию мощностей сервера, выносу файлов журнала на отдельный диск, балансировке нагрузки, разбиению таблиц на партиции и к всякого рода рефакторингу и перепроектированию модели. И вот уже все идеально настроено, но наступает момент, когда всех этих телодвижения оказывается недостаточно. Что делать дальше? Горизонтальное масштабирование и шардинг данных.


Читать дальше →
Total votes 48: ↑48 and ↓0+48
Comments28

Сервис временных зон на Ruby и Postgis

Reading time5 min
Views5.3K
В одном из проектов, в которых я учавствовал, возникла задача определения временной зоны по текущей геолокации пользователя. На backend приходила запись, создаваемая пользователем с помощью смартфона. Время приходило не в UTC, но в параметрах содержались координаты.
Конечно, существуют готовые сервисы (например The Google Time Zone), но все они платные или сильно ограничены по функционалу. Вот я и решил написать собственный сервис.
Читать дальше →
Total votes 16: ↑15 and ↓1+14
Comments4

WordPress для параноиков, часть 1

Reading time9 min
Views62K
Итак, если вы счастливый владелец nginx, знатный параноик и за каким-то чертом решили поставить wordpress, то… Первое, что пришло в голову — это «надо ограничить сему творению свободу!».

Настройки учетной записи, как и настройки php5-fpm, я опущу, так как у каждого свои тараканы, а кто-то вообще на apache запускает. Но вот общие для Wordpress я опишу в этой части. Напишу о том, что сделал, что получилось и почему.
Читать далее
Total votes 55: ↑49 and ↓6+43
Comments10

И ещё раз про распознавание номеров

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



В любых задачах обработки изображений 90% успеха — хорошая база данных. Репрезентативная и большая. Весной мы обещали выложить полную базу изображений того, что нам придёт. Подписка блога заканчивается, поэтому время выполнить обещание (блог может продлят, а может и нет). Наш сервер работал 95% времени, начиная с первого поста. Всё что пришло теперь доступно + мы сделали отдельные базы по вырезанным номерам и нарезанным символам.

Под катом ссылки на базу + её анализ + немного кода + небольшой рассказ о том, что будет сделано дальше с нашим сервером/жизнью проекта.
Читать дальше →
Total votes 39: ↑37 and ↓2+35
Comments21

Postgres. Выборка N случайных записей

Reading time6 min
Views36K
При работе над одним проектом возникла необходимость написать некое подобие тестовой системы. Задача формулировалась примерно так:

  • из N записей в базе необходимо выбрать m (3-5) случайных строк в серии из k выборок (преимущественно k=2).

А теперь то же самое человеческим языком: из таблицы нужно два раза выбрать по 3-5 случайных записей. При этом не должно быть дубликатов и выборка должна происходить случайным образом.

Первое, что приходит в голову:

 SELECT *
  FROM data_set
  WHERE id NOT IN (1,2,3,4, 5)
  ORDER BY random()
  LIMIT 5;

И это даже будет работать. Вот только цена такого решения…
Читать дальше →
Total votes 56: ↑51 and ↓5+46
Comments47

Строго типизированные комбинаторы для построения парсера и синтезатора естественного языка

Reading time13 min
Views7K
Известные ParserCombinator'ы и Parboiled предназначены исключительно для разбора формальных языков. Мы же решаем задачу разбора естественного языка и при этом хотим, чтобы с помощью той же грамматики можно было осуществлять синтез фраз на естественном языке, отражающих требуемую нам семантику. Было бы удобно иметь возможность описывать языковые конструкции вместе с правилами абстрагирования/конкретизации.

Например,

  1. Преобразование числительных в число («десять» -> 10:Int)
  2. и обратно (10:Int -> «десять» («десятый», «десяток» ...))
  3. Преобразование числительных вместе с единицей измерения («десять рублей» <-> NumberWithMeasurement(10, RUB))
  4. Неполный адрес («ул. Яблочная» <-> Address(street=«Яблочная»))
  5. Адрес в пределах города («улица Яблочная дом сто двадцать три квартира сорок пять» <-> Address(street=«Яблочная», building=123, flat=45))
  6. Телефон (256-00-21 («двести пятьдесят шесть ноль ноль двадцать один») <-> NumericalSequence(256,0,0,21))

Причём хотелось бы иметь следующие системные свойства:

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

Под катом — описание подхода, реализованного в библиотеке synapse-typed-expressions. Рассмотрены только числительные, но подход естественным образом распространяется на другие вышеупомянутые формальные языковые конструкции.
Читать дальше →
Total votes 20: ↑16 and ↓4+12
Comments2

Примерочная на основе дополненной реальности VIPodium

Reading time1 min
Views6.1K
На прошлой неделе была представлена новая виртуальная примерочная на основе дополненной реальности — Virtual Interactive Podium.

Российская компания Fitting Reality впервые представила свой продукт на конференции DEMO Fall 2011, которая проходила в Санта Кларе (Калифорния).



VIPodium, основанный на технологии дополненной реальности, позволяет в режиме реального времени примерить сотни элементов одежды и аксессуаров. Пользователь не только видит себя на экране в новой одежде, но и управляет программой простыми жестовыми командами: взмахами рук и нажатием невидимых кнопок прямо в воздухе.
Читать дальше →
Total votes 24: ↑15 and ↓9+6
Comments31

Нахождения минимального расстояния до кривой с помощью API Яндекс.Карт

Reading time8 min
Views7.8K
Здравствуйте уважаемые читатели.

Если вы когда-нибудь сталкивались с задачей описанной в топике, то наверное удивлены, тем что в посте будет что-либо кроме ссылки на описание метода getClosestPoint(), потому сразу скажу, что мое решение конечно основывается именно на ней. Однако, мне хочется поделиться не столько алгоритмической красотой (ее за меня реализовывала команда Яндекса создавая API), сколько готовым решением поставленной перед мной задачей.

Наша компания занимается в том числе представлением услуг IP-телефонии и интернета, а так же километрами собственного оптоволокна. для нас весьма важен вопрос на сколько далеко от кабеля находится офис предполагаемого клиента.

Готовое решение, от создания карты с маршрутами оптики, до реализации встроенной в формы определения кратчайшего расстояния ищите под катом.
Читать дальше →
Total votes 24: ↑23 and ↓1+22
Comments6

Positive bias или что общего у мирового кризиса с сорванным дедлайном

Reading time3 min
Views827
image
Прошедшая неделя ознаменовалась обвалом на рынках, пессимистичной статистикой по ключевым американским показателям и всеобщими опасениями, что дальше будет хуже. Сейчас только ленивый не пишет про возможную мировую рецессию. Я как раз ленивый поэтому не буду. А напишу лучше про то, как мы раз за разом садимся в лужу в наших оценках. И неважно, что мы оцениваем — свои профессиональные качества, дедлайн проекта или курс акций. Всему виной — positive bias.
Читать дальше →
Total votes 44: ↑39 and ↓5+34
Comments35

Palm's dead baby, Palm's dead… или все же нет?

Reading time4 min
Views449
Мы живем в интересное время. Время, когда полностью перестраивается телекоммуникационный рынок. Теснятся и уходят старожилы, появляются новые герои и лидеры.

Почти одновременно рынок взорвали две громких новости, последствия от которых мы будем наблюдать, на мой взгляд, еще очень и очень долго. Новости, которые в будущем весьма ощутимо скажутся на расстановке сил на рынке — приобретение компанией Google компании Motorola и новость от HP о сворачивании работ по WebOS. Вроде бы события и не связанные, но, по-моему, кое-что общее между ними есть.
Читать дальше →
Total votes 46: ↑41 and ↓5+36
Comments28

Основные принципы организации приема SMS платежей. Преимущества и тонкости оплаты по SMS, описание платежных SMS систем.

Reading time10 min
Views22K
Ни для кого не секрет, что сегодня бизнес в интернете развивается семимильными шагами. Новые интернет проекты открываются каждый день — большинство из них, правда, также быстро и закрывается, не успев развиться и привлечь аудиторию. Те, кто аудиторию привлек, начинает задумываться о способах ее монетизации — превращении показателей счетчиков в деньги.

Методы монетизации аудитории


Традиционно существует два основных способа заработка на аудитории проекта: продажа его рекламных возможностей и предоставление пользователям платных сервисов.
И если про первый уже сказано достаточно много, то второй еще только начинает свое активное развитие.

По предоставляемых пользователям услуг можно выделить три основных категории сайтов:
  • Специализированные интернет-магазины и сервисы (магазины программного обеспечения, музыки, видео, рефератов, темплейтов веб-дизайнов, документации, специализированных статей для профессионалов, сервисы доставки сообщений пользователям, розыгрыши и викторины, ответы на вопросы), основной задачей которых является предоставление посетителям специфических услуг или продажа контента (с оплатой за единицу контента). Такие ресурсы считают получение дохода от рекламы второстепенным заработком.
  • Сайты, доступ к которым можно получить только на платной основе (нишевые и узкотематические профессиональные ресурсы с ценной информацией для определенной аудитории, ресурсы для взрослых) – обычно пользователям демонстрируют только общую информацию о ресурсе, а для того, чтобы получить к нему доступ, требуется сначала внести оплату. Рекламы на таких ресурсах практически не бывает.
  • Ресурсы, предлагающие своим пользователям дополнительные сервисы и услуги – так, например, на сайте знакомств пользователи могут выделить свою анкету в результатах поиска, а в социальных сетях подарить другу какой-нибудь подарок.

Читать дальше →
Total votes 1: ↑1 and ↓0+1
Comments54
1
23 ...

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity