20 ноября 2009 г.

Яндекс под "Снежинском"

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

21 октября 2009 г.

Блоговар

Кажется, меня занесло в игру Blogowar.ru. Посмотрим, каково это.

24 сентября 2009 г.

Поднимаем VDS с нуля

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

Аренда настоящего сервера стоит дорого, и выходом становится аренда виртуального сервера, VDS (virtual dedicated server) или VPS (virtual private server). Часто спрашивают, в чем разница между VDS и VPS? Отвечаю: разницы нет, это одно и то же.

Сегодня я расскажу, как выбрать виртуальный сервер и ОС для него, а про установку всего и другие работы буду рассказывать постепенно.

Системы виртуализации.

Виртуализация - это когда на одном физическом компьютере возможно запустить две и более систем. Существует масса различных вариантов и решений, но мы будем говорить только о тех решениях и вариантах, которые используется как промышленные и которые встречаются в реальной жизни.
На самом деле реально столкнуться с тремя основным системами: Hyper-V, Xen и OpenVZ/Vitruozzo.
  • Hyper-V - технология, ранее называвшаяся Microsoft Windows Server Virtualization. Сама ставится на Windows Server, в качестве гостевых систем поддерживает все Винды, и, официально, SUSE Linux Enterprise Server. Остальные линуксы могут запускаться, но официальной поддержки нет.
Если Вам нужен именно сервер под управлением Windows, то это для вас. Для нас же, считающим, что винды не достойны управлять интернет-сервером, с Hyper-V не по пути. Если вам надо, погуглите и найдете.
  • OpenVZ и Virtuozzo - одно и то же по сути. Virtuozzo - коммерческий (и доволно дорогой) продукт, OpenVZ - фришный. Суть виртуализации - разделение ресурсов сервера при сохранении одного на всех ядра. Там есть определенная засада с распределением оперативной памяти. Из плючов - легкое изменение выделяемых ресурсов. Под управлением OpenVZ работает широко известный FirstVDS, например.
  • Xen является более передовой технологией. Во-первых, у каждого виртуального сервера свое ядро - а значит, вне зависимости от операционной системы главной машины, вы можете ставить любую систему в качестве гостевой. Во-вторых, поведение VDS на базе Xen очень схоже с поведением настоящего сервера. Мои симпатии целиком принадлежат именно Xen. Прекрасные VDS на базе Xen предлагает, например, OpenHosting.ru.

Следующим шагом будет выбор системы. Выбирать можно, как правило, из многих вариантов, среди которых FreeBDS и разнообразные Линкусы (Debian, Ubuntu, CentOS, Fedora, Gentoo и т.п.).

Рекомендация проста - какую систему знаете, такую и ставьте. Они все очень хорошие. Если никакую не знаете - ставьте Debian, если будете дальше читать меня, или другую систему, если будете читать где-то в другом месте.
На самом деле, большая ошибка новичка в том, что он считает, будто все линуксы разные. Я тоже когда-то так думал, но это заблуждение. У каждого дистрибутива есть свои специфические свойства, но в целом - Linux есть Linux, и будучи грамотно настроенным, будет служить верой и правдой.
В Debian мне нравится система установки ПО и некоторая паранойя со стороны создателей, в связи с чем в дистрибутивы стабильной системы помещаются только проверенные пакеты. Иногда нужна более новая версия пакета, чем есть в репозитории, но это как правило не проблема. В 99% случаев пакеты, присутствующие в репозитории, отвечают всем требованиям.

Отдельные слова про Gentoo Linux. В общем, я купился на ту нехитрую идею, что система, собранная на месте, должна работать быстрее. Может, я не специалист в Генту. Может, я как-то не так компилил. В общем, если у вас VDS с 128 мб оперативки и 200-300 мГц процессора - не надо ставить Генту, она будет два дня собираться, а ускорения работы вы все равно не заметите.

В следующей серии - про первоначальную настройку свеженького VDS.


22 сентября 2009 г.

Выбор хостинга и домена для своего блога.

У любого блоггера есть некоторый набор опций для ведения блога. Во-первых, выбор между stand-alone блогом - то есть отдельно расположенным сайтом, - и ведением блога на одной из блог-платформ, платной или бесплатной. Во втором случае, на блог-платформе, опять есть альтернатива, а именно использовать ли домен третьего уровня (типа %user%.livejournal.com или %user%.blogspot.com).
Вот об этом и поговорим.

Автономный блог - это солидно. Это широкие, практически неограниченные возможности, это собственный домен, это престиж. Заметьте, большинство владельцев автономных блогов являются специалистами по раскрутке - иначе говоря, seo-шниками. И правильно, ведь раскрученный блог становится не просто домашней страничкой владельца, но и его визитной карточкой, портфолио. Это совсем не значит, что автономных блогов других тематик не существует. Но тенденция налицо.
Однако, у автономного блога есть и недостатки. Блоггер должен разбираться в скриптах, которые он устанавливает и поддерживает, выбрать правильный хостинг, который не падает и не валяется, подобрать и установить нужные плагины, заниматься раскруткой, рекламой, монетизацией. Если какое-то звено проваливается, результат уже не тот, что ожидается. И вообще - ключевое слово результат.
Я затеялся с блогом в строгом соответствии с тем, что написал во вводном посте. У моего блога всегда будет как минимум один читатель - я сам, и если мне сегодняшнему удастся помочь себе завтрашнему, свою функцию этот блог выполнит. Но очень многие придерживаются другого подхода и желают иметь много читателей.
Я вообще-то тоже хочу, но как бы говорю о том, что мне это неважно чуть менее, чем полностью.
Так вот, несмотря на то, что я умею (и люблю, более того) возиться со скриптами, с хостингами, немного разбираюсь в раскрутке и прочем, я решил, что цель должна оправдывать средства. И вот - блог на базе Blogger'a. Почему не ЖЖ? Потому я больше доверяю Google, чем Sup'у, все просто.
И напоследок о домене. Говорят, ЖЖ позволяет подключить свой собственный домен к своему собственному акку. Однако blogger позволяет это сделать еще лучше.
Домен я зарегистрировал бесплатно. Как именно - я непременно напишу позже.
Последнее размышление о том, зачем вообще нужен домен. И чем, например, %username%.ru лучше, чем %usrname%.blogspot.com? По мне, свой собственный, уникальный домен символизирует. И кстати, по моим наблюдениям, дядя Яша гораздо больше любит %username%.ru, потому что %usrname%.blogspot.com он часто вообще игнорирует, редиска.
А вообще, насколько я понимаю, нет принципиальной разницы. Если вы интересно пишете, то вас будут читать.


21 сентября 2009 г.

Фантастический гол Аршавина в ворота Атлетико

Аршавин, пожалуй, все-таки заставит говорить о российском футболе.
Но почему он так не играет за сборную?

21 мая 2009 г.

Динамическое добавление строк в таблицу

Нужно мне было динамически вставлять строки в таблицу. Написал я такой код на Javascript:
var tr = document.createElement("tr");
var td_1 = document.createElement("td");
td_1.setAttribute("class", "td_class");
td_1.setAttribute("colspan","2");
td_1.innerHTML = "Содержание ячейки 1";
tr.appendChild(td_1);
var td_2 = document.createElement("td");
td_2.innerHTML = "Содержание ячейки 2";
tr.appendChild(td_2);
var parent_table = document.getElementById("parent_table");
parent_table.appendChild(tr);
Используется, естественно, DOM. HTML-код выглядит следующим образом (фрагмент):
<table id="parent_table">
</table>

Запускаем. В Мозилле, конечно, все ок. Но в Internet Explorer не работает. Ничего не происходит. Разбираемся.
Небольшое изыскание дало следующее направление. IE не поддерживает добавление строк к элементу "<table>", но позволяет добавлять строки в элементы типа "<thead>", "<tbody>" и т.п.
Перписываем HTML следующим образом:

<table>
<tbody id="parent_table">
</tbody>
</table>

Запускаем. Строки добавляются, CSS class не подцепляется, параметр "colspan" не учитывается.
Переделываем код следующим образом (изменения отображены красным цветом):

var tr = document.createElement("tr");
var td_1 = document.createElement("td");
td_1.className = "td_class";
td_1.setAttribute("colspan","2");
td_1.innerHTML = "Содержание ячейки 1";
tr.appendChild(td_1);
var td_2 = document.createElement("td");
td_2.innerHTML = "Содержание ячейки 2";
tr.appendChild(td_2);
var parent_table = document.getElementById("parent_table");
parent_table.appendChild(tr);

Теперь CSS-форматирование присутствует и в Мозилле, и в IE. Cледующим шагом заставим IE правильно обрабатывать параметр "colspan".
var tr = document.createElement("tr");
var td_1 = document.createElement("td");
td_1.className = "td_class";
td_1.colSpan=2;
td_1.innerHTML = "Содержание ячейки 1";
tr.appendChild(td_1);
var td_2 = document.createElement("td");
td_2.innerHTML = "Содержание ячейки 2";
tr.appendChild(td_2);
var parent_table = document.getElementById("parent_table");
parent_table.appendChild(tr);

Вот теперь все работает, как хотелось.
Буду рад услышать ваши комментарии.





Метки Technorati: ,

12 марта 2009 г.

Интегрируем SimplePie в CodeIgniter

SimplePie - это такая библиотека для чтения RSS и Atom всех версий. Только читает, не формирует. Подробнее на оффсайте библиотеки.
CodeIgniter - это такой фреймворк (что такое фреймворк?) для приложений на PHP. Подробнее - на оффсайте CodeIgniter, или на сайте CodeIgniter по-русски.

  1. Скачать дистрибутив SimplePie.
  2. Найти в дистрибутивие файл simplepie.inc. Переименовать его в Simplepie.php и поместить в директорию system/application/libraries/.
  3. Подключить в коде библиотеку обычным образом и использовать.

Ниже приведен пример функции контроллера, реализующей вывод всех постов из RSS.



class Posts extends Controller {
function list(id){
$feed_url = //... получение url RSS-фида по id
$this->load->library('simplepie');
$feed = new SimplePie();
$feed>set_feed_url($feed_url);

// получение данных постов и
// передача данных в отображение (view)
}
}




Наслаждаемся результатом.

4 марта 2009 г.

CodeIgniter - проблема с zend.ze1_compatibility_mode.

Разрабатывал я тут одну штуку на CodeIgniter. Сам фреймворк показался мне очень удобным, так что я планирую подробнее описать его подробнее.

На локальном Денвере все работало отлично. Однако после загрузки приложения на хостинг нарисовалась проблема: возникла ошибка Message: Undefined property: Search::$projects - на ровном, казалось бы, месте.

Проанализировав код, я пришел к выводу, что вызов:

$this->load->model('feeds');

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


class Feeds extends Controller {
function Controller(){
parent::Controller();
$this->load->model('feeds');
}
..
}



Однако это решение мне не понравилось. Во-первых, так быть не должно, потому что в документации на CodeIgniter совершенно недвусмысленно сказано, что "Your models will typically be loaded and called from within your controller functions." - то есть без указания на объявление в конструкторе.
Во-вторых же, эта мера все равно оказалась недостаточной. В проекте использовалась библиотека SimplePie, которая также отказалась работать, выдавая следующую ошибку: Fatal error: Trying to clone an uncloneable object of class.
В конечном итоге, ларчик открывался просто.
У PHP5 есть такая конфигурационная опция - zend.ze1_compatibility_mode. При включении этой опции объекты передаются по значению, а не по ссылке, - то есть так, как принято в Zend 1, он же движок PHP4. Соответственно, эта опция влияет на клонирование объектов.
Поскольку доступа к php.ini у меня не было, пришлось воспользоваться директивой:
php_flag zend.ze1_compatibility_mode off

в .htaccess. Все заработало сразц и именно так, как ожидалось.
Опция эта, к слову, выключена в установке php по умолчанию, и ни разу мне до этого не встречалась. На конкретном сервере она включена была по требованию предыдущего программиста, который использовал самописный фреймворк, реализованный, конечно, на 4 версии PHP, но с широким использованием недоделанной объектной модели четвертой версии.
Такие бывают аномалии.

11 января 2009 г.

Как бороться с ошибкой NCFTP "Could not read directory listing data: Connection reset by peer"

Всем прекрасно известно, что NCFTP - самый лучший FTP клиент для *nix-подобных систем. Тем, кому это было неизвестно ранее, теперь тоже в этом уверены. Не так ли? :)
Однако ошибка, вынесенная в заголовок, изрядно попортила мне нервов. Рекурсивная загрузка директорий, конечно, является самой актуальной фичей при переезде на другой сервер (VDS в моем случае). Для рекурсивной закачки используется следующий формат команды:

ncftp>get -R remote_directory

В моем случае команда не срабатывала (причем молча). Ошибка выдавалась при выходе из ncftp, то есть при подаче команды bye.
Чтобы избежать этой ошибки, надо добавить опцию -T (не пытаться использовать режим TAR для рекурсивного режима).

Установка NCFTP проста и понятна (для моих рабочих систем, Debian и FreeBSD, дистрибутивы имеются в репозитории и портах соответственно).