Поиск по этому блогу

суббота, 17 марта 2012 г.

Детектирование Apple Safari 5.1.1 useragent с помощью jquery и javascript


Строка user-agent Safari от Apple выглядит так:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22

function checkSafariVersion(version) {
    $.browser.chrome = $.browser.webkit && !!window.chrome;
    $.browser.safari = $.browser.webkit && !window.chrome;
    if ($.browser.safari && navigator.userAgent.match(/Version\/(.*\s)/)[1].trim() < version) {
        alert('Update your Safari');
    }
    return;
}

checkSafariVersion('5.1.2');


Простой nginx+php+windows без всякой хни

1. Установка nginx

Качаем с http://nginx.org/ru/download.html последнюю версию
Распаковываем в удобное место.

2. Создаём батник для запуска

cd c:\www\_servers\nginx\
start nginx
c:\www\_servers\xampp\php\php-cgi.exe -b 127.0.0.1:9000 -c c:\www\_servers\xampp\php\php.ini
exit

(php-cgi.exe устанавливается вместе с php, я использовал php от xampp, апач которого предварительно прибил в службах и запретил ему запускаться)

3. Конфиг nginx.conf


worker_processes 1;

events {
    worker_connections 1024;
}


http {
    include mime.types;
    default_type application/octet-stream;

    sendfile on;

    keepalive_timeout 65;

    server {
        listen 80;
        server_name localhost;
        location / {
            root html;
            index index.html index.htm;
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }

    server {
        listen 80;
        server_name test.local;
        index index.html index.php;
        root c:/www/_!sites/test.local/;
        location ~ \.php$ {
            root c:/www/_!sites/test.local/;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME c:/www/_!sites/test.local/$fastcgi_script_name;
            include fastcgi_params;
        }
    }
}

4. Запуск службой

Я использовал для этих целей плагин для total commander под названиием Services (локальные службы). В качестве запускаемого приложения указал вышеупомянутый батник.

В переменную окружения записываем PHP_FCGI_MAX_REQUESTS со значением 0 (это для того, чтобы fcgi не отваливался по достижению максимального количества запросов)

В принципе, этого достаточно для запуска web-сервера nginx на вашем windows-"box".


суббота, 11 февраля 2012 г.

Complete property Internet Explorer

Оказывается, всеми горячо "любимый" браузер Internet Explorer (речь идёт о 9-й версии сего детища браузеростроения) как всегда, по-своему обрабатывает свойство complete DOM-элемента image (попросту - картинки).

Если просто размещать картинки и прикольные фотки на странице, то ничего страшного в этом нет, ты никогда об этом даже не узнаешь.

Но мы (корейские пионеры), создаём интерактивные приложения на html canvas, поэтому сей баг здорово подпортил нам кровь. Дело в том, что некоторые библиотеки (в частности, jcanvas) используют это свойство в своих функциях.

К счастью, решение проблемы существует в виде плагина к jQuery под названием $.fn.imagesLoaded jQuery plugin.
Пример использования:

$(imagesContainer).imagesLoaded(function(){
        делаем свои дела ;
});

imagesContainer  -  контейнер, в который загружаются картинки.

Вот и всё. Всем удачи.

четверг, 9 февраля 2012 г.

Виртуальные хосты. Апач на коленке за 5 секунд.


 Добавь в httpd.conf :


LoadModule vhost_alias_module modules/mod_vhost_alias.so 
# Virtual hosts
Include "conf/extra/httpd-vhosts.conf"

Потом в conf/extra/httpd-vhosts.conf напиши:

#задаем настройки директорий вебсервера по дефолту
<Directory "c:/www/_!sites/">
Options
ExecCGI 
Indexes 
FollowSymLinks 
MultiViews
AllowOverride all
Order Allow,Deny
Allow from all
</Directory>
#приказываем апачке различать хосты по имени и слушать все ип адреса машины
NameVirtualHost *:80
#задаем автоматическое подключение виртуальных хостов по их имени
<VirtualHost _default_:80>
VirtualDocumentRoot c:/www/_!sites/%0/
ScriptAlias /cgi-bin/ "cgi-bin/"
</VirtualHost>

Всё. Вместо c:/www/_!sites/ - путь к каталогу, где у тебя будут лежать каталоги с сайтами.

Вопросы?

суббота, 3 декабря 2011 г.

Improving font rendering on Ubuntu
I did not like the default font rendering in Ubuntu.

I found a patch to freetype2, that gives you a lot more flexibility over the font rendering, and does a decent job mimicking the rendering in OSX or Windows.

I found instructions here.
The remainder of this post is copy and paste:
 - Download freetype 2.4.8 from freetype.org and unzip it somewhere.
- Download the infinality .tar.gz file, and unzip it somewhere.
- cd to the freetype-2.4.8 directory from a terminal and run these commands (edit the paths to match where you unzipped): 
patch -p1 < /path/to/your/extracted/files/freetype-add-subpixel-hinting-infinality-20111117-1.patch 
patch -p1 < /path/to/your/extracted/files/freetype-enable-subpixel-hinting-infinality-20100909-1.patch
patch -p1 < /path/to/your/extracted/files/freetype-entire-infinality-patchset-20111117-1.patch
./configure
make
sudo mkdir /usr/lib/freetype-infinality/ sudo
find . -name libfreetype.so.6.8.0 -exec mv {} /usr/lib/freetype-infinality/ \;
cd /usr/lib/freetype-infinality ln -s libfreetype.so.6.8.0 libfreetype.so.6
Then look at the README file for instructions on where to put the configuration files.

http://blog.adamdklein.com/?cat=17

вторник, 29 марта 2011 г.

Создание сертификатов клиента для OpenVPN

newcert.sh
Вызывается: newcert.sh имя_сертификата

#!/usr/local/bin/bash
cd /usr/local/etc/openvpn/scripts
export KEY_CONFIG="/usr/local/etc/openvpn/scripts/openssl.cnf"
export KEY_DIR="/usr/local/etc/openvpn/scripts/keys" # Каталог, в котором создаются ключи
export KEY_SIZE=1024 # Длина ключа
export KEY_COUNTRY="RU"
export KEY_PROVINCE="RU" # Значение должно совпадать со значением в CA сервера
export KEY_CITY="Your_city" # Значение должно совпадать со значением в CA сервера
export KEY_ORG="Your_company" # Значение должно совпадать со значением в CA сервера
export KEY_EMAIL="mail@mail.ru"
cd /usr/local/etc/openvpn/scripts
export NEWKEY_NAME=$1 # Будет содержать имя последнего созданного сертификата
./build-key $NEWKEY_NAME # Создание сертификатов
echo $NEWKEY_NAME

if [ ! -d /usr/local/etc/openvpn/clients/$NEWKEY_NAME ]; then
mkdir /usr/local/etc/openvpn/clients/$NEWKEY_NAME
else echo "Каталог существует";
fi

cp $KEY_DIR/ca.crt /usr/local/etc/openvpn/clients/$NEWKEY_NAME/
cp $KEY_DIR/$NEWKEY_NAME.* /usr/local/etc/openvpn/clients/$NEWKEY_NAME/ # Копируем все сертификаты в каталог с именем клиента для последующей выдачи ему.
ls -la /usr/local/etc/openvpn/clients/$NEWKEY_NAME # Любуемся



openssl.cnf

HOME = .
RANDFILE = $ENV::HOME/.rnd
oid_section = new_oids
[ new_oids ]
####################################################################
[ ca ]
default_ca = CA_default # The default ca section
####################################################################
[ CA_default ]
dir = $ENV::KEY_DIR # Where everything is kept
certs = $dir # Where the issued certs are kept
crl_dir = $dir # Where the issued crl are kept
database = $dir/index.txt # database index file.
new_certs_dir = $dir # default place for new certs.
certificate = $dir/ca.crt # The CA certificate
serial = $dir/serial # The current serial number
crl = $dir/crl.pem # The current CRL
private_key = $dir/ca.key # The private key
RANDFILE = $dir/.rand # private random number file
x509_extensions = usr_cert # The extentions to add to the cert
default_days = 3650 # how long to certify for
default_crl_days= 30 # how long before next CRL
default_md = md5 # which md to use.
preserve = no # keep passed DN ordering
policy = policy_match
# For the CA policy
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
####################################################################
[ req ]
default_bits = $ENV::KEY_SIZE
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = v3_ca # The extentions to add to the self signed cert
string_mask = nombstr
# req_extensions = v3_req # The extensions to add to a certificate request
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = $ENV::KEY_COUNTRY
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = $ENV::KEY_PROVINCE
localityName = Locality Name (eg, city)
localityName_default = $ENV::KEY_CITY
0.organizationName = Organization Name (eg, company)
0.organizationName_default = $ENV::KEY_ORG
organizationalUnitName = Organizational Unit Name (eg, section)
#organizationalUnitName_default =
commonName = Common Name (eg, your name or your server\'s hostname)
commonName_max = 64
emailAddress = Email Address
emailAddress_default = $ENV::KEY_EMAIL
emailAddress_max = 40
# SET-ex3 = SET extension number 3
[ req_attributes ]
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20
unstructuredName = An optional company name
[ usr_cert ]
basicConstraints=CA:FALSE
nsComment = "OpenSSL Generated Certificate"
# PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer:always
[ server ]
# JY ADDED -- Make a cert with nsCertType set to "server"
basicConstraints=CA:FALSE
nsCertType = server
nsComment = "OpenSSL Generated Server Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer:always
[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
basicConstraints = CA:true
[ crl_ext ]
authorityKeyIdentifier=keyid:always,issuer:always

В принципе, всё по дефолту.

четверг, 18 ноября 2010 г.

Доступ к sshd2 посредством putty и ppk (public key)

Вчера весь день посвятил настройке доступа по ключу, долго не мог добиться, чтобы сервер принял ключ. В интернете масса статей и гайдов по настройке ssh1, но! Мы, корейские пионеры не ищем лёгких путей и у нас запущен и работает sshd2 и возврата к первой версии не предвидится.
Дело в том, что процедура настройки немного, но отличается в ssh1 и ssh2. Итак, к делу.
1. На сервере, под учёткой простого смертного:
cd ~/.ssh2
rm ./*
(Это, конечно, не обязательно, просто чтобы не путаться после предыдущих неудачных экспериментов).
ssh-keygen2 # Вот именно, 2! Passphrase я делал пустую, иначе он будет её запрашивать каждый раз, а мы как раз от этого и хотим уйти.
Создадутся два (а точнее 3, но нас интересуют только 2) файлика вида id_xxx_xxxх_х и id_xxx_xxxх_х.pub, по расширению понимаем, что это за ключи, какой из них какой.
echo 'Key id_xxx_xxxx_x.pub' >> ./authorization (по умолчанию такой файл ищет демон в папке пользователя)
Вот в этом и состоит главное отличие в настройке ssh2 от ssh1 (в рамках топика) - формат и название этого файла (authorization, а не athorized_keys как раньше, хотя назвать его можно как угодно, главное - не забыть сообщить об этом серверу в конфиге, по умолчанию он authorization).
Итого, имеем 4 файла в ~/.ssh2/: authorization, 2 ключа и random_seed. Всё, этого достаточно.
chmod 0600 ./*
chmod 0700 ./

2. Копируем приватный ключ на машину с виндой, туда, где putty
На машине с putty проделываем следующее:
3. Находим где-нибудь puttygen.exe
4. В него загружаем приватный ключ (делаем импорт).
5. Сохраняем приватный ключ (с расширением ppk), публичный нам не нужен и серверу он тоже не нужен, поэтому не сохраняем публичный ключ.
Вроде всё. Настраиваем в putty автоввод имени пользователя, чей ключ мы импортировали, подцепляем свежеиспечённый .ppk и радуемся.
Я ещё до кучи для пущей крутизны отключил доступ по логину и паролю на сервере, поэтому зайти теперь удалённо могу только я со своим ключом.

Для не-виндовс клиентов действия следующие:
На клиенте делаем
cd ~/.ssh2/
ssh-keygen2 (можно указать -t, но меня вполне устраивают 2048 битные dsa-ключи)
echo "IdKey id_xxx_xxxx_x.pub" >> ./identification

С клиентом пока всё.
Копируем id_xxx_xxxx_x.pub на сервер, в каталог .ssh2 того пользователя, от имени которого будем осуществлять вход. Я делал с сервера: scp2 -l username -P port remote_host:/home/username/.ssh2/key.pub ~/.ssh2/ Разумеется, remote_host (в данном контексте - клиентская машина), port и username у каждого в жизни свои.
Далее, на сервере:
cd ~/.ssh2
echo "key id_xxx_xxxx_x.pub" >> ./authorization

На сервере всё.
Подключаемся с клиента: ssh2 -l username remote_host

Итожим:
1. создать на клиенте пару ключей
2. отправить public key на сервер
3. прописать полученный public key на сервере в файле ~/.ssh2/authorization
4. прописать private и public key на клиенте в файле ~/.ssh2/identification или, если putty, то добавить его в Connection -> SSH -> Auth