• Осторожнее с копипастом: фингерпринтинг текста непечатаемыми символами

    • Перевод
    Не хотите читать? Посмотрите демо.

    Символы нулевой ширины — это непечатаемые управляющие символы, которые не отображаются большинством приложений. Н​апример, в э​то пред​ложение я вст​авил де​сять про​​белов н​улевой ширины, вы эт​о замет​или? (Подсказка: вставьте предложение в Diff Checker, чтобы увидеть местоположение символов!). Эти символы можно использовать как уникальные «отпечатки» текста для идентификации пользователей.


    Безусловно, он может здесь быть. И вы никогда не догадаетесь

    Зачем?


    Ну, изначальная причина не слишком интересна. Несколько лет назад я с командой участвовали в соревнованиях по различным видеоиграм. У команды была приватная страничка для важных объявлений, среди прочего. Но в итоге эти объявления стали репостить в других местах, с издевательствами над командой, раскрывая конфиденциальную информацию и командную тактику.
    Читать дальше →
  • Автономный способ обхода DPI и эффективный способ обхода блокировок сайтов по IP-адресу

      Провайдеры Российской Федерации, в большинстве своем, применяют системы глубокого анализа трафика (DPI, Deep Packet Inspection) для блокировки сайтов, внесенных в реестр запрещенных. Не существует единого стандарта на DPI, есть большое количество реализации от разных поставщиков DPI-решений, отличающихся по типу подключения и типу работы.

      Существует два распространенных типа подключения DPI: пассивный и активный.

      Пассивный DPI

      Пассивный DPI — DPI, подключенный в провайдерскую сеть параллельно (не в разрез) либо через пассивный оптический сплиттер, либо с использованием зеркалирования исходящего от пользователей трафика. Такое подключение не замедляет скорость работы сети провайдера в случае недостаточной производительности DPI, из-за чего применяется у крупных провайдеров. DPI с таким типом подключения технически может только выявлять попытку запроса запрещенного контента, но не пресекать ее. Чтобы обойти это ограничение и заблокировать доступ на запрещенный сайт, DPI отправляет пользователю, запрашивающему заблокированный URL, специально сформированный HTTP-пакет с перенаправлением на страницу-заглушку провайдера, словно такой ответ прислал сам запрашиваемый ресурс (подделывается IP-адрес отправителя и TCP sequence). Из-за того, что DPI физически расположен ближе к пользователю, чем запрашиваемый сайт, подделанный ответ доходит до устройства пользователя быстрее, чем настоящий ответ от сайта.
      Читать дальше →
    • Открываем доступ к инструменту для составления списков английских слов из фильмов, книг и статей



        Skyeng делится с Хабром ссылкой на внутреннее приложение, которым пользуются наши методисты.

        Мы в школе Skyeng убеждены, что чем быстрее ученик получает ощутимый эффект от занятия или тренировки, тем выше его мотивация и эффективнее само обучение. Традиционная методика изучения языков обещает конкретный результат лишь через длительное время — год, два, т.е. требует вложения значительных сил, времени и средств без немедленного эффекта. Мы считаем, что вполне реально получить “возврат инвестиций” быстро, если ставить перед собой небольшие конкретные задачи и решать их. Сегодня мы расскажем про один из наших служебных инструментов, предназначенный как раз для этого, и дадим читателям возможность попробовать его в деле, составить собственные списки слов, самые интересные из которых будут предложены всем пользователями Aword!
        Читать дальше →
      • PostgreSQL. Как правильно хранить котов или история одной миграции

          История взята из реального проекта. Но поскольку реальный проект слишком скучный (и под NDA), в этой статье используется упрощенный пример.

          Жил-был один проект. И была у него база данных. И была в базе таблица для хранения, ну, скажем, котов. Вот такая:
          CREATE TABLE cats (
              id serial,
              cname varchar(20),
              ctype varchar(20),
              primary key(id)
          );
          

          Все довольно просто: у каждого кота есть id, имя и некий тип.

          Конечно, у нас были бизнес-требования к котам и их типам. Например, мы точно знали, что у нас есть типы big furry, neko и sudden danger. Предполагали, что могут появиться типы long tail и sleeper-eater. Но мы ожидали, что требования будут меняться. И пока не известно, какие в итоге понадобятся типы. Поэтому использовали тип данных varchar(20).
          Читать дальше →
        • Путешествие запроса Select через внутренности Постгреса

          • Перевод
          До конференции PG Day'16 Russia остались считанные дни, расписание можно посмотреть на нашем сайте. Мы трудимся в поте лица, но тем не менее успеваем готовить для вас переводы самых интересных материалов о PostgreSQL. Сегодня представляем вашему вниманию перевод статьи Pat Shaughnessy о поведении запроса Select.

          Готовясь летом к этой презентации, я решил изучить некоторые части исходного кода PostgreSQL на C. Я запустил очень простой запрос select и наблюдал, что Постгрес с ним делает, с помощью LLDB, отладчика C. Как Постгрес понял мой запрос? Как он нашел данные, которые я искал?



          Этот пост — неформальный журнал моего путешествия через внутренности PostgreSQL. Я опишу пройденный мной путь и то, что я видел в процессе. Я использую серию простых концептуальных диаграмм, чтобы объяснить, как Постгрес выполнил мой запрос. В случае, если вы понимаете C, я также оставлю вам несколько ориентиров и указателей, которые вы можете поискать, если вдруг решите покопаться во внутренностях Постгреса.

          Исходный код PostgreSQL восхитил меня. Он оказался чистым, хорошо задокументированным и простым для понимания. Узнайте сами, как Постгрес работает изнутри, присоединившись ко мне в путешествии в глубины инструмента, которым вы пользуетесь каждый день.
          Читать дальше →
        • Пришло время попрощаться с Rails

          • Перевод

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


          Так как я вовлечён во множество Ruby-проектов, люди часто спрашивают меня, почему я не люблю Rails, какие проблемы у меня есть с ним и так далее. Поэтому я решил написать этот длинный пост, чтобы подвести итоги и все объяснить.


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


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

          Читать дальше →
        • Supervisord и forever больше не нужны. Systemd

            В статье речь будет идти о systemd, который вошел в Debian 8 jessie. Я пишу о Debian, потому что пользуюсь именно им. Пишу о systemd не потому что его фанат, но некоторые вещи меня действительно радуют.

            Так почему же больше не нужны supervisord и forever?
            Читать дальше →
          • Flux в картинках

            • Перевод
            • Tutorial
            Нам в Хекслете нравится ReactJS и Flux. Нам кажется, что это правильное направления развития. Мы любим функциональное программирование и чистые функции, и когда сложные архитектуры упрощаются за счет подходов, связанных с ними — это круто. По Реакту уже есть немало ресурсов в интернете, в том числе наш практический курс по React JS. Последний урок в этом курсе называется «Однонаправленное распространение данных», и там мы подходим к интересной теме, которая лежит в основе архитектуры Flux.

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

            Мы используем React и Flux в своей браузерной среде разработки Hexlet IDE (она в опен-сорсе), в которой учащиеся выполняют практические задания. Flux одновременно очень популярен и очень непонятен для многих в мире веба. Сегодняшний перевод — попытка объяснить Flux на пальцах (ну, то есть картинках).

            Проблема


            Вначале нужно понять, какую проблему решает Flux.


            Читать дальше →
          • PostgreSQL: Приемы на продакшене

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

              image
              Читать дальше →
            • Модель ветвления и управления модулями git для большого проекта

                Без малого два года назад мы начали использовать в разработке нашего флагманского проекта СУБД ЛИНТЕР новую модель ветвления и управления подмодулями git-а. Десятки тысяч коммитов, сделанные за это время группой разработчиков, позволяют с определенной долей уверенности считать нововведения успешными. Эта статья — краткий обзор принципов организации хранилища исходных кодов в большом проекте на базе альтернативной реализации модулей git, сложившейся стратегии ветвления и инструментария linflow.


                Читать дальше →
                • +23
                • 33,2k
                • 8
              • Файловая система Linux полностью на tmpfs — скорость без компромиссов

                Предыстория


                Так сложилось, что уже пять лет мой раздел ntfs с операционной системой Windows располагается на рамдиске. Решено это не аппаратным, а чисто программным способом, доступным на любом ПК с достаточным количеством оперативной памяти: рамдиск создается средствами загрузчика grub4dos, а Windows распознаёт его при помощи драйвера firadisk.

                Однако до недавнего времени мне не был известен способ, как реализовать подобное для Linux. Нет, безусловно, существует огромное количество линуксовых LiveCD, загружающихся в память при помощи опций ядра toram, copy2ram и т. д., однако это не совсем то. Во-первых, это сжатые файловые системы, обычно squashfs, поэтому любое чтение с них сопровождается накладными расходами на распаковку, что вредит производительности. Во-вторых, это достаточно сложная каскадная система монтирования (так как squashfs — рид-онли система, а для функционирования ОС нужна запись), а мне хотелось по возможности простого способа, которым можно «вот так взять и превратить» любой установленный на жесткий диск Linux в загружаемый целиком в RAM.

                Ниже я опишу такой способ, который был с успехом опробован. Для опытов был взят самый заслуженный дистрибутив Linux — Debian.
                Читать дальше →
              • Осторожно при покупке MacBook. Высокотехнологический способ мошенничества в оффлайне

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

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

                  Как вы догадались — преступники найдены (забегая вперед, скажу, что это произошло естественно без помощи полиции). О том, чего стоит опасаться при покупке нового или б/у макбука, а также о том, как были найдены и пойманы преступники читайте под катом.

                  Не хочу наступить на те же грабли.
                • Алгоритм обращения программы к API VKontakte

                  Часто бывает мы хотим автоматизировать то или иное действие. Порой спешка или просто лень не дает нам возможности ознакомиться со всей документацией(по API VK).
                  Разработать программу для работы с API ВКонтакте проще чем кажется. Подойдет любой язык, умеющий отправлять http get запросы (соответственно получать ответ). Например: Delphi, shell, C, Perl, PHP, Python и т. п.
                  image
                  Читать дальше →
                • Экспорт дней рождения из ВКонтакте (работа с OpenAPI)

                    imageЛично я не любитель соцсетей, а в особенности — вконтакте, из-за которого у меня было немало времени, потраченного впустую. Собственно поэтому в свое время я решил из него удалиться. Но в определенный момент я понял, что контакт служил не только местом , где можно было с утра до ночи нажимать F5 на странице Новостей для общения, но также сервисом, благодаря которому я мог вовремя узнавать о днях рождения друзей и, таким образом, поддерживать с ними хорошие отношения.

                    Таким образом, была поставлена задача: экспорт календаря в внешний сервис (в моем случае — Google Calendar). Используется родной API, поэтому все работает быстро и без багов. Кому интересно — прошу под кат.
                    Читать дальше →
                  • Стив Балмер прочитал лекцию украинским студентам



                      5 ноября состоялась лекция главы Microsoft в первом корпусе Киевского Политехнического Института. Поскольку эта тема еще до сих пор не освещена на хабре, позвольте рассказать о происходившем типичному маководу.

                      Дальше по тексту личные впечатления от встречи со Стивом, немного фотографий, видео и никнейм Балмера в Twitter, который он так не хотел палить…
                      Читать дальше →
                    • Пробуем открыть свое дело

                        Пролог


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


                        Я буду очень рад, если данный материал будут читать люди с опытом, и поделятся своим. Я в свою очередь полезные мнения и комментарии буду выносить в конец поста.


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


                        Пробуем открыть свое дело. Часть 2

                        Много буковок...
                      • Рекламный баннер = поставщик данных

                          Представляю на ваш суд модель передачи данных от веб сервиса к клиенту — данные в баннере. На эту идею меня натолкнула статья Compression using Canvas and PNG, опубликованная на ajaxian.com ещё в 2008 году.

                          Суть: клиент запрашивает какие-либо данные с веб-сервиса, ответ ему приходит не json/xml, а png рекламный-баннер часть которого блок с данными. Веб-сервис поставляет библиотеку для работы с его данными-баннерами (запрос, отображение, распаковка).
                          Читать дальше →
                        • Чему мы должны учить разработчиков нового программного обеспечения? Почему?

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

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

                          Проблема

                          Во многих местах существует разрыв между обучением компьютерной науке и потребностями индустрии. Взгляните на следующую ситуацию:
                          Знаменитый профессор компьютерной науки (с гордостью): «Мы не учим программированию; мы обучаем компьютерной науке.»
                          Производственный менеджер: «Они не способны программировать.»

                          Во многом они оба правы, и не только на поверхностном уровне. Задача научного сообщества состоит не в том, чтобы обучать посредственных программистов, а индустрия не требует только «всесторонне развитых, высокообразованных мыслителей» и «учёных».

                          Другой профессор компьютерной науки: «Я не написал ни одной строчки кода.»
                          Читать дальше →