InProcess - В процессе
В процессе Новости 

InProcess.ru

PHP

Начинаем работать в PHP

Когда начинал программировать на PHP, то столкнулся с несколькими нюансами, про которые лучше помнить. Возможно будет интересно тем, кто также начинает работать с PHP, особенно, если до этого работали в других системах программирования.
Нюансы на которые обратить внимание:
  • При обращении к свойствам и методам объекта из других методов этого же объекта не забывать написать $this-> впереди. Это кажется простым правилом, но если вы до PHP работали в Delphi или C#, то первое время придется заставлять себя не забывать про $this-> так как в Delphi или C# это делать не обязательно.
  • При обращении к свойствам объекта не забывать, что знак $ должен стоять один раз непосредственно перед this. Т.е. не должно быть так: $this->$my_var. Правильно записать $this->my_var. Эта проблема относится к ошибкам copy-paste (скопировал-вставил). Переменные в классе декларируются, например, так: public $my_var в результате часто копируешь вместе со знаком $.
  • В условиях ни в коем случае не ошибаться и не писать = вместо == (в итоге, происходит присвоение значения переменной, которая расположена слева). Обычно потом приходится попотеть, разбираясь почему код не работает. Не могу сказать почему, но такого рода проблем в том же C# не было
  • Следующий момент такой: Если вы очень веско не можете объяснить зачем вам это нужно и это не является базисом на котором будет работать всё приложение, то не вызывайте include или require непосредственно из функций. Однажды решив, что без этого никак, это сделал. Через некоторое время спустя я получил ошибки, на изучение причин которых ушло несколько дней. Имейте ввиду, то что подключается из тела функции по include или require становится внутренним кодом самой функции. Если в подключаемых модулях были глобальные переменные, то они становятся локальными функции, где производилось подключение. Кстати, сейчас я всё таки использую inlсude из функции, но теперь это на самом деле необходимо и используется корректно.
  • При обращении, внутри любых функций, к переменным объявленным 'глобально' необходимо объявить их еще раз с помощью служебного слова global (например: global $my_var;) Понятно, что такое объявление нужно сделать внутри функции, до первого использования глобальной переменной. Глобальными считаются те переменные, которые объявлены вне тела классов, либо функций. Чтобы уменьшить количество проблем с global рекомендую делать декларацию всех глобальных переменных первой строкой в функциях.

Language string failed to load: recipients_failed

Ошибка от PHPMailer. Нужно было перейти на другой smtp сервер через который посылал почту из скрипта и получил ошибку: Language string failed to load: recipients_failedmy_mail@test.ru
Причины возникшей проблемы мне не были ясны, в таких случаях копирую текст ошибки и в поисковик. Результаты были найдены сразу, с такой проблемой столкнулся не я один. Но описать эту проблему решил вот почему. Дело в том, в что сообщении которое выдал PHPMailer объединено две ошибки, точнее критичная ошибка которая привела к тому что письмо не отправилось и информационное сообщение от PHPMailer в котором он говорит, что не смог найти файл в котором находится сообщение о ошибке на текущем (для PHPMailer) языке. Разделим полученное сообщение на логические части:
  1. Language string failed to load:
  2. recipients_failed
  3. my_mail@test.ru
Так вот, первую часть сообщения можно не рассматривать, это всего лишь недовольство мейлера тем, что он не нашел файл с сообщениями для текущего языка. Само сообщение - суть, он всё равно выводит (в списке под номером 2). В третьей части списка находится e-mail адрес на который не удалось отправить сообщение.
Из результатов поиска я так и не понял, что приводило к такой ошибке у тех, кто спрашивал, но похоже это связанно с передачей не всех, либо неправильных параметров мейлеру. В моем же случае оказалось, что провайдер на котором расположен хостинг разрешает отправку только непосредственно с сервера, где хостится скрипт. Проблема у меня наблюдалась только при отправке сообщения с моего же компьютера (т.е. с тестового локально развернутого сайта). О том как работать в PHPMailer встретил вот здесь: http://php.russofile.ru/ru/translate/mail/phpmailer/

Fatal error: Allowed memory size of ... bytes exhausted (tried to allocate ... bytes)

Упс... только начало что то получаться и тут на те вам :)
Проблема не большая, и говорит о том, что Вашему веб приложению понадобилось больше оперативной памяти чем разрешено в настройках. Ищем файл php.ini и меняем в нем следующий параметр: memory_limit = 8M. По умолчанию он 8M, поставьте как Вам нужно, например: 32M.

Запуск скриптов php из cron

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

Для тех кто собирается впервые использовать крон несколько советов:

  1. Для того чтобы запустить php скрипт из крон Вам потребуется настроить файл "crontab", такой файл может быть создан только один для каждого пользователя Unix. Файл создается, редактируется и просматривается с помощью программы с таким же названием: "crontab". (Кроме того, после того как файл создан его можно просматривать, а также редактировать с помощью обычного текстового редактора. Файл "crontab" имеет имя, которое совпадает с именем пользователя, для которого создан и располагается в папке /var/spool/cron/crontabs/. Но тем не менее лучше всё таки пользоваться утилитой crontab.
  2. Для того чтобы создать полноценное cron задание в файле задания достаточно одной строчки, например:
    * * * * * echo "hello world"
    Такое задание будет выводить "hello world" каждую минуту. Если вы хотите получить "hello world" на свой e-mail достаточно перед заданием крон набрать строчку: MAILTO=moya_poshta@mail.ru
    Итак, простое задание, с отправкой всей выводимой информации на мейл выглядит так:
    MAILTO=moya_poshta@mail.ru
    * * * * * echo "hello world"
  3. Вызовем нужный php скрипт из cron. Для скрипта, который будет вызываться каждую минуту можно записать например так:
    MAILTO=moya_poshta@mail.ru
    * * * * * /usr/bin/php /home/www/mysite/my_task.php
  4. Рассмотрим запись * * * * * echo "hello world", или * * * * * /usr/bin/php /home/www/mysite/my_task.php.
    Первые пять звездочек (позиций) задают задают время выполнения (Минута, Час, День, Месяц, День недели).
    Минута(0-59), Час(0-23), День(1-31), Месяц(1-12), День недели(0-7) (воскресенье 0 или 7)
    Запись * напр. в мнутах означает: выполнять каждую минуту (аналогично для остальных параметров).
    Можно записать несколько значений для конкретного врмеменного параметра через запятую, напр:
    1,5,25,50 * * * * - означает: выполнять задание в первую, пятую, 25-ю и 50-ю минуту каждого часа, каждого дня, каждого месяца и каждого дня недели
    Можно задавать интервалы с помощью тире -. Например:
    15-25 * * * * означает: выполнять каждую минуту начиная с 15 минуты часа, до 25 минуты.
    Кроме того можно задавать интервал с которым будет выполняться задание в указанном диапазоне, напр.:
    15-25/3 * * * * означает: выполнять каждые 3 минуты (через каждые три минуты) начиная с 15 минуты часа, до 25 минуты.
    Еще один пример:
    */15 * * * * означает: выполнять через каждые 15 минут.
  5. Особенностями при запуске скриптов из крон является то, что для запуска не задействуется веб. сервер (напр. Аппач) со всеми вытекающими. Если Вы инклудите файлы с отностительными путями, то вероятно ваши скрипты перестанут работать, поскольку php не будет находить Ваших файлов. Это связанно с тем, что отностительный путь расчитывается относительно текущей директории, и когда работает аппач он выставляет необходимый текущий путь, соотв. Вашему сайту. При запуске из крон эту работу за вас никто не делает. Чтобы обойти проблему можно воспользоваться функцией chdir() для указания текущего пути в ручную, например:
    if(empty($_SERVER['DOCUMENT_ROOT']))
    {//если текущий путь к сайту не выставлен (у меня так было при вызове из cron), то укажем сами
    chdir('/home/www/mysite'); //теперь с относительными путями порялок
    }
  6. Если в результате выполнения скрипта может осуществляться вывод (напр. с помощью echo), то чтобы его увидеть можете воспользоваться MAILTO=moya_poshta@mail.ru в файле задания крон. Если эта строчка присутствует в файле, весь вывод, который будет сформирован в результате работы скрипта, будет отправлен Вам на мейл (Обычно задания крон не должны формировать никакого вывода, но если что то пошло не так, вы сможете получить не мейл сообщение с информацией об ошибках).
Дополнительную информацию о формате файла crontab можно посмотреть здесь

О сессиях PHP (Session support in PHP)

Что желательно помнить, когда начинаешь работать с сессиями в PHP: данными, которые вы сохраняете в сессии, можно будет воспользоваться только в случае, если между обращениями от браузера к серверу, в рамках одного сеанса работы, прошло времени не больше, чем время жизни сессии. Время жизни сессии по умолчанию составляет 1440 секунд или 24 минуты (session.gc_maxlifetime = 1440).

Обратите внимание! Время жизни касается только данных, которые Вы сохраняете в сессии. С точки зрения программиста, после того как мы стартовали сессию, напр. с помощью функции session_start(), сессия представляет собой глобальный ассоциативный массив. Чтобы сохранить данные в сессии пишем: $_SESSION['user_email'] = 'test@test.ru';. После того как мы сохранили какое либо значение в сессии, мы можем получить его обратно при последующих обращениях от браузера, напр.: $user_email = $_SESSION['user_email'];. Получить сохранное значение будет возможно, если между двумя обращениями прошло меньше чем 1440 сек.

Несмотря на то, что данные сохраняемые в сессии "умирают" после окончания времени жизни, но идентификатор сессии остается постоянным в течении всего сеанса работы браузера вне зависимости от перерывов в обращении к серверу.

"Жизненной стойкостью" идентификатора сессии можно воспользоваться для решения разных задач, например, связанных с идентификацией пользователя в течении сеанса работы. Можно подумать, что раз данных сессии всё равно нет, то идентификатор можно и самим сделать напр. на основе куков и полностью отказаться от сессий php. Но на самом деле php делает немного больше при работе с идентификатором. Например, php определяет, если у пользователя отключены куки, то идентификатор сессии присоединяется ко всем внутренним урлам (ссылкам) и гарантирует доступность идентификатора в Вашей программе. Таким образом автоматически разрешается вопрос с отключенными куками на стороне пользователя.



Интерфейсы и абстрактные классы в PHP

Для объявления абстрактного класса перед словом class ставим ключевое слово abstract, напр.:
abstract class MyClass{...}

Для объявления интерфейса используем ключевое слово interface, напр:
interface MyInterface
{
public abstract function MyMethod( );
}

Все методы в объявлении интерфейса должны быть абстрактными.

Наследование от абстрактного класса происходит также как от обычного класса, т.е. с помощью слова extends, напр.:
class ChildrenClass extends MyClass{...}

Реализация интерфейса может быть выполнена в любом не абстрактном классе с помощью ключевого слова implements, напр.:
class WorkClass implements MyInterface{...}
Все методы интерфейса должны быть реализованы в классе который объявил о поддержке интерфейса.

В PHP любой класс может наследоваться только от одного класса, но реализовывать 1 или более интерфейсов, напр:
class WorkClass implements MyInterface, MyInterface2{...}
пример 2, одновременно и наследование от класса и поддержка интерфейсов:
class WorkClass extends MyClass implements MyInterface, MyInterface2{...}

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



Рассылка почтовых сообщений (email)

Появилась необходимость сделать рассылку для большого числа подписчиков (сотни тысяч). В настоящий момент пытаюсь поближе познакомится с задачей и вот вопросы которые кажутся важными сейчас:
  • Cоставление проекта для программы на php. При первом взгляде на задачу выделяются три основных блока из которых программа будет состоять: 1. Подготовка списка получателей; 2. Подготовка задания (документ который будет рассылаться + статус задания); 3. Рассылка
  • Запуск программы рассылки и преодоление временного ограничения на работу PHP скрипта. Как видится сейчас, запустить рассылку можно, например, по cron, либо ассинхронным вызовом javasript (Ajax). Что делать с временным ограничением пока не понятно. Как вариант для данного скрипта указывать оч. большое время выполнения set_time_limit(10000) или просто снять ограничение set_time_limit(0)
  • Как сделать рассылку и не попасть в спам лист почтовых серверов. Из простых соображений понятно, что в письме необходимо реализовать возможность отписаться от поступающих сообщений. Возможность отписаться должна быть легко доступной. Что нужно сделать с технической стороны и нужно ли что нибудь делать пока не понятно (Например, может быть что то типа: 1. отправлять не больше 100 писем за один цикл, потом сделать паузу на несколько секунд, минут? 2. Специальным образом формировать заголовки и служебные поля email?)

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

Полезные ссылки по теме:
Использование Zend Framework при создании рассылки. Статья полезная, может и не дает ответы на вопросы относительно рассылок, но затрагивает некоторые проблемы, с которыми сталкиваешься при реализации отправки email-ов из PHP

Пример-набросок реализации многопоточности... ведь никто не хочет ждать пока отправятся все 100000 писем habrahabr многопоточность



Патерн Singleton как замена глобальным переменным

источник: http://web-blog.org.ua/articles/practika-sozdaniya-patterna-singleton
  1.   
  2. /** 
  3.  * Простой пример реализации паттерна Singleton 
  4.  * 
  5.  * @name SingletonTest 
  6.  * @author Andrew Vasiliev (illusive [at] meta [dot] ua) 
  7.  */  
  8. class SingletonTest  
  9. {  
  10.     /** 
  11.      * Статическая переменная, в которой мы 
  12.      * будем хранить экземпляр класса 
  13.      * 
  14.      * @var SingletonTest 
  15.      */  
  16.     protected static $_instance;  
  17.   
  18.     /** 
  19.      * Закрываем доступ к функции вне класса. 
  20.      * Паттерн Singleton не допускает вызов 
  21.      * этой функции вне класса 
  22.      * 
  23.      */  
  24.     private function __construct(){  
  25.         /** 
  26.          * При этом в функцию можно вписать  
  27.          * свой код инициализации. Также можно 
  28.          * использовать деструктор класса. 
  29.          * Эти функции работают по прежднему, 
  30.          * только не доступны вне класса 
  31.          */  
  32.     }  
  33.   
  34.     /** 
  35.      * Закрываем доступ к функции вне класса. 
  36.      * Паттерн Singleton не допускает вызов 
  37.      * этой функции вне класса 
  38.      * 
  39.      */  
  40.     private function __clone(){  
  41.     }  
  42.   
  43.     /** 
  44.      * Статическая функция, которая возвращает 
  45.      * экземпляр класса или создает новый при 
  46.      * необходимости 
  47.      * 
  48.      * @return SingletonTest 
  49.      */  
  50.     public static function getInstance() {  
  51.         // проверяем актуальность экземпляра  
  52.         if (null === self::$_instance) {  
  53.             // создаем новый экземпляр  
  54.             self::$_instance = new self();  
  55.         }  
  56.         // возвращаем созданный или существующий экземпляр  
  57.         return self::$_instance;  
  58.     }  
  59. }  
  60.   
  61. ?>  


Установка PHP, MySql, Apache

http://www.php.ru/install/
http://www.softtime.ru/info/apache.php?id_article=24
Иногда вдруг захочется поставить самому apache, mysql, php и почему то ничего ни с чем не работает... это просто удивительно, но факт. Аппач не хотел работать с пхп... в итоге поставил именно тот который указан в доке, вроде помогло. Почему то не хотела подхватываться php_mysql.dll - исползал на пузе всё... не работает. Прописал в path пути к php и php\ext, добавил extension_dir="C:\php\ext\" и extension=php_mysql.dll в php.ini - не работает... Но вот оно счастье :) есть чудо персоны, нашел через яндекс: Здесь ответ Первый же пост и сразу в точку!

Call to undefined function mysql_connect()
Если вы видите такое сообщение, то это означает что не подключена библиотека MySQL.

что бы такого не случалось:

1. http://php.ru/install/

2. Смотрим руками:

- смотрим на выдачу phpinfo() где реально php берет php.ini файл.
- правим php.ini в том месте
- раскоментирум там строчку "extension=php_mysql.dll".
- перезапускаем апач.

3. не забываем про директиву апача
# configure the path to php.ini
PHPIniDir "C:/php5"

О том где искать конфиг MySql в Windows: (утянул с гугл ответов, чтобы было под рукой) Запустите mysqld --help --verbose и читайте. Вот пример для Windows:
Default options are read from the following files in the given order: C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf C:\Program Files\MySQL\my.ini C:\Program Files\MySQL\my.cnf



SimpleXML

SimpleXML можно действительно называть "XML для чайников". Вместо того, чтобы иметь дело с DOM или, что еще хуже, SAX, SimpleXML позволяет представить ваш XML-документ как родной объект PHP. Вы можете читать, писать или пробегаться по вашему XML-документу, с легкой непринужденностью получая доступ к элементам и атрибутам.

Рассмотрите следующий XML-документ:

<clients>
<
client>
<
name>John Doename>
<
account_number>87234838account_number>
client>
<
client>
<
name>Janet Smithname>
<
account_number>72384329account_number>
client>
clients>

Следующий фрагмент кода печатает имя каждого клиента и номер его аккаунта:

$clients = simplexml_load_file('clients.xml');
foreach (
$clients->client as $client) {
print
"$client->name has account number $client->account_number ";
}
?>

Как видим, SimpleXML действительно прост.

А в случае, если есть необходимость сделать что-то, что невозможно выполнить в рамках SimpleXML, вы можете преобразовать свой объект SimpleXML в дерево DOM, вызвав функцию dom_import_simplexml(), выполнить необходимое, и вернуться назад к SimpleXML, используя simplexml_import_dom(). Благодаря тому, что оба расширения реализованы в одной библиотеке XML, переключения между ними теперь реальны.

взято здесь

Установка Apache, Php, MySQL

Устанавливал:
Аппач: httpd-2.2.16-win32-x86-no_ssl.msi
Пхп: php-5.2.14-Win32.zip
MySQL: mysql-essential-5.1.50-win32.msi

Что потребуется в общих чертах:
1.Установить Apache, установить Php.
2.Настроить апач: Указать, где находится папка с сайтами, указать, что индексным файлом может быть index.php, указать настройку для запуска Php обработчика. Раскомментировать загрузку модуля mode_rewrite.
3. Настройка Php: Указываем какие модули нам нужны.
extension=php_gd2.dll
extension=php_mysql.dll
extension=php_mysqli.dll
Временную зону по умолчанию: date.timezone ="Europe/Moscow"
4. Просто установить MySQL никаких спец. настроек не надо.

Что потребуется подробней:
1. Подключения PHP как модуля в Apache, в файл конфигурации httpd.conf после всех LoadModule добавляем:
PHPIniDir "C:/server/php"
LoadModule php5_module "c:\server\php\php5apache2_2.dll"
AddHandler application/x-httpd-php .php
Обратите внимание: в переменной PHPIniDir нельзя ставить конечный “/”!
В раздел DirectoryIndex пишем:
DirectoryIndex index.php index.html
(Почему то не получилось настроить запуск Php обработчика как CGI скрипта, только как модуля)
2. Установка Php
Рекомендую скачать не инсталляцию, а архив так как в инсталляции не хватает кучи файлов, например файла php5apache2_2.dll



Проблемы с кодировкой?

Иногда обнаруживаю, что текст которые приходит от браузера искажен и представляет собой что то типа:
& #1059;& #1074;& #1072;& #1078;& #1072;& #1077;& #1084;& #1099;& #1077;& #1082;& #1086;& #1083;& #1083;& #1077;& #1075;& #1080;& #1077; (в этом примере специально стоит пробел между & и #, на самом деле между ними пробела нет)
Не знаю, в чем причина такой проблемы, но оказалось, что можно понять что там написано . Для этого нужно воспользоваться функцией htmlspecialchars_decode

Zend 5.5 + Windows 7

Запуск Zend 5.5 под Windows 7. Просто поставьте «совместимость» с Vista sp2 у ярлыка и zend начинает запускаться и работать, при других совместимостях выкидывается при загрузке. При установке zend 5.5 если не поставить совместимость, то чекбоксов и др не видно, но устанавливается, в принципе, нормально.
Нашел вот здесь: http://habrahabr.ru/post/69405/ в комментариях

MySQL

MySQL Error. Field doesn't have a default value

После установки 5-ой версии MySql и развертывании базы начал получать ошибки, которых никогда до этого не было: " Field doesn't have a default value". Причем для текстовых полей не было никакой возможности установить дефолтное значение, так как в качестве дефолта меня устраивала только пустая строка, но при этом ошибка не исчезала. Ставить Null не хотелось... Решение нашел здесь: http://forum.php-myadmin.ru. Поскольку база развернута локально то достаточно было просто изменить в ини-файле MySQL (my.cnf/my.ini) параметр sql-mode. Просто сделать sql-mode=""

Не работаю вьюшки mysql

При развертывании базы на одном из хостингов вьюшки (представления) MySql отказывались работать. Чтобы всё стало хорошо при создании представления добавил SQL SECURITY INVOKER:
CREATE ALGORITHM=UNDEFINED SQL SECURITY INVOKER VIEW `my_view` AS select...

Учебник по SQL

Понимание SQL

Разные ссылки

Работа с классом PHPMailer

http://php.russofile.ru/ru/translate/mail/phpmailer/

Ссылки на материалы по javascript

Система уроков по JavaScript
Вопросы и ответы по javascript: http://xpoint.ru/forums/programming/javascript/misc/faq.xhtml
http://www.tigir.com/javascript.htm
http://javascript.ru/tutorial/basic/functions/
Вводная статья по работе с jQuery

Справочник по web

Справочник с широким охватом web технологий Ю. Лукач «Справочник Веб-разработчика»

Книга по апачу, просто название, попозже поищу: Сервер Apache 2. Библия пользователя." Мохаммеда Дж. Кабира

Статистика рунета

Здесь можно получить приличную информацию по хостингу, доменным именам, и т.п. http://www.1stat.ru/

Архив сайтов http://web.archive.org (можно посмотреть каким был сайт год, два, пять лет назад...)

Здесь можно посмотреть статистику по различным запросам по мнению Яндекса

С помощью этого сервиса Яхо можно смотреть на каких сайтах стоят ссылки на какой либо нибудь сайт siteexplorer.search.yahoo.com

Здесь можно посмотреть уникальность контента: www.copyscape.com



Каталоги

Здесь можно регистрировать сайты
http://turtle.ru
www.ru/rus/index.html
Желтые страницы, здесь можно добавить информацию о компании причем ссылка на сайт будет прямая и что самое приятно это бесплатно www.adresa-telefony.ru
Еще желтые страницы тоже бесплатно www.bs-info.ru
Каталог аппорта http://catalog.aport.ru/rus/add/AddUrl.aspx
Определение позиции в поиске, но там же ссылка есть на добавление ресурса в поиск рамблера http://www.rambler.ru/doc/position.shtml

Документальные фильмы... Отличный сайт!!

Мне было интересно посмотреть историю гостиницы Москва: http://www.doc-films.ru/archives/82 но на сайте просто много оч. интересного

Печать HTML с разбивкой по листам

Здесь http://igorban.ru/?p=95 пример как сделать принудительную разбивку при печати html страницы. С помощью использования стиля:

Здесь http://igorban.ru/?p=95 пример как сделать принудительную разбивку при печати html страницы. С помощью использования стиля:

Парсим excel файл

Здесь утилита: http://sourceforge.net/project/showfiles.php?group_id=99160
Здесь информация о том как excel хранит дату время: http://computers.plib.ru/office/Excel/Glava%2010/index2.htm

Наложение прозрачного изображения

Здесь хороший пример, как сделать "водяной знак" на изображении, с помощью php: http://koivi.com/php-gd-image-watermark/

Шаблоны сайтов и сайты

http://www.templatemonster.com/website-templates/20764.html
http://www.templatemonster.com/website-templates/21530.html
http://www.templatemonster.com/website-templates/21670.html
last 28 pg



Инструменты полезные при создании сайтов

Как посмотреть как выглядит твой сайт в разных операционных системах, разных браузерах, разном разрешении и т.п.. Как вариант можно использовать сайт - http://browsershots.org/

Берем и делаем сайты :) http://wordpress.org/


Иногда, после смены ДНС сайта, продолжаешь видеть его старый вариант. В Windows можно попробовать:
ipconfig /flushdns
Если нужно трассировку до сервера на котором расположен сайт, можно командой винды - tracert, например: tracert bsmos.ru
Добавить сайт для индексации в Гугл: http://www.google.com/addurl/

Инструменты и библиотеки для web программиста

http://tools.mozilla.com/simple.html

Хостинг

http://www.hostgator.com/

Работа

Бронирование номеров в гостиницах

Обычно программирование позволяет узнать немного больше чем языки программирования, особенности работы операционных систем и браузеров. Предметная область, к которой относится проект, требует серьезного изучения. В настоящее время проекты относятся к системам бронирования номеров гостиниц.
Забронировать гостиницу можно двумя способами, непосредственно в гостинице, либо через агентство по бронированию номеров. Это кажется странным, но бронировать гостиницу выгодней и вообще то удобней через агентство. Во первых, агентство предложит практическую любую гостиницу на выбор и во вторых, что самое приятное, часто номер можно забронировать дешевле, чем напрямую в гостинице. Доверять или не доверять агентству, вопрос открытый и еще недавно я бы и сам попытался найти выход напрямую. Однако проработав в компании по бронированию на этот вопрос смотрю уже по другому. Во первых, коллектив в котором работаю - порядочные, ответственные люди. Компания называется "БукингСервис", сайт компании www.bsmos.ru.
На сегодняшний день, в системах бронирования гостиниц больше заинтересованы именно агентства. Задачи программистов или скажем так специалистов, которые связаны с программным обеспечением сводятся к следующему: Создание и поддержка программного обеспечения, которое должно включать три компонента: 1. система управления контентом (описание гостиниц, номеров и т.п.). 2. система управления заказами и помощи работе менеджеров и руководства. 3. система для пользователей (получение заказа). А также продвижение сайтов в интернете.
Продвижение сайта в интернете своеобразная задача. Поисковые машины не очень любят когда этим занимаются, но эта позиция не совсем понятна. Продвижение - это просто специфическая технология рекламы услуги или товара. Поскольку именно верхние позиции результатов поиска приносят прибыль, продвижение не искоренить. Ну и кроме того, если организация продвигает свой сайт, то как минимум она не равнодушна к тому, чем занимается, ценит то, что предлагает клиентам, ценит работу своих сотрудников. Вкладывая деньги в продвижения, начинаешь делать все, чтобы товар или услуга соответствовали наивысшему уровню, а сайт был удобным и привлекательным, иначе никакое продвижение не заставит пользователя сделать заказ и тем более вернуться в компанию повторно.
Ну и напоследок, если вас интересует гостиница в Москве, то можно заказать её здесь: бронирование гостиниц Москвы, либо воспользоваться любой поисковой системой, сделать запрос и выбрать приглянувшийся вариант. И вот еще :) есть очень приятный сайт с прямыми контактами гостиниц называется "ХотелРум.Ру".

HTML / CSS

Оттенки серого

С цветом всегда непросто. Подбор цвета может отнять много времени и результат не всегда будет полностью устраивать, особенно если у честь что разные мониторы отобразят выбранный вами цвет по разному.
Серый цвет не является каким то особенным, но тем не менее вот небольшая табличка тонов серого.
10% Gray #EBEBEB
Test test
15% Gray #E1E1E1
Test test
20% Gray #D7D7D7
Test test
25% Gray #CCCCCC
Test test
30% Gray #C2C2C2
Test test
35% Gray #B7B7B7
Test test
40% Gray #ACACAC
Test test
45% Gray #A0A0A0
Test test
50% Gray #959595
Test test
55% Gray #898989
Test test
60% Gray #7C7C7C
Test test
65% Gray #6F6F6F
Test test
70% Gray #626262
Test test
75% Gray #555555
Test test
80% Gray #464646
Test test
85% Gray #363636
Test test
При всей простоте темы, серый цвет может доставить некоторые хлопоты. Например, можно столкнуться с такой ошибкой: Указать серый цвет словом, но с ошибкой т.е не gray, а grey. Проблемку усугубляет еще то, что некоторые браузеры воспринимают ошибочное написание как правильное и отображают цвет как будто он задан корректно. Так, Mozilla Firefox 2.0 прощает ошибочное написание, а IE6 нет. В итоге, при тестировании страницы в разных браузерах, очень сильно удивляешься: Почему в одном браузере пропал фон или шрифт остался черным, а в другом всё в порядке.

Для подбора цвета для элементов сайта удобно воспользоваться http://kuler.adobe.com/

Код стрелки вправо: → ?

Код стрелки влево:   ← ?

Цветовая таблица от Студии Артемия Лебедева


Не уменьшается размер файла изображение jpg? Как сжать изображение jpg

При подготовке небольших картинок JPG, одинакового размера по ширине и высоте (напр. 150px - 100px), для сайта столкнулся с непонятным эффектом: часть картинок запросто сжимались до размера 3кб и при этом качество картинки оставалось приличным. Но некоторые изображения упирались непонятно почему и не уменьшались меньше 10-20 кб (т.е. при внешне одинаковых условиях размеры файлов различались в 3-7 раз).
Выход нашел такой: предварительно сохранить картинку в формате bmp, а после этого картинку bmp сохранить в формате jpg. Теперь мои картинки всегда в пределах 4 кб чему я очень рад :) По всей видимости jpg позволяет сохранять внутри себя дополнительную информацию которая, возможно не являясь изображением, не поддается сжатию. Пересохранением через bmp эта проблема решается.

Теперь столкнулся с проблемой уменьшения размера png картинки. В нете нашел ссылки на статьи на сайте Артемия Лебедева, мне помогла сразу первая :)

про Png 1
про Png 2
про Png 3
про Png 4

Мне нужно было уменьшить кнопку с градиентной заливкой. В итоге чтобы добиться результата нужно соблюдать следующие правила:
1. Градиент заливать так, чтобы он был строго вертикальный или строго горизонтальный!
2. Уменьшить кол-во цветов которые используются в палитре. Например мне нужно было залить горизонтальным градиентом картинку с высотой 30 пикселей. Понятно, что на один пиксель программа не может дать более 1 цвета. Следовательно ставим кол-во цветов = 30.

Соблюдение всего лишь этих 2-х простых правил позволило уменьшить картинку в 5 раз!

Div в internet explorer - IE растягивается по высоте и не реагирует на значение параметра height

После установки font-size в 0 всё стало нормально!

Карты Гугл

Периодически приходится добавлять карту гугл на разные сайты, и каждый раз заново вспоминаю как это делать. Эта ситуация мне надоела, здесь попытаюсь описать порядок действий:
1. Получить ключ карты google для Вашего сайта: получить ключ карты
2. Идем в документацию документация по api карт

Позиционирование слоя поверх flash

Для тех кто хочет расположить html элемент поверх flash: Никакие position:absolute с z-index не помогают. Чтобы решить вопрос, необходимо поставить параметр wmode со значением transparent в код вставки flash: <embed wmode="transparent" ...

JavaScript

Программно вызвать события элементов HTML с помощью javascript

Существует два варианта программного вызова события. Рассмотрим программную инициацию события на примере события onchange для элемента input с type="text". Почему выбрано событие onchange в качестве примера. Дело в том, что если Вы установите значение в например текстовый input программно, то событие onchange не вызовется. Тем не менее, часто важно, чтобы событие отработало вне зависимости от того, как было изменено значение элемента.

Для примера допустим что у нас есть такой html элемент:

Способ вызвать событие программно 1

Просто вызовем onchange у нашего контрола:
var el = getElementById('my1');
el.onchange();

Способ вызвать событие программно 2

Второй способ чуть сложнее. Причина почему и когда нужно использовать именно второй вариант пока для себя не уяснил. Вероятно это связано с тем, что на событие могут быть "подписаны" несколько функций, и тогда второй вариант более корректен.

//напишем функцию которая будет заниматься инициацией события:

function fireEvent(el,event)
{
	//on IE
	if(el.fireEvent)
		el.fireEvent('on'+event);
	else
	{//On Gecko based browsers
		if(document.createEvent)
		{
			var evt = document.createEvent('HTMLEvents');
			if(evt.initEvent)
			{
				evt.initEvent(event, true, true);
			}
			if(el.dispatchEvent)
			{
				el.dispatchEvent(evt);
			}
		}		
	}
}
//теперь воспользуемся написанной функцией:
var el = getElementById('my1');
fireEvent(el, 'change');
Обратите внимание! в качестве события, которое нужно вызвать, передаем "change", т.е. без приставки "on" !

У меня работали оба способа программного вызова события, причем как в IE (InternetExplorer 6) так и в Mozilla Firefox (проверял на третьей версии)

DOM модель. Справочник

DOM модель. Справочник