• 22Oct

    Исходный материал – это Fedora Core 6 ( но и на 8ой я тестил – работает) и MSSQL 2000

    Сразу скажу, что в перле нет DBD::MSSQL, лично у меня – это сразу паника. Ну ничего. Есть такая умная штука как ODBC (Open DataBase Connectivity) она была создана именно для того, чтоб универсализировать доступ к различным типам баз данных, и по сути из себя представляет интерфейс. Я когда в буйной молодости кодил под винду, то сталкивался с этим, но тогда особо не заморачивался на тему «что оно такое?», и «как работает?». Так вот в линуксе есть подобная штука. Называется она unixODBC. ЕЕ и ставим.

    Устанавливаем unixODBC.

    1. yum install unixODBC.i386

    Единственная проблема, что стандартные сошники есть только для MySQL и PostgreSQL. А на официальном сайте я нашел драйвер для Microsoft SQL Server – он прям там красуется на первом месте, но не могет не смущать надпись «Download free trial from…»

    В этом случае спасает FreeTDS – это и есть те самые библиотеки для общения с Microsoft SQL Server и Sybase. И с ним тоже при установке не должно быть никаких проблем.

    1. yum install freetds.i386

    Не забываем поставить модуль для DBI.

    1. cpan DBD::ODBC

    дальше добавляем конфиг

    в файл /etc/odbcinst.ini

    1. [MyServer2k]
    2. Driver = /usr/lib/libtdsodbc.so

    На этом конфигурация закончена. В перле это происходит так:

    1. my $dbh2 = DBI->connect("DBI:ODBC:DRIVER={MyServer2k};Server=10.1.1.1;Database=MSSQL_DB_NAME;Uid=DB_USER_NAME;Pwd=DB_PASSWORD", ' DB_USER_NAME', 'DB_PASSWORD',{AutoCommit => 1, RaiseError=> 1, PrintError =>0});
    Share and Enjoy:
    • Facebook
    • LinkedIn
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , , , , ,

  • 15Oct

    Меня тут долго не было… Ремонт… Новая работа… Кучу всего свалилось… Даже за сервак забыл заплатит. Так что спасибо Гугу, напомнил.

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

    Кроме того, что мы хотим узнать, что текущий пользователь на сайте авторизуется через OpenID. Мы хотим его авторизовать по всем правилам Django. И чтобы авторизированный пользователь через OpenID был таким же как и через стандартную Django авторизацию. Т.е. попробуем прижить вместе несколько авторизаций.

    Через массив бекендов у меня так и не получилось. Т.к. я хотел, чтоб у них был общий айдишник, и чтоб хранились они в общей таблице. Поэтому я просто расширил базовую авторизацию дополнительным функционалом. В последствии даже попробовал установить openid к уже рабочему проекту.

    Для определения, к какой авторизации принадлежит я пользователя привязывал к группе. Название группы, к которой я привязывал пользователя можно положить в настройки проекта OPENID_GROUP по умолчанию это значение OpenID.

    Код и условия далеко не идеальны, так что с удовольствием выслушаю конструктивную критику и предложения по изменению.

    Сначала опишу процесс установки. На готовое, живое приложение.

    1. Распаковываем файлы из архива в любую папку вашего проекта. К примеру в openidconsumer.
    2. В установленные приложения проекта (INSTALLED_APPS) устанавливаем новое ‘openidconsumer’
    3. Заменяем бекенд авторизации на наш наследник от базавого.

    1. AUTHENTICATION_BACKENDS = ('django_openidconsumer.exauth.TypedModelBackend',)

    4. В файле settings.py установим имя группы, которое будет определять, что пользователь авторизируется через OpenID. OPENID_GROUP = ‘openid_auth’;
    5. Делаем инсерт в таблицу групп . По умолчанию у нее значение auth_group.

    1. INSERT INTO auth_group(name) VALUES (‘openid_auth’);

    6. В урлсы проекта urls.py прописываем урл, с которого будет проходить авторизация.

    1. (r'^openid/',include('openidconsumer.urls'),{'on_success':vm.init_openid}),

    Параметром on_success – мы указываем какая функция будет вызвана в случае удачной авторизации.
    7. Пишем обработчик этой функции:

    1. from openidconsumer import exauth
    2. from django.http import HttpResponseRedirect
    3.  
    4. def init_openid(request,identity_url, openid_response,*args,**kwargs):
    5.     if exauth.openid_login_first(request,identity_url, openid_response):
    6.         return HttpResponseRedirect('/edit_profile/');
    7.     return HttpResponseRedirect('/');

    тут все просто – либо идет редирект на /edit_profile/, в случае если пользователь зашел под своим OpenID url впервые , либо перебрасываем на главную

    Если вы обратили внимание, то я убрал мидвере класс из предыдущего описания. В принципе там была передача в объект реквеста параметра OpenID. Я же ее добавил в объект юзера.

    В принципе в зависимости от предыдущего описание модуля для работы с OpenID. Добавился файл exauth.py в котором и происходит расширение возможностей базавой авторизации и добавлены некоторые полезные функции.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , ,

  • 19Jul

    что мне надо от логов:
    1) конешно выводить точку запуска + время в каждом запускаемом логе + дополнительная инфа, как правило у разных проектов она разная.
    2) выводить не только сроку, но и более сложную структуру.
    3) разные функции для логов ( info, error, debug,trace) чтоб на внешнем серваке отказываться от определенных из них, причем делать этот без потери скорости.

    sub _log{
    my ($self,$type,$text,$cl) = @_;
    my @tt = localtime;
    my ($pack,$filename,$line) = caller(1);
    my ($topack,$tofile,$toline) = caller($cl) if($cl);
    $line = "($type)".POSIX::strftime("%d,%h %H:%M:%S",localtime)." $filename($line) ";
    if($cl){
    my ($topack,$tofile,$toline) = caller($cl) ;
    $line.= "{$tofile($toline)}";
    }
    # тут линию можно дополнить своими
    open my $fh,'>>'.MyProject::Conf::LOGFILE;
    print $fh $line.$text."\n";
    close $fh;
    }
    
    my $alog = MyProject::Conf::LOGS;
    my $clog = MyProject::Conf::CLOGS;
    
    no strict 'refs';
    
    foreach my $ll (@$alog){
    my $method = lc $ll;
    if(grep {$_ eq $ll} @$clog){
    *{$method} = sub{my $self = shift; $self->_log($ll,@_)};
    *{$method.'_dump'} = sub{my $self = shift; my $text = shift; my $data = shift; $self->_log($ll,$text.':'.Dumper($data),@_)}
    }else{
    *{$method} = sub{};
    *{$method.'_dump'} = sub{};
    }
    }
    

    немного по коду… MyProject::Conf::LOGFILE – тут просто лежит абсолютный путь к файлу логов.
    MyProject::Conf::LOGS – тут лежит массив имен всех доступных логов, я использую ['INFO','DEBUG','DERROR','TRACE']
    MyProject::Conf::CLOGS – массив логов которые необходимо выводить. Так я сделал потому, что не в се используемые логи необходимо выводить в данном запуске проекта.

    цикл идущий после no strict ‘refs’;

    просто заполняет функции. имен всех функций переводятся в нижний регистр. + добавляется еще и функция dump, для info она будет info_dump, которая кроме передой строки, в лог еще запишет передаваемую структуру, выводимую с помощью Data::Dumper

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , ,

  • 13Jul

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

    Бока в перле вылазят во время конкатенации. Тут умные дятьки пишут, что

    Конкатенация строки, имеющей флаг UTF-8, со строкой, у которой этот флаг снят, приводит к автоматическому преобразованию строки без флага. При этом Perl исходит из того, что строка в кодировке “latin-1″ или той кодировке, которая установлена с помощью прагмы “encoding”.

    другие умные дятьки ( гдето в пермонксах) , что
    use encoding ':utf8';
    зло. Ну как зло… вобщем я точно не помню, надо порыться в монксах, но помоему глюк с аплоадом картинок начинается.. при определении размера…

    Еще есть use utf8 , все скаляры в исходниках считать утфными. Сначало пользовался этой фишкой, а потом необходимость отпала.
    Вобщем закончелось все тем, что я написал “типокостыль”, для снятия со структуры утфного флага, потомучто XML::Simple вообще его везде растовляет, а для меня это критично.

    Вобщем собственно типс:

    sub _utf8_off_all{
    my $self = shift;
    my $ref = shift;
    my $rr = ref($ref);
    if($rr){
    if($rr eq 'ARRAY'){
    for(my $i=0;$i<@$ref;$i++){
    $ref->[$i] = $self->_utf8_off_all($ref->[$i])
    }
    }elsif($rr eq 'HASH'){
    foreach my $k (keys %$ref){
    if(Encode::is_utf8($k)){
    Encode::_utf8_off($k);
    }
    $ref->{$k} = $self->_utf8_off_all($ref->{$k});
    }
    }else{
    die 'UNKNOWN REF in encodeall';
    }
    }else{
    if(Encode::is_utf8($ref)){
    Encode::_utf8_off($ref);
    }
    }
    return $ref;
    }

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , ,

  • 01Jul

    я даже и не вспомню, почему я решил назвать “tips” этот раздел, наверно гдето слыхал.

    О… только что прогулил, оказалось, что это “советы”. Хм.. советы конечно это круто, слишком круто для этого раздела. Просто прикольные вещички, до которых я сразу бы не догодался.

    может просто маленькие примерчики кода.

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

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags:

   

Recent Posts

Recent Comments

  • Я просто оставлю это тут: ...
  • спасибо...
  • Если вдуматься в каждое слово, то время беСконечно в русском...
  • Спасибо, Евгений, исправленно.P.S.: перехал на диску...
  • за опечатку - спасибо...