Алексей Качаев | Web-developer, фрилансер, менеджер

PHP, jQuery, AJAX, CodeIgniter, ZendFramework, Web2.0, блоггинг, Wordpress, бизнес, StartUp, Инветоры, web-проекты, бизнес-идеи, фриланс, интерфейсы

PHP и JavaScript: парочка полезных функций

Опубликовано: Алексей Качаев | 12 комментариев

Уверен, что у каждого программиста есть свой hot list полезных функций, которые должны быть постоянно под рукой. У меня в этот list входят также несколько конструкций, классов и интерфейсов, которыми я часто пользуюсь. В планах - добавить сюда же некоторые полезные алгоритмы. Но это позже… Сейчас хочу поделиться двумя функциями с вами, может кто-то возьмет эти функции себе на вооружение, может кто-то предложит более эффективные!

аutoencode() - простое декодирование строки

Итак, начнем с пары функций, которые я постоянно использую для управления кодировкой. Про эту функцию мне напомнил в комментариях к прошлому посту читатель none. Проблема в том, что при использовании в приложениях jQuery ajax-запросов нужно следить за тем, чтобы кодировка “жестко равнялась” UTF. Иногда этого добиться очень сложно. Например, у меня в прошлом примере база работала в кодировке cp1251, а отдавать результат нужно в UTF-8.. Но это только пол проблемы, немного поднапрягшись можно “переделать” базу данных. Но иногда

а) это невозможно
б) мы заранее не знаем в какой кодировке получим входные данные (например, реализуем класс для использования в стороннем коде)

В этих случаях можно пользоваться связкой таких функций:

function is_utf8($string) { 
/*
** Функция определяет является ли строка UTF
*/
	for ($i=0; $i<strlen($string); $i++) { 
		if (ord($string[$i]) < 0x80) continue; 
		elseif ((ord($string[$i]) & 0xE0) == 0xC0) $n=1; 
		elseif ((ord($string[$i]) & 0xF0) == 0xE0) $n=2; 
		elseif ((ord($string[$i]) & 0xF8) == 0xF0) $n=3; 
		elseif ((ord($string[$i]) & 0xFC) == 0xF8) $n=4; 
		elseif ((ord($string[$i]) & 0xFE) == 0xFC) $n=5; 
		else return false; 
 
		for ($j=0; $j<$n; $j++) { 
			if ((++$i == strlen($string)) || ((ord($string[$i]) & 0xC0) != 0x80)) return false; 
		}	 
	} 
	return true; 
}
 
function autoencode($string, $encoding='utf-8') { 
/*
** Декодирует строку в указанную кодировку
*/
	if (is_utf8($string)) $detect='utf-8'; 
	else { 
		$cp1251=0; 
		$koi8u=0; 
		$strlen=strlen($string); 
		for($i=0;$i<$strlen;$i++) { 
			$code=ord($string[$i]); 
			if (($code>223 and $code<256) or ($code==179) or ($code==180) or ($code==186) or ($code==191)) $cp1251++; // а-я, і, ґ, є, Ї 
			if (($code>191 and $code<224) or ($code==164) or ($code==166) or ($code==167) or ($code==173)) $koi8u++; // а-я, є, і, ї, ґ 
		} 
		if ($cp1251>$koi8u) $detect='windows-1251'; 
		else $detect='koi8-u'; 
	} 
	if ($encoding==$detect) return $string; 
	else return iconv($detect, $encoding."//TRANSLIT", $string); 
}

Аналог str_replace() для JavaScript

Функцию str_replace() для PHP я использую достаточно часто. Она настолько удобна, что когда я пишу на JavaScript, иногда чувствую себя связанным по рукам и ногам. :) Поэтому пользуюсь вот этим чудным аналогом от Kevin van Zonneveld (функция принимает те же параметры и возвращает тот же результат).

function str_replace ( search, replace, subject ) {
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Gabriel Paderni
 
    if(!(replace instanceof Array)){
        replace=new Array(replace);
        if(search instanceof Array){//If search    is an array and replace    is a string, then this replacement string is used for every value of search
            while(search.length>replace.length){
                replace[replace.length]=replace[0];
            }
        }
    }
 
    if(!(search instanceof Array))search=new Array(search);
    while(search.length>replace.length){//If replace    has fewer values than search , then an empty string is used for the rest of replacement values
        replace[replace.length]='';
    }
 
    if(subject instanceof Array){//If subject is an array, then the search and replace is performed with every entry of subject , and the return value is an array as well.
        for(k in subject){
            subject[k]=str_replace(search,replace,subject[k]);
        }
        return subject;
    }
 
    for(var k=0; k<search.length; k++){
        var i = subject.indexOf(search[k]);
        while(i>-1){
            subject = subject.replace(search[k], replace[k]);
            i = subject.indexOf(search[k],i);
        }
    }
 
    return subject;
 
}

Спонсор поста: Ищите кому доверить свой сайт? Комплексная оптимизация сайтов и раскрутка сайтов.

Понравился пост? Будь в курсе последних событий: подпишись на RSS-ленту.!

jQuery, MySQL и полноценное веб-приложение

Опубликовано: Алексей Качаев | 13 комментариев

Спонсор поста: Интернет магазин детских игрушек лего.

Алексей Качаев. jQueryИтак, сегодня представляю второй урок по использованию jQuery на примере скрипта Todo-листа.

В первую части мы реализовали с помощью jQuery и плагина jqModal возможность добавлять / редактировать / удалять записи из списка, но при этом каждый элемент списка был всего лишь элементом странички. Читайте здесь - “jQuery + jqModal - обучение на конкретном примере“.

Чем этот пример не дотягивает до веб-приложения? Естественно тем, что наши записи нигде не сохраняются. Это не хорошо. Но мы можем решить эту проблему с помощью базы данных: пользователь добавляет / редактирует / удаляет записи ? мы отправляем запрос на сервер и совершаем это действие с записью в базе данных ? возвращаем пользователю результат (успешно выполнено или ошибка). При этом состояние списка всегда синхронизировано с состоянием записей в базе данных.

Наращивать функционал будет постепенно, в принципе его здесь можно придумать очень много.

То, что у нас в итоге получится вы можете посмотреть здесь: “jQuery, jqModal и MySQL - обучение на конкретном примере“. В исходном коде странички можно ознакомиться с JavaScript кодом и CSS-стилями.

Приготовимся к битве

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

Итак, создаем таблицу `todo`, содержащюю три поля:

- `id` - для хранения уникального идентификатора

- `text` - здесь будет хранится текст записи из todo-списка

- `data` - для хранения даты задания

Пока ограничимся этими данными, хотя добавить сюда можно еще очень много, например, степень выполнения задания, категория, статус важности и т.д. Но, имхо, это все не добавит в приложение ничего принципиально нового - если разберетесь с этим, до добавлять сами сможете что угодно :)

Теперь о пользовательском интерфейсе.

Для отображения списка мы будем использовать таблицу с тремя столбцами:

- Текст задания

- Дата

- Управляющие элементы (для вызова интерфейсов редактирования и удаления соответствующей записи)

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

<div class="load"><img src="load.gif" align="absmiddle"> <span></span></div>

Изначально этот слой будет скрыт. Он будет демонстрироваться только во время выполнения ajax-запросов. Изображение вращающейся стрелки, понятное дело, для визуализации. А span мы будем использовать для вывода сообщения, сопровождающего запрос и комментирующее его результат.

[Читать далее...]

Понравился пост? Будь в курсе последних событий: подпишись на RSS-ленту.!

Идея социального сервиса: “Я знаю!”

Опубликовано: Алексей Качаев | 10 комментариев

Спонсоры поста: Портал недвижимости

Алексей Качаев. Идея социального сервисаБуквально сегодня возникла идея социального сервиса. Она мне кажется хорошей и полезной, так что выставляю на суд моих уважаемых читателей.

Это только общий очерк идеи, поэтому принимаются любые дополнения, идеи, замечания и т.д.

Предистория

У нас в локальной сети общежития установлена программа для сетевого общения - Commfort, позволяющая вести чат по нескольким каналам. Один из таких каналов - “Викторина” - работает под управлением специального бота. Бот генерирует вопрос, требующий однозначный ответ (чаще всего 1-2 слова). Ждет. Если кто-то дал правильный ответ в течении 10-15 секунд - зачет (+ к репутации пользователя), если нет - то дается подсказка №1, еще 10 секунд, еще подсказка и еще 10 секунд. Если никто так и не ответил правильно - объявляется правильный ответ, и задается следующий вопрос. И так далее.

У нас в сети компов под 500, в “Викторине” тусуется много народу, иногда баталии бывают сразу человек по 20. Это очень увлекает :)

Смотря в очередной раз на эту погонку за баллами репутации, у меня возникла идея игрового-познавательного сервиса.

Суть сервиса

После регистрации каждый пользователь может зайти в одну из “комнат”, разделенных по тематикам, в каждой комнате периодически появляются новые вопросы, нужно на них отвечать как можно быстрее. Чем быстрее пользователь ответит на вопрос, тем больше баллов получит в репутацию (например, 1й - 100 баллов, 2й - 99 баллов и т.д.).

Правильный ответ на вопрос будет показан тогда, когда получить за него баллов уже нельзя. Т.е. по нашей бальной шкале тогда, когда уже есть 99 правильных ответов. (100й получает 0 баллов, поэтому нет смысла).

Очевидно, еще нужно как-то разграничить сложные задания и простые: за простые давать меньше баллов. Пока не придумал как это реализовать, единственная зацепка - оценивать показатель количества правильных ответов на единицу времени. Чем он больше, тем легче задание. Как то так.

Рейтинг можно вести (и наверное, нужно вести) отдельно по разным тематикам.

Проблема, конечно, с вопросами :) Но тут тоже можно прикрутить user generated content. Например, тот пользователь, который по определенной теме набрал больше N баллов рейтинга имеет право предлагать свой вопрос. Он будет как в Дигге проверятся на уникальность и добавляться в базу новых вопросов. Тут надо быть, конечно, аккуратными - нужна система “бана” вопроса, если он не понравился 10 юзерам.. Или что-то в этом роде.

В общем, идея высказана. Уверен, на ее основе можно сделать неплохой сервис, который хоть немного поднимет уровень мозговой активности молодежи. :)

Рад выслушать любое мнение, дополнение, предложение, идею!

Спонсор поста:

Понравился пост? Будь в курсе последних событий: подпишись на RSS-ленту.!

15 млрд. Facebook`a, клиенты и инвесторы

Опубликовано: Алексей Качаев | 3 комментария

Алексей Качаев. Клиенты и инвесторыСпонсор поста: Общество с ограниченной ответственность “Волгоградский канат”. Это звучит гордо…

Собственно, началась эта история с моего поста “Почему Facebook стоит 15 млрд. $?”… Поскольку в комментариях к нему возникло несколько вопросов, давайте продолжим рассуждать в направлении венчурных стартапов.

Вопрос первый: Зачем клиенты, они сами придут

Возник вопрос, естественно, из этого списка:
? Идея
? Команда
? Желательно, будущие клиенты
? Инвестор
? Компания

Так вот, зачем клиенты?

Когда вы “начинаете начинать” стартап, у вас есть ИДЕЯ. Эта идея кажеться вам самой крутой идеей из всех только возможных (и это на самом деле хорошо). Но, чтобы стартап “выстрелил” нам нужно дойти до той кондиции, когда так будет думать ВЕСЬ РЫНОК, а не только вы. Как бы вы хорошо не разбирались в тонкостях задуманного, это самое “задуманное” в первую очередь ориентировано на КЛИЕНТА, а ему всегда виднее.

Поэтому, два вывода:

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

[Читать далее...]

Понравился пост? Будь в курсе последних событий: подпишись на RSS-ленту.!

Blogger & Admin: one day from life

Опубликовано: Алексей Качаев | 4 комментария

You see, it`s very hard to work on Saturday, so I decided to have good time and make something fun. The results you can see downpage. I named this story in pictures “Blogger and Admin: One Day From Life”.

Is this situation familiar to you?

[Читать далее...]

Понравился пост? Будь в курсе последних событий: подпишись на RSS-ленту.!

Страница 1 из 3123»