воскресенье, 25 ноября 2012 г.

Phantomjs. Кратко о webkit консольном браузере.

Отличный браузер, который дает нам дополнительные возможности в программной навигации по вебу. А также позволяет реализовать unit-тестирование javaScript, делать скриншоты страниц и другое. Это браузер позволяет нам работать с DOM так же буд-то мы находимся в самом обычном браузере с GUI. Краткая информация:
У меня лично были некоторые трудности с установкой из исходников. Ах, да совсем забыл Ubuntu :). Значит были сложности, т.к. требуется qt и еще ряд зависимостей, если кто-то хочет попробовать собрать, то подробная инструкция по этому вопросу есть на сайте продукта. Также я поставил изначально из пакетов:
sudo aptitude install phantomjs
Но, как известно, стандартные пакеты славятся отсталостью версий. Как же быть если пакеты в репозиторые старые, а из сырцов поставить не вышло? На официальном сайте есть бинарники. Там вы найдете бинарники для популярных ОС.
Как пользоваться. Очень просто, куда вы распаковали скачанный архив, там находите папку bin а в ней phantomjs, его можно вынести в удобное для вас место. Итак приступим.
Первый самый простой скрипт (hello.js) для нашего phantomjs.
console.log('Hello Phantom!!!');
Для запуска выполним
phantomjs hello.js
Получим сообщение в консоль. Ну, это по-моему очевидно. Далее чуть поинтереснее. Пример получения скриншота посещаемой страницы:

var page = require('webpage').create();
page.open('http://google.com', function () {
    page.render('google.png');
    phantom.exit();
});
 
Тут мы сначала подключаем необходимый нам модуль webpage. А затем открывает необходимую нам страницу, после успешной загрузки которой мы вызовим колбэк функцию. В этой функции мы сохраняем (рендерим) скриншот страницы в файл google.png и закрываем phantomjs.

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

var page = require('webpage').create(),
    system = require('system'),
    t, address;

if (system.args.length === 1) {
    console.log('Usage: loadspeed.js ');
    phantom.exit();
}

t = Date.now();
address = system.args[1];
page.open(address, function (status) {
    if (status !== 'success') {
        console.log('FAIL to load the address');
    } else {
        t = Date.now() - t;
        console.log('Loading time ' + t + ' msec');
    }
    phantom.exit();
});

Запустив этот скрипт и передав в качестве параметра Web-адрес, мы получим ожидаемый результат, т. е. скорость загрузки страницы.

Гораздо больше примеров есть на официальном ресурсе, который указан вначале статьи. Штука удобная действительно. Я написал обертку на PHP для управления этим браузером, но она "дико" сырая, умеет выполнять только одно, вызывать обработчик phantomjs и делать скриншот в файл. Как будет что показать обязательно обновлю статью и укажу ссылочку на Git хаб.

Проброс портов в Windows

Ситуация проста. Имеем следующее. Виртуальную машину. Физическую машину на которой она крутиться. Если коротко то хост машина - Win7, гостевая - ubuntu-server 12.04., роутер. На роутере скорее всего для проброса портов будет пункт типа Virtual Servers. Там выбираем службу (или руками порты прописываем) IP машины на которую нам надо отправлять. Это сугубо индивидуально поэтому не могу ничего конкретно посоветовать. Смотрите документацию по своему роутеру. На тему "проброс портов".
Идем далее. На Убунте поднят апач, т.е. это 80 порт - это наша цель. Но роутер может обратиться только на наш физический IP адрес внутри локальной сети, на железную сетевую карту. Тут нам надо делать еще один проброс порта, того же 80го. Но только уже на нашем компьютере под управлением Win7 с железной карты, пускай у нее IP будет 192.168.1.101 на карту, которую добавит при установке, ваша виртуальная машина (у меня Virtual Box и карта которая соединяет виртуальные миры с физическими имеет адрес 192.168.56.1, ну шлюз, в смысле, соответственно машина с Апачем имеет IP равный 192.168.56.101). Итого, вкратце, надо пробросить 192.168.1.101:80 на 192.168.56.101:80 в операционной системе Windows 7 приступаем.
1. Запускаем консоль с правами администратора.
2. Запускаем netsh
и
netsh>interface
netsh interface>portproxy
netsh interface portproxy>add v4tov4 listenport=80 listenaddress=192.168.1.101 connectaddress=192.168.56.101 connectport=80
Проверяем все ли прошло гладко:
netsh interface portproxy>dump

#===========================
# Конфигурация портов прокси
#===========================
pushd interface portproxy

reset
add v4tov4 listenport=80 connectaddress=192.168.56.101 connectport=80


popd

# Конец конфигурации портов прокси
Да все нормально. Пробуем теперь обратиться локально по 192.168.1.101 и мы получим ответ от апача по адресу 192.168.56.101. Дальше пробуем уже по внешнему IP адресу, и вы должны получить тот же ответ что и от внутреннего адреса 192.168.56.101. Стоит уточнить, данный способ пробросит только TCP.

Если узрите неточности, прошу отметить в комментариях.


четверг, 30 августа 2012 г.

PHP. Работа с CSV файлами.

Работая надо одним проектом, часто приходилось работать с данными полученными из разных источников. Все эти данные были сформированы в виде CSV файлов. Причем все имели разные форматы. Нужен был инструмент для быстрой и удобной работы. Решил написать. Т.к. из того что я нашел не было ничего подходящего.

Итак что умеет этот класс. Главное это то что он осуществляет удобную загрузку данных CSV и, путем несложного дополнения, можно экспортировать данные в другой формат, а также формирование и сохранение данных в CSV формат. Все делается очень просто и без особых усилий. Из способностей этого класса есть еще такие "недопиленные" фишки как поиск по колонкам и по строкам, пока в некоторых случаях срабатывает некорректно. Но от класса этого и не требовалось, так сказать это побочный положительный эффект.
Итак по порядку. Класс можно забрать на Gitgub'e.
Использовать его очень просто. Ниже пример инициализации и загрузки CSV данных.

$options = array(
    'splitter' => ';', // Это разделитель "колонок" в CSV файле
    'wrapper' => '"', // А это то во что "завернуты" значения "колонок"
);
$csv = new Csv($options);
А вот так просто мы можем добавить строку в CSV файл, но данные сохранятся только после вызова метода Csv::save([file_name])
// Можно передать и в конструктор в виде параметра file => 'filename.csv'
$csv->file('./users.csv');
$csv->add(
    array ('id', 'user', 'name', 'email')
);
// Если как в этом примере мы указали имя файла то просто вызываем Csv::save если нет, то передаем в качестве параметра имя файла
$csv->save()

Если мы заранее указали имя файла с которым работаем, то и этот метод вызываем без параметров. Это загрузка CSV файла и его парсинг.

$csv->load();
или
$csv->load("./users.csv');

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

$csv->rows(); // Получаем все распарсенные строки из файла (в виде массива)
$csv->row(1); // Получи первую строку, причем если вы укажите в параметрах конструктора параметр columnNames, то это строка выведет данные а не названия столбцов
$csv->cell(10, 3); // Выведет данные из 10 строки 3 колонки
$csv->remove(3); // Удалит 3ю строку из файла
$csv->readOnly(true); // Пометить объект как "только чтение" и методы add и remove будут генерировать исключения
$data = $csv->columns() // Получить все колонки
$userNames = $csv->column('name'); // Получить колонку с именами (если конечно был задан map колонок)

// Весь поиск прекращает работу и возвращает строку как только будет найдена первая строка удовлетворяющая поиску
$csv->find('Vasya'); // Будет работать медленее всего, вернет первую строку в которой есть 'Vasya', регистр важен
$csv->find('Vasya', 2); // Будет работать быстрее чем предыдущий вариант, с таким же результатом, но не по всей таблице а только по 3й колонке
$csv->find('Vasya', 2, Csv::FIND_SENS_CASE); // Быстрый регистронезависимый поиск по 3й колонке
$csv->save(); // Сохраняем все изменения если конечно объект не помечен как "только чтение"
Замечу, что поиск работает очень быстро, разумеется для этого типа данных. Я потратил наверное больше всего времени на этот кусочек реализации. Думаю вы оцените, для сравнения, поиск по списку из 450 тыс. (колонок было 13), данные из середины, находились без указания колонки поиска за ~2с. а с указанием за ~0.5), конечно, эти данные абсолютно ни о чем не говорят, а просто приблизительно показывают, что поиск вполне можно использовать.
Благодаря этому классу, я смог быстро реализовать импорт/экспорт данных из CSV в Ms Excel XML и из CSV в MySQL, с минимальным набором логики, как вы заметили есть методы, которые позволяют манипулировать данными, думаю это очень важно.
И мне показалось, что не поделиться им с вами, будет не честно, зачем ему валяться без дела, пускай людям приносит радость и экономит время.

Скачать класс с Github
Можно забрать с composer

пятница, 10 августа 2012 г.

MySQL. Отключение логирования запросов без индексов.

MySQL при включенном slow log логирует и запросы которые не содержат в себе индексов. Порою возникает необходимость такую "фичу" отключить для этого необходимо найти конфигурационный файл mysql. В случае если это Debian то это будет /etc/mysql/my.cnf и добавить туда в секцию MySQL директиву log-queries-not-using-indexes. Что приведет к игнорированию запросов которые не используют индексы, только если, конечно, время выполнения такого запроса будет ниже чем установленный long-query-time

вторник, 3 июля 2012 г.

Разработка. Как передать HTTP_REFERER из flash.

Предыстория такова. Есть на некоем ресурсе флеш-виджет которые выполняет какие-то операции с пользовательским контентом. В моем конкретном случае, это фотографии. Задача стояла следующим образом. Необходимо собирать статистику показов с внешних ресурсов, т.е. сколько раз и где флешка засветилась на экранах пользователей. задача так же усложнялась и тем, что по сути показы должны были учитываться не самой флешки, а меняющихся в ней фотографий. Если же вам так же понадобится учитывать показ контента внутри флеш, то, увы, прийдется обратиться к флешеру, сваявшего этот виджет. Зачем я объясню позже.
Итак приступим. Все мы прекрасно знаем, что флешка передать реферера не может, вернее может, но этот реферер будет физическим адресом размещения самой флешки. Что не есть хорошо и нам абсолютно не надо. Так как же передать реферера? Очень просто, достаточно обвернуть выдачу флешки в php-скрипт. В котором мы будем выхватывать реферера учитывать показ. Если же у вас задача, так же как и у меня, "со звездочкой", то делаем нехитрый трюк с редиректом и добавлением параметра в запрос, таким вот образом. Получив реферер, в PHP скрипте, мы генерируем новый запрос к флешке и делаем по нему редирект. Флешка в своб очередь, получив этот параметр, добавляет его к каждому запросу (в моем случае фотографии) к нашему серверу, где этот запрос, обрабатывается скриптом, который учитывает всю необходимую нам информацию, включая реферера. Теперь чтоб совсем все стало ясно, приведу небольшой пример утопического кода (без проверок и пр. только логика, так что, пожалуйста не возмущайтесь понапрасну):

// Файл flashcatch.php
$file = './flash.swf';
$referer = $_SERVER['HTTP_REFERER'];
// Если не надо делать никаких более действий, то прямо здесь счетаем показ
// ...
// Устанавливаем тип содержимого
header('Content-Type: application/x-shockwave-flash');
// Читаем и отдаем флешку.
echo file_get_content($file);
exit();

Если понадобиться добавить параметр для последующего учета показов контента внутри самой флешки то код немного усложниться.

// Файл flashcatch-trick.php
$file = './flash.swf';
$referer = $_SERVER['HTTP_REFERER'];
// Добавляем параметр к запросу на флешку например referer.
if (strpos($_SERVER['REQUEST_URI'], '?')) {
    $connector = '&';
} else {
    $connector = '?';
}
$newRequest = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'] . $connector . 'referer=' . $referer;
// Если запрос является внешним и запрос не содержит в себе параметра referer то делаем редирект
if (isExternalRequest() && !$_REQUEST['referer']) {
    header ('Location: ' . $newRequest);
    exit();
}
// Устанавливаем тип содержимого
header('Content-Type: application/x-shockwave-flash');
// Читаем и отдаем флешку.
echo file_get_content($file);
exit();

И вот тут вспоминаем про флешера, во флешку передаем новый параметр в котором прописан реферер, в моем случае это параметр referer :). А флешер формируя запросы к к серверу для получения фотографий (аудио, видео), подставляет его и сервер при выдаче содержимого флешке учитывает реферера и показ, соответсвенно.

Функция isExternalRequest не приведена, ее не составит труда написать самому. Суть ее думаю ясна, вернет труЪ если это внешний запрос и фальс если свой же сервер запросил флешку.

среда, 27 июня 2012 г.

Google Maps. Курсоры рук для карты.

Если вдруг вам понадобяться такие вот руки как при перемещении курсора над картой или же при перемещении с нажатой кнопкой мыши то вот:
http://maps.google.com/mapfiles/openhand.cur
http://maps.google.com/mapfiles/closedhand.cur

пятница, 18 мая 2012 г.

SEO. 301 редирект с /index на /. Или главная всегда по одному адресу.

Для того чтобы главная страница сайта всегда была доступна по одному адресу, например, есть сайт www.some.com, я его могу открыть двумя способами. Первый набрать в адресной строке браузера непосредственно www.some.com или www.some.com/index. При этом во втором случае я получаю тоже самое что и при первом. Некоторые поговариют, что это не хорошо переваривается поисковиками, поэтому сделаем небольшую операцию используя возможности модуля для Apache - mod_rewrite.
# Указываем правило, если запрос будет состоять из /index
RewriteCond  %{REQUEST_URI} ^/index$ [NC]
# То применим для него редиркт 301, т.е. "переехали" на ПМЖ
RewriteRule ^.*$ / [R=301,L]

понедельник, 7 мая 2012 г.

Magento. Как сбросить админский пароль на админку.

Для сброса пароля необходимо сделать следующее.
1. Если вы не помните или не знаете как называется пользователь с админскими правами, то выполните такой запрос:

SELECT * FROM admin_user;
В полученом списке выберите необходимого пользователя где будет указано что это админ.
2. Далее выполняем такой запрос:
UPDATE admin_user SET password=CONCAT(MD5('{соль}{пароль}'), ':{соль}') WHERE username='{пользователь_админ}';
Где заменить {пароль} на новый пароль, {соль} на любую последовательность символов, ну соль, одним словом, а {пользователь_админ} — на того пользователя, которого мы нашли по первому запросу.

Up: Как правильно заметил Max St слово password которое идет после {новый_пароль} это, цитирую :), "строка, которую указали для шифрования при установке magento".

среда, 18 апреля 2012 г.

MySQL. Как сделать дамб БД с хранимыми процедурами, и не только.

Иногда приходится перенести дамп базы данных (MySQL), и перенести его не просто так, а с хранимыми внутри БД процедурами, чтобы приказать mysqldump делать дамп с оными надо выполнить такую вот команду:
mysqldump -uUser -pPass --routines --extended-insert DBName > /dir/file.sql
Для бекапа дампа и одновременного сжатия его можно воспользоваться таким вот способом.
mysqldump -uUser -pPass DBName | gzip > /dir/file.sql.gz
Чтобы развернуть дамп завернутый :) таким вот способом надо сделать вот так:
gunzip < /dir/file.sql.gz | mysql -uUser -pPass DBName
Если вы хотите сделать бекап только одной таблицы, для этого утилите mysqldump надо указать следующий ключ --tables table1 table2, и через пробел все таблицы которые вы хотите задампить. Вот примерчик:
mysqldump -uUser -pPass DBName --tables table1 table2 > /dir/file.sql.gz

пятница, 6 апреля 2012 г.

Magento. Как получить суффикс добавляемый в ЧПУ ссылку

Недавно возникла необходимость получить суффикс ссылки в Magento, это то что добавляется в конец ссылки имитируя физический документ, ну к примеру http://www.example.com/some/seo/link, - это без суффикса, а http://www.example.com/some/seo/link.html - с суффиксом. Это задается в админке, т.е. может меняться пользователем. Получить это в коде можно очень просто.
// Для ссылки на товар
Mage::getStoreConfig('catalog/seo/product_url_suffix');
// Для ссылки на категорию
Mage::getStoreConfig('catalog/seo/category_url_suffix');

четверг, 5 апреля 2012 г.

CSS. Ненумерованный (bullit) список с маркерами-символами

Способ задать, к примеру, в списке в качестве маркера, такое длинное, смачное тире "—" не просто, ну в смысле, просто, но не так как этого хотелось бы. Внизу представлены CSS правила для этого хитрого дела. Разбирать не буду, что для чего, кому что-то не понятно — в комменты, пожалуйста. Я отвечу.
ul.bullit-dash li {
    padding: 0;
    margin: 0;
    list-style-type: none;
    behavior: expression( !this.before
    ? this.before = this.innerHTML = '— ' + this.innerHTML : '' );
    text-indent: -1.24em;
}

ul.bullit-dash li:before {
    content: '\2014\a0';
}

четверг, 9 февраля 2012 г.

SEO. 301 перенаправление всех доменов на основной. Или как отправить домен с Www на домен без Www

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

# Включаем режим перенаправления
RewriteEngine On
# Указываем основной каталог
RewriteBase /
# Наше правило проверяющее текущий домен в запросе и если он не mysite.com
RewriteCond %{HTTP_HOST} ^www\.mysite\.com [NC,OR]
RewriteCond %{HTTP_HOST} ^(www\.)mysite\.(?!com$) [NC,OR]
RewriteCond %{HTTP_HOST} ^mysite\.(?!com$) [NC]
# то делаем редирект на mysite.com
RewriteRule (.*) http://mysite.com/$1 [R=301,L]

Таким образом домены вида www.mysite.com, www.mysite.com.ua, www.mysite.us, www.mysite.ru будут отправлены на наш основной домен site.com. Ну разумеется если пользователь любезно будет отправлен DNS серверами по этим именам к вам на сервер :).

HTTP. Коды ответов (Response Codes)


Шпоргалка по HTTP кодам ответов.
1xx: Informational (Информационные).
100 Continue (Продолжать).
101 Switching Protocols (Переключение протоколов).
102 Processing (Идёт обработка).
2xx: Success (Успешно).
200 OK (Хорошо).
201 Created (Создано).
202 Accepted (Принято).
203 Non-Authoritative Information (Информация не авторитетна).
204 No Content (Нет содержимого).
205 Reset Content (Сбросить содержимое).
206 Partial Content (Частичное содержимое).
207 Multi-Status (Многостатусный).
226 IM Used (IM использовано).
3xx: Redirection (Перенаправление).
300 Multiple Choices (Множество выборов).
301 Moved Permanently (Перемещено окончательно).
302 Found (Найдено).
303 See Other (Смотреть другое).
304 Not Modified (Не изменялось).
305 Use Proxy (Использовать прокси).
306 (зарезервировано).
307 Temporary Redirect (Временное перенаправление).
4xx: Client Error (Ошибка клиента).
400 Bad Request (Плохой запрос).
401 Unauthorized (Неавторизован).
402 Payment Required (Необходима оплата).
403 Forbidden (Запрещено).
404 Not Found (Не найдено).
405 Method Not Allowed (Метод не поддерживается).
406 Not Acceptable (Не приемлемо).
407 Proxy Authentication Required (Необходима аутентификация прокси).
408 Request Timeout (Время ожидания истекло).
409 Conflict (Конфликт).
410 Gone (Удалён).
411 Length Required (Необходима длина).
412 Precondition Failed (Условие «ложно»).
413 Request Entity Too Large (Размер запроса слишком велик).
414 Request-URI Too Long (Запрашиваемый URI слишком длинный).
415 Unsupported Media Type (Неподдерживаемый тип данных).
416 Requested Range Not Satisfiable (Запрашиваемый диапазон не достижим).
417 Expectation Failed (Ожидаемое не приемлемо).
418 I'm a teapot (Я - чайник).
422 Unprocessable Entity (Необрабатываемый экземпляр).
423 Locked (Заблокировано).
424 Failed Dependency (Невыполненная зависимость).
425 Unordered Collection (Неупорядоченный набор).
426 Upgrade Required (Необходимо обновление).
449 Retry With (Повторить с...).
456 Unrecoverable Error (Некорректируемая ошибка...).
5xx: Server Error (Ошибка сервера).
500 Internal Server Error (Внутренняя ошибка сервера).
501 Not Implemented (Не реализовано).
502 Bad Gateway (Плохой шлюз).
503 Service Unavailable (Сервис недоступен).
504 Gateway Timeout (Шлюз не отвечает).
505 HTTP Version Not Supported (Версия HTTP не поддерживается).
506 Variant Also Negotiates (Вариант тоже согласован).
507 Insufficient Storage (Переполнение хранилища).
509 Bandwidth Limit Exceeded (Исчерпана пропускная ширина канала).
510 Not Extended (Не расширено).

понедельник, 30 января 2012 г.

Magento. Очистка магазина от тестовых данных.

Порою приходиться переносить проект с девелопмент окружения в продакшен :) (не всегда конечно проект доживает до такого). Так вот чтобы без напряжения в заднем проходе совершить это действие. Даю несколько SQL команд, которые необходимо выполнить, хоть из phpMyAdmin, хоть из консоли, в общем так как вам будет удобно.

-- Clear Magento Test Data
TRUNCATE TABLE sales_flat_order;
TRUNCATE TABLE sales_order_tax;
TRUNCATE TABLE downloadable_link_purchased;
TRUNCATE TABLE sales_bestsellers_aggregated_daily;
TRUNCATE TABLE sales_bestsellers_aggregated_monthly;
TRUNCATE TABLE sales_bestsellers_aggregated_yearly;
TRUNCATE TABLE catalogsearch_query;
TRUNCATE TABLE customer_entity;
TRUNCATE TABLE tag; 

понедельник, 23 января 2012 г.

jQuery. Каркас для плагина.

Для плагинописания jQuery советуют использовать каркас который примерно таков.
(function () {
    /**
     * @var Object Default plugin options
     */
    var defaultOptions = {
        'param1' : 'foo',
        'param2' : 'bar'
    };

    /**
     * @param current jQuery element
     */
    var $this = null;
    /**
     * @param all plugin methods
     */
    var methods = {
        init: function () {
            var settings = $.extend(defaultOptions, options);
            return this.each(function() {
                $this = $(this);
                // Write code here
            });
        }
    };

    /**
     * Plugin constructor
     * @param method
     */
    jQuery.fn.myNewCoolPlugin = function (method) {
        if (methods[method]) {
            return methods[ method ].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || ! method) {
            return methods.init.apply(this, arguments);
        } else {
            jQuery.error('Method ' + method + ' does not exist on jQuery.tooltip');
        }
    };
})(jQuery);
Важный совет: каждый новый плагин должен писаться в своем замыкании.

четверг, 19 января 2012 г.

SEO. Нах..й SEO.

Да простит меня общественность, за "яркий" заголовок, но то что в нынешнее время называют SEO-специалистом, сродни средневековым алхимикам, которые что-то варили непонимая что но понимая зачем, и конечно же у них не получалось то что они задумали. А "выстрелит" или не "выстрелит", падало на долю случая. Так и все эти сеошники, шарлатаны и надменные нахалы. Возомнили себя настоящими спецами без которых и интернета наверное не существовало бы, даже специализированные компании создают. И ничего удивительного, алхимики в свое время даже к королям во двор попадали так сказать алхимики при дворе. Но как мы видим алхимия дала много чего человеку, и еще больше ничего не дала, а главное не дала того, за ради чего была задумана — золото и прочие драг. металлы, и по прежнему надо было приложить огромное количество труда для добычи этого ценного материала. Так и с SEO оптимизаций, эти "мастера" заявляют и доказывают что вот она 10ка а вот тут будет ваш проект после того как я его обработаю. Ага... уже, прям сразу. Люди не спешите платить деньги мошенникам.

А теперь давайте объективно рассмотрим ситуацию. Хотя бы один из сеошников знает алгоритмы по которым работает тот или иной робот или паук, я думаю что нет. Ну вот и как человек, который не знает как работает инструмент его заработка, может предлагать платные услуги? Видимо никак, но тем не менее, сейчас сплошь и рядом одни сеошники. Значит есть люди которые их вскармливают своими кровными.

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

Едем дальше. Семантика. Место которым сеошник будет отмахиваться от аргументов против него, но позвольте, заголовки, абзацы и пр. появились до того как родился самый первый поисковик. Т.е. это сделано было явно не для робота, робот же в свою очередь в силу своей не способности. Разбить текст на логические участки, нуждался в такой разметке. К чему я веду этот яростный монолог, да к тому что роботы поисковые сейчас "некисло", могут "въехать" в тематику и сущность вашего сайта. Понять куда ведут ссылки с ваших страниц и пр. моменты касаемые "всплытия" вашего сайта наверх. То есть чтобы сайт поднялся высоко его должны высоко оценить люди. Роботы в плане индексирования стали очень похожими на человека, а так же чего сами не "доварят" своими "котелками" то пытаются анализировать статистически. Ну вот и я в ту же степь: обсуждать как работают поисковики, а это по сути гадание на кофейной гуще.

Подвожу черту — делайте качественные, быстрые, наполненные интересным содержимым ресурсы и посетитель обязательно это оценит и вернется к вас с друзьями, а там и роботы за ними подтянутся. И не надо думать, что это вам не под силу. Под силу еще как!


P.S.: Прошу прощения за резкость в статье, я писал ее под впечатлении от не очень приятного диалога и отложил в черновики, теперь взявшись дописывать, хотел подкорректировать, но потом решил оставить. И вот дописал до точки, так сказать, и публикую...


вторник, 3 января 2012 г.

MySQL. Структура таблицы


SHOW DATABASES; - список баз данных
SHOW TABLES [FROM db_name]; - список таблиц в базе
SHOW COLUMNS FROM таблица [FROM db_name]; - список столбцов в таблице
SHOW CREATE TABLE table_name; - показать структуру таблицы в формате "CREATE TABLE"
SHOW INDEX FROM tbl_name; - список индексов
SHOW GRANTS FOR user [FROM db_name]; - привилегии для пользователя.


SHOW VARIABLES; - значения системных переменных
SHOW [FULL] PROCESSLIST; - статистика по mysqld процессам
SHOW STATUS; - общая статистика
SHOW TABLE STATUS [FROM db_name]; - статистика по всем таблицам в базе

Подсмотрел тут: www.opennet.ru