• Как посчитать всё на свете одним SQL-запросом. Оконные функции PostgreSQL


      Я с удивлением обнаружил, что многие разработчики, даже давно использующие postgresql, не понимают оконные функции, считая их какой-то особой магией для избранных. Ну или в лучшем случае «копипастят» со StackOverflow выражения типа «row_number() OVER ()», не вдаваясь в детали. А ведь оконные функции — полезнейший функционал PostgreSQL.
      Попробую по-простому объяснить, как можно их использовать.


      Читать дальше →
    • Проблемы передачи списка перечислений или Почему абстракции «текут»

        Все нетривиальные абстракции дырявы

        Джоэл Спольски – Закон дырявых абстракций


        А иногда дырявятся и довольно простые абстракции

        Автор этой статьи



        Большинство современных разработчиков знакомы с «законом дырявых абстракций» по знаменитой заметке Джоэла Спольски с одноименным названием. Заключается этот закон в том, что как бы ни был хорош протокол взаимодействия, фреймворк или набор классов, моделирующих предметную область, рано или поздно нам приходится спускаться на уровень ниже и разбираться с тем, как же эта абстракция устроена. Внутреннее устройство абстракции должно быть проблемой самой абстракции, но возможно это только в наиболее общих случаев и лишь до тех пор, пока все идет хорошо (*).

        Когда-то давно, в «небольшой» мелкомягкой компании решили, а почему бы нам не «абстрагироваться» от местоположения объекта и сделать сам факт того, является ли объект локальным или удаленным, лишь «деталью реализации». Так появились технологии DCOM и ее наследник .NET Remoting, которые скрывали от разработчика, является ли объект удаленным или нет. При этом появились все эти «прозрачные прокси», которые позволяли работать с удаленным объектом, даже не зная об этом. Однако, со временем выяснилось, что эта информация архиважна для разработчика, поскольку удаленный объект может генерировать совершенно другой перечень исключений, да и стоимость работы с ним несравнимо выше, чем взаимодействие с локальным объектом.

        Читать дальше →
      • Чем полезен мономорфизм?

        • Перевод


        Выступления и посты в блогах о производительности JavaScript часто обращают внимание на важность мономорфного кода, однако обычно не дается внятного никакого объяснения, что такое мономорфизм/полиморфизм и почему это имеет значение. Даже мои собственные выступления зачастую сводятся к дихотомии в стиле Невероятного Халка: «ОДИН ТИП ХОРОШО! ДВА ТИП ПЛОХО!». Неудивительно, что когда люди обращаются ко мне за советом по производительности, чаще всего они просят объяснить, что на самом деле такое мономорфизм, откуда берется полиморфизм и что в нем плохого.

        Ситуацию осложняет еще и то, что само слово «полиморфизм» имеет множество значений. В классическом объектно-ориентированном программировании полиморфизм связан с созданием дочерних классов, в которых можно переопределить поведение базового класса. Программисты, работающие с Haskell, вместо этого подумают о параметрическом полиморфизме. Однако полиморфизм, о котором предупреждают в докладах о производительности JavaScript – это полиморфизм вызовов функции.

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

        Я также попробовал новый способ объяснять вещи – изображая взаимодействие составных частей виртуальной машины в виде коротких комиксов. Кроме того, данная статья не покрывает некоторые детали, которые я посчитал незначительными, излишними или не связанными напрямую.
        Читать дальше →
      • Числа Каталана

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

          В мире ПО существует огромное количество программ, забытых своими разработчиками. Хорошо, когда уже есть хорошая альтернатива. А если ее нет? В программе может катастрофически не хватать каких-то мелочей, некоторые досадные ошибки могут годами доставлять массу неудобств пользователям, а на новых версиях ОС программа и вовсе может отказаться работать. Далеко не всегда имеются исходные коды, чтобы привести программу в порядок. Если программа простая — не составит труда за короткий срок создать альтернативу. Но если программа большая и сложная, что же делать в таком случае? Не всегда рационально тратить время и деньги на разработку полного аналога, ведь расширить в разумных рамках функциональность и исправить большинство ошибок можно уже в готовом исполняемом файле.
          В этой статье будут продемонстрированы методики модификации исполняемых файлов на примере расширения функциональности легендарной игры Age of Empires II (стратегия реального времени).
          Читать дальше →
        • Как новые руководители разрушают доверенные им компании

            Эта статья – о рисках смены руководства в больших компаниях и характерных явлениях при попытках игнорировать закон эффективного управления собственностью:
            Эффективно управлять можно только той собственностью, которую мог бы создать сам.
            Кто не может создать, – будет только разрушать!
            И.А. Дедюхова, Кодекс Хамурапи
            Картинка для привлечения внимания читателей из поколений Y и Z:


            Краткое содержание


            Новый директор себе в подчиненные и советники пригласит своих «проверенных людей». Увеличение штата топ-менеджеров в условиях фиксированного ФОТ повлечет за собой сокращение рядовых сотрудников на значительный процент.
            Новый директор в первую очередь будет сокращать те подразделения, работу которых он не понимает. Под прессом психологического давления руководители этих подразделений возмут на себя обязательства самостоятельно разработать планы по сокращению и принять на себя все риски их реализации.
            Сокращения пройдут под флагом повышения эффективности, но для «непонятных директору» подразделений не смогут сформулировать критерии этой эффективности, кроме «минимизации затрат». Цель по минимизации затрат без дополнительных обоснованных ограничений – это цель по уничтожению, и не имеет отношения к настоящей оптимизации.
            Отсекая непонятные ему части компании (выводя в аутсорс и т.п.), директор попытается превратить компанию в ту, работу которой он полностью способен понять, которой он в полной мере способен управлять.
            Проблему нехватки знаний в технической области новый директор и его команда компенсируют «помощью» от западных консалтинговых компаний. Это приведет к ситуации внешнего управления, причем без всякой ответственности за диктуемые извне решения.
            Внешняя и внутренняя отчетность о работе компании до самого конца не будет показывать никаких признаков проблем, т.к. тому, кто принес плохие вести не выдают премию, а рубят голову.


            Читать дальше →
          • Двойной обман. Как ФБР использовало украинского хакера Максима Попова

            • Перевод


            Холодным днём 18 января 2001 года Максим Игоревич Попов, 20-летний украинский парень, нервно толкнул двери американского посольства в Лондоне. Его можно было принять за участника программы по студенческому обмену, который пришёл получать визу, но самом деле Максим был хакером, участником восточноевропейской хакерской группы, которая атаковала американские коммерческие компании, зарабатывая на вымогательстве и фроде. Прокатившаяся волна таких атак выглядела словно предвестник нового этапа Холодной войны между США и организованными хакерскими группировками в странах бывшего советского блока. Максим Попов с детским лицом, в очках и с короткой стрижкой, собирался стать первым перебежчиком в этой войне.
            Читать дальше →
          • Разработчики в край обленились?

            • Перевод
            image

            Примечание от переводчика:

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



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

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

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

            Ниже я предлагаю вам ознакомиться с рядом скриншотов, на которых запечатлены «косяки» наших коллег только за последний месяц. Или я такой «везучий», что только и делаю, что натыкаюсь на подобное? Или же это видят все, но только мне приходится сдерживаться, чтобы не начать орать?
            Читать дальше →
          • Особенности распределения фонда оплаты труда в больших предприятиях РФ

              Оказывается, в свободном доступе есть интересная информация от HeadHunter о повышении фонда оплаты труда (ФОТ) в 2015 году. Со страницы проекта "Банк данных заработных плат" идет ссылка "Сравнивайте зарплаты вашей компании с рынком".

              Прямая ссылка на pdf: Зарплаты в России. Итоги 2015 года.


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

              И вообще, многим придут на ум уже затертые шаблоны:
              • Надо не завидовать, а больше работать, и станешь таким же высокооплачиваемым топ-менеджером.
              • Не нравится – уходи и работай на себя / аутсорсь за валюту на западные компании / переезжай в другие страны.


              Но эти выводы и советы слишком уж лежат на поверхности.
              We need to go deeper.
              Давайте посмотрим, насколько же глубока эта не кроличья нора…
              Читать дальше →
            • NGINX — История перерождения под Windows

                Раз уж тут у нас «неделя» nginx, например тут или тут, то попробую и я внести свою, так сказать, лепту. Речь пойдет про nginx 4 windows, а именно про более-менее официальную сборку для этой пропритарной, некоторыми не очень любимой платформы.

                Почему Windows. Все просто, в корпоративном секторе Windows на сервере, да и на рабочих станциях — нередко обязательная программа. И от этих требований к платформе, например в ультимативной форме озвученных клиентом, никуда не денешься.
                И раз уж имеем Windows, но не хочется мучиться с IIS, apache и иже с ними, если хочется использовать любимые инструменты, а nginx однозначно к ним относится, то приходится иногда мириться даже с некоторыми ограничениями на этой платформе. Вернее приходилось…

                Хотя нужно заметить, что даже с этими ограничениями, nginx даст фору практически любому веб-серверу под windows по многим факторам, в том числе по стабильности, потреблению памяти, а главное производительности.

                Спешу сразу поделится хорошей новостью — больше ограничений, критичных к высокой производительности, при использовании nginx под windows практически не существует, и последнее из критичных, с высокой долей вероятности, тоже скоро отпадет. Но по порядку…

                Здесь описаны известные проблемы nginx 4 windows, а именно:

                • Рабочий процесс может обслуживать не более 1024 одновременных соединений.
                • Кэш и другие модули, требующие поддержки разделяемой памяти, не работают под Windows Vista и более поздними версиями в связи с тем, что на этих версиях Windows включена рандомизация адресного пространства.
                • Хоть и возможен запуск нескольких рабочих процессов, только один из них реально работает.

                Я немного изменил порядок, т.к. именно в такой последовательности я разбирался с этими ограничениями, так сказать отсортировано «исторически».
                Читать дальше →
              • NGINX изнутри: рожден для производительности и масштабирования

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

                Инфографика Inside NGINX сверху вниз проведет вас по азам устройства процессов к иллюстрации того, как NGINX обрабатывает множество соединений в одном процессе. Данная статья рассмотрит всё это чуть более детально.
                Поехали!
              • Обстоятельно о подсчёте единичных битов

                • Tutorial
                Я хотел бы подарить сообществу Хабра статью, в которой стараюсь дать достаточно полное описание подходов к алгоритмам подсчёта единичных битов в переменных размером от 8 до 64 битов. Эти алгоритмы относятся к разделу так называемой «битовой магии» или «битовой алхимии», которая завораживает своей красотой и неочевидностью многих программистов. Я хочу показать, что в основах этой алхимии нет ничего сложного, и вы даже сможете разработать собственные методы подсчёта единичных битов, познакомившись с фундаментальными приёмами, составляющими подобные алгоритмы.

                Читать дальше →
              • Tracert vs Traceroute

                  В чем отличие маршрута пакета от его пути?
                  Стандартный механизм маршрутизации пакетов в интернете — per hop behavior — то есть каждый узел в сети принимает решение куда ему отправить пакет на основе информации, полученной от протоколов динамической маршрутизации и статически указанных администраторами маршрутов.

                  Маршрут — это интерфейс, в который нам надо послать пакет для достижения какого то узла назначения и адрес следующего маршрутизатора (next-hop):
                  R1#sh ip rou | i 40.  
                  	 40.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
                  O        40.0.0.0/31 [110/3] via 20.0.0.0, 00:01:54, FastEthernet0/0
                  O        40.1.1.1/32 [110/4] via 20.0.0.0, 00:00:05, FastEthernet0/0
                  

                  Что такое путь? Путь — это список узлов, через которые прошел (пройдет) пакет:
                   1  10.0.0.1  16.616 ms  16.270 ms  15.929 ms
                   2  20.0.0.0  15.678 ms  15.157 ms  15.071 ms
                   3  30.0.0.1  26.423 ms  26.081 ms  26.744 ms
                   4  40.0.0.0  48.979 ms  48.674 ms  48.384 ms
                   5  100.0.0.2  58.707 ms  58.773 ms  58.536 ms
                  

                  Путь пакета можно посмотреть с помощью утилит tracert в OC Windows и traceroute в GNU/Linux и Unix-подобных системах. (другие команды, типа tracepath мы не рассматриваем).
                  Многие считают что этих утилит один и тот же принцип работы, но это не так. Давайте разберемся.
                  Читать дальше →
                • Как я написал и издал книгу по мотивам своих постов с Хабра



                    Привет!
                    У меня сегодня небольшой праздник. Моя книга «Бизнес как игра» наконец-то доехала до полок. Ещё тёплая.

                    Из постов, которые я тут пишу уже лет пять, выросла книга. Упоротая, с такими вещами, которые обычно про бизнес не пишут. Внутри — 140 маленьких глав на страницу-две про разные аспекты бизнеса, по сути — баек. Начиналось всё с хабрапостов — и постепенно стало понятно, что их надо очень сильно менять, плюс писать куда больше про бизнес и управление.

                    Ниже я расскажу, что узнал, пока издавался. Например, про то, что заработать на книге нельзя, про обычные тиражи, про процесс и вообще.
                    Читать дальше →
                  • Роберт Меткалф: папа EtherNet, отличный инженер и фиговый предсказатель (но за слова ответил)

                      • «Я предсказываю, что интернет в 1996 году ожидает коллапс.»
                      • «Идеология движения Open Source — утопическая галиматья, как коммунизм. Linux — утопия для спиритуалистов.»
                      • «Беспроводные технологии обречены и мы скоро вернемся к проводам. Вода все еще течет по трубам, и, примерно по этим же причинам, компьютеры будут соединяться проводами.»
                      • «Социальные сети – это большой мыльный пузырь, он должен лопнуть, как лопаются все пузыри.»

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

                      Чтобы там не он говорил, но благодаря ему у нас было счастливое детство, мы могли рубиться по сети в Doom и Starcraft.
                      От лица компании Edison поздравляем изобретателя. C днем рождения, Роберт! (70 лет, однако.)
                      image

                      «Недостаточно аналитичная» — причина по которой научный совет Гарварда не принял диссертацию Роберта Меткалфа «Packet Communication», в которой впервые описывались стандарты Ethernet.

                      Десятилетия спустя, став всемирно признанным, Меткалф не простил своих гарвадских обидчиков-профессоров. Характеризуя их, он постоянно употребляет выражение dark little heart (темные мелочные сердца).
                      Читать дальше →
                      • +14
                      • 20,9k
                      • 4
                    • Wireshark — приручение акулы

                      • Tutorial


                      Wireshark — это достаточно известный инструмент для захвата и анализа сетевого трафика, фактически стандарт как для образования, так и для траблшутинга.
                      Wireshark работает с подавляющим большинством известных протоколов, имеет понятный и логичный графический интерфейс на основе GTK+ и мощнейшую систему фильтров.
                      Кроссплатформенный, работает в таких ОС как Linux, Solaris, FreeBSD, NetBSD, OpenBSD, Mac OS X, и, естественно, Windows. Распространяется под лицензией GNU GPL v2. Доступен бесплатно на сайте wireshark.org.
                      Установка в системе Windows тривиальна — next, next, next.
                      Самая свежая на момент написания статьи версия – 1.10.3, она и будет участвовать в обзоре.

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

                      Начинаем плаванье


                      Для начала захвата достаточно выбрать свой сетевой интерфейс и нажать Start.
                      Читать дальше →
                    • Футуристическое мышление

                        Все имена сохранены, все совпадения имеют под собой злой умысел.

                        Привет! Меня зовут Саня, и я вижу будущее. Вы только не подумайте: я не какой-нибудь там маг-экстрасенс пятой категории гильдии Ардуины второго пришествия. Я действительно вижу будущее, когда сосредоточусь. Я не знаю, кто посылает мне эти видения: бородатый дядька на небе, аццкий сцотона, или дух Ричарда Фейнмана просачивается сквозь швы пространства-времени и подсовывает мне в голову эти картинки. Я также не знаю, как вся эта бодяга согласуется с многомировой теорией, принципом неопределённости Гейзенберга и пророчеством Ванги.

                        Многие спросят: «Эй чувак! Если ты действительно видишь будущее, то какого чёрта ты тратишь время на пост в хабр вместо того, чтобы спасать мир?!» Проблема в том, что я не вижу глобальных событий. Я не могу предсказать эпидемию или войну; не могу знать о том, что Северная Корея запустит ядерную ракету; даже вымирание популяции бородатых хомячков в африканских саваннах я не могу предотвратить. Вот я и решил устроиться на работу, где мои скромные умения точно пригодятся.
                        Читать дальше →
                      • Кризис ожирения сайтов

                        • Перевод
                        Примечание переводчика: визит под кат этого поста означает большие объёмы потреблённого трафика. И это иронично, если учесть поднятую тему. Но всё сразу встаёт на свои места, если помнить, что в оригинале это было выступление в прошлом ноябре в Сиднее длиной почти в час. Чтение поста занимает куда меньше времени. В форме видеозаписи (1280×720) речь занимает два гигабайта. Пост же занимает всего лишь 12 МиБ. Рекомендуется просмотр на широких мониторах.



                        Перед началом тирады я хотел бы обратить внимание на то, что прекрасные сайты бывают любых форм и размеров. И я здесь не собираюсь кого-то пристыживать за количество использованных бит, объём использованных ресурсов и так далее. Я люблю большие сочные галереи изображений, мне нравятся огромные эксперименты на JavaScript, я смотрю онлайн-видео в высоком разрешении, как и все вы. Я считаю, что подобное замечательно.

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

                        • Перевод


                        В оригинале название звучит как «How Not To Sort By Average Rating». Я подумал, что дословный перевод «Как не сортировать по усреднённому рейтингу» будет малопонятен и хуже отражает содержание статьи.

                        Постановка проблемы


                        Вы занимаетесь веб программированием. У вас есть пользователи, которые оценивают контент на вашем сайте. Вы хотите разместить высоко оцененный контент наверху, а низко оцененный — внизу. Для этого на основе пользовательских оценок вам нужно вычислить некий «рейтинг».

                        Неправильное решение №1

                        Рейтинг= (Число положительных оценок) - (Число отрицательных оценок)
                        

                        Читать дальше →
                      • Расширенные инструкции процессора в .NET или «C# Intrinsics»

                          В шахматных программах широко используются «битовые доски» (битборды 1, 2) для представления фигур на доске. А так же и для других игр на той же доске 8×8, и даже для карточных игр. С битбордами часто проводят различные операции, например, найти первый установленный бит или посчитать количество установленных битов. Для этих операций придумано много «хитрых» алгоритмов, а на современных процессорах некоторые из этих операций доступны в расширенном наборе инструкций. Например, popcnt, доступный в SSE4.2 ABM. Также есть пара инструкций bsf/bsr, которые доступны уже давно, но из JIT-компилятора к ним нет никакого доступа.
                          Конечно, всё серьёзные шахматные программы пишут на C++, но для прототипирования каких-нибудь алгоритмов хочется использовать C#, потому что я с ним лучше знаком и у меня меньше шансов выстрелить себе в ногу. Но производительность тоже не хочется терять просто так, в C/C++ интересующие нас инструкции доступны так называемые встроенные функции. Я попробовал сделать подобное решение и для C#.
                          Читать далее