• [ В закладки ] Алгоритмы и структуры данных в ядре Linux, Chromium и не только

    • Translation
    Многие студенты, впервые сталкиваясь с описанием какой-нибудь хитроумной штуки, вроде алгоритма Кнута – Морриса – Пратта или красно-чёрных деревьев, тут же задаются вопросами: «К чему такие сложности? И это, кроме авторов учебников, кому-нибудь нужно?». Лучший способ доказать пользу алгоритмов – это примеры из жизни. Причём, в идеале – конкретные примеры применения широко известных алгоритмов в современных, повсеместно используемых, программных продуктах.



    Посмотрим, что можно обнаружить в коде ядра Linux, браузера Chromium и ещё в некоторых проектах.
    Читать дальше →
    • +140
    • 80.4k
    • 15
  • Эволюция структур данных в Яндекс.Метрике

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



      Но обработка данных — это не проблема. Проблема в том, как и в каком виде сохранять результаты обработки, чтобы с ними можно было удобно работать. В процессе разработки нам приходилось несколько раз полностью менять подход к организации хранения данных. Мы начинали с таблиц MyISAM, использовали LSM-деревья и в конце концов пришли к column-oriented базе данных. В этой статье я хочу рассказать, что нас вынуждало это делать.

      Яндекс.Метрика работает с 2008 года — более семи лет. Каждый раз изменение подхода к хранению данных было обусловлено тем, что то или иное решение работало слишком плохо — с недостаточным запасом по производительности, недостаточно надёжно и с большим количеством проблем при эксплуатации, использовало слишком много вычислительных ресурсов, или же просто не позволяло нам реализовать то, что мы хотим.
      Читать дальше →
    • 15 тривиальных фактов о правильной работе с протоколом HTTP

        Внимание! Реклама! Пост оплачен Капитаном Очевидность!

        Ниже под катом вы найдёте 15 пунктов, описывающих правильную организацию ресурсов, доступных по протоколу HTTP — веб-сайтов, «ручек» бэкенда, API и прочая. «Правильный» здесь означает «соответствующий рекомендациям и спецификациям». Большая часть ниженаписанного почти дословно переведена из официальных стандартов, рекомендаций и best practices от IETF и W3C.



        Вы не найдёте здесь абсолютно ничего неочевидного. Нет, серьёзно, каждый веб-разработчик теоретически эти 15 пунктов должен освоить где-то в районе junior developer-а и/или второго-третьего курса университета.

        Однако на практике оказывается, что великое множество веб-разработчиков эти азы таки не усвоило. Читаешь документацию к иным API и рыдаешь. Уверен, что каждый читатель таки найдёт в этом списке что-то новое для себя.
        Читать дальше →
      • Плакаты на IT тематику

        Почитывая «Банду четырех», всё чаще думаю как хорошо было бы иметь отдельный плакат на стену в офисе, резюмирующий и объясняющий шаблоны проектирования. Как здорово было бы не держать все их в голове, а имея проблему, взглянуть и найти подходящее решение. Но найти подходящий постер оказалось не так то просто, да и тот оказался не идеальным.
        Читать дальше →
      • Алгоритм победителя AI Challenge 2011 (Ants)

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

        Не могу поверить в то, что я выиграл.
        И тем более не могу поверить в то, что выиграл решительно.

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

        Вот пример одной из моих игр: aichallenge.org/visualizer.php?game=346288&user=4513 (это не та игра, которую привёл автор в своей статье. Я не могу дать ссылку именно на неё, поскольку она хранится прямо на сервере автора. — прим. перев.). В этой заметке я хочу объяснить, что делает мой код, и как именно у него получается это делать. Есть много технических моментов, и в общем-то статья не о самой стратегии, но я постараюсь объяснять попроще.
        Читать дальше →
      • Хабрахабр: немного статистики и альтернативный топ топиков

          Я заметил, что текущий топ хабрахабра содержит малое количество полезных материалов. Вообще, как оценивают материал? Люди ставлят плюс/минус, потому что:
          1. Хотят поощрить автора за написание хороших топиков
          2. Хотят отблагодарить автора за написание сиюминутной новости/интересной картинки
          3. Хотят выплеснуть свое настроение на чужом топике
          Вполне очевидно, что такая система голосования не всегда будет поощрять хорошие топики и не всегда в топе будут только хорошие и полезные статьи.
          Но у каждой статьи есть еще два иных показателя: количество человек, занесших статью в избранное (коротко — фавориты) и количество комментариев. Очевидно, что первый показатель определяет полезность статьи, а второй — насколько тема затронула умы хабралюдей.
          Мне показалось, что альтернативные варианты топа будут очень интересны остальным людям. Вообще, было бы хорошо, если бы такую фичу сделали, разработчики, но…

          Итак, я проанализировал 72% топиков хабра (остальные были закрыты/недоступны/удалены) и составил альтернативный топ. Под катом парочка рисунков и ссылки на страницы альтернативного топа.
          Читать дальше →
        • Спать мало, но правильно?

            Навеяно этим постом от юзера case. Пост не новый, и на главную он не попал.
            Но я вот наткнулся на него сегодня и решил написать кое-что о сне. Уверен, что это будет полезно многим хабравчанам, да и случайным читателям тоже.
            Читать дальше →
          • Ускорение загрузки Windows for fun and profit

              image Пожалуй, начну с того, что если перегружаться 15 раз в год, то любой «тюнинг» процесса загрузки отнимает больше времени, чем будет выиграно на перезагрузках за все время жизни системы. Однако, спортивный интерес берет свое, тем более, что люди интересуется процессом оптимизации быстродействия. А загрузка оказалась самым очевидным кандидатом в примеры того, как на мой взгляд должен выглядеть этот самый процесс. Сразу скажу, что грузиться будем с 5400 rpm винта, грузиться будем в «рабочую» систему: помимо недобитой вендорской крапвари там стоит еще куча всякого типа вижуал студии, антивируса, скайпа, стима, гуглапдейтера и пр…

              Про то, почему отключение pagefile-а скорее вредно, чем полезно — как нибудь в другой раз, а пока…
              Под катом много однообразных картинок и немножко унылого текста
            • Как решать проблемы пользователей не за сутки, а за минуты: ускоряем поиск по логам

                Мы в Почте Mail.Ru постоянно сталкиваемся с необходимостью работать с историей пользователей. Учитывая, что ежемесячная аудитория проекта составляет более 40 миллионов человек, история всех их действий – это порядка петабайта данных. Потребность в поиске по логам у нас возникает сотни раз в день, а на получение нужной информации в среднем уходило несколько часов. При этом, по нашим предположениям, извлечение информации из логов можно было ускорить до нескольких секунд.

                Чтобы оценить целесообразность разработки системы для оптимизации поиска по логам, мы воспользовались вот этой таблицей с XKCD:



                (на самом деле нет, но нам она все равно нравится).

                Итак, мы всерьез взялись за оптимизацию. Итогом нашей работы стала разработка системы, благодаря которой мы можем поднять историю действий примерно в 100 000 (сто тысяч, это не опечатка) раз быстрее. Мы разработали big-data сервис, который позволяет хранить петабайты информации в структурированном виде: каждому ключу у нас соответствует лог каких-то событий. Хранилище устроено так, что оно способно работать и на самых дешевых SATA-дисках, и на больших многодисковых хранилищах с минимальным количеством процессорного времени, при этом оно полностью fault-толерантно — если вдруг какая-то машина выйдет из строя, это ни на что не влияет. Если в системе заканчивается место, в нее просто добавляется сервер или несколько: система автоматически увидит их и начнет записывать данные. Чтение данных происходит почти моментально.
                Читать дальше →
              • Что такое grep и с чем его едят

                  Эта заметка навеяна мелькавшими последнее время на хабре постами двух тематик — «интересные команды unix» и «как я подбирал программиста». И описываемые там команды, конечно, местами интересные, но редко практически полезные, а выясняется, что реально полезным инструментарием мы пользоваться и не умеем.
                  Небольшое лирическое отступление:
                  Года три назад меня попросили провести собеседование с претендентами на должность unix-сисадмина. На двух крупнейших на тот момент фриланс-биржах на вакансию откликнулись восемь претендентов, двое из которых входили в ТОП-5 рейтинга этих бирж. Я никогда не требую от админов знания наизусть конфигов и считаю, что нужный софт всегда освоится, если есть желание читать, логика в действиях и умение правильно пользоваться инструментарием системы. Посему для начала претендентам были даны две задачки, примерно такого плана:
                  — поместить задание в крон, которое будет выполняться в каждый чётный час и в 3 часа;
                  — распечатать из файла /var/run/dmesg.boot информацию о процессоре.

                  К моему удивлению никто из претендентов с обоими вопросами не справился. Двое, в принципе, не знали о существовании grep.

                  image

                  Поэтому… Лето… Пятница… Перед шашлыками немного поговорим о grep.
                  Читать дальше →
                • Хабраконвертер

                    В связи с тем, что пишу статьи в гугл-доксах (все-таки визуально видеть форматирование мне сподручнее), а перегонять из гугл-доксов в хабраразметку несколько затратно, запилил онлайн ковертер из «rich-text» (Google Docs, Word и т.д.) в хабраразметку: habraconverter.meta4.info

                    Хабраконвертер поддерживает:
                    • Простое форматирование (заголовки, жирный/италик/перечекнутый/подчеркнутый, надстрочный, подстрочный)
                    • Исправление кавычек
                    • Ссылки
                    • Списки
                    • Таблицы
                    • Картинки (при копировании из Google Docs, align не учитывается)
                    • Горизонтальная линия
                    • Исходный код (через форматирование текста шрифтом Courier New)
                    Читать дальше →
                    • +80
                    • 939
                    • 6
                  • Компиляция пакетов

                    В Ubuntu используется философия пакетного менеджмента, то есть все программы ставятся из пакетов deb, в которых хранится, собственно сама программа и скрипты, которые корректно ставят/удаляют/обновляют. Пакеты deb можно найти в сети Интернет, на дисках. Самый лучший способ использовать репозитории, хранилища deb пакетов. Если использовать репозитории, то при появлении в них новых версий установленных у вас программ, вам будет проще и быстрей обновить их. Это очень удобно и позволяет держать систему актуальной и защищенной. Иногда требумой программы в репозитариях нет и приходится компилировать из исходников. Но это надо делать правильно.
                    Сегодня я хочу предложить изящный метод, не раз помогавший мне.
                    Читать дальше →
                  • Облегченная разработка WP7 приложений при помощи Caliburn.Micro framework (ч.1)



                      Здравствуйте!

                      Как можно догадаться из названия, эта статья будет просвещенна framework'у Caliburn.Micro. Я постараюсь показать, что полезного может дать использование этого framework’а разработчику под платформу WP7, какие задачи он решает, его достоинства и недостатки.

                      Но самый важный вопрос, на который я буду пытаться ответить в течении всей статьи, это зачем вообще нужен еще один промежуточный слой, в виде какого-то framework’а, в достаточно устоявшемся царстве WP7.

                      Если вам интересна эта тема, то добро пожаловать под кат.
                      Читать дальше →
                    • Файлы уходят в облака. Выбираем облако


                        После недавних событий по массовому открытию новых облачных хранилищ ваш покорный слуга задался вопросом: «Какие есть сейчас хранилища и куда можно запихнуть свои жизненно необходимые файлы?»
                        Некоторое время рысканья по хабру/гуглу и прочим конторам привело к следующему списку хранилищ:

                        Baidu, Bitcasa, Box.net, Dropbox, Google Drive, Microsoft SkyDrive, SpiderOak, Wuala, Яндекс.Диск

                        В самом конце статьи ищите сравнительную таблицу.
                        А теперь кратко о каждом сервисе, предоставляемой халяве и клиентах под Windows и Android
                      • Новый навигатор по примерам кода Microsoft All-In-One Code Framework, MSDN, Windows 8 и многое другое



                          Я уже рассказывал на habr о бесплатной централизованной библиотеке кода: Microsoft All-In-One Code Framework.

                          Кратко напомню, что это такое: целью проекта Microsoft All-In-One Code Framework является предоставление примеров кода для типичных задач для всех технологий разработки Microsoft. При этом, команда проекта не выдумывает эти примеры из воздуха. Для того, чтобы определить какие примеры необходимы, просматриваются форумы разработчиков, социальные медиа и обращения в службу поддержки Microsoft. На основании всех этих запросов, для наиболее часто встречающихся, в библиотеку публикуются примеры кода.

                          Подобная библиотека фактически бесполезна без возможности удобной навигации и поиска по примерам кода. И разработчики библиотеки сразу же предоставили эту возможность в виде отдельного приложения и дополнения к Visual Studio. Приложение и дополнение предоставляли удобный способ работы с примерами из All-In-One Code Framework, но на сайтах Microsoft есть много других примеров кода, которые не входят в All-In-One Code Framework, и доступ к которым было бы удобно получить находясь внутри одной программы. Думаю, что я был не единственным, кому в голову приходила такая мысль.

                          Пару недель назад была выпущена новая версия навигатора по примерам кода, который позволят получить доступ к более 3500 примеров, включая примеры из MSDN Code Gallery и официальные примеры Windows 8.
                          Дополнительные возможности навигатора и снимки экрана
                          • +16
                          • 8.1k
                          • 3
                        • Горутины: всё, что вы хотели знать, но боялись спросить

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

                            Что за горутины?

                            Горутина (goroutine) — это функция, выполняющаяся конкурентно с другими горутинами в том же адресном пространстве.

                            Запустить горутину очень просто:
                            go normalFunc(args...)

                            Функция normalFunc(args...) начнет выполняться асинхронно с вызвавшим ее кодом.

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

                            Сколько вешать в граммах?

                            Чтобы было проще ориентироваться, рассмотрим цифры полученные опытным путем.
                            Читать дальше →
                          • Бесплатный VPN от Comodo

                              В свете ожидающегося послевыборного закручивания интернет-гаек в наше стране, хотелось бы рассказать о бесплатном VPN от Comodo Group.
                              Comodo TrustConnect — простой в регистрации, установке и использовании сервис VPN со 128-битным шифрованием, от солидной компании, которой, в отличие от других бесплатных VPN-провайдеров, вполне можно довериться. Для тех кто не в курсе, такой VPN очень полезен при использовании открытого WiFi в публичных местах (например, при посещении сайтов, у которых до сих пор нет https). Также с помощью VPN предотвращается прослушка и фильтрация трафика провайдером, кровавой гэбнёй или админом на работе.
                              Читать дальше →
                            • Набор полезных утилит и библиотек мира .NET

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

                                IL Stub Diagnostic Tool



                                IL заглушки (stubs) динамически генерируются во время работы приложения на лету и управляют маршаллингом и вызовом целевого метода. IL Stub Diagnostic tool была создана чтобы улучшить качество отладки приложений. Это real-time монитор, который показывает детали каждой IL заглушки, создаваемой в исследуемом процессе. Для каждой заглушки утилита показывает ее IL код и сигнатуры Managed/Unmanaged методов
                                Читать дальше →
                              • Go for IT. Часть первая

                                  Неуловимый Go.


                                  Помните анекдот про неуловимого Джо? Именно восклицанием «Да кому он нужен!», прозвучавшим в форме вопроса "ЗАЧЕМ?", был встречен на Хабре релиз первой стабильной версии GO 1.

                                  Именно на этот вопрос я хочу ответить циклом статей, оформленных в необычном для Хабра формате — в виде пошаговой совместной разработки действующего веб-проекта — с живым обсуждением и добавлением функционала. А чтобы вдвойне оправдать внесение цикла ещё и в хаб «Высокая производительность», мы поставим перед собой задачу создать не просто «хомяка», а проект, который наглядно продемонстрирует habri et orbi способность выдерживать значительные естественные нагрузки.

                                  Вместо аперитива: реализация простейшего динамического веб-приложения на языке Go работает в 5-20 раз быстрее аналогичной Python-реализации. И всего в два раза уступает скорости отдачи статики Nginx-ом.

                                  В рамках этого проекта, помимо самого языка Go, мы косвенно затронем и другие (относительно новые) технологии веб-разработки — HTML5, CSS3, Redis, MongoDB. Также я постараюсь вытащить из закутков долговременной памяти некоторые из трюков в области безопасности и экономии на спичках, коих накопилось много за полтора десятка лет работы в этой области. Устраивайтесь поудобнее, запасайтесь терпением и кофе — под катом «много букв», а ведь это только вводная часть :)
                                  Читать дальше →
                                • Code52 — новый проект каждую неделю

                                    imageЕсли вы хотите заняться open source проектом, но не знаете с чего начать, то Code52 вам поможет. В начале года несколько программистов (Andrew Tobin, Brendan Forster и Paul Jenkins) решили создать место для легкого старта в open source мире.
                                    Раз в неделю реализуется одна новая идея. Уже сейчас в Code52 17 проектов. Преимущественно используюется .NET платформа, но создатели не собираются себя ограничивать. Например, проект sayw.at, стартовавший вчера, будет написан на NodeJS.

                                    Подробнее о Code52