Search
Write a publication
Pull to refresh
24
0
Александр @Holden

User

Send message

ООП в JavaScript

Reading time4 min
Views40K
Хочу представить вам функцию-конструктор классов createClass.
Чем хорош этот конструктор:
1. Сам код выглядит более читабельным и понятным
2. Поддержка множественного наследования
3. Поддержка абстрактных методов
4. Наследование статических методов и свойств класса
5. Умный метод instanceOf (проверяет по всей цепочке классов)
Читать дальше →

Валидация HTML-форм и расширение функциональности

Reading time4 min
Views15K
Валидации HTML-форм уделяют очень мало внимания. Например, даже на habrahabr.ru пока я регистрировался и входил на сайт несколько раз мне выдавалось сообщение об ошибке: то код протекции ввел неправильно, то в логине указал email вместо логина. А еще бывает пользователи ошибаются с количеством цифр в номере телефона или реквизитах организации, путают русскую букву «с» с английской, при копировании и вставке в Windows лишнии пробелы добавляются к данным.

Конечно, все это не смертельно. Но было бы крайне удобно, чтобы данные проверялись еще до отправки на сервере. Особенно CAPTCHA, ибо ее часто вводишь с ошибкой.

Для решения данной проблемы были несколько способов: HTML5, jQuery Validate, zForms.ru и еще ряд менее известных библиотек. Но все эти способы имели свои недостатки: HTML5 поддерживается не всеми браузерами и не имеет опции не отправлять незаполненные поля, задать сообщение о несоответствии регулярному выражению, ограничить список допустимых символов для ввода в поле, возможности склеивать поля, посылать значения чекбоксов в формате csv или суммы значений.
Читать дальше →

Слушайте хабр по «радио»

Reading time1 min
Views563
На одном сайте, который мне внутренний голос нашептал одним воскресным утром, нашёл ссылку на RSS радио. В настройках помимо всего прочего есть и хабр, и тот самый сайт.
Мне понравилось.

Есть приложение для iPhone или iPad
image
Сделано в Центре речевых технологий.

Aibolit для android

Reading time4 min
Views2.7K
Как же утомителен процесс инициализации UI при разработке android-приложений. Раз за разом приходится писать горы шаблонного кода: findViewbyId, setOnClickListener, getResources().getDrawable, … Возникает естественное желание переложить эту работу на плечи AOP. Беглый поиск готовых решений, адаптированных под android, навел разве что на RoboGuice, о котором уже упоминалось на хабре. Однако библиотека имеет значительный размер (~0.5 mb), что для многих приложений недопустимо много, и к тому же требует наследования ваших классов application и activity от RoboApplication и RoboActivity, чего не всегда хочется делать. Потому и появился Aibolit, легкая (~40kb), простая в использовании и функциональная библиотека, использующая dependency injection для инициализации UI на android.

Читать дальше →

Генерация версии android приложения из ревизии subversion и git

Reading time6 min
Views3.9K
Когда пользователи сталкиваются с проблемами — всегда хочется точно знать какой именно версией ПО они пользуются. При использовании системы контроля версий и автоматической нумерации версий ПО, такую информацию можно предоставить пользователям, а в случае необходимости просто попросить продиктовать строку.

О том, как можно пронумеровать свой android проект написано здесь и здесь. В обоих статьях рассмотрен пример получения версии проекта с помощью 'svn info', причём в первой статье автор жалуется на отсутствие SvnAnt, а во второй статье автор замечает проблему, связанную с использованием 'svn info'. Проблема связана с тем, что 'svn info' выдаёт неточные сведения о ревизии рабочей копии.

Далее рассмотрен пример решения этой проблемы достаточно простым способом.
UPD: добавлен скрипт для git.
Читать дальше →

Умный бэкап MySQL

Reading time4 min
Views2.5K
Думаю, у многих в жизни возникала ситуация, когда есть полный бэкап базы MySQL, и нужно восстановить только несколько таблиц из него. Или, еще хуже, нужно восстановить старые записи в этих таблицах, не затерев при этом новых. А в случае если дамп занимает сотни мегабайт, процесс не очень вдохновляет.

В этой статье я опишу концепцию умного бэкапа, реализованную в Sypex Dumper. А также приведу примеры использования.
Читать дальше →

Использование паттерна mediator для переключения между activity

Reading time3 min
Views7.8K


В простейшем случае для запуска Activity в Android нужно создать Intent c указанием класса вызываемого activity и Bundle из параметров. И всё хорошо, пока у нас в приложении пара экранов. Сложности начинаются тогда, когда количество экранов в нашем приложении будет исчисляться десятками. В данной статье я бы хотел предложить относительно несложный способ организации работы с большим количеством Activity.
Читать дальше →

Паттерн «Обозреватель» и контекст вызова в Javascript

Reading time3 min
Views13K
Хотя про паттерн «Обозреватель (Наблюдатель, Observer)» сказано достаточно, в том числе и на Хабре, вкратце повторюсь. Суть паттерна в наблюдении за состоянием неких субъектов системы и соответствующей реакции наблюдателей на изменения этих состояний. За одним субъектом может следить несколько наблюдателей, причём сам он об этом не знает (слабое связывание), но исправно оповещает всех об изменении состояния.

Удобно использовать Обозревателя на сайтах и в веб-приложениях, поэтому логично реализовать его с использованием самого популярного языка для веб-среды — Javascript.
Читать дальше →

Traits в php 5.4. Разбираем детали реализации

Reading time8 min
Views53K
Совсем недавно вышла первая beta php 5.4, а пока я писал топик подоспела и вторая. Одно из нововведений в 5.4 – это traits (типажи). Предлагаю разобраться во всех деталях в том, что же типажи из себя представляют в php.

Простой пример типажа, чтобы не заглядывать в Википедею:
//определение типажа
trait Pprint 
{
    public function whoAmI()
    {
        return get_class($this) . ': ' . (string) $this;
    }
}

class Human 
{
    use Pprint; //подключаем типаж, ключевое слово use

    protected $_name = 'unknown';
    
    public function __construct($name)
    {
        $this->_name = $name;
    }

    public function __toString()
    {
        return (string) $this->_name;
    }   
}

$a = new Human('Nikita');
echo $a->whoAmI(), PHP_EOL; //=> Human: Nikita

Как видно, к классу Human было добавлено поведение из типажа Pprint.

Но во всём есть свои детали.
О них далее

Стратегия оптимизации веб-проекта с использованием MySQL

Reading time5 min
Views8.3K

Введение


В жизни любого крупного веб-проекта, особенно на PHP, но, в целом, это касается любого серверного ЯП, пригодного для веб-разработки, обычно наступает понимание, что «так дальше жить нельзя», и что настал момент, когда нужно провести оптимизацию работы сайта, чтобы он перестал тормозить (хотя бы на production).

Интересно, что, как правило, даже тяжелые фреймворки (вроде Symfony или RoR) на «медленных» языках, в production-окружении работают достаточно сносно по скорости, а основные «тормоза» вызываются SQL-запросами и неграмотным кешированием (к примеру, инициализация достаточно сложной и большой конфигурации проекта на Symfony занимает около 80 мс, а времена исполнения страницы, при этом, иногда достигают секунды и более).

Если вы смогли определить, что это — ваш случай, и ваш проект на MySQL, то эта статья может вам помочь принять конкретные меры и исправлению ситуации с закреплением результата и предотвращением возникновения откровенных проблем с СУБД впоследствии.
Читать дальше →

USSD в Android

Reading time4 min
Views35K
USSD (Unstructured Supplementary Service Data)— стандартный сервис в сетях GSM, позволяющий организовать интерактивное взаимодействие между абонентом сети и сервисным приложением в режиме передачи коротких сообщений.
Как известно, Android не имеет API для чтения USSD сообщений, далее я расскажу как решить эту проблему.
Читать дальше →

Переключаем WiFi в режим точки доступа в Windows

Reading time3 min
Views590K
Так уж получилось, что на работе для получения полноценного интернета без ограничений, мне приходиться использовать нетбук и 3g-модем. Недавно, купив iPod Touch, я очень захотел его подключить к интернету. Если смартфон еще мог вылезти в интернет самостоятельно, то вот с плеером несколько труднее.

Один из вариантов — это подключение с помощью кабеля синхронизации. Вариант не очень удобный, так как носить с собой постоянно кабель желания совершенно нет, да и iTunes ставить тоже не хочеться. Второй вариант, тот который и описывается в данной статье — это подключение через WiFi. На Хабрахабре уже упоминалась похожая задача и её решение, но для Linux. Наша задача настроить тоже самое под Windows.

Итак, что мы имеем


— Нетбук, ASUS 1215B
— Интернет через USB 3g-модем
— Плеер и смартфон с наличием WiFi

Задача


— Получить на всех устройствах интернет

Читать дальше →

Как ускорить эмулятор Android на 400%

Reading time5 min
Views143K
Последние несколько месяцев я работал над SDK для Android, входящим в платформу управления контентом Nuxeo. Особенно много работы было в последнее время, с приближением официального релиза SDK. Я хочу поделиться несколькими практическими советами по поводу разработки под Android, в частности тестирования и эмуляции. Уже после нескольких дней разработки я понял, что работа с эмулятором Android — не сахар, потому что он чудовищно медленный.

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

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

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

Ежедневный Git

Reading time3 min
Views98K
Уже были статьи про основы гита (0, 1, 2), были и статьи про внутреннее устройство репозитория. Сегодня поговорим, как простому смертному работать с гитом на автопилоте и не морочить себе голову.

Во-первых, шорткаты (в порядке убывания популярности):

alias gst='git-status'
alias ga='git-add'
alias gc='git-commit -m'
alias gp='git pull && git push'
alias gull='git pull'
alias gush='git push'
alias gb='git-branch'
alias gco='git-checkout'
alias gd='git-diff'

Во-вторых, отображение текущей ветки в командной строке:
export PS1='`__git_ps1 "%s"` \w \$ '

Выглядит так:
lazy-args-in-futures ~/Work/io/oleganza-io.git $

(Как установить: ericgoodwin.com/2008/4/10/auto-completion-with-git)

Типичный поток работы в одной ветке
Читать дальше →

Про Git на пальцах (для переходящих с SVN)

Reading time8 min
Views280K
Год назад мы с командой решили перейти с SVN на Git. Зачем это было надо — писать не буду, т.к. на эту тему уже и так много написано. А хочу я описать типичные алгоритмы работы, понятные человеку, который долгое время пользовался SVN. Ниже — памятка, написанная для команды год назад, чтобы легче было мигрировать. Надеюсь, кому-нибудь пригодится.
Читать...

FreeArc — современный архиватор

Reading time4 min
Views36K
Столько всего хочется хранить на жестком диске: фильмы, музыку, программы, документы… Но, к сожалению, винчестер – не резиновый. Заставить данные потесниться смогут программы-архиваторы. Сейчас довольно сильно распространены 7Zip и WinRAR, но в данный момент по эффективности все же лидирует FreeArc. По результатам одного из самых авторитетных тестов FreeArc занял три первых места, причём c большим отрывом от соперников:


Читать дальше →

Краткий список WYSIWYG редакторов от Марка Андреева

Reading time4 min
Views361K

Однажды мне потребовался WYSIWYG редактор, я помнил как он выглядит, его функции, но не помнил названия. Через 45 минут я все же его нашел… Тогда я поставил перед собой задачу помочь многим, в том числе и себе: сделать сводный список всех чуть более известных WYSIWYG редакторов.
Читать дальше →

MarkitUp! — Легкий редактор на jQuery

Reading time4 min
Views21K

Введение


Всех приветствую!

Совсем недавно мне пришлось немного расширить функционал редактора одного проекта. Но как оказалось в моем случае я наткнулся на некие трудности. В этой статье я поделюсь с читателями как я вышел из сложившийся ситуации.
Читать дальше →

Iterator, ArrayAccess, Countable: Объект как массив

Reading time5 min
Views31K

0. Intro.


В стандартной поставке php имеются 2 интересных интерфейса, позволяющие значительно изменять поведение объектов в языке.
Это Iterator и ArrayAccess. Первый позволяет итерировать объект через такие конструкции each, foreach, for. Второй же, в свою очередь, позволяет обращаться к объекту, как к массиву применяя привычное $array[] = 'newItem'. Соответственно, для полноценной эмуляции массива, объект обязан заимплементить оба интерфейса.
Читать дальше →

Helios Kernel (удобный include в Javascript)

Reading time4 min
Views7.1K
Hello World,

Всё начилось с простой идеи: мне захотелось, чтоб я мог в шапке скрипта написать что-то вроде

include( "path/to/someLibrary.js" );

а ниже использовать объекты, объявленные в скрипте someLibrary.js. Так появилась библиотека Helios Kernel.

Читать дальше →

Information

Rating
Does not participate
Location
Украина
Date of birth
Registered
Activity