Программирование

Drupal 7 и jQuery.once()

Некоторое время назад писал про Drupal.behaviors и jQuery в «шестерке». Там, как мы помним, чтобы одни и те же действия не выполнялись над элементами многократно, нужно было использовать контекст, а также присваивать и проверять наличие спец. класса. В общем, вот так:

Drupal.behaviors.myModuleBehavior = function(context) {
  $('.module-class-object:not(.module-class-processed)', context).each(function () {
    $(this).addClass('module-class-processed');
    // Do things
  });
};

Как нетрудно догадаться, для каждого нового «поведения» этот код надо копировать (что не очень хорошо).

В Drupal 7, однако, стало гораздо удобнее: в него интегрирована новая функция jQuery — once(). Она умеет присваивать спец. классы и проверять их наличие сама. Вот так:

(function ($) {
  Drupal.behaviors.myBehavior = {
    attach: function (context, settings) {
      $('div.my_behavior').once(function () {
        //этот код выполнится только раз для каждого div.my_behavior, независимо от числа запусков Drupal.attachBehaviors()
      });
    }
  };
}

Прогресс, как говорится, налицо.

Единственный недостаток (если это можно считать недостатком) once() — объекту, возвращаемому селектором $(...), должно быть можно присвоить CSS-класс. То есть запись $(document).once(...) результатов не даст. А вот запись $('body').once(...) — даст.

Порт модуля user titles

Сегодня закончил порт модуля user titles в Drupal 7. По факту — добавил результат в соответствующий issue на drupal.org.

Порту подвергся основной модуль, без контрибов. Впрочем, контрибы там меньше чем по 1КБ каждый, так что если будет желание — проблем возникнуть не должно. Также не тестировал работу тайтлов-изображений (они мне сейчас просто не нужны), но код также портирован, так что если какие проблемы с картинками будут — пишите, посмотрю.

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

В процессе портирования, кстати, посчастливилось поработать с новомодным DB API. API прекрасен, одна строчка SQL-запроса средней сложности превращается в десять строчек нового кода. Правда, более понятного, да.

Файл с модулем добавлен к заметке, качайте, пользуйтесь на здоровье.

Ссылку на основного спонсора порта добавлю сюда позже, когда проект будет открыт.

upd: архив с модулем обновлен. Изменения:
 — исправлен небольшой баг в hook_user_view();
 — админка модуля перенесена в Configuration→People;
 — добавлен порт контриб-модуля ut_userpoints (то есть интеграция с модулем userpoints) за авторством boran.

Про браузеры, файлы, безопасность и JavaScript

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

Так, например, есть известный элемент HTML <input type="file" />, предназначенный для открытия пользователем файла у себя в компьютере, предположительно — для последующей его отправки на сервер. Когда пользователь нажимает кнопочку Browse и выбирает в стандартном диалоге операционной системы нужный файл — полный путь к нему немедленно появляется в поле слева от кнопочки. Однако если мы вдруг захотим обратиться к полю input с целью получить этот самый полный путь через JavaScript, система безопасности современного браузера тут же покажет нам современную фигу. И вместо полного пути возвратит только имя файла.

А я вот хочу чтоб в браузере пользователь мог проигрывать локальные видео-файлы. И для выбора проигрываемого файла отлично подходит диалог из элемента input. Но нет — тут, оказывается, дыра в безопасности, дескать, я так по полному пути могу делать всякое нехорошее с файлами и директориями. Правда, при этом я могу создать обычный текстбокс <input type="text" /> и попросить пользователя ввести полный путь к файлу туда. Причем, причин вводить путь к файлу у пользователя будет столько же, сколько выбирать его в диалоге. Разве что это гораздо неудобнее выбора файла в диалоге. А делать с файлом всякое я смогу все равно (кроме, пожалуй, его загрузки на сервер).

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

Через это вопрос к общественности: знает ли кто какой-нибудь плагинчик jQuery или иное средство для вызова системного диалога «Открыть файл» без использования <input type="file" />, но с возможностью получения полного пути к выбранному файлу? Поделитесь, а.

Также подойдет возможность увязать <input type="file" /> с объектом на странице, чтобы, типа, они сами, без меня, «безопасно» путями обменивались. Но это наверно из разряда фантастики.

Снова про звук, Linux, Qt и на этот раз — Phonon

Вообще, я ОС Линукс люблю и по возможности работаю именно в нем (но пропагандой пингвинов обычно не занимаюсь). И KDE люблю тоже. Но есть во всей этой кухне одна особенность, которая бесила меня всегда до мозга костей.

Вот, например, в ОС Windows можно было одновременно слушать музыку и, скажем, играть в игры — то есть, воспроизводить звук из разных источников параллельно — очень-очень давно. Десять лет точно. И дело не в том, что в Луниксе — нельзя. Можно, конечно. Но как-то так сложилось, что звуковая система в нем лицом повернута к самому Луниксу. А к пользователю — тем, что с оборотной стороны лица находится. Со всеми этими фронтэндами, бэкэндами, промежуточными демонами, альсами, оссами, пульсаудио, консольными плеерами и звуковыми библиотеками, разработчики пускаются во все все тяжкие, но годы проходят, а свести все это к приличному виду, чтоб хотя бы из коробки работало без конфликтов, — не получается.

Работа с потоками в Qt

Обнаружил добротную и длинную статью в двух частях о работе с потоками и параллельном программировании в Qt:

Легкость создания и запуска потоков в Qt, в сочетании с некоторым незнанием стилей программирования (особенно асинхронного сетевого программирования, в сочетании с концепцией сигналов и слотов в Qt) и/или привычками, приобретенными во время использования других инструментариев или языков, обычно приводят к тому, что люди стреляют себе в ногу. Кроме того, поддержка потоков в Qt – это палка о двух концах: когда создание многопоточных приложений для вас становится очень простым, в это же момент добавляется определенное количество особенностей (особенно когда дело доходит до взаимодействия с QObject), о которых вы должны знать.

Целью данного документа не является научить вас использовать потоки, делать правильную блокировку, использовать параллельность и писать масштабируемые программы. Вместо этого, эта небольшая статья введет пользователей в курс многопоточности в Qt 4, для того чтобы избежать наиболее распространенных ошибок и помочь им разрабатывать код, одновременно и более надежный, и имеющий лучшую структуру.
Потоки, cобытия и объекты QObject (Часть 1)
Потоки, cобытия и объекты QObject (Часть 2)

Толково.

Обнимите программиста

Хорошая знакомая прислала ссылку на душевный ролик:

Про защищенные веб-приложения

Если кто еще не видел, вот толковая заметка с дюжиной фундаментальных советов на тему безопасности веб-приложений. Там и про SQL Injection, и про XSS, и про CSRF, и про всякое другое.

12 навыков создания защищенных веб-приложений

Полезно, в чем-то познавательно.

Qt-приложения на Android

Новость из стана лабораторий Qt в Nokia. На этот раз — приятная:

BogDan did not only create a Qt port, but also a complete Qt Creator integration for Android, as well as an all-in-one Necessitas installer. And as cherry on top, BogDan implemented Ministro, a deployment service which makes sure that the right Qt libraries are present on the end users’ device and your application does just run.
He did all of that in his spare time, driven by his passion for Qt, Android and FOSS. He does neither work for Nokia nor for Google. This is a pure community effort.
Bringing Qt applications to Android

Добрый человек по имени Богдан Ватра разработал Necessitas, пакет для сборки Qt-программ под платформу Android. И, кроме того — службу Ministro, автоматически подтягивающую нужные библиотеки Qt на целевое устройство. Разработал, что характерно, сам, без помощи Нокии.

Обзорный ролик новинки:

Жизнь-то налаживается. Правда, в настоящее время пакет работает только под Линукс. Но нам, линуксоидам, это без разницы.

Что будет с Qt

После нашумевшего соглашения между Nokia и Microsoft у многих возник вопрос — а что же будет с родиной и с Qt? Вот первая публикация Nokia на эту тему:

Wow, what a day… Nokia outlined its new platform strategy for smartphones, with Windows Phones as it primary smartphone platform in a proposed partnership with Microsoft… and Microsoft’s tools would be used for Nokia Windows Phone application development … and guess what, it has raised a lot of questions in the Qt community.
So the question is, what is the future for Qt?
Nokia new strategic direction. What is the future for Qt?

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

Поэтому в комментариях народ, как и раньше, настроен крайне скептически. Посмотрим, что будет дальше.

jSlider Form API

Дорогие коллеги!
Модуль jSlider Form API переехал на Drupal.org: http://drupal.org/project/jslider_form_api.
Дальнейшая поддержка и разработка модуля будет осуществляться там.

Сделал еще один небольшой модуль для Drupal 6.x, называется jSlider Form API. В модуле создается новый элемент для использования при создании форм Друпала. Элемент называется transfer_slider и представляет собой виджет, разделяющий заданное число между двумя текстовыми полями с помощью слайдера jQuery UI Slider.

Кроме описания самого элемента, для наглядности в модуль включена тестовая страница по адресу admin/settings/jslider_form_api_test, выводящая форму с двумя слайдерами:

Далее — подробности и особенности работы модуля.