• Язык в языке или встраиваем XPath в Scala

    • Tutorial
    Scala — великолепный язык. В него можно влюбиться. Код может быть лаконичным, но понятным; гибким, но строго типизированным. Продуманные до мелочей инструменты позволяют не бороться с языком, а выражать на нем свои идеи.

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

    В этой статье я расскажу о том, чего делать, скорее всего, не стоит.
    Я расскажу как встроить в scala другой язык.
    Читать дальше →
    • +16
    • 9.9k
    • 9
  • А как же всё-таки работает многопоточность? Часть II: memory ordering

      картинка для привлечения внимания

      Знание об управлении потоками, которое мы получили в прошлом топике, конечно, велико, но вопросов остаётся всё равно много. Например: «Как работает happens-before?», «Правда ли, что volatile — это сброс кешей?», «Зачем вообще было городить какую-то модель памяти? Нормально же всё было, что началось-то такое?»

      Как и прошлая статья, эта построена по принципу «сначала кратко опишем, что должно происходить в теории, а потом отправимся в исходники и посмотрим, как это происходит там». Таким образом, первая часть во многом применима не только к Java, а потому и разработчики под другие платформы могут найти для себя что-то полезное.
      Go Deeper
    • Хитрые задачи по Java

        Совсем недавно я сдал OCA Java SE 7 Programmer I. За время подготовки успел решить огромное количество задач и извлечь из них много тонких моментов языка. Самые интересные и ловкие — сохранял на будущее. И вот у меня накопилась небольшая личная коллекция, лучшую часть которой я здесь и опишу.

        В замечательной статье Знаешь ли ты JAVA, %username% и её второй части автор тоже поделился опытом после подготовки. Однако я пришёл к выводу, что могу добавить что-то своё. Так и зародилась эта статья.

        Читать дальше →
      • MacroGroovy — работа с AST на Groovy ещё никогда не была такой простой

          image
          Последнее время часто приходится работать с такой мощной возможностью Groovy как Compile-time AST Transformations.

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

          def someVariable = new ConstantExpression("someValue");
          def returnStatement = new ReturnStatement(
              new ConstructorCallExpression(
                  ClassHelper.make(SomeCoolClass),
                  new ArgumentListExpression(someVariable)
              )
          );
          


          До боли знакомые конструкции, не правда ли? Хотите, чтобы было вот так?
          def someVariable = macro { "someValue" }
          def returnStatement = macro { return new SomeCoolClass($v{ someVariable }) }
          


          Или даже так?
          def constructorCall = macro { new SomeCoolClass($v{ macro { "someValue" } }) }
          


          В данной статье речь пойдёт о моём решении этой проблемы, максимально близком к родному решению Groovy — github.com/bsideup/MacroGroovy

          Читать дальше →
        • Правильные способы исключения файлов в Git

            Иногда встречаю в файле .gitignore то, чего там быть никак не должно. Например, папка .idea, в которой лежат конфиги известных IDE от JetBrains. Это часть вашего рабочего окружения и она никаким боком не относится к проекту и репозиторию. Если над проектом работает несколько человек и каждый из них добавит конфиги своего окружения в .gitignore, то он превратится в нечитаемую помойку.

            В этом топике я расскажу о правильных способах исключения файлов и о том когда какой способ использовать.
            Читать дальше →
          • Ускоряем Nginx за 5 минут

              image
              Попытайтесь повторить это сами

              Как правило, настроенный должным образом сервер Nginx на Linux, может обрабатывать 500,000 — 600,000 запросов в секунду. Но этот показатель можно весьма ощутимо увеличить. Хотел бы обратить внимание на тот факт, что настройки описанные ниже, применялись в тестовой среде и, возможно, для ваших боевых серверов они не подойдут.

              Минутка банальности.

              yum -y install nginx
              

              На всякий пожарный, создадим бэкап исходного конфига.

              cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.orig
              vim /etc/nginx/nginx.conf
              

              А теперь можно и похимичить!
              Бдыжь-бдыжь
            • PicUntu 4.5 installer: легкий способ установить Ubuntu на устройства с Rockchip RK3188



                Еще в январе на Хабре публиковалась новость о новом дистрибутиве Linux, PicUntu, предназначенном для установки Ubuntu на устройства с Rockchip RK3188 (в основном это мини-ПК, TV boxes и прочее). Теперь появился GUI-установщик, который позволяет без всяких проблем установить данный дистрибутив, с чем могут справиться не особо опытные пользователи.

                Читать дальше →
              • Загрузка ОС Linux без загрузчика

                Введение


                Здесь по возможности я постараюсь как можно проще и детальнее ответить на вопрос:
                «Как можно загрузить Linux (на примере ubuntu) без использования загрузчика такого как GRUB 2, iELILO»
                Здесь не будет разбираться как запустить/установить Ubuntu в режиме [UEFI only]. Для этого обратитесь сюда help.ubuntu.ru/wiki/установка_дистрибутива_на_компьютер_с_efi
                и сюда help.ubuntu.ru/wiki/lubuntu-osinstallation
                Все действия будут производиться на уже работающей системе.
                Читать дальше →
              • Настраиваем HTTPS-сервер на nginx

                Для чего я это пишу?


                В последнее время в связи с кучей факторов (АНБ, DPI с рекламой и другое) у меня начала просыпаться паранойя и я подумал полностью перевести свой небольшой сайт на https. На хабре было несколько статей с техническими подробностями работы SSL/TLS, однако поискав информацию на тему настройки https-вебсервера обнаружил традиционное деление статей — либо это статьи «Делайте вот так», где просто даны настройки без каких-либо разъяснений и вариантов использования, либо это большие теоретические статьи, где обсуждаются различные схемы использования, но без практически применимых готовых вариантов. На хабре была статья о настройке, однако в ней нет информации про DH-кодировки, да и некоторые параметры не описаны. Подумал, что стоит упорядочить найденное в виде статьи, которая будет полезна тем, кто хотел бы развернуть https у себя на сервере, но не слишком углубляться в дебри SSL.

                Повествование будет вестись с учетом того, что веб-сервером выступает nginx (и в одном месте будет параметр для php-fpm).
                Читать дальше →
              • Копаемся в памяти JVM. Манипуляции с флагами



                  HotSpot JVM имеет множество опций для отслеживания происходящего в виртуальной машине: PrintGC, PrintCompilation, TraceClassLoading и т.п. Как правило, они включаются параметрами командной строки, например, -XX:+PrintGCDetails. Однако порой возникает необходимость включить или выключить такой флаг непосредственно во время работы приложения, когда перезапуск JVM с другими параметрами невозможен. Этого можно добиться как штатным, так и хакерским способом, причем последний и мощнее, и интереснее. Впрочем, внимания заслуживают оба.

                  Из данной статьи вы узнаете:

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

                  Читать дальше →
                • Алгоритм выбора STL-контейнера

                  • Translation
                  • Tutorial


                  UPD: схема заменена на вариант с контейнерами из С++11, соавторы — в комментариях ниже

                  Первый вариант схемы - без контейнеров из С++11

                  Only registered users can participate in poll. Log in, please.

                  Стоит по результатам обсуждения в комментариях расширить схему для контейнеров С++11?

                  • 6.6%Нет, ты что, это же перевод, должно быть точно как в оригинале!73
                  • 12.2%Надо бы, конечно, но вряд ли мы тут всё правильно придумаем135
                  • 81.2%А почему бы и нет? Давай, конечно!900
                • Linux Malware Detect — антивирус для веб-серверов



                  Интернет уже не тот, что прежде — кругом враги. Тема обнаружения непосредственного заражения сайта и поиска вредоносных/зараженных скриптов на взломанном сайте рассмотрена слабо, попробуем это исправить.
                  Итак, представляем вашему вниманию Linux Malware Detect.

                  Linux Malware Detect (LMD) — это сканер для Linux, предназначенный для поиска веб-шеллов, спам-ботов, троянов, злонамеренных скриптов и прочих типичных угроз характерных для веб-пространств и особенно актуален для виртуальных шаред-хостинг платформ. Главное отличие от прочих Linux-антивирусов — его веб направленность, сканирование файлов веб-сайтов, ведь обычные антивирусы ориентируются на более глобальные угрозы уровня системы.
                  Читать дальше →
                • Gradle и решение задач автоматизации

                  Всем привет, сегодня я хотел бы рассказать вам о моём опыте работы с Gradle, не просто переписать мануал (хотя он отлично написан), но рассказать с какими реальными проблемами я столкнулся и как побеждал их, а также показать какие возможности предоставляет нам Gradle. Тема очень обширная поэтому, к сожалению я не смогу рассмотреть многие аспекты подробно и последовательно, надеюсь что читатели уже немного знакомы с Gradle и смогут понять суть описываемых решений.
                  Читать дальше →
                  • +20
                  • 32.4k
                  • 6
                • Почему с нормальным распределением не все нормально

                  image

                  Нормальное распределение (распределение Гаусса) всегда играло центральную роль в теории вероятностей, так как возникает очень часто как результат воздействия множества факторов, вклад любого одного из которых ничтожен. Центральная предельная теорема (ЦПТ), находит применение фактически во всех прикладных науках, делая аппарат статистики универсальным. Однако, весьма часты случаи, когда ее применение невозможно, а исследователи пытаются всячески организовать подгонку результатов под гауссиану. Вот про альтернативный подход в случае влияния на распределение множества факторов я сейчас и расскажу.
                  Читать дальше →
                • Еще один способ управления вентилятором в Linux (на примере Acer S3-391)

                  Понадобился мне однажды для работы ноутбук. Уж не помню почему, но выбор пал на Acer S3-391, тонкий, легкий, быстрый, но не лишенный недостатков. Кроме плохого экрана (который кстати не так просто заменить — у него особый коннектор, и возможно он приклеен к рамке), особенно меня раздражал шум вентилятора.
                  Пути решения этой проблемы я и постараюсь осветить в этой статье.

                  Прочитав статью Управляем вентилятором ноутбука через DSDT в Linux и не только, как и автор, я начал усердно гуглить в сторону ACPI и DSDT, даже перекомпилировал и подключил свою таблицу, но найти «ту самую» строчку кода отвечающую за работу вентилятора так и не удалось.

                  Читать дальше →
                • Scala WAT: Коллекции

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

                  В этот раз перейдём к коллекциям. Стандартная библиотека для коллекций в Scala настолько богата, что может предложить готовые методы даже для самых требовательных разработчиков. В каких случая применять какие методы обычно не описывается и всё познаётся на опыте. Обычно, в начале все узнают filter и map, на этом дело может ограничиться, ведь с определённой фантазией можно реализовать множество алгоритмов только на этих функциях. Однако, эти способы могут быть неоптимальны или рождать невозможные для предметной области результаты, которые, однако же, придётся обработать.

                  Ниже мы обсудим, какие функции стандартной библиотеки часто используются неправильно и что можно улучшить.
                  Читать дальше →
                  • +34
                  • 15.8k
                  • 5
                • Поддержка транзакций, тестового окружения и другие удобные надстройки над commons-dbutils

                    Поддержка транзакций, тестового окружения и другие удобные надстройки над commons-dbutils.


                    "/>
                      Если обращение к RDBMS вашего проекта ведется не через ORM или Spring JdbcTemplate, то работу через голый JDBC может сильно скрасить commons-dbutils.
                    Особенно если его надстроить транзакциями, работой с разными окружениями, авто-открытием/закрытием ресурсов, запрсами read-only, обработкой SqlException, возвратом pk при вставке и т.д.
                    Т.е, например, чтобы можно было бы сделать так:
                    int userId = Sql.queryForValue("SELECT ID FROM OU.USERS WHERE LAST_NAME=?", "IVANOV");
                    Sql.update("DELETE FROM OU.USERS WHERE FIRST_NAME=? AND LAST_NAME=?", fname, lname);
                    List<User> list = Sql.query("SELECT FROM OU.USERS", USER_LIST_HANDLER);
                    int newId = Sql.insert("INSERT INTO OU.USERS VALUES (?,?)", fname, lname);

                    И этот код работал бы внутри транзакции, через Application Server Connction pool и в JUnit без изменений и mock-ов.
                    За чуть меньше года моей работы с commons-dbutils он оброс различными классами и утильными методами, о которых и хочу здесь рассказать.
                    Читать дальше →
                  • Алгоритмы и структуры данных JDK

                    [ english version ]
                    Периодически проверяя нет ли реализации того или иного стандартного алгоритма в jdk, пришла мысль составить подобный обзор. Также интересны были причины наличия/отсутствия многих известных структур данных.
                    Формат обзора — только ключевые свойства и особенности структур и алгоритмов в составе jdk, подробности и детали — расписаны в javadoc или легко найти в исходниках.
                    Надеюсь на конструктивную критику и коллективный разум если что упустил.
                    Хватит вступлений, итак, давайте рассмотрим что включает в себя текущий jdk 7 и почему.
                    Читать дальше →
                  • Передача параметров в HTTP-заголовке через запятую для Apache CXF

                      Предистория:


                      Согласно RFC-2616, HTTP header можно передавать кучей разных способов.
                      Мы использовали вариант КЛЮЧ = <ЗНАЧЕНИЕ-1>,<ЗНАЧЕНИЕ-2>,...,<ЗНАЧЕНИЕ-N>
                      Библиотека Apache CXF до версии 2.5.8 (включительно) обрабатывала такую ситуацию корректно.

                      Проблема:


                      С версии 2.5.9 Apache CXF втихаря «улучшились» и допустимыми признают только КЛЮЧ = <ЗНАЧЕНИЕ>
                      Ни в документации, ни на форуме апача нет ответа на вопрос:

                      Как разрешить Apache CXF принимать параметры заголовка HTTP-запроса (HTTP header) через запятую?

                      Исследование исходных кодов библиотеки указало на решение проблемы.

                      Решение:


                      В конфиге beans.xml надо добавить:

                      <jaxrs:properties>
                           <!-- enable comma separated HTTP header values. Example" "X-ListID: 0,100,13,25,16" -->
                           <entry key="org.apache.cxf.http.header.split" value="true" />
                      </jaxrs:properties>
                      
                    • Java: class-файл. Копнём глубже


                      Здравствуйте, хабралюди.

                      Понадобилось мне однажды внести небольшое изменение в программу (пожелавшую остаться неизвестной), чтобы избавить её от досадного глюка. Совсем копеечное, поменять порядок вызова функций. Перед этим я довольно долго переписывался с авторами, детально описал им причины возникновения ошибки и способы воспроизведения, даже видео присылал. Но то ли английский мой настолько плох, что не понимали они, то ли просто поленились (странный порядок вызова функций провоцировал появление ошибок в подключаемых модулях. Это не наша проблема, это проблема авторов тех модулей).

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

                      Декомпилятор мне не помощник, 1000 с хвостиком файлов с убийственной архитектурой я не потяну. Ну что же, — подумал я, — мы пойдём другим путём. Есть несколько софтин, редактирующих классы. Есть небольшой опыт ковыряния кода. Есть описания инструкций. Казалось бы, в чём проблема?

                      Ан нет. Программа скомпилирована под 7 версию java. Редакторы, которые я нашёл, в последний раз обновилялись несколько лет назад, но до сих пор исправно работали. А в этот раз я получил неработающий класс и горстку бесполезных сообщений об ошибках в крашрепорте одной из софтин. Выяснилось, что, кроме всего прочего, Jasmin код, полученный при помощи Javap, компилирует некорректно.

                      Что нам стоит дом построить? Я решил не мелочиться и написать свой редактор. Или хотя бы парсер class-файлов, о процессе создания которого и написана эта статья.

                      Осторожно, под катом могут быть велосипеды с квадратными колёсами.
                      upd
                      Да, я знаю про ASM, BCEL и подобные вещи. Я решил писать с нуля. Мне было интересно, для меня этого повода достаточно.
                      Читать дальше →