May 06

Давно ничего не писал - как-то не о чем… Праздники, работа, учеба… Единственное, что реально интересно из этого списка - это работа, но… к сожалению, как раз она и “способствует” отсутствию статей в этом блоге - её много и на блог времени просто не остается… А написать, к счастью, есть о чем. :)

Сегодня речь пойдет о так называемых dialog widget’ах (периодически, слышу, что их также называют js-popup’ами). Недавно понадобилось реализовать такой функционал в моём “рабочем” проекте и стал вопрос об использовании существующих решений.

В проекте я использую jQuery и, соответственно, выбирал системку, которая базировалась бы на нем. Всё началось с Thickbox’а, который я довольно долгое время и использовал, но… Кое-что мне в нем не нравилось изначально:

  • Минимум настроек
  • Отличие от большинства плагинов jQuery
  • Отсутствие развития (последняя версия вышла в августе 2007-го года и зависела еще от jQuery 1.1x, хотя и с 1.2 тоже работала нормально)

… в итоге эти недостатки привели ко вполне логичному концу - я не мог реализовать 2 разных “диалога” на одной странице не “вторгаясь” в сам код Thickbox’а, причем застрял на мелочи - удиалогов должны были различаться бэкграунды - у одного он должен был быть полностью залит определенным цветом, а второй должен был быть полупрозрачным. Причем в первом случае сделать фон непрозрачным мне пришлось через CSS, хотя гораздо логичнее было бы предоставить эту возможность самой функции создания диалога.

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

Подробное описание (а также демонтрацию возможностей nyroModal) можно посмотреть на странице самого проекта, а я здесь приведу лишь несколько примеров использования.

Самый простой способ, при котором даже не нужно лезть в JavaScript - это присвоение ссылкам класса nyroModal:

<a href="demo.html" class="nyroModal">Ajax</a>

Эта ссылка откроет вам файл demo.html в “окошке”.

<a href="demo.html#demo" class="nyroModal">Ajax</a>

Эта - сделает почти то же самое, только в окошке будет только инфа из блока с id == “test” из файла demo.html.

<a href="#demo" class="nyroModal">No Ajax!</a>

А здесь у нас в окно попадет содержимое блока с id == “test” из текущей страницы.

Если же нужны какие-то дополнительные параметры (значения или callback-функции), то здесь уже без “ручного” JavaScript’а не обойтись:

<a href="#demo" id="no-ajax">No Ajax!</a>
<script type="text/javascript">
$('#no-ajax').nyroModal({
  bgColor: '#FFFFFF',
  showBackground: function(elts, settings, callback) {
    // elts.bg.css({opacity:0}).fadeTo(500, 0.75, callback);
    callback();
  },
  hideBackground: function(elts, settings, callback) {
    // elts.bg.fadeOut(300, callback);
    callback();
  }
})
</script>

Таким образом мы заменим цвет фона на белый + уберем прозрачность и анимацию при появлении/исчезновении фона.

На этом, наверное, будем прощаться. Если остались вопросы - обращайтесь. :)

written by FX Poster \\ tags: , , ,

Apr 20

Сегодня мы с Мишей разговорились в ICQ. Разговор получился ОЧЕНЬ длинный и офигительно интересный. Читаем под катом:
Continue reading »

written by FX Poster \\ tags: , , , ,

Mar 09

IE6 очень плохо работает с изображениями в PNG-формате, которые имеют альфа-канал (проще говоря, прозрачность) - он просто не учитывается. Решить проблему довольно просто, самый удобный вариант - воспользоваться “библиотекой” jQuery.ifixpng, которая сделает всё за вас. Единственный недостаток (хотя, кому как) - зависимость от jQuery. Тем, кто пользуется другими библиотеками, в частности, PrototypeJS (а именно она по умолчанию используется в таких фреймворках как RubyOnRails и Symfony), воспользоваться этой “библиотекой” не получится. Именно для них я и попытался переписать эту библиотеку.

Prototype.Browser.Version = (navigator.userAgent.toLowerCase().match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1];
Prototype.FixPNG = { Pixel: ‘images/pixel.gif’ };

Element.addMethods({
  fixpng: (Prototype.Browser.IE && Prototype.Browser.Version < 7) ? function(element) {
    function fixPosition(element) { if(element.style.position != ‘absolute’) element.style.position == ‘relative’; }
    function filter(src) { return “progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,sizingMethod=crop,src=’” + src + “‘)”; }
    var elementName = element.nodeName.toLowerCase();
    if(elementName == ‘img’ || elementName == ‘input’) {
      if(element.src && element.src.match(/.*\.png([?].*)?$/i)) {
        element.setStyle({
          filter: filter(element.src),
          width: element.getWidth(),
          height: element.getHeight()
        });
        element.src = Prototype.FixPNG.Pixel;
        fixPosition(element);
      }
    } else {
      var image = element.currentStyle.backgroundImage;
      if (image.match(/^url\(["']?(.*\.png([?].*)?)["']?\)$/i)) {
        element.setStyle({
          filter: filter(RegExp.$1),
          backgroundImage: “none”
        });
        element.children().each(fixPosition);
      }
    }
  } : function(element) {}
});

Зависимости:

  • Библиотека PrototypeJS
  • В директории images должен лежать “пустой” файл pixel.gif (его можно взять здесь, или, если вас не устраивает такое расположение файла - просто измените переменную Prototype.FixPNG.Pixel)

Пример использования:

Event.observe(window, 'load', function() {
  $$('.test, #test').each(function(element){ element.fixpng() });
}, false);

PS. Также советую почитать раздел Known Limitations на странице jQuery.ifixpng.

written by FX Poster \\ tags: , ,

Nov 17

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

Веб-браузеры

Здесь все в общем-то ясно - JS сейчас рулит и сдавать свои позиции не собирается. Но есть одно “но”. Качаем отсюда интерпретатор ECMAScript’а и изучаем содержимое каталога builtins - там находится стандартная библиотека, написана, собственно, на самом ECMAScript’е. Поизучайте файлы. Знакомо? Догадываюсь, что да. Все знакомо? Хех, подозреваю, что нет. По крайней мере на текущий JS новый ECMAScript не похож. Похож на дикую смесь JS, Java, C#. Целая куча новых ключевых слов, новые операторы. На мой взгляд, синтаксис языка чрезмерно усложняется. Не знаю, нужно ли это…

В продолжении хочется заметить, что внедрение этого “нового языка” в браузеры может весьма и весьма затянутся…

Desktop/Server-side программирование

Автор поста упомянул про конкуренцию с Python и Ruby:

Новый Javascript явно претендует на что-то большее. Если он действительно будет “принят на вооружение” — определенно можно ожидать появления изрядного количества серверных приложений и фреймворков на js. Во всяком случае, язык получился явно не слабее питона и руби — хотя, конечно, вряд ли средства интеграции с кодом на C и C++ будут тут столь же развиты, ниша у языка все-таки другая.

Но не учел 2 момента:

  1. Большое количество уже написанного кода на Python/Ruby. Имеется ввиду какое-то ПО на них, скрипты, классы дополнительные (смотрим rubygems, easy_install), фреймворки и т.д.
  2. Полное ОТСУТСТВИЕ нормальной стандартной библиотеки. Найдите мне функции/классы для работы с сокетами и бд под JS. В общем случае нельзя даже работать с файловой системой, насколько я знаю (в винде можно, под никсами - нет). И примеров нужных библиотек можно привести очень много. На мой взгляд, “язык, претендующий на замещение руби и питона” должен иметь стандартную библиотеку хотя бы не хуже ихних.

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

written by FX Poster \\ tags: ,

Nov 16

Что-то никто из знакомых не пишет ничего по этому поводу… Пропустили все что ли? А зря - вещь интересная, и, как оказалось, достаточно простая в реализации:

// addMethod - By John Resig (MIT Licensed)
function addMethod(object, name, fn){
    var old = object[ name ];
    object[ name ] = function(){
        if ( fn.length == arguments.length )
            return fn.apply( this, arguments );
        else if ( typeof old == ‘function’ )
            return old.apply( this, arguments );
    };
}

Оригинал здесь, там же и примеры использования.

written by FX Poster \\ tags:

Sep 29

Сегодня впервые побывал в нашем Start Up Coffee. Причиной моего сегодняшнего похода туда была презентация очередного Web 2.0 портала Trashbox.ru. Сейчас портал находится в конечной стадии разработки, а открытие должно произойти 8-го октября.

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

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

Я не зря выделил навигацию и размер страниц - почти вся презентация была построена на том, что аналогичные сайты обладают очень плохой навигацией по меню, неудобно искать какую-то определенную программу/статью, да и к тому же очень много весят. В трэшбоксе все иначе. Страница представляет из себя практически сплошной JavaScript, и довольно много работы выполняется на клиентской машине по постройке страницы, что позволяет существенно (по словам разработчиков - в 5 раз) уменьшить обьем передаваемых данных. Новые страницы подгружаются через Ajax, что также экономит траффик. Насчет навигации - 100% ничего сказать пока не могу, рабочей версии показано не было, а из всех слайдов всего на одном был скриншот странички портала. Главное меню состоит из 4-х разделов, из них был показан, насколько я помню, раздел “Программы”. Под главным меню находятся 2 облака тегов/категорий (теги фиксированные, пользователем не добавляются, добавлять их могут только админы): типы программ и ОС. Можно выбрать сразу несколько подразделов из каждого облака, например, ((ICQ + Browser) + (Symbian 8 + Windows Mobile 6)), и программы, соответствующей тематики и работающие в указанных ОС будут динамически подгружены в текущую страницу. По рассказам - смотрится интересно (хотя отсутствие пользовательских тегов огорчает), а на практике - возможно будет удобно. Поживем - увидим.

Все это касалось версии “для компьютеров”, еще планируется версия для телефонов, но о ней пока что почти ничего не известно кроме того, что wap/wml посланы нафиг, а разработка ведется под телефоны с поддержкой HTML.

Планы проекта - до НГ собрать 10000 хостов в сутки. Ну что ж - пожелаем удачи и будем с нетерпением ждать открытия.

Это была, так сказать, “информация для прессы”. Теперь хочу посвятить в некоторые технические детали, они в презентации почему-то упомянуты не были, но тем не менее, мне они известны. Проект пишется на PHP. Все пишется с нуля - и JS и PHP-коды. Фреймворки не используются за их “ненадобностью”. Комментарии разработчика явно показывают, что человек хочет и изобретает в очередной раз колесо: “У нас 120-140кб JS-кода, фреймворки нам только бы увеличили размеры этого кода и на капельки бы нам не помогли.”, “Не нужен мне этот ваш Zend Framework, у меня свой фреймворк - тут все зашибись, а питон и руби - вообще х##ня”.

Вывод у меня один - в будущее проекта я не верю. И буду очень рад, если мое мнение окажется ошибочным. А по поводу 10000 хостов в сутки - по-моему, за 3 месяца это просто невозможно.

UPD: Слайды с презентации можно посмотреть здесь.

UPD2: Появилось еще видео с презентации.

written by FX Poster \\ tags: , , ,

Sep 18

Очень познавательная статья про ООП в JS. Для новичков в JS и для тех, кто средне в нем шарит - самое оно. Для тех, кто вообще не в теме - ООП в этом замечательном языке реализовано не на основе классов и обьектов, как экземпляров классов, к чему многие (очень многие) привыкли, а на основе прототипов. Подробнее - википедия, как всегда рулит.

После этой статьи и статьи википедии очень советую взять какой-нибудь из JS-фреймворков (Prototype, JQuery, гугл рулит) и поизучать их код - эффект будет еще круче, чем от статей, но основы нужно же знать. ;)

written by FX Poster \\ tags:

Sep 01

Не спится. Сижу пишу scaffolding для Zend Framework. Возникла проблема - для того, чтобы реализовать полноценное редактирование/удаление записей в таблице нужно добавить к стандартному классу Zend_Db_Table_Row одну public-функцию. Вот теперь сижу и думаю - насколько “правильно” будет просто открыть файл с этим классом и дописать функцию по сравнению с порождением подклассов.

С точки зрения проектировщика - этого делать не стоит. лучше породить подкласс. Но в данном случае прийдется порождать подкласс не только от Zend_Db_Table_Row, но и от Zend_Db_Table, а может и еще чего-то. Чего делать ну вообще не хочется - там кода писать абсолютно тупого - ну просто дофига (возможно я преувеличиваю немного, но все же…).

Чтобы вы делали в моем случае?

Да… Все больше и больше понимаю “недоразвитость” PHP. Если уж делать язык динамически типизированным и объектно-ориентированным - почему нельзя было сделать это нормально? Примеры “нормальных” языков в этом плане привести несложно - Python, Ruby, JavaScript.

В питоне такое “добавление” метода к классу решалось бы так:

def some_name(self):
    ...
Class.new_func = some_name

В JavaScript и того легче:

Class.new_func = function() {...}

А в PHP… Эх…

written by FX Poster \\ tags: , , ,

Apr 12

Очередня лабораторная работа по предмету “Архитектура ЕОМ” - работа с файловой системой используя интерпретируемые файлы. Под Windows для таких целей можно использовать либо bat/cmd-файлы, либо WSH. Так как батники мы не учили, а мне больше по душе использовать высокоуровневые языки, для выполнения лабы был выбран JavaScript.

Если кому понадобится - copy.js и readme к нему.

PS. Первая лабораторная была тоже на работу с ФС, только средствами С++.

Добавлено:

Обновил программу и readme.

written by FX Poster \\ tags: ,