Заметки разработчика
Шпаргалки по найденным решениям и всякая всячина на компьютерную тему…
Паранойя об инклудах в php
Речь пойдет о том, как сделать php файл недоступным для посетителей сайта, но при этом доступным для того, чтобы подключать его (по средствам функции include и т.п.) к другим php файлам на сервере. В первую очередь я задался вопросом о том, каким образом можно внутри php файла (средствами php) узнать - вызван/исполняется ли файл непосредственно или через какой-то другой скрипт.
Подобных мыслей не возникает, когда в основные скрипты подключаются php файлы, являющиеся некими библиотеками, содержащими лишь какое-то количество реализаций функций/классов. Если посетитель сайта вызовет в браузере такой библиотечный файл, то ничего страшного не произойдет (хотя как по мне, то если уж закрывать, то все
).
Но если же вставляемый файл содержит в себе простой код (т.е. не заключенный в некую функцию или класс), то прямой вызов такого файла может нести в себе угрозу для безопасности всего сайта. Обычно я такие файлы использую, когда хочу разбить некий большой скрипт на несколько файлов поменьше, чтоб создать себе более комфортные условия для работы с кодом.
Вот маленький пример подобной организации файловой структуры некоего закрытого сайта (требующего авторизации).
Допустим, у нас есть один главный файл “index.php”, через который для посетителей происходит вся работа с сайтом путем передачи ему разных GET параметров. В нем в свою очередь анализируется, к примеру, параметр $_GET['page'] и в зависимости от того, какое слово в нем указано, в “index.php” подключается соответствующий файл (передали, к примеру, слово “inbox”, тогда через функцию include подключается файл “p_inbox.php”), в котором описаны дальнейшие инструкции. Еще в файле “index.php” реализован механизм авторизации (через сессии), то есть в нем каждый раз проверяется, имеет ли зашедший пользователь права для просмотра сайта.
Проблема, на мой взгляд, начинается тогда, когда понимаешь, что есть возможность того, что человек может вызвать напрямую файл “p_inbox.php”. Как минимум, такой скрипт может некорректно отработать и вывести какие-то ошибки, у него, к примеру, может не быть в распоряжении каких-то данных, которые заранее подготавливаются в файле “index.php” в расчете на то, что далее их подхватит “p_inbox.php”.
Так же появляется необходимость в самом начале файла “p_inbox.php” проверять данные сессии, чтобы не дать возможность сделать что-то с помощью этого скрипта неавторизованному пользователю (по сути, если такой проверки не будет, то это может быть серьезной дырой в безопасности). И такая проверка (в каждом подобном файле) может быть не единственной. Если хочется избежать какой-либо некорректной работы скрипта при его непосредственном вызове в браузере, то приходится добавлять так же проверки на существование тех самых подготовленных заранее данных в index.php и т.п.
Все это выглядит как-то печально… Происходит дублирование проверок и излишние вычисления, а в некоторых случаях даже дополнительные запросы в базу данных. Именно это сподвигло меня к тому, чтобы задуматься о том, как определять достаточно легко и универсально, вызывается ли файл “p_inbox.php” в “чистом” виде или же в контексте файла “index.php”. Ведь если найти такое решение, то можно избавиться от всего избыточного кода в каждом подключаемом файле. Так же это можно использовать чтобы “вставляемые” скрипты могли выдавать информацию по-разному (или в разных форматах), в зависимости от того, вызван файл самостоятельно или же в контексте какого-то другого файла.
Испытательный стенд
Предположим, что у нас есть два файла, лежащих в одном и том же каталоге, “index.php” и “addon.php”.
//Файл index.php
print '<p>This index.php</p>';
include('addon.php');
//Файл addon.php print '<p>This addon.php</p>';
Задача сделать так, чтобы при непосредственном вызове файла “addon.php” не выводилось надписи “This addon.php”, но при вызове файла “index.php” появлялись сразу две надписи: “This index.php” и “This addon.php” (вторая будет сигнализировать об успешной вставке файла “addon.php”).
Варианты решения проблемы
Варианты перечислены в порядке поступления мыслей, которые приходили в ходе решения задачи
Тот способ, к которому я в итоге пришел, описан самым последним (четвертый).
Первый
Самое первое, что мне пришло в голову, это давать какое-нибудь более сложное (секретное) имя подключаемому файлу, к примеру “40dfg_9n2xo_addon.php”. Но вариант можно сразу же браковать из-за того, что если человек имеет информацию о структуре каталогов и именах файлов сайта (что не так уж и сложно может быть в некоторых случаях), то такая “защита” сразу же с треском провалится.
Второй
В самом начале главного файла (”index.php”) можно создать переменную - “secret”, которая будет равна какой-то секретной строке.
$secret = '85mb_*4ce56Z-e';
После чего в начале файла “addon.php” проверять, существует ли такая переменная и равна ли она секретной фразе “85mb_*4ce56Z-e”. Саму фразу можно, конечно, разместить в каком-то одном файле типа “config.php”, подключая его во всех скриптах через функцию “require_once”, чтобы в последствии можно было легко изменять эту фразу, но в примере я хочу показать саму суть без примесей лишних отвлекающих маневров
В этом способе так же строится предположение, что исходный код и структуру сайта никто больше не увидит, что, так или иначе, является заблуждением. Если посторонний человек каким-то образом узнает эту секретную фразу и директива register_globals в php.ini будет установлена в “on”, он имеет возможность вызвать скрипт с соответствующим параметром (”addon.php?secret=85mb_*4ce56Z-e”) и получить добро на исполнение файла.
Да, чтобы избежать опасности, связанной с “register_globals”, достаточно в начале файла “addon.php” сделать проверку секретной фразы правильным способом. Не так:
If(!isset($secret) || $secret != '85mb_*4ce56Z-e') exit();
А так:
If(!isset($GLOBALS['secret']) || $GLOBALS['secret'] != '85mb_*4ce56Z-e') exit();
(обращаясь к переменной через $GLOBALS['secret'] php будет знать, что имеется ввиду именно переменная, определенная ранее в скрипте, а не та, что может быть передана через GET или POST запрос)
Но мне этот способ все равно не очень нравится, какой-то он уж слишком мудреный…
Третий
Идея в том, чтобы средствами самого сервера не разрешать доступ “извне” к файлам на подобие “addon.php”, но при этом оставить доступ для их внутреннего использования (для вставки в другие файлы). Можно все вставляемые файлы положить в одну директорию и закрыть к ней внешний доступ паролем (.htpasswd). Или вообще закрыть доступ к папке с помощью файла .htaccess, добавив, к примеру, в него строку “Deny from all”. Вполне возможно, что есть еще способы закрыть доступ извне к файлам или директориями средствами сервера.
Способ достаточно хороший и можно сказать “железный”. Только есть шанс, что, к примеру, при переезде сайта файлы .htaccess ненароком не перенесутся, и этого можно не заметить. А паранойя должна быть паранойной
поэтому вполне можно совмещать этот способ защиты файлов с их внутренней защитой, реализованной средствами php.
Четвертый
Этот тот способ, на котором я остановился и который в целом мне нравится
Идея в том, чтобы в файле “addon.php” узнавать имя файла, в котором содержится конкретный кусок кода (__FILE__), и имя файла, в котором выполняется текущий код ($_SERVER['PHP_SELF']), после чего можно сравнить оба эти значения. И если они отличаются, значит, “addon.php” выполняется внутри “index.php”, если значения одинаковы, значит, выполняется непосредственно “addon.php”.
Собственно, вот модифицированный код файла “addon.php”.
//Файл addon.php if($_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF'] == __FILE__) exit(); print '<p>This addon.php</p>';
Определение __FILE__ возвращает абсолютный путь к файлу, в котором оно вызвано. Используется для отображения информации о скрипте, если в нем произошла ошибка (при обработке исключений).
$_SERVER['PHP_SELF'] – хранит в себе полный путь относительно корня сайта к скрипту, который в данный момент исполняется (который запросил пользователь в своем браузере, если посмотреть значение переменной $_SERVER['PHP_SELF'] из подключаемого файла, будет все равно возращен путь к “главному” файлу).
$_SERVER['DOCUMENT_ROOT'] – возвращает абсолютный путь к корню сайта. Из-за того, что в __FILE__ абсолютный путь, а в $_SERVER['PHP_SELF'] полный путь именно от корня сайта, приходится PHP_SELF совмещать с DOCUMENT_ROOT, чтобы получился абсолютный путь, который уже можно сравнивать с тем путем, который возвращает __FILE__.
Если обнаруживается, что файл “addon.php” вызван без каких-либо посредников, скрипт просто останавливает свое исполнение. Хотя можно еще по-разному реагировать на такие попытки вторжения - генерировать ошибку 404, прикидываясь, что файла не существует, или перенаправлять посетителя на первую страницу сайта и т.д.
Внимание: под виндовым сервером проверка не будет срабатывать, в этом случае нужно у пути, который берется через PHP_SELF, заменять все слеши (”/”) на обратные слеши (”\”):
if($_SERVER['DOCUMENT_ROOT']. str_replace('/', '\', $_SERVER['PHP_SELF']) == __FILE__) exit();
Все, буквы кончились…
Было бы интересно услышать конструктивную критику или какие-то дополнения (может, есть какой-то еще более простой и эффективный способ?).
Copyright © 2008 Заметки разработчика
Эта rss лента только для персонального некоммерческого использования.
Грамотная работа в Word
Часто сталкиваюсь с тем, что люди не умеют корректно работать в программах типа MS Word и ей подобных. Хотя обычно большинство из них уверены, что все отлично делают.
Чаще всего это проблема всех новичков, недавно научившихся в той или иной мере пользоваться вордом (а иногда и у “старичков”
). Проблема появляется тогда, когда человек, создавая документ, не знает основной “философии” работы в подобных программах, набирает текст “абы как”, вставляя кучу пробелов где нужно и не нужно и т.п., стремясь к одному – “главное, чтобы выглядело как нужно”. Часто со временем это приводит к выработке каких-то своих “хитростей”, то есть, к изобретению достаточно некачественного велосипеда. С другой стороны, если документы создаются только чтобы их распечатать и забыть про них, а также имеют достаточно маленький размер, то такой подход вполне жизнеспособен. Но, думаю, применение правильного подхода все же может очень облегчить жизнь даже в таких случаях. Если же эти документы хранятся и предполагается их дальнейшее изменение вами или, тем более, другими людьми, то при “самобытном” способе их изготовления может начаться настоящий хаос.
Все дальнейшие рекомендации можно и нужно применять не только в MS Word, но и во всех других программах подобного плана (OpenOffice.org Writer, AbiWord, Google Docs, StarOffice и прочие, разве что к программе “Блокнот” далеко не все применимо
), и даже в более серьезных программах, предназначенных для профессиональной верстки текстов. Также предполагается, что человек все же имеет какой-никакой опыт работы в используемой им программе.
Итак, самое главное, забудьте вначале о внешнем виде документа, “зримое не важно”
Нужно выработать привычку набирать сначала “чистый” текст, а уже потом его украшать. В этой статье я хочу описать принципы правильного создания чистого текста и его структуры, в следующей - способы “украшения” такого текста и несколько полезных “в быту” приемов.
Итак начну…
Пробелы
В первую очередь – никогда не используйте в тексте больше одного пробела. В частности, это относится к пробелам перед каждым абзацем для того, чтобы сделать красную строку или отступ перед текстом. Иногда с помощью пробелов выравнивают текст по центру или по правому краю, что является “большим грехом”
Также не очень хороши “случайные” вставки двух/трех пробелов между словами вместо одного.
Почему так делать плохо? Аргументировать могу только тем, что с такими документами в дальнейшем ужасно неудобно работать и модифицировать их. Представьте себе, к примеру, “картину”: вы сделали большой документ (для сгущения красок можно представить, что это какая-то книга) и все красные строки сделали с помощью пробелов, но вдруг неожиданно вам по каким-либо причинам нужно увеличить/уменьшить все отступы красной строки… Первый вариант, это сидеть и руками добавлять или удалять в каждой красной строке нужное количество пробелов. Второй вариант более продвинут, но все равно “не здравый” – использовать поиск и замену по всему документу, “сказав” программе “замени все подряд идущие 4 пробела на 8 подряд идущих пробелов” (можно еще усугубить условие авто-замены, чтобы не заменилось что-то лишнее), но это именно тот случай, когда изобретается “неудобный велосипед”.
Справедливости ради стоит отметить, что бывают ситуации, где легче в каком-то участке текста использовать более одного подряд идущего пробела, но это лишь исключения из правил, которые если и случаются, то очень-очень редко.
Грамотность набора (знаки препинания + пробелы)
Аспект, который касается любого набора текстов, где бы то ни было. Это правильность набора текста в плане уместного использования пробелов между знаками препинания. С этим вообще у многих проблемы, хотя правил набора текста достаточно мало и нужно лишь захотеть, чтобы начать их успешно применять.
Целостность абзацев
Вообще нужно как-то наказать того человека, который придумал объяснять назначение кнопки Enter как: “Это кнопка для того, чтобы текст перенести на следующую строку”
На самом же деле кнопка Enter нужна только для того, чтобы сделать новый абзац, и никак иначе. Еще с помощью нее можно делать “пустые абзацы” для увеличения расстояния между абзацами.
Те, кто сильно проникся вариантом “чтобы текст перенести на следующую строку” жмут Enter в конце каждой строки, создавая таким образом искусственный перенос текста на новую строку внутри воображаемого абзаца (воображаемого потому, что по факту это будет не один абзац, а много маленьких абзацев).
На самом же деле любой редактор переносит текст автоматически, и об этом пользователю не нужно беспокоиться. Когда вы нажимаете клавишу Enter, редактор понимает, что весь написанный блок является самостоятельными абзацем. Такой подход приносит массу удобств для последующего оформления/форматирования текста. Нажатие же Enter`а в конце каждой строки приносит лишь массу “головной боли” и ни грамма плюсов.
К примеру, попробуйте изменить формат листа для документа, у которого каждая строка перенесена с помощью Enter`а на новую строку, и вы увидите, как текст документа “скукожится” (если уменьшить размер листа) или же не будет заполнять лист во всю ширину (если увеличить лист). Правильно же набранный текст (в смысле абзацев) в какой формат листа не помести - он везде будет хорошо выглядеть, так как он будет постоянно заполнять лист во всю ширину (как вода в сосуде
).
Пример плохого и хорошего абзаца
Для наглядности приведу пример. Синими точками обозначены пробелы, символ ¶ обозначает нажатие кнопки Enter (символ конца абзаца).
Неправильный “абзац”

Пробелами сделана красная строка, нажатие Enter`а в конце каждой строки, да еще и искусственное создание выравнивания текста по ширине с помощью пробелов
Правильный абзац

Чистота и порядок, прямо идиллия
Текст с “новой страницы”
Если вам нужно, чтобы какая-то часть документа начиналась обязательно с новой страницы, не используйте кучу Enter`ов (пустых абзацев). Так как если вы вдруг решите что-то изменить выше по тексту, весь текст ниже может “поплыть” и нужно будет заново просматривать документ для расстановки нужных кусков текста с начала новых страниц.
Часто в программах есть возможность вставить “Разрыв страницы”. В MS Word для этого нужно нажать комбинацию клавиш Ctrl+Enter, курсор перескочит на новую страницу, и если на месте курсора расположить нужные текст, он всегда будет начинаться с начала новой страницы, какие бы не происходили сдвиги текста вверху. Разрыв страницы является неким “скачком”, к примеру, из середины листа в начало следующего листа.
Заголовки и логическая структура документа
Очень часто, когда хотят сделать заголовок (всего документа и подзаголовки), просто пишут нужные текст, изменяют его размер на больший по сравнению с остальным текстом, добавляют ему жирности и т.п. И это не правильно…
Во всех программах, про которые эта статья, есть понятие заголовков, т.е. подразумевается, что вы можете выделить нужный абзац и указать, что этот абзац является заголовком, и больше ничего делать не нужно. Причем, указывать заголовки нужно с учетом их иерархии, поэтому вы можете указать не только факт заголовка как такового, но и еще какого именно он уровня: “Заголовок 1 уровня”, “Заголовок 2 уровня”, “Заголовок 3 уровня” и т.д.
Пока не обращайте внимания на то, что такие заголовки могут выглядеть не так, как бы вам хотелось. Главная идея в том, чтобы программа могла “опознавать” логическую структуру документа, где располагается обычный текст, а где заголовки, и кто чей “ребенок”.
Эта возможность очень полезна. Так, к примеру, в некоторых программах потом можно автоматически сгенерировать красивое оглавление документа с названиями глав и адекватными номерами страниц этих глав, не затратив для этого никаких усилий.
Часто в программе присутствует удобный способ навигации по структуре документа (которую можно использовать, только если в документе правильно размечены заголовки). Эта функция просто мега полезна при частой работе с большими документами (книги, сценарии и т.п.).
Так же немаловажна возможность изменять в дальнейшем внешний вид этих заголовков в несколько кликов и лишиться “удовольствия” делать это вручную для каждого из них.
“Скелет” готов
В следующей статье я расскажу, как можно оформлять такой чистый текст на примере различных программ.
Copyright © 2008 Заметки разработчика
Эта rss лента только для персонального некоммерческого использования.
Отсылка e-mail через C#
Этот кусок кода показывает, как можно программно отослать электронное письмо средствами C#. Письмо отсылается через указанный SMTP-сервер, который требует авторизацию. Так же к письму можно прикрепить одно или несколько вложений.
//Адрес SMTP-сервера
String smtpHost = "SMTP.SERVER.RU";
//Порт SMTP-сервера
int smtpPort = 25;
//Логин
String smtpUserName = "LOGIN";
//Пароль
String smtpUserPass = "PASSWORD";
//Создание подключения
SmtpClient client = new SmtpClient(smtpHost, smtpPort);
client.Credentials = new NetworkCredential(smtpUserName, smtpUserPass);
//Адрес для поля "От"
String msgFrom = "LOGIN@SERVER.RU";
//Адрес для поля "Кому" (адрес получателя)
String msgTo = "KUDA@TO.RU";
//Тема письма
String msgSubject = "Письмо от C#";
//Текст письма
String msgBody = "Привет!\r\n\r\nЭто тестовое письмо\r\n\r\n--\r\nС уважением, C# :-)";
//Вложение для письма
//Если нужно больше вложений, для каждого вложения создаем свой объект Attachment с нужным путем к файлу
Attachment attachData = new Attachment("D:\\Тестовое вложение.zip");
//Создание сообщения
MailMessage message = new MailMessage(msgFrom, msgTo, msgSubject, msgBody);
//Крепим к сообщению подготовленное заранее вложение
message.Attachments.Add(attachData);
try
{
//Отсылаем сообщение
client.Send(message);
}
catch (SmtpException ex)
{
//В случае ошибки при отсылке сообщения можем увидеть, в чем проблема
Console.WriteLine(ex.InnerException.Message.ToString());
}
Тело письма и его заголовок будут созданы и отосланы в кодировке - UTF-8. Если же захочется отослать письмо в кодировке windows-1251, то начинаются проблемы. Мне удалось найти только одно достаточно подробное описание этой проблемы. И в более свежих версиях фреймворка (помимо .Net Framework 2.0) точно такая же проблема.
Да, отчасти помогает прописывание вручную заголовка, говорящего о кодировке всего письма, но с другой стороны, не так уж все радужно. Итак, перед кодом отсылки сообщения (после 29-ой строки) добавляем следующий код:
message.SubjectEncoding = Encoding.Default; message.BodyEncoding = Encoding.Default; message.Headers["Content-type"] = "text/plain; charset=windows-1251";
В итоге мы имеем письмо, у которого два раза (второй раз вставляется автоматом) повторяется заголовок Content-type, в первом указана кодировка windows-1251, а во втором настырный .Net вставляет UTF-8. Не думаю, что такое дублирование заголовков можно назвать корректным. Но это, похоже, единственный способ добиться какой-то адекватности отображения тела письма в почтовой программе, которая получит его.
Для просмотра писем я использую Mozilla Thunderbird. В нем тело письма отображается нормально, но при этом он не понимает кодировки заголовка письма и отображает его некорректно. Если оставить заголовок в кодировке UTF-8, а тело письма создавать в windows-1251:
message.BodyEncoding = Encoding.Default; message.Headers["Content-type"] = "text/plain; charset=windows-1251";
Тогда Thunderbird правильно отображает письмо. Но все эти ухищрения достаточно сомнительны из-за того, что каждый почтовый клиент может по-своему трактовать двойной и противоречивый заголовок Content-type. Так, к примеру, если посмотреть на такое письмо через вэбовский клиент mail.ru, то при любых раскладах тело письма отображается коряво. Тема же отображается правильно, только если отсылать ее в UTF-8.
Глядя на эту печальную картину, в голову приходит только два варианта решения проблемы. Плюнуть и отсылать письма в UTF-8 или же самостоятельно подключаться к SMTP-серверу и “вручную общаться” с ним по протоколу SMTP, а не использовать готовую реализацию в виде класса SmtpClient.
Copyright © 2008 Заметки разработчика
Эта rss лента только для персонального некоммерческого использования.
Правильный редактор для PHP
Иногда очень сильно не хватает какого-то хорошего редактора для PHP именно с точки зрения комфортной работы с кодом, что-то посерьезней, чем простая подсветка синтаксиса. При этом обычных редакторов пруд пруди, в которых, к сожалению, та же подсветка синтаксиса далеко не всегда корректно работает.
Хочется иметь нормальную реализацию IntelliSense, а не “деревянную” пародию на него в виде заранее определенного списка методов и констант языка, “вываливающегося” во время работы по поводу и без повода в виде полного списка. IntelliSense обязательно должен “знать” о всех используемыми вами классах, о их методах и переменных, то есть подключил через #include файл с определением своего класса, и редактор сразу же его подхватывает, подсказывая информацию о всех “внутренностях” объектов этого класса.
Не помешали бы так же подсказки во время набора названия функции в виде краткого описания функции (принимаемые параметры, есть ли перегруженные функции и т.п.). Особенно этого не хватает для самописных функций, в некоторых типичных редакторах я видел такие подсказки, но только для родных функций PHP. Ах да, еще очень удобно быстро переходить к определению функции из места ее вызова. Вообще, много чего еще хочется, причем все эти возможности считаю лишь толикой самых необходимых вещей в процессе кодинга и никак не излишеством…

Можно сказать, что в этом смысле моим идеалом является связка MS Visual Studio + Visual Assist, которую я использую при работе с C# и C++ (Visual Assist в этой связке просто как спасательный круг). Когда лишний раз не лезешь в другие файлы, чтобы посмотреть принимаемые параметры функции или названия тех или иных членов класса, это в любом случае способствует производительности и “приятности” процесса. Отсутствие среди своего инструментария такого редактора очень удручает, учитывая все большую (от версии к версии) объектно-ориентированность PHP.
И вот оно!
Все же нашел для себя достаточно неплохой редактор - Komodo Edit. Если вы, как я, пользовались обычными редакторами, заменяющими стандартный “блокнот” и тоже жаждали человеческого IntelliSense, советую обязательно попробовать его. Он ко всему еще и бесплатный (о платной версии ниже) и работает на базе мозиловского фреймворка (XPFE), что делает его так же мультиплатформенным.
Этот редактор не идеал, в нем много хорошего, при этом, конечно же, ему есть куда еще развиваться. Но, в целом, в первые дни знакомства с ним у меня не было предела радости
Стоит так же отметить поддержку и других языков (Perl, Python, Ruby, Tcl), а так же JavaScript, CSS, HTML, XML и много другого (судя по списку файлов, которые он может открыть, он знает еще много языков и технологий, но не уверен насчет работы IntelliSense для них всех). Приятно удивила поддержка многих популярных фрейворков для JavaScript (для моего знакомства с jQuery это было кстати).
Я наверняка еще не успел изучить весь функционал Komodo Edit, но некоторые моменты хотел бы описать.
Первым делом я настроил под себя цветовую схему подсветки кода для PHP (Edit -> Preferences… -> Fonts and Colors), так как привык уже к цветам из Notepad++.
Так же полезным дополнением оказался плагин, который находит все TODO в открытом проекте или файле и выводит их в один список (на подобие того, как это реализовано в VS). И плагин, позволяющий видеть в виде одного списка все классы и методы, определенные в открытом файле (Source Tree) для быстрой навигации по ним.
Вообще перед использованием Komodo имеет смысл изучить его настройки, изменив те или иные параметры под себя. Я, к примеру, еще переопределил горячую клавишу для перехода к определению функций (сделал F12, как в Visual Studio
).
В целом все работает достаточно хорошо, “земля и небо” по сравнению с кодингом в обычном редакторе.
Немного неудобно, что для полноценной поддержки IntelliSense обязательно нужно создавать файл проекта (его нужно просто сохранить в корневой каталог сайта). То есть если открыть один файл вне рамок проекта Komodo, все инклуды, прописанные в нем, не будут обрабатываться как-либо, и, соответственно, Komodo не будет ничего знать о функциях и классах, определенных в подключаемых файлах. Но, в целом, это маленькое неудобство пережить можно
С другой стороны, создание файла проекта дает возможность выполнить более тонкие настройки проекта, которые сохраняются и при каждом открытии проекта, Komodo будет помнить о них. Через него, к примеру, можно указать дополнительные директории для того, чтобы Komodo при работе с вашим проектом все время имел ввиду структуру классов и методов (для IntelliSense и различных подсказок), реализованных в файлах, которые лежат в подключаемой директории, даже если эти файлы ни как фактически не подключены (через include или require) к редактируемому файлу. Еще можно производить поиск или замену текста во всех файлах проекта. Так же, Komodo запоминает сделанные вами закладки внутри кода (Ctrl+F2) для каждого файла, это очень удобно.
Немного неприятно удивило, что Komodo Edit ничего не знает о встроенных в PHP классах (может, я делаю что-то не так?). К примеру, если нужно использовать класс mysqli:
$mysqli = new mysqli(HOST, USER, PASS, MBASE);
if (mysqli_connect_errno()) {
print "Connect failed: ".mysqli_connect_error();
exit();
}
$mysqli->query('INSERT.......');
$mysqli->close();
Когда после написания слова “$mysqli” я начинаю обращаться к методам этого объекта (пишу знак “->”), Komodo Edit не хочет подсказывать ничего о методах query, close и т.д., а в строке состояния ругается, что, мол, в глаза не видел определения этого класса… При этом со встроенными в PHP функциями проблем нет, к примеру, о семействе функций mysqli_* (оберткой над которыми и является класс mysqli) Komodo прекрасно знает. Но, надеюсь, эту недоработку когда-нибудь поправят. Если же вы, к примеру, работаете с базой через свой класс - обертку (или через что-то вроде PEAR), то проблем с IntelliSense не должно возникать.
Один раз у меня случилось так, что при редактировании js файла Komodo не понял, какой Java Script фреймворк я использую. Но это, к счастью, всегда можно поправить в его настройках (Edit -> Preferences… -> Code Intelligence).
Существует платная версия Komodo, называемая Komodo IDE. Как я понял, основное отличие от Komodo Edit в функциях, свойственных многим IDE. Комодо IDE имеет встроенные инструменты для работы с системой управления версиями (SVN) и отладчик кода.
Кстати, в Komodo Edit все же есть примитивный отладчик, который на ходу уведомляет о таких мелких ошибках, как забытая точка с запятой в конце строки, незакрытая скобка и т.п. Такие ошибки он подчеркивает красной волнистой линией. Для того, чтобы такая отладка работала, нужно в настройках программы указать путь к исполняемому файлу PHP и php.ini (Edit -> Preferences… -> Languages -> PHP).
Как видно, подобные настройки можно проделать и для всех остальных языков.
Послесловие
Komodo Edit теперь мой повседневный инструмент
Плюс, для коротких правок каких-то мелочей в эпизодических случаях я продолжаю использовать аналог продвинутого блокнота - Notepad++, то есть использую его по своему настоящему назначению.
До Komodo Edit я еще пробовал интересный плагин к Visual Studio, который называется VS.Php. Он встраивается в Visual Studio и позволяет работать с PHP так же, как, к примеру, с C# (можно отлаживать код, работает IntelliSense и т.п.). Но как-то он не особо впечатлил, особенно на фоне своей платности. К тому же, как я понял, работая в нем можно полностью забыть про поддержку Java Script и т.п. Интересно еще то, что в нем точно так же, как в Komodo, не работает IntelliSense для классов, встроенных в PHP. Так же этот VS.Php конфликтует с Visual Assist.
Есть еще два подобных редактора, о которых я слышал, но как-то не случилось их попробовать (дальше лишь ИМХО и догадки на основе “слухов”):
- Zend Studio – платный, по отзывам сложилось впечатление, что это нечто громоздкое и применимо в первую очередь ну в очень больших и сложных проектах, особенно он уместен, возможно, если проект создается на основе Zend Framework.
- Eclipse – бесплатный, но отпугнул, скорее всего, своей “накрученностью”. Как я понял, его еще нужно уметь собрать под себя из различных модулей. В общем, как-то не возникло желания разбираться с тем, как его установить и настроить (но в свое время я все же пытался немного
), хотя, несомненно, кому-то он может очень нравиться.
***
Если кто-то посоветует какие-нибудь еще редакторы с оглядкой на мои “придирчивые” вкусы, буду очень благодарен. Так же было бы интересно услышать о каких-то дополнительных интересных особенностях Komodo от тех, кто им уже пользуется.
В общем, долой примитивную подсветку кода с вагоном ненужных функций! Это “наболевший” камень в огород постоянно появляющихся простых редакторов кода, выставляющих на передний план среди своих “достоинств” встроенный проводник по файловой системе или что-то вроде мини редактора/вьювера базы данных (ну зачем это нужно, если нет самых важных вещей именно для того, для чего изначально предполагается использовать редактор кода) и т.п. и т.д.. Почему-то почти каждый начинающий (хотя, может, не всегда начинающий) программист хочет “быстренько” сделать свой “мега” редактор, который часто вырождается в “опять что-то до боли знакомое”… очевидно, это традиция из серии “Hellow World!” ![]()
Copyright © 2008 Заметки разработчика
Эта rss лента только для персонального некоммерческого использования.
Борьба со спамом в форумах phpBB2
Недавно на своем форуме изменил тактику борьбы со спамом (по сути, просто поставил другой мод
), что принесло свои плоды.
Раньше для борьбы со спамерскими роботами был установлен мод расширенной графической капчи – Advanced Visual Confirmation и одна из первых версия мода Stop Advertisement Bots (уже есть более свежая версия).
Stop Advertisement Bots скрывает от глаз посетителей поле для ввода сайта и при этом определяет, что регистрационную форму заполнил робот, если заполнено это скрытое поле.
Еще установлен прекрасный мод, который автоматически удаляет пользователей (и их сообщения), которые использовали более чем 1 ссылку в тексте своего поста (Detector Bots) (макс. допустимое количество ссылок в одном сообщении можно настраивать).
И еще один небольшой мод (в некоторых ситуациях просто незаменим…) - URL Censor Hack. Он заставляет работать более корректно встроенный в phpBB2 автоцензор. Без него автоцензор не хочет заменять указанные фразы (например, вы хотите заменить vasa.ru на слово “цензура”), которые находятся непосредственно в адресе ссылок (при этом в области обычного текста стандартный автоцензор работает нормально).
С этим же модом все прекрасно работает. Он помогает бороться с редкими случаями навязчивых спамеров, рекламирующих один и тот же сайт (в моем случае в сообщение вставляли постоянно одну и ту же порно картинку…), которые при этом регистрируются вручную, используя разные e-mail`ы и ip адреса (т.е. нельзя предотвратить их повторную регистрацию). Потом такие сообщения все равно нужно удалять вручную, но, по крайней мере, таким образом можно сделать, чтобы пользователи не имели “удовольствия” лицезреть всякие пакости в виде картинки или ссылки (которые могут вести на вредоносные сайты с левыми скриптами или же с каким-нибудь “разводом”).
Так же все форумы закрыты от незарегистрированных пользователей (т.е. гости могут только читать, но не писать сообщения), а при регистрации человек должен подтвердить право на владение e-mail`ом, который он указал.
Это решение, в общем-то, помогало, но со временем все возвращалось на круги своя…
Как было…
У меня получалась следующая картина (каждые сутки примерно одно и то же).
Detector Bots
Обрезал около 40 спамерских сообщений, содержащих в себе много ссылок, то есть каким-то образом боты все же обходили изощренную капчу. Сложно сказать, обходили ли ее боты или же ее распознавали люди.
Stop Advertisement Bots
Отсекал около 10 спамеров, так как уже далеко не все боты при регистрации указывают адрес сайта в соответствующем скрытом поле (зато часто лепят свой сайт во все остальные поля…).
Advanced Visual Confirmation
Трудно сказать, скольких именно спамеров в сутки этот мод отсекал, так как никакой статистики он не ведет, но то, что его обходили многие боты, это точно. Варианты искажений символов тоже менял – ничего не изменилось.
Также регулярно накапливались не активированные пользователи/боты, которые, очевидно, указывали “левые” e-mail`ы при регистрации (примерно 10 пользователей в сутки, то есть они проходили капчу и скрытое поле для сайта).
Для постоянных зачисток таких “призрачных” пользователей очень хорошо помогает мод Prune Users (с помощью него удобно также удалять пользователей, которые, к примеру, за пол года не написали ни одного сообщения).
В итоге, около 5 сообщений в сутки проходили все барьеры, и их приходилось убивать вручную.
Как стало…
Убрал из прежнего “арсенала” моды Advanced Visual Confirmation и Stop Advertisement Bots. Вместо них поставил Anti Bot Question Hack (ABQ). Его суть в том, что он задает регистрирующемуся посетителю вопрос, на который нужно правильно ответить (на манер “отгадаешь три загадки - пропущу”
). Вопрос может быть как в текстовом виде, так и в графическом (к примеру, “что за предмет изображен на рисунке?”). Я пока ограничился лишь текстовыми вопросами.
Процесс регистрации стал более дружественен к пользователю (что нельзя было сказать при использовании графической капчи, так как не каждый и не всегда с первого раза угадает, какие символы изображены на искаженном рисунке), и, что больше всего радует, теперь ботам хода нет.
В данный момент у меня за неделю зарегистрировалось только 4 пользователя (настоящих!). И в некоторые дни было не более двух зарегистрировавшихся спамеров (очевидно, ручками
на вопросы отвечали), которые сразу же автоматически обрезались с помощью Detector Bots, так как после регистрации они создавали темы с кучей рекламных ссылок. В общем, прогресс, мягко говоря, очень ощутим. Конечно, что-то будет проскакивать, но все легче, чем было…
Обычно многие сетуют на то, что такой вид защиты тоже легко обойти (поэтому, очевидно, я раньше не ставил этот мод
), и, если многие форумы начнут использовать его, то спамеры придумают способы, чтобы обходить эту защиту. Но я все же думаю, что метод вопросов более гибок (чем графические капчи со случайными символами), и реализовать универсальный способ обхода не так просто. Каждый владелец форума сможет придумывать свои уникальные вопросы, еще и добавлять к вопросам картинки (ну не сможет бот ответить на вопрос “что изображено на картинке”, если имя файла картинки никак не будет указывать на это).
Но если и эта защита будет легко обходиться ботами, найдутся новые/другие способы борьбы
Я вот думаю об варианте ужесточения защиты, запретив размещать новичкам даже 1 ссылку (изменив настройки мода Detector Bots)…
Но не на всяком форуме это уместно.
Еще мне понравилась побочная возможность “фильтровать” таким образом людей, которые “не в теме” форума (в моей ситуации, думаю, большинство таких людей – спамеры, только регистрирующиеся вручную). Достаточно придумать вопросы, на которые ответит не каждый прохожий, но которые являются элементарными для тех, кто интересуется темой форума. Конечно, такой подход применим далеко не на всех форумах в виду того, что не все форумы тематические.
Технический нюанс
Автор топика, посвященного моду ABQ, советует ставить версию 1.0.3, как я понял, из-за того, что она не нагружена лишними функциями и при этом хорошо справляется со своей задачей. Я поставил именно ее, но теперь сомневаюсь в правильности выбора
Меня жутко напрягает то, что в этой версии нет блокировки пользователя после трех неверных ответов (как это происходит при использовании графической капчи). В третьей же версии этого мода, судя по исходникам, есть такая блокировка… В общем, буду пытаться прикрутить эту функцию к версии 1.0.3. В случае неудачи придется ставить третью версию
Собственно, сами принципы этих модов, ведущих к минимальным усилиям в борьбе со спамом, можно применять в любых других движках форумов (для которых наверняка уже есть аналоги этих модов), блогов и т.п.
PS. Так же пользуясь случаем хочу поздравить всех с Днем Победы в Великой Отечественной Войне!
Copyright © 2008 Заметки разработчика
Эта rss лента только для персонального некоммерческого использования.
jQuery. Мое первое знакомство с “волшебной палочкой” для JavaScript
На днях познакомился с очень хорошим фреймворком для JavaScript с названием jQuery. Дня три не мог нарадоваться
И захотелось поделиться этим.
До этого использовал чистый JavaScript, а для задач, требующих использования AJAX, использовал библиотеку JsHttpRequest от dkLab.
“Я почему раньше такой злой был - потому что у меня велосипеда не было!” (с) Почтальон Печкин
В целом до знакомства с jQuery я достаточно негативно воспринимал работу с JavaScript, душа у меня к нему явно не лежит. Причем использую в JavaScript обычно самый необходимый функционал, например, оперирование объектами из DOM, на уровне скрыть/показать, или же для валидации данных форм на стороне клиента.
Так как информация о фреймворках для JavaScript постоянно мелькает перед глазами на различных блогах, мне стало интересно разобраться с одним из них. Выбор стоял перед jQuery или Prototype (возможно, из-за того, что они одни из самых популярных). Посмотрев отзывы в различных источниках, выбрал для изучения jQuery и, как оказалось, не прогадал.
Как я понял, основная фишка jQuery (по крайней мере, на первый взгляд) в том, что он позволяет очень удобно и изящно получать доступ к тем или иным элементам объектной модели документа (то, что мне нужно пока в первую очередь). В Prototype этот момент менее изящный (хотя всяко лучше чем в голом JavaScript
), но, как это всегда бывает, есть в нем и свои плюсы.
То есть, нельзя сказать, что jQuery - лучший из лучших, просто для моих текущих задач он подходит как нельзя лучше. И я достаточно четко понимаю, что в будущем, возможно, будет смысл использовать Prototype или что-то еще (или вообще ничего, ведь все от ситуации зависит…).
В целом, использование JavaScript фреймворков на подобие jQuery дает возможность достаточно легко делать на странице практически все, на что хватит фантазии, фактически можно делать целые online приложения, которые по функциональности будут очень похожи на обычные программы. Что, конечно же, можно сделать и без фреймворков, но с гораздо большими трудозатратами.
Собственно, для изучения jQuery (или достаточно хорошего ознакомления) хватило двух хороших статей, ссылками на которые и хотел поделиться с теми, кто, возможно, так же собирается разбираться с jQuery:
- Очень подробная и качественная статья на RSDN, в конце которой так же можно найти полезные ссылки.
- Менее подробная, но зато хорошо иллюстрированная примерами (с уклоном на использование визуальных эффектов в jQuery) статья Шевчука Антона “jQuery для начинающих” (рекомендую читать после статьи на RSDN).
Так же пришелся очень кстати файл справки в формате CHM для jQuery.
Не знаю, хорошо это или плохо, но часто меня одолевает “лень” тратить свое время на то, на что его можно не тратить. Наверное, именно поэтому для меня jQuery - действительно полезное открытие ![]()
Copyright © 2008 Заметки разработчика
Эта rss лента только для персонального некоммерческого использования.
MySql и русская кодировка
Проблема возникает, если вы работаете с кодировкой, отличной от UTF-8, и храните в базе данных тексты, к примеру, в кодировке cp1251. Но MySql не всегда использует по умолчанию кодировку cp1251, в частности, не всегда по умолчанию используется эта кодировка для соединений с базой. Из-за этого возникают ситуации, когда в базе тексты хранятся в нормальном читабельном виде, но при выводе этих данных на сайт появляются одни лишь “кракозяблы” (знаки вопросов вместо букв – “?????????? ????”).
Для борьбы с этим явлением нужно использовать следующий ряд запросов, которые должны выполняться после каждого коннекта к базе:
mysql_query("SET NAMES 'cp1251'");
mysql_query("SET CHARACTER SET 'cp1251'");
Обновлено: Количество запросов уменьшено благодаря прояснению ситуации Бирц`ом (см. комментарии).
Это обычно помогает. Единственное неудобство, что каждый раз будут выполняться эти избыточные, по сути, запросы (как не крути, а это дополнительные нагрузки на сервер, хотя предполагаю, что достаточно мизерные). Еще бывают ситуации, когда нет возможности прописать эти строки после каждого коннекта, если вы, к примеру, используете какую-то программу, работающую напрямую с базой данных и не имеющую соответствующих настроек в себе.
На серверах, которые предоставляют услуги хостинга для русскоязычных сайтов, чаще всего все в порядке и такой проблемы нет (т.к. у них по умолчанию MySql настроен на работу в первую очередь с кодировкой cp1251). Если ваш сайт использует иностранный хостинг, то, скорее всего, единственным способом решения проблемы будет способ, описанный выше.
Но если же вы имеете возможность подкорректировать конфиг MySql на сервере, тогда есть еще одно решение, реализацию которого я с радостью для себя обнаружил (я-то “догадывался”, что можно как-то изменить настройки самого MySql, но как это сделать, не знал)
MySQL и русская кодировка WINDOWS-1251
Сегодня мы рассмотрим, что нужно написать в конфигурационном файле /etc/my.cnf для того, чтобы настроить mysql стандартной сборки на работу с кодировкой cp1251 по умолчанию без всякой перекомпиляции.
Рассмотрим пример конфига на основе MySQL 5.x.
В раздел [mysqld] необходимо добавить следующее:
default-character-set=cp1251
character-set-server=cp1251
collation-server=cp1251_general_ci
init-connect=”SET NAMES cp1251″
skip-character-set-client-handshakeДве последние строки принудительно устанавливают кодировку cp1251 для всех запросов.
В раздел [mysqldump] достаточно добавить только
default-character-set=cp1251
Этого достаточно, чтобы MySQL работал с windows-1251 кодировкой по умолчанию.
(с) dodik.ru
Теперь я могу использовать свой локальный сервер на XAMPP (ну не нравится мне Денвер…) более комфортно
Также это прекрасно сработало на “самодельном” сервере под SUSE.
Copyright © 2008 Заметки разработчика
Эта rss лента только для персонального некоммерческого использования.
Обтекание текстом в Photoshop
Меня одно время мучил вопрос, как сделать обтекание текстом (text wrapping) какого-либо объекта в Photoshop,так как при разработке эскизов дизайна для сайтов этой возможности ой как не хватало. Потом решение нашлось (с помощью метода “проб и ошибок”
), несмотря на то, что достаточно часто на некоторых форумах упоминается, что это просто невозможно сделать.
Вам будут необходимы навыки работы с кривыми (Patchs/контуры), если вы вдруг их не имеете, можете посмотреть неплохой урок на эту тему.
В общем, рецепт прост.
С помощью инструмента Pen Tool (
) или других инструментов нужно нарисовать Patch (контур) требуемой формы (в нашем случае это будет прямоугольник с “дыркой” для картинки). Затем делаем текущим инструментом ввод текста. Наводим курсор на готовый контур (Patch), курсор должен принять бочкообразную форму (
). Когда форма курсора приняла нужный вид, кликаем и пишем желаемый текст.
Готово! Также автоматически создается дубликат контура (Patch), но уже привязанный к вашему тексту (в палитре Patchs он отображается только тогда, когда будет выделен слой с только что созданным текстом), после чего изначальный Patch уже никак не участвует в процессе и его можно удалить (на рисунке у него имя “Work Patch”).

Форму, в которую заключен текст, в дальнейшем можно изменять как обычный контур/кривую, на что текст будет сразу же соответственно реагировать. Таким же образом текст можно заключать во всевозможные замысловатые фигуры.
Конечно, это не совсем полноценное обтекание текстом (как в специализированных программах для верстки), так как если вы захотите изменить расположение картинки, нужно будет изменять контур каждый раз. Но все лучше, чем искусственно создавать обтекание текстом с помощью разбивания одного блока текста на несколько или с помощью кучи пробелов (это уже кто на что горазд)
Для полного счастья еще было бы здорово узнать, как сделать хотя бы подобное обтекание текстом в программе Fireworks.
Copyright © 2008 Заметки разработчика
Эта rss лента только для персонального некоммерческого использования.
Поиск в интернете “для чайников”
Оказывается, далеко не все люди умеют нормально использовать поисковики для того, чтобы находить нужную для себя информацию. Почему так, не знаю, ведь в каждой поисковой системе есть “Расширенный поиск” и краткие справки о том, как эффективно пользоваться поиском. Бывает, люди просто не знают, что есть возможность искать лучше.
Итак, если вы имеете желание потратить немного времени, чтобы улучшить свои способности в области поиска информации, приступим.
Лично я в основном использую для поиска Яндекс и если ничего не нашел в Яндексе пробую в Google, соответственно дальше и буду в первую очередь подразумевать Яндекс и Google, хотя в большинстве случаев все сказанное будет актуально и для многих других поисковых систем.
Базовые моменты
- Не используйте в своем запросе никаких знаков препинания (ничего, кроме букв и цифр).
- Одна из самых больших ошибок – писать в строку поиска целые мемуары о том, что нужно найти. Нельзя сказать, что это всегда вредит, но и пользы от этого нет. Используя много лишних слов, вы рискуете получить среди результатов поиска кучу мусора. По возможности нужно использовать только важные слова для каждого конкретного случая, причем, слова можно при каждой попытке добавлять или отнимать. Чем меньше лишних слов, тем больше обычно выдается подходящих сайтов. К примеру, вместо запроса:
Как склеить разбитую вазу упавшую на достаточно твердую поверхность с высоты 2 метра
Некоторые могут подумать, что это преувеличение, но я сам видел подобные запросы. Лучше же его укоротить до наиболее важных слов:
как склеить разбитую вазу
Строго говоря, слово “как” тоже можно убрать, но из соображений эстетики и “авось поможет” оставил. Иногда укороченные запросы выглядят совсем нечитабельными для человека, но для поисковика такие запросы – самое то ![]()
Вот, к примеру, длинный и человеко-естественный вариант:
какая цена участков земли на луне
И хороший с точки зрения поисковика запрос (поисковик выдаст больше подходящих результатов):
цена луна
Представьте, если бы люди так общались, мы бы тогда, наверное, в основном молчали
С практикой обычно в голове уже сам формируется вариант запроса, приспособленного под поисковик по интересующему вопросу.
- Иногда помогает упрощение/абстрагирование понятий, к примеру, заменим запрос:
как склеить разбитую вазу
На:
как склеить разбитый фарфор
При этом запросе я нашел уже более адекватную информацию.
Иногда же больше помогают, наоборот, более точные понятия. Если в запросе используются часто употребляемые слова, далеко не всегда удается найти что-либо с первой попытки, поэтому можно экспериментировать.
- Еще можно менять, к примеру, вопросительную форму на утвердительную, представив, какие наверняка должны быть слова в ответе на ваш вопрос. Т.е. вместо:
как склеить разбитый фарфор
Пишем:
чтобы склеить разбитый фарфор нужно
Яндекс при втором варианте выдал уже больше подходящих сайтов.
Эту фразу можно также пробовать укорачивать до “как склеить фарфор” или “склеить фарфор”.
Дополнительные возможности
Существуют специальные (вспомогательные) символы, которые позволяют в большей степени влиять на адекватность результатов поиска. К примеру, такими общераспространенными символами являются `+`, `-` и `”`.
Ставя перед словом символ `+` (пробела между спецсимволом и словом быть не должно) вы говорите поисковику: “данное слово должно обязательно присутствовать в найденных сайтах, если этого слова там нет, то и не показывай эти сайты в результатах”.
рецепт картошка +скачать
Все рецепты блюд с картошкой, где нет слова “скачать” будут исключены из результатов поиска.
`-` соответственно является противоположностью, т.е. его нужно ставить перед словом, которое не должно встречаться в результатах поиска.
реферат -купить
С помощью этих символов очень удобно отсеивать ненужную вам информацию.
реферат –купить +скачать
Чаще всего, поисковику все равно, в какой последовательности введены слова в вашем запросе. Поэтому в результатах поиска будут такие страницы, где указанные вами слова могут быть разбросаны по всей странице (но насколько я понимаю, чем ближе ключевые слова друг к другу, тем выше в результатах будут такие страницы). Так вот, если вам особо важна четкая последовательность слов (и нахождения их в непосредственной близости друг к другу), существуют кавычки. Возьмите такую группу слов в кавычки, и дело в шляпе. Поэтому с помощью кавычек обычно рекомендуется искать цитаты.
“златая цепь на дубе том”
Лично я достаточно редко ищу цитаты (а если это и происходит, то они обычно находятся и без кавычек), а использую кавычки по “прямому назначению”, т.е. беру в них участки текста, в которых мне важен порядок и близость слов. Отличие от поиска цитаты в том, что в кавычки не берется весь запрос, а только нужная часть в нем (вещь достаточно очевидная, но все же захотелось обратить на это внимание), или кавычками обрамляется несколько блоков текста. Иногда эта возможность очень актуальна, когда от перемены слов местами смысл может сильно измениться. Вот, к примеру, запрос:
скачать “время машины”
Если его ввести без кавычек, будет совсем другой результат (все результаты будут относится в основном к группе “Машина времени”)
Единственный нюанс заключается в том, что слова, взятые в кавычки, не склоняются при поиске, что иногда бывает немного неудобно.
Так же не стоит забывать, что все эти специальные символы можно использовать одновременно, если в этом есть необходимость.
“продам планету” +дешево -юмор
Недавно, кстати, возникала необходимость исключать (или наоборот) из результатов поиска целые словосочетания, а не слова по отдельности. Т.е. использовать такую конструкцию:
Основные слова –”ненужное словосочетание”
К сожалению, в Яндексе такая конструкция не срабатывает, а в Google работает на ура. Хотя такая конструкция вполне интуитивна и по идее должна работать везде.
Думаю, описанных мною возможностей хватит для большинства повседневных задач, я, к примеру, больше ничего не использую, и пока хватает.
Тем не менее, стоит знать, что это не все возможные специальные символы для поиска. У каждого поисковика есть дополнительный набор своих “фирменных” символов, о которых можно прочитать в их системах помощи (к примеру, описание базовых возможностей поиска в Яндексе и аналогичная справка на Google). У Яндекса есть вообще масса устрашающих возможностей
У Google подобного документа не нашел, если кто кинет ссылку в комментариях, буду благодарен. Так же на многих поисковиках предусмотрен расширенный поиск (обычно у поля ввода запроса стоит ссылка с текстом “Расширенный поиск”), с помощью которого можно не тратить время на изучение всех спецсимволов каждого поисковика, а сформировать сложный запрос с помощью удобной формы (Яндекс, Google).
Если ничего не находится в одном поисковике, это не значит, что информации не существует, нужно пробовать поискать во втором (как я иду обычно после Яндекса в Google, и иногда, кстати, там достаточно сильные отличия результатов поиска). Если и там ничего (есть смысл “полистать” страницы с результатами из-за того, что нужный сайт не всегда в самых первых строках результатов), обычно приходится махнуть рукой на это дело или найти какой-то форум, соответствующий теме, и там задать свой вопрос с надеждой, что на него кто-нибудь ответит.
Недавно, кстати, нашел дополнительный способ находить качественно другое преподнесение информации, это поиск по блогам (на Яндексе и на Google), иногда там находится такая информация, которую по сайтам найти не удается.
Хотел написать короткую статью, а получилось как всегда
Удачных вам поисков! ![]()
Copyright © 2008 Заметки разработчика
Эта rss лента только для персонального некоммерческого использования.
Что делать, если у сайта нет RSS-канала
Что делать, если вам сильно хочется следить за обновлениями информации на чьем-то сайте, но при этом у этого сайта нет своего RSS-канала?
Оказывается, все-таки есть выход из этой ситуации.
Самый просто способ – это использовать сайт page2rss.ru. Этот сайт будет следить за страницей в интернете, которую вы укажете, и как только будет видеть какие-то изменившиеся данные, будет публиковать их в виде RSS-канала, на который вы и можете подписаться (после указания адреса страницы и нажатия кнопки “to RSS” справа появятся кнопки для подписки на RSS).
Нюанс только в том, что вы не будете в итоге видеть какие-то аккуратно оформленные новости, а будете видеть именно измененные куски. Хотя, наверняка, в некоторых случаях не такие они и страшные могут быть
Но даже если в RSS-канале информация будет представлена несколько хаотично, основную задачу этот сервис выполняет. Вы всегда будете знать, что на странице произошло обновление, примерно понимая, какой оно имеет характер. Вообще, применений можно найти массу – можно следить за изменениями в какой-либо статье, новыми комментариями к чему либо, за изменениями в каких-либо рейтингах и т.д., и все это невзирая на отсутствия соответствующих RSS-каналов на нуж









