Архив / разработка

RSS лента

Аналог strtotime в Java

На работе пишем новый проект, который перевернёт мир рекламы. Проект пишем на Java. Почему на Java? Хуй его знает. Без меня решили. Пишем, так пишем. Значит надо учить Java. Язык хороший, мощный. Немного смущает строгая типизация и линейное мышление, привитое php.

А ещё иногда очень не хватает простых функций вроде strtotime.

Для форматирования даты в нужный формат в php требуется 2 функции: strtotime и date.

date('Y-m-d', strtotime('дата в любом формате'));

В Java всё немного иначе.

// Создаём объект SimpleDateFormat для даты из которой будем форматировать. Дата должна быть указанного формата.
SimpleDateFormat dateSourceObject = new SimpleDateFormat("dd.MM.yyyy");

// Создаём объект SimpleDateFormat для даты в которую будем форматировать.
SimpleDateFormat dateResultObject = new SimpleDateFormat("yyyy-MM-dd");

// Форматируем дату
dateResultObject.format(dateSourceObject.parse('дата в формате dd.MM.yyyy'));

Плюсы в Java:

  • Строгая типизация
  • ООП
  • Java это круто

Плюсы в php: просто и быстро

Для преверженцев ООП есть вариант и в php:

$date = DateTime::createFromFormat('j-M-Y', '15-Feb-2009');
echo $date->format('Y-m-d');


Правда здесь необходимо указать формат даты, из которой будем форматировать.

Резервное копирование БД

Понадобилось создавать резервную копию базы. Но дамп надо было хранить на другой машине, недоступной из сети. Т.к. база занимает более 80Gb и постоянно растёт каждую таблицу необходимо было поместить в отдельный файл для случаев, если необходимо восстановить данные одной таблицы.

Для этого был написан такой скрипт на sh:

#!/bin/sh

DATE=`date -d "yesterday" +"%Y-%m-%d"`
DIR=%backups path%

HOSTUSER=%ssh user name%
HOSTNAME=%ssh host%

DBBASE=%database name%
DBUSER=%database user%
DBPASS=%database password%

echo "Create dir $DIR$DATE"
mkdir -p $DIR$DATE

for TABLE in $(ssh -p 222 $HOSTUSER@$HOSTNAME -C "mysql -B -s -u$DBUSER -p$DBPASS $DBBASE -e 'show tables'")
do
    echo "Create dump for table $TABLE"
	ssh -p 222 $HOSTUSER@$HOSTNAME -C "mysqldump -u$DBUSER -p$DBPASS $DBBASE $TABLE | gzip -c" > $DIR$DATE/$TABLE.sql.gz
done

echo "Create full archive"
tar -czvf $DIR/$DATE.sql.tar.gz $DIR$DATE

echo "Remove dir $DIR$DATE"
rm -rf $DIR$DATE

echo "Finished"

Также скрипт можно взять на GitHub

Восстановление пароля PostgreSQL 9.1

1) Открываем файл /etc/postgresql/9.1/main/pg_hba.conf
2) Находим сточку local all postgres peer
3) Меняем на local all postgres trust
4) Перезагружаем базу:

service postgresql reload

5) Логинимся в PostgreSQL без пароля:

psql -d template1 -U postgresql

6) Меняем пароль:

ALTER USER postgres WITH PASSWORD 'newpassword';

7) Возвращаем строчку на своё место local all postgres peer

Установка php 5.6 на CentOS 6.3

Чтобы поставить php 5.4 на CentOS необходимо подключить дополнительные репозитории:


rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-7.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

Теперь ставим php из репозитория remi:


yum --enablerepo=remi,remi-test install php php-common php-devel

И добавляем необходимые модули:


yum --enablerepo=remi,remi-test install php-pear php-pdo php-mysql php-gd php-mbstring php-mcrypt php-xml

Также будет полезно установить акселератор, например Alternative PHP Cache:


yum --enablerepo=remi,remi-test install php-pecl-apc

Nginx. Пароль на директорию

Для того, чтобы защитить директорию стандартной Basic авторизацией в конфигурацию виртуального сервера необходимо добавить блок location:

location /path/ {
	auth_basic "Unauthorized";
	auth_basic_user_file /path/to/.htpasswd;
}

Так как nginx отдаёт файлы, начинающиеся на точку (например .htaccess) необходимо закрыть доступ к таким файлам:

location ~ /\. {
	deny all;
	access_log off;
	log_not_found off;
}

Для генерации пароля можно использовать htpasswd:

$htpasswd -nd %username%

где %username% имя пользователя

Если не установлен apache можно воспользоваться php:

php -r 'echo crypt("password", "salt");'

где password — пароль, а salt — двухсимвольная (набор символов ./0-9A-Za-z) соль.

Google Analytics и ссылки с якорем

Для того, чтобы отслеживать ссылки с якорем в Google Analytics необходимо добавить параметры для отслеживания:

Традиционный код:

var pageTracker = _gat._getTracker("UA-XXXXX-X");
pageTracker._trackPageview(location.pathname + location.search + location.hash);

Асинхронный код:

_gaq.push(['_setAccount', 'UA-XXXXX-X']);
_gaq.push(['_trackPageview', location.pathname + location.search + location.hash]);

Изменение регистра символов

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

Написал такую функцию:

function lower($str, $charset='UTF-8')
{
	//	Разбиение строки.
	$tmp = explode(' ', $str);

	if (is_array($tmp) && 0 < ($count = count($tmp)))
	{
		for ($i=0;$i<$count;$i++)
		{
			/**
			 * Для определения кириллицы используется тождественное сравнивание,
			 *  т.к. ctype_upper работает некорректно.
			 * 
			 */
			if ($tmp[$i] !== mb_strtolower($tmp[$i], $charset))
			{
				$tmp[$i] = mb_convert_case(mb_strtolower($tmp[$i], $charset), MB_CASE_TITLE, $charset);
			}
		}
	}
	$str = implode(' ', $tmp);
	return $str;
}

Использовать можно так:

$str = 'Записки WEB-ПРОГРАММИСТА';
echo lower($str); // Записки Web-Программиста

Условия в if

В стандартах кодирования в разделе «форматирование блоков if then else» написано, что при сравнении константы необходимо ставить слева, т.е.

if (1 == $var)

Сегодня задумался по поводу сравнения с булевыми константами.
Как лучше писать

if (true === $var)

или использовать восклицательный знак (!)

if (!$var)

Загрузка файлов с помощью PHP и cURL

При написании приложения для работы с vkontakte.ru Ads API потребовалось загружать данные на их сервер.
С помощью cURL и PHP делается это так:

< ?php
$ch = curl_init();
// URL для обработки.
curl_setopt($ch, CURLOPT_URL, $url);
// Не отправлять заголовки в браузер
curl_setopt($ch, CURLOPT_HEADER, false);
// Название браузера.
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
// Возвращать содержимое.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Заголовки для запроса.
$headers = array(
	'Expect:',
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// Сообщаем, что это POST-запрос.
curl_setopt($ch, CURLOPT_POST, true);
// Данные POST-запроса.
$post = array(
	'file' => '@/home/izra/file.ext'
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

// Получение ответа.
$return = curl_exec($ch);
// Закрытие соединения.
curl_close($ch);
?>

Ads API vkontakte.ru

Vkontakte.ru выпустил в свет API для управления рекламными объявлениями. Конечно, выпустил он его давно, но Ads API до сих пор имеет статус beta.

Документация не особо объемная, но все же немного помогает. При разработке решений на базе их API проблемы возникли сразу же.
Читать полностью →