• Все английские времена в одной простой схеме

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

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

    Первоначальная идея. Сначала разъяснить все английские времена за один присест удавалось, надёргав различных идей из интернета: обрывки чьих-то схем, начинали склеиваться в свою схему и обрастать собственными легендами, а применение времён почти всегда было проще пояснить, используя хрестоматийную «систему английских времен с точки зрения употребления глагола “to vodka”». С каждой новой импровизированной лекцией, схема и нарратив продолжали меняться. «Ученики» попадались с различным базовым уровнем, что позволило понять, откуда нужно начинать плясать, чтобы урок был понятен всем, кто хоть раз слышал что-то про глаголы have и be. Когда счёт обученных уже пошёл на десятки, я решил оформить идею в более стройную лекцию. От первых попыток преподавания английских времён, до этого момента прошло пять лет. За это время было обучено ещё пару сотен человек. Обучено — по приколу. Денег за эти уроки я не брал.

    Читать далее
  • ClickHouse: очень быстро и очень удобно



      Виктор Тарнавский показывает, что оно работает. Перед вами расшифровка доклада Highload++ 2016.

      Здравствуйте. Меня зовут Виктор Тарнавский. Я работаю в «Яндексе». Расскажу про очень быструю, очень отказоустойчивую и супермасштабируемую базу данных ClickHouse для аналитических задач, которую мы разработали.

      Пару слов обо мне. Я Виктор, работаю в «Яндексе» и руковожу отделом, который занимается разработкой аналитических продуктов, таких как «Яндекс.Метрика» и «Яндекс.AppMetrica». Я думаю, многие из вас пользовались этими продуктами и знают их. Ну, и в прошлом, и по-прежнему пишу много кода, а раньше еще занимался разработкой железа.
      Читать дальше →
    • Долгая история про локализацию даты без года в PHP

        Давайте начнём с простой задачки — вывести локализованную дату: там должен быть день, полное название месяца на языке локали и полный год. В наше время это действительно очень просто. В PHP есть своё i18n-расширение intl, которое входит в ядро с версии 5.3. И в этом intl есть класс IntlDateFormatter, у которого в свою очередь предопределено несколько форматов. Используем его LONG формат.

        <?php
        
        foreach (['en_US', 'ru_RU', 'es_ES', 'fa_IR'] as $locale) {
            $formatter = new IntlDateFormatter(
                $locale, 
                IntlDateFormatter::LONG, 
                IntlDateFormatter::NONE, 
                'Europe/Moscow'
            );
            echo $formatter->format(1455111783), PHP_EOL;
        }

        Результат:

        February 10, 2016
        10 февраля 2016 г.
        10 de febrero de 2016
        ۱۰ ﻑﻭﺭیﻩٔ ۲۰۱۶ ﻡ. // вот тут вообще-то RTL-текст, но я хз как это правильно оформить

        Пока неплохо. А теперь давайте слегка изменим условия: «вывести локализованную дату: там должен быть день и полное название месяца на языке локали». То есть, мы не хотим отображать год.
        Казалось бы, ерунда. Но есть нюанс...
      • Pritunl — VPN-сервер для себя и друзей за 10 минут


          В связи с последними событиями в России хочу рассказать вам о классном self-hosted VPN-сервере. После простой установки, без особого труда и углубленных знаний вы сможете создавать пользователей, генерировать VPN-профили и смотреть графики использования сети.


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


          В результате чего пятидоллоравая VPS'ка может превратится в мощный инструмент обхода блокировок

          Читать дальше →
        • HiDPI в Linux

            HiDPI
            Aqua Mine

            Введение

            После многолетнего доминирования дисплеев с высокой плотностью пикселей на мобильных устройствах, данная тенденция наконец-то дошла и до лаптопов с десктопами. По моему мнению, производители не ставили HiDPI-матрицы в основном из-за слабой поддержки DPI, отличных от 96, в Windows. К счастью, ситуация заметно улучшилась с выходом Windows 8 с Modern UI, хотя в десктопном режиме все еще далеко не идеальная — люди до сих пор жалуются на 3200×1800 при 13.3" в лаптопах и сомневаются о покупке 4K UHD 23.8"-монитора.

            DPI и Linux

            Возможность установки произвольного значения DPI появилась еще во времена Xfree86, но следует понимать, что это просто значение, которое ничего не делает само по себе. Его считывают и используют программы и компоненты, которые и принимают решение, каким образом отразить изменение DPI на экране. Если текст следует установленному значению DPI в 95% случаев (спасибо xft!), то размер элементов зависит от используемого окружения рабочего стола и тулкитов, на которых написаны приложения.

            GTK+ 3-приложения поддерживают как целочисленный скейлинг элементов и дробный скейлинг шрифтов, так и изменение DPI на лету, без перезапуска приложений. Скейлингом элементов управляет переменная окружения GDK_SCALE, а скейлингом шрифтов — GDK_DPI_SCALE.
            По умолчанию, шрифты скейлятся вместе с элементами. Таким образом, при DPI 96 и GDK_SCALE=2, вы получите шрифт, словно он с DPI 192. Чтобы отменить скейлинг шрифтов, достаточно установить переменную окружения GDK_DPI_SCALE в 0.5 (для GDK_SCALE=2).
            Qt4 не умеет скейлить элементы. Для применения нового значения DPI требуется перезапуск приложения.
            Qt5, начиная с версии 5.4, поддерживает целочисленный скейлинг элементов через переменную окружения QT_DEVICE_PIXEL_RATIO. DPI менять на лету нельзя, как и в Qt4, но работы в этом направлении ведутся и будут доступны с релизом Qt 5.6, как и скейлинг на каждый монитор отдельно.
            WxWidgets-приложения ведут себя так же, как GTK+ 3, только не поддерживают скейлинг элементов.

            Я попытался выяснить, какие DE можно комфортно использовать с HiDPI-мониторами. Тестирование проводилось на лаптопе с 12.5" 1366×768 (125 DPI) с подключенным внешним 23.8"-монитором с разрешением 3840×2160 (185 DPI).
            Читать дальше →
          • PHP, YII2 и формирование больших excel-файлов

            Начало


            Одна поддерживаемая нашей компанией учетно-отчетная система начала очень быстро разрастаться в количестве хранимых данных. Система написана на PHP с использованием фреймворка Yii2. Изначально отчеты строились через библиотеку PhpSpreadsheet, которая пришла на смену, уже давно ставшему deprecated, PhpExcel.

            Среди разного вида отчетности был один очень крупный – фактически полный набор всех хранящихся в БД данных должен выгружаться в одну excel-таблицу. На начальном этапе проблем не возникало, но когда объем стал превышать многие сотни тысяч записей, то скрипт формирования выгрузки стал отваливаться в timeout limit.
            Читать дальше →
          • Что именно происходит, когда пользователь набирает в адресной строке google.com? Часть 2

            • Перевод
            Часть 1

            TLS handshake


            Клиентский компьютер отправляет на сервер сообщение ClientHello, где указывает TLS-версию, список алгоритмов шифрования и доступные методы сжатия. Сервер отвечает сообщением ServerHello, содержащим такие же данные, плюс публичный сертификат сервера. Сертификат содержит публичный ключ, которым клиент зашифрует оставшуюся часть приветствия. Клиент проверяет, что сертификат подписан кем-либо из списка доверенных CA (Certificate Authority). Если проверка проходит, клиент создаёт последовательность псевдослучайных байтов и шифрует её с публичным ключом сервера. Эта последовательность используется для создания симметричного ключа.
            Читать дальше →
            • +11
            • 40,4k
            • 5
          • Что именно происходит, когда пользователь набирает в адресной строке google.com? Часть 1

              Перевод первой части материала с github, обстоятельно объясняющего работу интернета: что именно происходит, когда пользователь набирает в адресной строке google.com?

              Кнопка «ввод» возвращается в исходное положение


              Для начала отсчёта выберем момент, когда кнопка «ввод» утоплена. В этот момент замыкается контур, отвечающий за эту кнопку. Небольшой ток проходит по логическим контурам клавиатуры. Они сканируют состояние всех переключателей, гасят паразитные электрические импульсы, и преобразовывают нажатие в код клавиши 13. Контроллер кодирует код для передачи в компьютер. Теперь это почти всегда делается через USB или Bluetooth, а раньше в процессе участвовали PS/2 или ADB.
              Читать дальше →
            • Что на самом деле происходит, когда пользователь вбивает в браузер адрес google.com

              • Перевод


              Эта статья является попыткой ответа на старый вопрос для собеседований: «Что же случается, когда вы печатаете в адресной строке google.com и нажимаете Enter?» Мы попробуем разобраться в этом максимально подробно, не пропуская ни одной детали.

              Примечание: публикация основана на содержании репозитория What happens when...

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

              Мы перенесли перевод в репозиторий GitHub и отправили Pull Request автору материала — оставляйте свои правки к тексту, и вместе мы сможем значительно улучшить его.
              Читать дальше →
            • Потрясающая, но невидимая глубина

              • Перевод


              Вы только что зашли на страницу Google.

              Просто, не так ли?

              Что же на самом деле произошло?

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

              Давайте упростим.

              Вы только что установили соединение с www.google.com.

              Просто, не так ли?

              Что же на самом деле произошло?
              Читать дальше →
            • CSS-анимация подождет

              Перевод статьи Making Animations Wait от Donovan Hutchinson.


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


              Читать дальше →
              • +14
              • 16,3k
              • 6
            • Нейронная сеть на спичечных коробках

                Я не помню где брал эту информацию, но она отражает суть нейросетей лучше всего. На пальцах.

                Правила игры. НС обучается играть в игру «11 палочек». Можно брать либо 1 палочку, либо 2. Нужно вытянуть последним все палочки.

                Берем 10 спичечных коробков и в каждый помещаем пуговки двух цветов. Например, черного и белого. По одной штуке. Номер на коробке будет отвечать за количество палочек в текущий момент.

                Например, НС начинает ход.

                1. Закрываем глаза и вытаскиваем наугад пуговку из коробки под номером 11. Если черная, то берем одну палочку, если белая — две. (Пусть будет белая — 2 палочки).
                2. Ход человека. Например, он взял 2 палочки.
                3. Далее, берем коробок под номером 11-2-2 = 7 и вытаскиваем наугад из него пуговку.

                Так до тех пор пока игра не закончится.

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

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

                Тут, конечно, масштаб незначителен, но он хорошо показывает, что НС хороша тем, что есть возможность гибкого обучения и подстраивания под правила игры.
              • Убийцы оптимизации

                • Перевод
                image

                В этом посте изложены советы, как не написать код, производительность которого окажется гораздо ниже ожидаемой. Особенно это касается ситуаций, когда движок V8 (используемый в Node.js, Opera, Chromium и т. д.) отказывается оптимизировать какие-то функции.
                Читать дальше →
              • Как работает реляционная БД

                • Перевод
                • Tutorial
                Реляционные базы данных (РБД) используются повсюду. Они бывают самых разных видов, от маленьких и полезных SQLite до мощных Teradata. Но в то же время существует очень немного статей, объясняющих принцип действия и устройство реляционных баз данных. Да и те, что есть — довольно поверхностные, без особых подробностей. Зато по более «модным» направлениям (большие данные, NoSQL или JS) написано гораздо больше статей, причём куда более глубоких. Вероятно, такая ситуация сложилась из-за того, что реляционные БД — вещь «старая» и слишком скучная, чтобы разбирать её вне университетских программ, исследовательских работ и книг.

                На самом деле, мало кто действительно понимает, как работают реляционные БД. А многие разработчики очень не любят, когда они чего-то не понимают. Если реляционные БД используют порядка 40 лет, значит тому есть причина. РБД — штука очень интересная, поскольку в ее основе лежат полезные и широко используемые понятия. Если вы хотели бы разобраться в том, как работают РБД, то эта статья для вас.
                Читать дальше →
              • Чёрточки: только ли тире, минус и дефис?

                  Однажды вечером я почувствовал, что пришло время расширить 97‐ й параграф «Ководства» Артемия Лебедева.

                  На клавиатуре одна чёрточка, она обычно правее нуля и повыше букв «З» и «Х». Неосведомлённые люди называют её попеременно то дефисом, то минусом, то тире. Лебедев объясняет нам, что это четыре (учитывая две разновидности тире) различных символа. На самом деле их как минимум девять, и об этом я и расскажу вам сейчас.

                  Читать дальше →
                • Как я укрощал Windows Update и получал инвайт на резерв Windows 10

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

                  В далёком-далёком 2014-м году, в холодном-холодном (кстати, не таком уж и холодном) ноябре месяце мой лэптоп мезозойского 2010-го года выпуска после внезапного отключения электроэнергии во время установки обновлений схватил хард-свичофф. Ну, думаю, бывает, включил его, и как ни в чем не бывало продолжил работу. Но уже на следующий день, после еженедельной пачки апдейтов для ОС, я заметил весьма странную вещь: при запланированной после наката очередного KBxxxxxx перезагрузке системе «Не удаётся завершить обновления», о чём она недвусмысленно повествует нам перед появлением логон-скрина.
                  Читать дальше →
                  • +10
                  • 29,9k
                  • 9
                • Слушаем музыку дома

                    Как-то так сложилось, но музыкального центра у меня никогда не было, максимум советский магнитофон Маяк-223 да пара колонок. Приобщиться к цифровому звуку и компакт-дискам удалось только с появлением PC-совместимого компьютера в начале 2000-х. Да и CD-привод был дорог и появился далеко не сразу. Однако в то время уже во всю развивалась революция MP3, а соответственно как и у многих, у меня начала расти небольшая коллекция музыки на винте, что-то было скопировано у друзей, что-то рипалось собственноручно с купленных компакт-дисков, дабы не дергать постоянно привод ради прослушивания музыки. Да и в Winamp'е можно было составить плейлист на много-много часов из много-много альбомов, а не гонять строго один альбом постоянно.

                    Собственно музыка слушалась со встроенной звуковухи на обычных компьютерных пищалках без особых претензий. Но несколько лет назад вдруг захотелось чего-то большего. Что называется, не было у бабы проблем, купила баба порося. В этой статье я постараюсь поделиться с вами личным опытом в организации домашнего звука.
                    Читать дальше →
                  • Так считали древние. Вавилон

                      Это продолжение задуманной мной серии про историю вычислений и счета. Первая статья про Египет здесь.

                      Сейчас я попробую немного рассказать о другой великой цивилизации и культуре прошлого. Вавилонское царство возникло в начале 2-го тысячелетия до нашей эры, оно пришло на смену Шумеру и Аккаду и существовало до завоевания Персами в 539 г. до н.э. Писали в Вавилоне, как все помнят, на глиняных табличках с помощью клинописи, которые очень неплохо сохраняются в отличие от бумаги, папируса, и подобных вещей, поэтому мы знаем достаточно много и про Вавилон, и про его математику. Но, конечно, мы не знаем всего. В отличие от греков вавилоняне не оставили точных алгоритмов и ясных объяснений своих приемов. Теперь мы можем только догадываться как именно вавилоняне действовали в том или ином случае при решении задачи. В этой работе я сосредточусь в основном на вавилонской арифметике, оставив в стороне геометрию, алгебру и астрономию.
                      Читать дальше →
                      • +32
                      • 27,4k
                      • 1
                    • Так считали древние. Египет

                        Мало кто задумывается, что те приемы, которые мы используем для письма и счета формировались на протяжении многих тысяч лет. Нам они кажутся очевидными, ну, подумаешь, умножить в столбик, перенести все члены с неизвестным на одну сторону. Ведь это так просто! На самом деле это огромные интеллектуальные завоевания человечества, которые часто были недоступны умнейшим людям прошлого. Я собираюсь (если хватит терпения и времени) написать несколько заметок о том, как считали в прошлом. В этой я расскажу про то, как считали египтяне.
                        Читать дальше →
                      • Пулы потоков: ускоряем NGINX в 9 и более раз

                        • Перевод
                        Как известно, для обработки соединений NGINX использует асинхронный событийный подход. Вместо того, чтобы выделять на каждый запрос отдельный поток или процесс (как это делают серверы с традиционной архитектурой), NGINX мультиплексирует обработку множества соединений и запросов в одном рабочем процессе. Для этого применяются сокеты в неблокирующем режиме и такие эффективные методы работы с событиями, как epoll и kqueue.

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

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

                        У медали есть и обратная сторона. Главной проблемой асинхронного подхода, а лучше даже сказать «врагом» — являются блокирующие операции. И, к сожалению, многие авторы сторонних модулей, не понимая принципов функционирования NGINX, пытаются выполнять блокирующие операции в своих модулях. Такие операции способны полностью убить производительность NGINX и их следует избегать любой ценой.

                        Но даже в текущей реализации NGINX не всегда возможно избежать блокировок. И для решения данной проблемы в NGINX версии 1.7.11 был представлен новый механизм «пулов потоков». Что это такое и как его применять разберем далее, а для начала познакомимся с нашим врагом в лицо.
                        Читать дальше →