22 April 2012

json_encode и кириллица

В PHP 5.4 наконец-то починили кириллицу в json_encode:

$ php -a
Interactive shell

php > var_dump(json_encode('мама мыла раму'));
string(76) ""\u043c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443""
php > var_dump(json_encode('мама мыла раму', JSON_UNESCAPED_UNICODE));
string(28) ""мама мыла раму""

Хотя бы так.

8 January 2012

Debian, SSL

В продолжение темы.

Чтобы установить свой самопальный корневой сертификат на Debian-машину, нужно:

  1. Положить корневой сертификат (webdev.crt, к примеру) в /usr/local/share/ca-certificates;
  2. Выполнить update-ca-certificates.

После этого можно спокойно делать openssl verify certificate.crt на каком-нибудь подписанном нами клиентском сертификате. Вывод должен быть таким:

$ openssl verify certificate.crt 
certificate.crt: OK

23 September 2011

doctrine-fixtures Issue

Есть в doctrine-fixtures одна проблема... И никак её не порешают ведь :(

Для себя временно рещил вопрос таким образом (для проекта на Symfony 2):

$ echo 'SET GLOBAL foreign_key_checks = 0;' | mysql
$ sudo -u www-data php /srv/www/project/app/console --env=prod doctrine:fixture:load
$ echo 'SET GLOBAL foreign_key_checks = 1;' | mysql

6 September 2011

Шпаргалка по SSL-сертификатам

Создание ключа:

openssl genrsa 2048 > /etc/ssl/private/test.com.key

Создание самоподписанного сертификата:

openssl req -new -key /etc/ssl/private/test.com.key -x509 -days 3650 -out /etc/ssl/certs/test.com.pem

Создание запроса на выпуск сертификата (для отправки в центр сертификации):

openssl req -new -key /etc/ssl/private/test.com.key -out test.com.csr

А так же подпись CSR (для самопального CA, первый запуск):

openssl x509 -req -days 3650 -in test.com.csr -CA /etc/ssl/certs/ca.pem -CAkey /etc/ssl/private/ca.key -CAcreateserial -out /etc/ssl/certs/test.com.pem

P.S. Просмотр информации о сертификате:

openssl x509 -noout -in test.com.pem -issuer -subject -dates

26 August 2011

Doctrine 2 — дата и время

Столкнулся с проблемой использования типа datetime из Doctrine 2 и MySQL. Точнее, вот с чем: для временных меток я, естественно, хотел использовать MySQL'овский TIMESTAMP, который поддерживает временные зоны и хранит всё правильным образом. Но в Doctrine 2 datetime идёт в MySQL только как DATETIME, т.е. поддержки TIMESTAMP вообще нет.

И тут я стал думать :)

Сначала, естественно, о том, как вкрячить TIMESTAMP. И меня очень удивило, почему никто этого до сих пор не сделал.

А потом я подумал (не без помощи @magazoll) в другом направлении. Ведь база должна быть тупым хранилищем (в нашем случае). Почему бы тогда просто не хранить в БД тот же DATETIME, только время там держать в UTC+0. Т.е. в модели держать время в UTC+0. А уже при выводе или другой обработке конвертить в правильную зону, которая у пользователя.

Обосрите вариант.

25 July 2011

habrahabr.ru/blogs/pm/124716: «ScrumMaster ни в коем случае не должен стать «чугунной крышкой», ограничивающей сверху интеллектуальные порывы членов команды — стоит ему хоть раз поспорить с коллегами на тему, в которой он не является сведущим, напомнив, что он их менеджер — и до конца дней за ним закрепится ярлык «тупого ублюдка».

anotherpm.com/blog/?p=1462: «Если команда «зажала» Архитектора со всех сторон критикой, то единственный выход для него – защищать свою позицию, даже если это противоречит логике! В противном случае он будет унижен и раздавлен, а его последующие решения будут сразу же восприниматься критически».

Интересно.

18 March 2011

Format XML in CLI

$ xmllint --format file.xml
$ curl http://test.com/some.xml | xmllint --format -

7 March 2011

Создаём линии и полигоны с Google Maps API 3

Печаль берёт, когда понимаешь, что “рисовательные” функции в новом API ещё не сделаны.

Из достойных нашёл библиотеку от некоего ryshkin@gmail.com. Самый близкий по внешнему виду аналог того, что было во второй версии API.

P.S. Да, если вам не безразлична эта функциональность в официальном API, голосуйте за feature request (просто нажмите на звёздочку).

5 March 2011

Центрирование карты на объект в Google Maps

Похоже, блог всё больше приобретает формат заметок для самого себя :)

Ну да ладно, меньше слов, больше дела. Будет ещё время для больших народных статей.

Итак, центрирование карты на объекте в Google Maps.

  1. Высчитываем квадрат, который охватывает весь объект, который нам нужно уместить в «кадр».
    coords = [
        ['44.836928293404', '46.59780563343'],
        ['47.51399816684',  '50.46499313343'],
        ['46.222172331891', '54.15639938343'],
        ['42.45238909074',  '52.88198532093'],
        ['38.475682580589', '54.42007125843'],
        ['36.452822092303', '54.72768844593'],
        ['36.558791335468', '50.24526657093'],
        ['38.337937018032', '47.82827438343'],
        ['41.108896157766', '49.67397750843']
    ];
    
    bounds = new google.maps.LatLngBounds();
    for (i in coords) {
        bounds.extend(new google.maps.LatLng(coords[i][0], coords[i][1]));
    }
    
  2. Наводим «кадр» на этот квадрат :)
    map.fitBounds(bounds);
    

;)

15 February 2011

Some Useful *nix Commands

Find files for some action (echo in this example) in current directory and all subdirectories:

$ find . -name '*.php' | while read file; do echo $file; done

Expand tabs to spaces (tab = 4 spaces):

$ expand -t 4 FILE > FILE.new && mv FILE.new FILE

And remove trailing whitespaces:

$ sed -i 's/[ \t]*$//g' FILE

4 February 2011

MySQL Tables Sizes

SELECT table_name, round(((data_length + index_length) / (1024*1024)), 2) AS "Size (MiB)" FROM information_schema.tables WHERE table_schema = "your_schema_name";

1 February 2011

cURL for Debugging

Only HTTP headers:

$ curl -I http://example.com/

And basic HTTP authentication:

$ curl -u user:password http://example.com/

7 January 2011

16 December 2010

Ошибки БД через исключения

«Ошибки БД через исключения» в блогах Битрикса. Читаем и не забываем.

14 December 2010

76 ^_^

P.S. Ладно, ладно, чуток пользовался докой, но только в тех случаях, когда я реально знал, где искать.

6 December 2010

LDAPer 1.1.0

LDAPer 1.1.0 — таки выпустил новую версию, которая не валится при отсутствии PEAR::Net_LDAP2 и поодерживает группы по умолчанию для LDAP-пользователей :)

P.S. capall.shockov.com — для жадных ;)

5 December 2010

Локальный PEAR-репозиторий

Зачем же может потребоваться локальная установка PEAR-репозитория? Сходу — для тестирования новой версии пакета на какой-то одном сайте. Благая цель, по-моему :)

А сам процесс установки, собственно, уже описан на официальном сайте ;)

31 October 2010

No comments

ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS

Настройка wildcard'а в домене в BIND и nginx

Опять из серии «чтобы не забыть» :)

Итак, как настроить это дело в BIND'e (в файле зоны):

...
*.server.com.    A    IP
...

где вместо IP, собственно, IP-адрес.

И в nginx'e:

server {
    ...
    server_name    server.com *.server.com;
    ...
}

Вуаля!

P.S. Да, ещё хочется в будущем ловить не только пользовательские поддомены основного сайта, но и произвольные домены пользователей. Решением, кроме как listen 80 default; в nginx, пока не нашёл...

26 October 2010

Анализ производительности FreeBSD-сервера

Небольшая шпаргалка, больше для себя.

Аналог iotop (на FreeBSD его нет):

$> top -m io -o total

Загруженность жёстких дисков:

$> gstat

И ссылка на хорошую презентацию про это дело: Help! My system is slow!.