• 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: , , , , , ,

  • 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:

  • 22May

    Сегодня таки добил эту тему, наконец-то. Короче сейчас еще как всегда куча работы, поэтому пока память еще свежа выкидываю все, что нашел.

    начнем с перла.


    #!/usr/bin/perl -C

    это из perldoc почитаете, позволяет автоматом кодировать СТД потоки.

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

    upgrade, downgrade добавляет или убирает утфный флаг

    encode, decode кодирование и декодирования текста

    is_utf8 проверяет, является ли стринг – утфным.

    далее от перла перемещаемся к DBI, а именно к DBD::mysql

    вот такая у меня сейчас функция коннекта:


    sub init_dbh{
    my $self = shift;
    my $dbh = DBI->connect_cached("DBI:mysql:database=conveyor;host=127.0.0.1", 'root', '',{AutoCommit => 1, RaiseError=> 1, PrintError =>0});
    $dbh->{'mysql_auto_reconnect'} = 1;
    $dbh->{'mysql_enable_utf8'} = 1;
    $dbh->do('SET NAMES utf8');
    return $dbh;
    }

    я думаю тут и так все без слов понятно. Если что, по ссылке выше все это мона почитать.

    ну и наконец-то мускул.

    в конфиге устанавливаем все кодировки, все возможные и невозможные:


    [client]
    default-character-set=utf8
    [mysqld]
    collation_server=utf8_unicode_ci
    character_set_server=utf8
    default-character-set=utf8

    далее, заходим через консоль в бд., вводим “status”, все должно быть утф:

    Server characterset: utf8
    Db characterset: utf8
    Client characterset: utf8
    Conn. characterset: utf8

    если в базе не утф, то
    ALTER DATABASE database_name CHARACTER SET utf8;
    каждую таблицу проверяем:
    SHOW CREATE TABLE table_name;
    если чарсет не утф, то
    ALTER TABLE table_name CONVERT TO CHARACTER SET utf8;
    кодировки могут быть индивидуально установленны у полей, их также необходимо менять
    ALTER TABLE table_name MODIFY column_name VARCHAR(255) CHARACTER SET utf8;

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

    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:

  • 20May

    Итого, что я слышал, и что мне понравилось на YAPC::Russia .

    Профилирование перл кода. В принципе все модули, о которых рассказывалось – все хорошо документированы.

    Devel::DProf

    Devel::Profiler

    Devel::DProfLB

    (в принципе все они равносильны, необходимо поочередно выбирать, кого лучше юзать)

    Devel::DProfPP – необходим для парсинга исходящих данных от профайлера

    Devel::SmallProf

    Devel::FastProf

    Devel::NYTProf

    (перл инлайн профайлеры)

    DBI::Profile

    DBIx::Profile

    (профайлинг DBI)

    Дальше буду тестить, вводить в свои проэкты. О результата буду рассказывать позже.

    про ПОЕ был доклад хороший, быренько пробежались по всем аспектам.

    Для себя запомнил:

    POE::XS::Queue::Array

    Надо потестить, попробовать. Модуль работает с очередью задач.

    Стандарты кодирования. И сразу ссылка автора.

    http://www.reg.ru/coding_standards

    По модулям:

    Perl::Critic

    Module::Starter::PBP – также из рекомендаций из «Perl Best Practices»

    App::perlstyle

    http://perldoc.perl.org/perlstyle.html – на перлдоке

    http://perltidy.sourceforge.net/ – тулса для очистки “perltidy pbp

    Другие о япси:

    http://www.insight-it.ru/life/yapcrussia-2008-may-perl/

    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.: перехал на диску...
  • за опечатку - спасибо...