Компиляторы и интерпретаторы языков, как правило, пишутся на других языках(по крайней мере так было сначала). Например PhP был написан на языке С. Как вы догадались на языке PhP можно определить, спроектировать и написать свой компилятор своего языка. Конечно язык который бы создадим будет медленно работать и будет ограничен, тем не менее он может быть очень полезным.
User
How-to: Как создать красивый и функциональный баннер ротатор средствами Drupal 7
6 min
16KОбычно я не пишу статьи на тему как использовать те или иные готовые модули для реализации некоторой функциональности. Гораздо больше меня интересует непосредственно создание модулей, взаимодействие с ядром, работа с различными API и т.п. «программистские» и архитектурные вещи.
Но, на этот раз, по многочисленным просьбам трудящихся я все таки решил написать один How-to.
Итак, речь в настоящей статье пойдет о том, как готовыми средствами Drupal 7 и парой шаблонов реализовать баннер-ротатор наподобии того, что встроен в один из моих ресурсов (http://labridge.ru).
Конечный результат должен выглядеть примерно так:
![](https://habrastorage.org/storage2/b3e/ee2/054/b3eee2054b318b9d8a3c941585dc1e48.png)
Но, на этот раз, по многочисленным просьбам трудящихся я все таки решил написать один How-to.
Итак, речь в настоящей статье пойдет о том, как готовыми средствами Drupal 7 и парой шаблонов реализовать баннер-ротатор наподобии того, что встроен в один из моих ресурсов (http://labridge.ru).
Конечный результат должен выглядеть примерно так:
![](https://habrastorage.org/storage2/b3e/ee2/054/b3eee2054b318b9d8a3c941585dc1e48.png)
+4
Многокритериальный выбор альтернатив с использованием правил нечеткого вывода. Реализация на Java. Часть 2/3: Основной алгоритм
6 min
4.9KПеред прочтением крайне рекомендую ознакомиться с первой частью статьи:
Многокритериальный выбор альтернатив с использованием правил нечеткого вывода. Часть 1/3: Теория
Для осуществления выбора необходим набор правил (интерфейс Rule), которе включают в себя набор соответствующих им нечетких логических функций (реализующих интерфейс Function) и определенные входные формализованные данные (изначально представляющие собой двухмерный массив элементов типа double).
Для бОльшего удобства данные (одномерные массивы элементов типа double) внутри класса Rule хранятся в классе-обертке Skill.
Далее правила передаются классу Facade, создающего из них нечеткие подмножества, размеры которых зависят от количества исследуемых объектов и требуемой точности (задаваемой в статическом классе Variables).
После нахождения общего функционального решения этой системы подмножеств (метод calcD) применяется процедура сравнения полученных нечетких подмножеств в единичном интервале для получения наилучшего решения (метод calcC); для этого вычисляются мощности данных уровневых множеств и их точечные оценки (метод calcS); в данном алгоритме для облегчения требуемой сортировки элементов применяется класс-структура Num.
Многокритериальный выбор альтернатив с использованием правил нечеткого вывода. Часть 1/3: Теория
Для осуществления выбора необходим набор правил (интерфейс Rule), которе включают в себя набор соответствующих им нечетких логических функций (реализующих интерфейс Function) и определенные входные формализованные данные (изначально представляющие собой двухмерный массив элементов типа double).
Для бОльшего удобства данные (одномерные массивы элементов типа double) внутри класса Rule хранятся в классе-обертке Skill.
Далее правила передаются классу Facade, создающего из них нечеткие подмножества, размеры которых зависят от количества исследуемых объектов и требуемой точности (задаваемой в статическом классе Variables).
После нахождения общего функционального решения этой системы подмножеств (метод calcD) применяется процедура сравнения полученных нечетких подмножеств в единичном интервале для получения наилучшего решения (метод calcC); для этого вычисляются мощности данных уровневых множеств и их точечные оценки (метод calcS); в данном алгоритме для облегчения требуемой сортировки элементов применяется класс-структура Num.
+22
Многокритериальный выбор альтернатив с использованием правил нечеткого вывода. Часть 1/3: Теория
2 min
11KНечеткая логика — математические основы
Нечёткое множество
Описание метода
Пусть имеется множество элементов U, а A – его нечеткое подмножество, степень принадлежности его элементов определяется значением X, принимающим значение из интервала [0;1].
Таким образом, объект можно описать набором критериев(параметров) X(1), X(2) … X(n), принадлежащих соответствующим базовым множествам U(1), U(2) … U(n). Совокупность критериев с соответствующими значениями характеризует приемлимость S данного объекта относительно поставленной задачи.
Нечёткое множество
Описание метода
Пусть имеется множество элементов U, а A – его нечеткое подмножество, степень принадлежности его элементов определяется значением X, принимающим значение из интервала [0;1].
Таким образом, объект можно описать набором критериев(параметров) X(1), X(2) … X(n), принадлежащих соответствующим базовым множествам U(1), U(2) … U(n). Совокупность критериев с соответствующими значениями характеризует приемлимость S данного объекта относительно поставленной задачи.
+18
Рекомендации для GUI под Android
1 min
23KПроизводители обычно выпускают рекомендации для построения GUI под их OS. Дошла очередь и до Google Android:
![image](http://javafx.me/files/guideand.jpg)
![image](http://javafx.me/files/guideand.jpg)
+53
Простая минималистская реализация сложных JavaScript приложений
12 min
8.7KTutorial
Я хочу описать простой минималистский подход к разработке сложных JavaScript приложений. Из внешних библиотек будут использоваться только jQuery и мой js-шаблонизатор, причём из jQuery используются только
В основе подхода лежат две идеи:
$.ready()
, $.ajax()
и $.proxy()
— т.е. суть не в библиотеках (их тривиально заменить на предпочитаемые вами), а в самом подходе.В основе подхода лежат две идеи:
- JavaScript виджеты — небольшие модули, каждый из которых «владеет» определённой частью веб-странички (т.е. всё управление этой частью странички происходит исключительно через методы этого модуля, а не через прямую модификацию DOM — инкапсуляция). Виджет отвечает исключительно за функциональность, но не за внешний вид; поэтому прямая модификация части DOM, которым «владеет» виджет, снаружи виджета допускается — но только для чисто дизайнерских задач (для архитектуры и общей сложности приложения нет принципиальной разницы между коррекцией внешнего вида через CSS или jQuery).
- Глобальный диспетчер событий. Взаимодействие между виджетами осуществляется путём посылки сообщений глобальному диспетчеру (слабая связанность, паттерн Mediator/Посредник), а уже он принимает решение что с этим сообщением делать — создать/удалить виджеты, дёрнуть методы других виджетов, выполнить дизайнерский код, etc. В отличие от динамического подхода к обработке событий (когда обработчики конкретного события добавляются/удаляются в процессе работы) статический диспетчер сильно упрощает понимание и отладку кода. Безусловно, есть задачи, для которых нужны именно динамические обработчики событий, но в большинстве случаев это избыточное усложнение, поэтому всё, что можно, делается статическими обработчиками.
+53
+88
Fog computing
3 min
14K![image](https://habrastorage.org/getpro/habr/post_images/ae0/915/e74/ae0915e746172d8cd8c56087378664b1.jpg)
Если вам кажется, что на картинке ничего не видно, то я отвечу, на картинке отчетливейшим образом изображен туман! ;) В связи с выходом из вынужденного захабренного молчания публикую свой небольшой футурологический очерк.
Ура! То, о чем так давно боялись спросить большевики, случилось! В след за облачными вычислениями сегодня мы открываем эпоху туманных (fog) вычислений!
Туманные вычисления — и звучит как-то туманно. Попробую в двух словах донести эту парадигму до читателя, невооруженного википедией и гуглом. Для вооруженных же придется сказать, что сие словосочетание уже было испохаблено одним из видов облачных вычислений, которые принципиально ни чем от них не отличаются.
+38
ISO 8601 и ECMAScript — головная боль от разночтения стандартов
3 min
11KРазрабатываем мы тут некоторый сервис интеграции с очень сторонней системой. Сам сервис работает на Node.js. И всё бы хорошо, но только недоступность сервера во время сборки мусора очень нервировала стороннюю систему.
В канун нового года было решено сделать серверу подарок — обновить Node.js с версии 0.4.8 до 0.6.6 В силу ряда организационных причин, обсуждать которые здесь не очень хочется, обновление было проведено сразу на боевой системе и даже без регрессионного тестирования.
Неужели в этой ситуации что-то могло пойти не так?
В канун нового года было решено сделать серверу подарок — обновить Node.js с версии 0.4.8 до 0.6.6 В силу ряда организационных причин, обсуждать которые здесь не очень хочется, обновление было проведено сразу на боевой системе и даже без регрессионного тестирования.
Неужели в этой ситуации что-то могло пойти не так?
+48
Красивый вывод изображений
3 min
46K![image](https://habrastorage.org/getpro/habr/post_images/fa0/8c4/a60/fa08c4a60758423fd6b03e01b3bbc58f.png)
Всегда мне не нравилось, как выводятся изображения на моих сайтах. Хотелось какой-то упорядоченности, зависимости. Поэтому, я полез искать скрипты и решения в гугле. После безуспешных поисков, решено было делать что-то самому.
Но что? Я стал смотреть, как сделан вывод картинок у популярных сайтов. Всё мне не нравилось, пока я не додумался посмотреть вывод в google images и google+. Меня поразило то, что
Не долго думая, я сел писать код, который сможет вывести картинки так же.
+55
Несколько находок
2 min
7.2KКроссдоменные запросы с помощью YQL
Как клиентский веб разработчик, я всегда хочу уменьшить расходы потребления серверных ресурсов. Может быть, я один такой, не знаю. Но есть группа задач, которые просто-напросто не реализуемы на стороне клиента. Одна из таких задач: запрос на чужой домен. Нам приходится создавать серверный скрипт, который выступает посредником между браузером и сервером, с которого хотим стянуть данные, отдавая данные как бы со своего домена.
Позавчера, один уважаемый человек с форума javascript.ru с ником melky вскользь упомянул о каком-то странном, на первый взгляд, jQuery плагине, который называется jquery.xdomainajax.js
Пытливому уму программиста не нравятся всякие плагины, без понимания сути, поэтому я выковырял самую нужную часть:
var query = 'select * from html where url="http://javascript.ru/" and xpath="*"'
var url = 'http://query.yahooapis.com/v1/public/yql?q='+encodeURI(query)+'&format=xml&callback=callback';
var script = document.createElement('script');
script.src = url;
document.body.appendChild(script);
function callback(data) {
console.log(data); //сам текст ответа находится в data.result[0]
}
Откройте консоль и зупустите код. Как видно, в запрос пихается урл сайта и XML запрос в виде xpath, ответ приходит в виде jsonp. Если в урле написать format=json, то ответ придет в виде объекта с тегами.
Дальше этого применения я не пошел, поэтому лучше сами изучите матчасть здесь: developer.yahoo.com/yql
В комментариях настаивают указать на ограничения по количеству запросов с одного IP и запросов, использующих accesskey, которого у нас нет (так что, скорее всего, можно забить :) ).
+35
Код в стиле «дамп потока сознания»
5 min
9KНекоторое время назад в одной из своих статей я описал понятие пластилиновой архитектуры. В продолжение я бы хотел описать один из самых распространённых «стилей программирования», который, к сожалению, очень часто встречается у молодых и неопытных специалистов.
Итак, давайте представим, что перед программистом стоит задача написать новый модуль или дописать некоторую функциональность к уже существующей системе. Что будет делать опытный специалист? Он нальёт себе китайского чая, откинется на спинку кресла, возьмёт карандаш и начнёт думать. Он нарисует структуру модуля, обдумает сущности, интерфейсы и взаимодействие между ними, опустится на уровень конкретных методов, вероятно, напишет юнит-тесты на интерфейсы. Только потом он начнёт наполнять кодом существующую структуру (либо делегирует эту задачу десятку индусов-кодеров).
Теперь давайте посмотрим, как поступит в этом случае типичный джуниор. Есть задача – её надо решить. Их так учили в университетах. Многие из них ещё находятся под влиянием маргинального лозунга «пиши код, б##дь!». Итак, он наливает себе растворимого кофе, надевает наушники с чем-нибудь пожёстче и погромче и уходит в поток на пару-тройку часов.
Всё бы ничего. Я ничего не имею против кофе, наушников или состояния потока. Более того, обычно это наиболее эффективный и, зачастую, единственный способ писать хороший код. Но мы рассматриваем типичный случай молодого и неопытного программиста, поэтому давайте посмотрим на результаты.
Итак, давайте представим, что перед программистом стоит задача написать новый модуль или дописать некоторую функциональность к уже существующей системе. Что будет делать опытный специалист? Он нальёт себе китайского чая, откинется на спинку кресла, возьмёт карандаш и начнёт думать. Он нарисует структуру модуля, обдумает сущности, интерфейсы и взаимодействие между ними, опустится на уровень конкретных методов, вероятно, напишет юнит-тесты на интерфейсы. Только потом он начнёт наполнять кодом существующую структуру (либо делегирует эту задачу десятку индусов-кодеров).
Теперь давайте посмотрим, как поступит в этом случае типичный джуниор. Есть задача – её надо решить. Их так учили в университетах. Многие из них ещё находятся под влиянием маргинального лозунга «пиши код, б##дь!». Итак, он наливает себе растворимого кофе, надевает наушники с чем-нибудь пожёстче и погромче и уходит в поток на пару-тройку часов.
Всё бы ничего. Я ничего не имею против кофе, наушников или состояния потока. Более того, обычно это наиболее эффективный и, зачастую, единственный способ писать хороший код. Но мы рассматриваем типичный случай молодого и неопытного программиста, поэтому давайте посмотрим на результаты.
+71
Централизованное резервное копирование данных Windows и *nix серверов средствами Bacula
15 min
98KПриветствую всех хаброжителей!
Как нетрудно догадаться, речь пойдет о бекапах.
Своевременный бекап — крайне важная часть работы системного администратора. Своевременный бекап делает сон спокойным, а нервы стальными, придает сил и оберегает здоровье.
Думаю вполне резонным будет предположение, что данная тема уже набила оскомину, но все же я рискну поделиться своим опытом. На суд читателя будет представлена клиент-серверная реализация схемы резервного копирования. В качестве инструмента я выбрал open source проект Bacula. По более чем полугодовому опыту его использования остаюсь доволен своим выбором.
Bacula состоит из нескольких демонов, каждый из которых несет свою функциональную нагрузку. На рисунке ниже схематично представлена взаимосвязь этих демонов.
Под хабракатом я опишу все демоны подробно
![](https://habrastorage.org/getpro/habr/post_images/988/585/704/988585704447e8e1cc678ec5af7d39a2.png)
В моем случае резервному копированию подлежат:
Как нетрудно догадаться, речь пойдет о бекапах.
Своевременный бекап — крайне важная часть работы системного администратора. Своевременный бекап делает сон спокойным, а нервы стальными, придает сил и оберегает здоровье.
Думаю вполне резонным будет предположение, что данная тема уже набила оскомину, но все же я рискну поделиться своим опытом. На суд читателя будет представлена клиент-серверная реализация схемы резервного копирования. В качестве инструмента я выбрал open source проект Bacula. По более чем полугодовому опыту его использования остаюсь доволен своим выбором.
Bacula состоит из нескольких демонов, каждый из которых несет свою функциональную нагрузку. На рисунке ниже схематично представлена взаимосвязь этих демонов.
Под хабракатом я опишу все демоны подробно
![](https://habrastorage.org/getpro/habr/post_images/988/585/704/988585704447e8e1cc678ec5af7d39a2.png)
В моем случае резервному копированию подлежат:
- Конфигурационные файлы различных демонов со всех серверов.
- MySQL базы данных.
- Документооборот с файлового сервера Windows.
- Различные важные данные с nix серверов(движки сайтов/форумов, etc..)
+39
Джон Кармак о статическом анализе кода
4 min
14K«Самой важной вещью, которую я сделал как программист за последние годы — это начал агрессивно применять статический анализ кода. — пишет Джон Кармак в статье, опубликованной на AltDevBlogADay. — Не так важны сотни серьёзных багов, которые удалось предотвратить, сколько смена ментальности и моего отношения к надёжности ПО и качеству кода».
Джон Кармак рассказывает о различных инструментах, которые пытался использовать в течение своей карьеры и о тех выводах, к которым пришёл в итоге.
Джон Кармак рассказывает о различных инструментах, которые пытался использовать в течение своей карьеры и о тех выводах, к которым пришёл в итоге.
+62
«Правильный» system() для PHP-CLI
2 min
13KВнимание! Все рассуждения относятся к запуску PHP в режиме CLI, а не как модуль веб-сервера!
Если вы когда-либо использовали функцию system() в PHP, вы наверняка задавались вопросом: каким образом system() возвращает последнюю строку для команды, да ещё и выводит результаты исполнения команды на веб-страницу, а не себе куда-то в stdout веб-сервера? И почему system() работает не так, как system() в Си? Ответ, в общем-то, проще, чем может показаться.
Если вы когда-либо использовали функцию system() в PHP, вы наверняка задавались вопросом: каким образом system() возвращает последнюю строку для команды, да ещё и выводит результаты исполнения команды на веб-страницу, а не себе куда-то в stdout веб-сервера? И почему system() работает не так, как system() в Си? Ответ, в общем-то, проще, чем может показаться.
+57
Подключение сети к глобальному IPv6 пространству
7 min
22KНекоторое время назад в комментариях к статье «IPv6 шлюз для локальной сети» меня попросили рассказать о том, как я активировал IPv6 в одном из своих проектов. Начну с пары слов о самом проекте. CareNet — это результат кооперации двух крупных Шведских университетов: KTH Royal Institute of Technology и Karolinska Institutet. Вкратце, CareNet — это система, позволяющая наблюдать паллиативных пациентов вне больницы. У пациента дома устанавливается небольшое устройство, которое имеет доступ в Интернет и подключено посредством VPN к серверам CareNet. Устройство включает в себя HDVC-клиент, набор сенсоров для контроля состояния пациента и средства доступа к медицинскому порталу, содержащему всю информацию о пациенте. Медицинская информация доступна как самому пациенту, так и доктору.
+34
Обновление одним файлом или объединяем несколько патчей
3 min
4.5KБольшинство пользователей следят за обновлениями по безопасности и обновляют свои компьютеры и программы. Но как быть, если это локальная сеть, а интернет есть не у всех пользователей, а обновить Adobe продукты очень как хотелось бы? В данной статье будет расмотрено обновление для Adobe Reader 9.x для Microsoft Windows. На основе данного примера Вы сможете создавать и другие файлы обновлений для любых программ.
Исходные данные: у пользователей установлен/или не_установлен Adobe Reader 9.x. Необходимо установить/обновить его до последней версии. Посетив официальный сайт Adobe, видим что последняя версия 9.4. Однако обновления имеются до версии 9.4.7. Скачивание инкрементальных патчей и применение по очередности позволит нам истратить много времени для установки на каждом компьютере. Мы будем создавать единый файл с установщикой, который будет так же включать в себя и все обновления с помощью AutoIt..
Исходные данные: у пользователей установлен/или не_установлен Adobe Reader 9.x. Необходимо установить/обновить его до последней версии. Посетив официальный сайт Adobe, видим что последняя версия 9.4. Однако обновления имеются до версии 9.4.7. Скачивание инкрементальных патчей и применение по очередности позволит нам истратить много времени для установки на каждом компьютере. Мы будем создавать единый файл с установщикой, который будет так же включать в себя и все обновления с помощью AutoIt..
+4
Bacula: realtime filesets на Windows-клиентах
3 min
5.2K![](https://habrastorage.org/storage2/ea3/075/908/ea307590892b9b1e8c753e583764b1f2.png)
Сегодня мы поговорим про создание/восстановление резервных копий bacula под Windows.
Сразу предупреждаю, никакой революционной изюминки здесь вы не найдете, но, надеюсь, некоторым хабражителям информация будет полезной (дабы в т.ч. оценить гибкость этого бесплатного продукта).
Статья расчитана на тех, у кого уже есть небольшой опыт общения с bacula.
Ограничение, с которым я столкнулся, это невозможность задавать ограничение на размер файла. Но зато bacula поддерживает получение списка файлов через pipe от команды, которая может выполняться как на клиенте, так и на сервере. Подробнее читайте здесь.
Итак, поехали.
+4
О регистрации на сайтах
6 min
77KTutorial
Мы часто выполняем на многих сайтах действие, которое постоянно эволюционирует и улучшается (а иногда наоборот). Это регистрация. Именно о разных способах и особенностях регистраций на сайтах я бы хотел с вами поговорить. Это не громоздкое исследование, а просто небольшие и (надеюсь) полезные выдержки из моего опыта дизайнера интерфейсов.
![](https://habrastorage.org/getpro/habr/post_images/3a2/132/0a2/3a21320a2cd57bb8713540925380cc3e.png)
Пример удачной регистрации на сайте Tumblr.
Начну с определения самого понятия «регистрация», с ним всё не так просто, как может казаться. В результате полевых исследований нашей компании оказалось, что разные люди (клиенты, посетители и мы сами) нередко воспринимают это слово по-разному. Для того, чтобы избежать непонимания, опишу то, как я сам вижу регистрацию.
![](https://habrastorage.org/getpro/habr/post_images/3a2/132/0a2/3a21320a2cd57bb8713540925380cc3e.png)
Пример удачной регистрации на сайте Tumblr.
Начну с определения самого понятия «регистрация», с ним всё не так просто, как может казаться. В результате полевых исследований нашей компании оказалось, что разные люди (клиенты, посетители и мы сами) нередко воспринимают это слово по-разному. Для того, чтобы избежать непонимания, опишу то, как я сам вижу регистрацию.
+122
Обработка критических ошибок в PHP
6 min
32KВ статье описан функционал, который доступен в PHP (актуально для 5.3.х) для обработки ошибок всех типов, включая ошибки интерпретации кода (E_ERROR, E_PARSE, E_WARNING, etc). Эта обработка поможет вам для управляемого отображения страницы в случае возникновения таких проблем. В статье присутствует множество описаний и рабочих примеров(архитектуры) для того, что бы сразу воспользоваться в своем программном продукте. В конце концов, ну немного сломали сайт, ну надо же, об этом сообщить поисковику с заголовком 4хх или 5хх и повеселить пользователя, вместо возврата белого экрана (или что хуже экрана со священной информацией, для хакеров) с ответом 200 Ok.
![](https://habrastorage.org/storage1/fb09e22e/c53ec92c/921d4a1e/8bd2155e.png)
Идея написать этот топик возникла, когда я на храбре задал 2 вопроса:
По моей карме и добавление в избранное я понял, что они оказались интересные для PHP хабрасообщества. По этой причине я решил оформить решения этих вопросов в виде статьи, да бы людям и поисковикам было проще и комплексно находить нужную информацию.
Если заинтересовались, то подробности под катом…
![](https://habrastorage.org/storage1/fb09e22e/c53ec92c/921d4a1e/8bd2155e.png)
Идея написать этот топик возникла, когда я на храбре задал 2 вопроса:
- Вопрос о перехвате предупреждений и вывод ошибок в указанное место шаблона
- Вопрос о перехвате критических ошибок, заставляющие выполнение скрипт только остановиться
По моей карме и добавление в избранное я понял, что они оказались интересные для PHP хабрасообщества. По этой причине я решил оформить решения этих вопросов в виде статьи, да бы людям и поисковикам было проще и комплексно находить нужную информацию.
Если заинтересовались, то подробности под катом…
+94
Information
- Rating
- Does not participate
- Location
- Подольск, Москва и Московская обл., Россия
- Registered
- Activity