• Ускоряем логин через SSH в Ubuntu в 100 раз

      Долгое время я мучился ужасно медленным удаленным логином на свои Ubuntu сервера (все 2 ). Ужасно медленно в данном случае — 2-3 секунды. Не то чтобы это было совсем фатально, но когда логин через ключ — хочется чтобы все работало мгновенно — в конце концов, у нас не 486SX.

      Длительное гугление приводило только к стандартным решениям:
      1. UseDNS no в /etc/ssh/sshd_config — ускоряет логин в случае тормозного DNS. В моём случае стоял локальный кеширующий DNS, потому и так все было быстро.
      2. Принудительное указание IPv4 в SSH клиенте — особо не помогло, видимо не у всех тормозит
      И на askubuntu.com вопрос c bounty уныло провисел долгие недели без ответа…

      Читать дальше →
    • Знаешь ли ты JAVA, %username%?

      JAVA Evil EditionНедавно я сдавал экзамен Oracle Certified Professional Java Programmer (бывший Sun Certified), и за время подготовки прорешал огромное количество различных задачек. Отдельные задачки по джаве иногда появляются на хабре и вызывают немалый интерес, поэтому я решил поделиться накопленным и сделать небольшую подборку.

      Итак, ниже представлен десяток наиболее, на мой взгляд, интересных задач по Java SE из более чем 1000, проработанных мной. Сложность варьируется от средней до ооооооочень сложной. Решение большинства задач практически не требует знания API, достаточно логики и фундаментальных основ Java.

      К слову, сложность экзамена Oracle Certified Professional Java Programmer гораздо ниже чем сложность данного теста, поэтому все, кто правильно ответит хотя бы на половину этих вопросов, может смело сдавать этот экзамен без всякой подготовки.

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

      ВНИМАНИЕ: во второй половине статьи — ответы и подробные пояснения по соответствующим нюансам JAVA.

      Читать дальше →
    • Обратная сторона луны

        При написании приложений, одной из важнейших вопросов являются потребление памяти и отзывчивость (скорость работы).

        Считается, что сборщик мусора – черный ящик, работу которого нельзя предугадать.

        А еще говорят, что GC в .NET практически не настраиваемый. А еще, что нельзя посмотреть исходники как классов .NET Framework, так и CLR, GC и т.п.

        А я скажу как бы ни так!

        В данной статье мы рассмотрим:
        • структура организации размещения объектов в памяти
        • CLR 4.5 Background Server GC
        • правильная настройка сборщика мусора
        • эффективный апгрейд приложений до .NET 4.0+
        • правильное ручное управление памятью

        Читать дальше →
      • Постигаем Git

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

        Если вы не понимаете, что побудило сделать git именно таким, то вас ждут страдания. Используя множество флагов (--flag), вы сможете заставить git работать так, как по вашему мнению он должен работать, вместо того, чтобы работать так, как git того хочет. Это как забивать гвозди отверткой. Работа делается, но хуже, медленнее, да и отвертка портится.
        Читать дальше →
      • Я не знаю ООП

          Я не умею программировать на объектно-ориентированных языках. Не научился. После 5 лет промышленного программирования на Java я всё ещё не знаю, как создать хорошую систему в объектно-ориентированном стиле. Просто не понимаю.

          Я пытался научиться, честно. Я изучал паттерны, читал код open source проектов, пытался строить в голове стройные концепции, но так и не понял принципы создания качественных объектно-ориентированных программ. Возможно кто-то другой их понял, но не я.

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

          • Tutorial

          Проведя небольшое научное исследование (проще говоря, выполнив поиск на сайте), обнаружил, что на хабре имеется всего две статьи с тегом вычислительная геометрия, причем одна из них оказалась моей. Т.к. в последнее время я несколько заинтересовался этой тематикой, то решил продолжить тему алгоритмической геометрии рассмотрением задачи построения так называемых минимальных выпуклых оболочек. Хотя рисунок справа и дает проницательному хаброчитателю исчерпывающее объяснение того, что это такое, тем не менее под катом будут даны чуть более формальные определения и описаны два классических алгоритма построения минимальных выпуклых оболочек.
          Читать дальше →
        • Защита АСУ ТП по-американски

            Пост написан из-за появления вчерашних новостей о вирусе-шпионе (например, вот). как ни странно, но проблема защиты промышленных объектов в РФ ставится не так остро, как должна бы… в СМИ очень часто можно услышать про законы о персональных данных, а вот защитой АСУ ТП(системы управления технологическими процессами), похоже, никто особо не занимался (защита критически важных объектов регламентирована документами ФСТЭК, но они имеют гриф и не доступны простым смертным). Для тех же компаний, которые не попали в список этих самых «критически важных», существует только стандарт Газпрома… и все, больше никаких документов и рекомендаций в области защиты АСУ ТП нет.
            В США дело обстоит в корне наоборот, и американский US CERT выкладывает в свободный доступ свои рекомендации по защите АСУ ТП. Желающих ознакомиться прошу под кат.
            Читать дальше →
          • Опыт переезда на SSD

              На прошлой неделе менеджер дал добро на апгрейд машины с HDD на SSD всем четверым моим коллегам включая меня. Помогло мое возмущенное письмо о вреде долгой компиляции и тормозов Resharper'а на нервы разработчика. Рассказал что запуск студии занятие нетривиальное, а уж компиляция и последующий рестарт ASP.NET вообще крайне болезнены.

              В принципе конфигурация хорошая, Xeon W3503 с 4GB памяти, и комп должен по идее летать (не в играх понятно, а в офисной обстановке). Но к сожалению все это добро тормозится самым обычным сигейтом на 250 гигов. Поэтому разрешив денежный вопрос, я принялся выбирать подходящий SSD. Для минимизации даунтайма, я решил просто склонировать свой диск. Посмотрев на текущий занятый обьем, я остановился на диске от 100GB. В местном магазине были закуплены SSD Corsair 115GB по $170 в количестве 4-х штук и розданы каждому. Дешевле было бы брать на newegg'е, но временные ограничения предполагали покупку «сегодня же», поэтому брал что было. Заодно и докупил памяти до 8 гигов.

              Итак мне, как самому инициативному, нужно было перенести свою систему, а так же помочь коллегам. Для клонирования я воспользовался Clonezilla. Для манипулирования разделами, я так же скачал Gparted. И Clonezilla и Gparted надо прожечь на болванки или флешки, как вам проще.
              Читать дальше →
            • Когда использовать Parallel.ForEach, а когда PLINQ

              • Перевод

              Введение


              Обычно, при оптимизации программы для многоядерных компьютеров первым шагом является выяснение возможности разделения алгоритма на части, выполняющиеся параллельно. Если для решения задачи необходимо параллельно обрабатывать отдельные элементы из большого набора данных, то первыми кандидатами станут новые возможности параллельности в .NET Framework 4: Parallel.ForEach и Parallel LINQ (PLINQ)

              Parallel.ForEach


              Класс Parallel содержит метод ForEach, представляющий собой многопоточную версию обычного цикла foreach в C#. Подобно обычному foreach, Parallel.ForEach выполняет итерации над перечислимыми данными (enumerable), но с использованием множества потоков. Одна из более часто используемых перегрузок Parallel.ForEach выглядит следующим образом:
              
              public static ParallelLoopResult ForEach<TSource>(
              			 IEnumerable<TSource> source,
              			 Action<TSource> body)
              

              Ienumerable указывает на последовательность, по которой нужно выполнить итерации, а Action body задает делегат, вызываемый для каждого элемента. Полный список перегрузок Parallel.ForEach можно найти здесь.

              PLINQ


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

              Выполнение независимых операций


              Читать дальше →
              • +67
              • 31,4k
              • 9
            • Еще Одно Руководство по Монадам (часть 2: функции >>= и return)

              • Перевод
              By Mike Vanier

              Две фундаментальные монадические операции


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

              К этому моменту, я надеюсь, у вас сложилось хотя бы смутное ощущение монад, что они такое и для чего используются. Я уже упоминал одну из особенностей функционального программирования — композицию функций, благодаря которой мы создаем новые функции, объединяя старые. Функциональные программисты постоянно говорят о «комбинируемости» {1}, подразумевая, что если что-то в языке программирования не комбинируется, значит, оно немногого стоит. Аналогично, наши новоявленные монадические функции не были столь же полезны, если бы они не компоновались так, как это есть на самом деле. Но мы еще увидим, для их композиции нельзя использовать стандартную функцию «точка» (.) языка Haskell. Мы придем к выводу, что тут нужно что-то большее, и определим две фундаментальные монадические операции (или, для начала, их типы).
              Читать дальше →
              • +15
              • 5,6k
              • 4