Показаны сообщения с ярлыком Разное. Показать все сообщения
Показаны сообщения с ярлыком Разное. Показать все сообщения

суббота, 19 марта 2011 г.

Опыт отказа от рекурсии. Happy end

Как оказалось, я был не прав по поводу того, что устранить потерю скорости не получится. При более внимательном рассмотрении увидел, что переменных класса CRegExp довольно таки много, а не одна. Соответственно им создавался отдельный стек. А это бага .... Ну ты лошара (с).

В общем после исправления этого момента потеря производительности стала незначительной. Так что Happy End

Попробовать изменения можно будет в новой версии плагина FarColorer 1.0.3.1

четверг, 17 марта 2011 г.

Опыт отказа от рекурсии

В интернете практически не освещена тема отказа от рекурсии в алгоритмах. Много статей и книг где рассказывается, что такое рекурсия, как ей пользоваться. Но вот как от неё избавится - почти ничего нет.

Итак, рекурсия - это вызов функцией самой себя. Всем известен алгоритм вычисления факториала, классика книг. Все красиво и элегантно, хоть циклом кажется и проще. А уж всевозможные алгоритмы анализа строки и работы с регулярными выражениями. Казалось бы, используй и радуйся.
Но не все так просто. Глубина рекурсии (как много раз функция может вызвать саму себя ) ограничена. Ограничена размером стека. Дело в том, что перед вызовом функцией самой себя, нужно сохранить значения всех локальных переменных, чтобы ими можно было воспользоваться после возвращения. А сохраняется это все в стек. И вот пока в стеке есть место, мы можем углубляться в рекурсию. Все глубже , глубже. Пока не выскочит ошибка - Stack overflow. И все , тушите свет.
Стандартная величина стека примерно 2 мб (для windows программ). Так давайте увеличим размер стека опциями компилятора, делов то. А на сколько увеличить, так чтобы было и не много и не мало? а если запросы растут со временем , постоянно перекомпилировать? А если у вас библиотека, которая использует стек вызвавшей её программы ? И вот тут то и понимаешь, что это не наш метод. Надо как то избавляться от рекурсии.
Вот с этим я и столкнулся в поддерживаемой мной библиотеке Colorer. Алгоритм разбора строки по регулярному выражению был рекурсивный. Так же был красив и пах. Но на длинных строках любил падать. Дай строку в 3000 символов и все, приехали. Надо было что то делать.
Единственным методом ликвидации рекурсии, который я нашел , это избавление от хвостовой рекурсии. Суть его в следующем - если рекурсивный вызов идет последним в функции, то функцию можно заменить на цикл. Факториал как раз является примером для этого.
Но у меня рекурсивных вызовов было очень много в функции. Часть можно было развернуть в цикл, но это совсем малая часть. Да и кстати, код был построен так, что в зависимости от результата вызова (функция возвращала bool значение) функция могла завершится или продолжить работу далее. А сама функция была циклом внутри которого switch.
Вот тут то приходит единственное оставшееся решение - а почему бы нам не воспроизвести рекурсивный вызов с помощью цикла и сохранения параметров? т.е. сделать это все вместо компилятора. Что нам для этого нужно:
  1. список локальных переменных, которые нужно сохранить.
  2. динамический список типа стека, в который мы будем сохранять значения локальных переменных, и извлекать от туда
  3. после-рекурсионные действия , или action (не знаю как назвать это лучше)
  4. цикл 
В начале остановимся на action. Каждый рекурсионный вызов в зависимости от результат приводил к return true, или return false, или return результат_функции, или к продолжению работы функции многими строками кода. Т.к. мы избавляемся от рекурсии в пользу цикла, то этот код нужно выполнить после завершения цикла для этого рекурсионного вызова. Т.е. когда цикл придет к return ... Потому все такие ситуации выделяем в один switch, присваивая  им свой код action.

Создаем функцию, которая сохраняет локальные переменные,а на их место задает новые (если есть параметры при вызове рекурсии). Как их сохранять, это отдельная песня. У меня было их мало, и я передавал их по ссылке.  Помимо переменных нужно сохранить и действие (action) которое нужно сделать в зависимости от результат функции. Эта функция заменяет нам рекурсионный вызов - сохраняем текущие значения, заменяем их на новые.  После сохранения мы должны вернутся в начало цикла, как будто мы только зашли в функцию.
Далее, создаем функцию проверки нашего стека на наличие там записей и извлечения их из него. Она нам потребуется для замены строк return чего_то_там. Передаем в неё это чего_то_там. И если стек пустой, возвращаем action = чего_то_там, иначе извлекаем из стека данные, обновляем локальные переменные и возвращаем action в зависимости от чего_то_там. По этому action выполняем код.
Ну а дальше это все объединяем в один цикл и работаем.

В общем описание получилось очень сумбурное, малопонятное.  Но объяснить тяжело. Проще показать результат. Правилась функция CRegExp::lowParse. До изменений файлы были следующими cregexp.cpp, cregexp.h. После применения данного метода cregexp.cpp, cregexp.h .

В ходе испытаний, подтвердилась стабильная работа на длинных строках. Код работает корректно. Но немного упала скорость. На тестовых файлах скорость работы упала на 1 секунду (на моем компьютере). После анализа в профайлере, выяснилось , что узким местом стала работа с памятью в нашем стеке. Оптимизированный вариант приведен выше, как финальный. В нем падение скорости составляет уже примерно 0.4 секунды. Но это уже не устранимо. Зато мы не падаем на рекурсии.

В новой версии FarColorer будет применен этот патч. И проблема, зафиксированная во многих баг-репортах , наконец таки уйдет.

Happy end ?

суббота, 26 февраля 2011 г.

Добрым словом по 3g Мегафона

Уже больше половины года пользуюсь 3g модемом Мегафона. Интернет на работе по талонам, на определенные сайты только можно ходить. Ну и в общем подключил безлимитку на 512 кб. Пользуюсь, работает и работает.

А в последние месяцы приходится часто работать у заказчика в офисе. Они, редиски, то вообще не могут предоставить интернет, то работает все, кроме удаленного доступа в "нашу" сеть. И вот тут то меня удивил модем то, по 2 недели подряд в рабочее время через RDP по модему в нашу сеть. И ведь нормально работает. Скорости хватает,  вполне комфортно работается через RDP. В общем выручает сильно.
Тут еще обратил внимание - ни одного обрыва за 4 суток, пока сам не оборвал связь. Для сотовой связи очень удивительно. Бывают конечно деньки, когда обрывы идут, но от сотовой связи такое ожидаемо. По крайней мере для меня.

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

gcc, отладка, map файлы и все, все, все

В исходниках Colorer`а помимо проектных файлов для Visual C++, есть makefile для cygwin и mingw. Была у меня мысль, да и сейчас есть, перенести сборку полностью на gcc на mingw. После доработок Colorer под версию 1.0.3 поправил makefile, и приступил к сборке. Для сборки же решил использовать TDM-GCC версии 4.5.1 . Сборка прошла успешно, а вот Far падал при первом же обращении к плагину. На VC++ такого не было. Рыл код, смотрел опции компиляции, ничего не помогает. Так ведь еще и не понятно в каком месте падает.

Решил попробовать собрать отладочную версию в gcc. Но добавление соответствующих опций не давало эффекта. Отладочная информация не добавлялась к файлу. Проблему еще предстоит решить, хотя бы из спортивного интереса.

На эту фигню, так сказать, было убито дня 3. Решение родилось как то по крупицам. Для отладки релизных версий программ  часто используется map-файл. Тут можно почитать пример его использования. А в Far есть полезная библиотечка FExcept (странно что про неё ни написано хотя бы рекомендаций по использованию). Если она подключена, то при падении Far будет формироваться файл trap.log . В этом файле содержится стэк вызова функций/процедур, значения регистров и т.п. . Т.е. то, что обычно видно в отладчике. Файл формируется по map файлу Far`а и плагина. По этому трапу мы видим место падения. Ну а дальше дело техники.
В моем случае ошибка была в том, что gcc, в отличии от vc++, не подключил DllMain как внешнюю вызываемую функцию. Что исправляется двумя словами
extern "C" BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpReserved )
На этом приключения не закончились. Сборка прошла, все работает. Но интересно ведь увидеть повлияло ли смена компилятора на скорость. Для этого собрал с помощью того же tmd-gcc утилиту colorer.exe и запустил тест на скорость работы. Удивления не было предела - скорость упала больше чем в 2 раза. С помощью пользователя far-форума chupakabra было установлено, что виноват компилятор, а не опции компилирования. Он же создал вопрос на форуме mingw-w64. Разработчики подтвердили ошибку компилятора, и  что она уже должна быть исправлена в trunk версии. Осталось проверить исправленную версию.

Попал на ithappens.ru

Через пол года , после отправки истории на ithappens.ru, опубликовали таки. Один за всех, все с одного . Правда отредактировали знатно. Кое-чего переиначили ( или я так написал  ?) Ну в общем результат есть.

понедельник, 19 июля 2010 г.

Режим Unity в VMware

В продолжение предыдущего поста, оказывается в VMware Player есть режим Unity, когда рабочие окна из виртуальной машины переходят в гостевую. Т.е. как XPMode под Windows 7. VMware Player 3 стал бесплатным как раз, чтобы конкурировать с XPMode. Блин, вот если бы случайно не нажал, не узнал бы. Сейчас и не знаешь чего еще желать  :-)

пятница, 16 июля 2010 г.

Виртуальная машина для разработки

На старой работе я использовал личный ноутбук. Было удобно всегда иметь настроенное рабочее место под рукой - и дома могу кой чего по работе сделать, и на работе кой чего из домашнего. В итоге ноутбук превратился в рабочее место разработчика. Лишнего практически не было, все настроено как надо. Но когда сменил работу от этой идеи пришлось отказаться. Мне и так выдали рабочий ноутбук, а работать  на двух сразу очень не удобно. Плюсом личный ноутбук, чувствуя все это, сломался на полтора месяца.

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

До этого у меня уже был опыт общения и с VMware, и с Microsoft Virtual PC. В пользу VMware был большой список поддерживаемых операционок, периодические обновления, гибкость настроек. Но вот добавляла она в систему лишние сетевые подключения, куча сервисов дополнительных. В пользу же Virual PC было не требовательность к ресурсам ( в отличии от VMware, она не отъедала сразу всю выделенную под машину оперативку), небольшой размер,  ничего лишнего не ставила.  Так что выбор пал на  Virtual PC.

Установил Virtual PC, поднял систему на ней, настроил все как надо. Но начались сюрпризы. Виртуальная машина никак не хотела поддерживать широкоформатное разрешение экрана ноутбука. Получалось либо работаешь в маленьком окне (меньше 1024x768), либо  в полно-экранном режиме 1024x768, но с обрезанием экрана по бокам. Потом начались неожиданные отключения клавиатуры. Т.е. вот вроде вводил что то в виртуалку, а теперь не вводиться, ни одна клавиша не работает. И перезапуск виртуалки не помогает, только полный ребут  компа. Экран всё же больше напрягал.
Тогда решил попробовать поставить на ноутбук  VMware Player. И о чудо, оказывается Варя подстраивает разрешение виртуальной машины под размер окна. Т.е. что в широко-формате работает нормально, что в небольшом окне, без прокрутки. И что самое интересное уже не было раздражающих размытых шрифтов, что встречалось на старых версиях.

Как итог, остановился на VMware. Теперь есть настроенное рабочее место и дома и работе. Перенести можно на флешке, либо вообще не носить. Единственное с чем приходится мирится, это более низкая скорость работы с жестким диском на ноутбуке. Но не критично.

Да и кстати, не все вещи можно тестировать на виртуалке. Проблема Сolorer и Far с "неправильным" миганием курсора,  на виртуалке не видна. На ней все гладко и чинно.

вторник, 22 июня 2010 г.

Два месяца как один большой сон

Последние два месяца пролетели быстро.  Ощущение что все снится. А все дело в том, что решил сменить работу. Мысли о смене работы были давно, но вот не хватало толчка.  Как вдруг он появился, со стороны любимой девушки.
Подал объявление о работе, сходил на несколько собеседований. Это были первые собеседования где у меня проверяли знания и логику. Если в одной фирме это были тесты на знания Delphi, C++, SQL и Oracle ( в плане если дано такое,  что будет после выполенения такого кода), то в другой было предложено на словах решить задачу -  провести репликацию таблицы между серверами.
В промежутках между собеседованиями дорабатывал двух недельный срок на старом месте. И ведь надо же было случиться так, что в этот момент и в срок как раз до моего увольнения потребуется доработать одну систему. Две недели были в мыле.
В итоге после увольнения меня взяли в Петер-сервис, на должность инженера-программсита службы поддержки. По сути это много аналитики, чтения чужого кода, тестирования систем, внедрения систем, и немного программирования. Первый месяц прошел в самообучении и непонимании - нафига столько стандартов и мне их все учить? Фирма крупная, большинство процессов стандартизировано, т.е. есть своя бумажка, что и как делать. Но изложено так, что тяжело без примеров разобраться. После меня отправили на обучение в Питер, и теперь вот можно приступать к нормальной работе.

Тут еще как на зло сломалось мое рабочее место - ноутбук. Вот уже месяца полтора без него. А там все, вся компьютерная жизнь. Усе настроено под меня, усе есть. Рабочее место программиста. И тут на тебе...  сдох USB контроллер.  Да и кстати, на работе политика - в рабочее время интернет работает только на фиксированное кол-во сайтов. В итоге отвык от интернета за месяц. Да и проекты свои забросил. В режиме чтения наблюдаю что происходит, чтобы не отстать. А на правки времени нет.

После двух месяцов такого кипиша не жалею о смене работы. Уж больно "шоколадное" место нашел, по сравнению с тем где раньше работал, да и с тем что в встречается на рынке.

четверг, 1 апреля 2010 г.

Вставка большого количества записей в Firebird

Домучиваю потихоньку перенос КЛАДР в Firebird. Ну а для этого основная операция - вставка громадного числа записей.

Первоначально шел по пути обработки данных из dbf КЛАДРа на клиенте, и вставке их на сервер. Отключал индексы на таблице, вставлял по одной записи (т.е. не блок из нескольких), коммитил через 1000 вставок. Скрость работы  примерно минут 30-40 на 1000000 записей кладра.

Потом узнал о external table. Не сложной манипуляцией dbf файл адоптируется в нужный вид(обрезаем заголовок ), кидается на сервер. На сервере мы его подключаем как внешнюю таблицу и работаем с ним. Плюс написал хранимые процедуры для обработки данных и вставки их (то, что раньше делал на клиенте). Итог - не считая подготовления файлов (а оно занимает от силы не более минуты), этот же миллион записей загрузился за 3,5 минуты.

клиент в первом случае и сервер во втором это одна и таже машина.

Доволен как удав :-)

среда, 24 марта 2010 г.

Перенос проектов между SVN хранилищами

Так исторически сложилось, что многие мои проекты, в том числе и рабочие , раскиданы по нескольким разным svn хранилищам. Вчера было решено это всё дело сложить в один репозиторий, сохранив всю историю работы. Немного погуглив, нашел решение для переноса единичного проекта.
  1. делаем дамп репозитория, из которого будем переносить проект.
    svnadmin dump /var/svn/repositories/repoA > repoA.dump
  2. затем нужно выделить из дампа нужный нам проект с именем project2
    cat ./repoA.dump | svndumpfilter include project2 > project2.dump
  3. теперь заливаем дамп нашего проекта в новый репозиторий
    svnadmin load /var/svn/repositories/repoB < project2.dump 

И вот вроде все прекрасно. Но, если открыть журнал репозитория, то там будет много пустых ревизий с комментарием "This is an empty revision for padding.". Т.е. из-за не совпадения номеров ревизий в новом репозитории и в старом, идет выравнивание за счет создание таких ревизий. Это меня очень не устраивало. Столько мусора в журнале. Гугл что то ничего внятного сказать не мог, кроме как сделать дамп нового репозитория, в текстовом редакторе убрать эти пустышки. Справка на офф сайте Subversion по svndumpfilter совсем никакая.
Как оказалось все есть в встроенной справке в svndumpfilter. Исправив команду из пункта 2 на
cat ./repoA.dump | svndumpfilter include project2 --renumber-revs --drop-empty-revs > project2.dump
мы получим требуемый результат. Чистота, чисто дамп....

Кстати, особенность svnadmin dump в том, что её нужно запускать локально. А если вы хотите сделать дамп чужого репозитория, или просто удаленно, не заходя на сервер, то в этом вам поможет rsvndump . Только вот он распространяется только в исходниках. Пробовал вчера его собрать на mingw . Началось все мирно rsvndump, apr, subversion, apr-util. Но когда затем потребовался sqllite (или что то еще) я плюнул. Ну его нафиг.

четверг, 11 марта 2010 г.

Фраза дня

Глядел сейчас список изменений в новой версии  Антивируса Касперского 6.0 для Windows Workstations (6.0.4.1422). В разделе Известные проблемы есть такая строка

- В некоторых случаях процесс avp.exe определяется Windows 7/ Windows Server 2008 R2 как игра Aliens versus Predator, что ведет к нестабильной работе продукта. Для избежания этих проблем перед установкой продукта на этих ОС необходимо установить обновления KB974332 или KB976264.

Просто даже не знаю, смеяться  или плакать.  8-)

вторник, 2 марта 2010 г.

Донастройка ruby-enterprise в gentoo

Обновлял сейчас ruby-enterprise и Redmine на сервере, и наткнулся на старые проблемы ( на которые руки не доходили исправить).  При запуске ruby возникает ошибка
/opt/ruby-enterprise-1.8.6-20080624/bin/ruby: no such file to load --auto_gem (LoadError)
Ошибка происходит из-за того, что  RUBYOPT="-rauto_gem" . На кой это сделано не понятно, причем не только мне, но из-за этой хери оно не работает. Я в  первой теме писал решение, установить RUBYOPT="" . Но если сервер перезагрузить - то опять все по новой. Новое решение взято от сюда.  
cd to /etc
grep RUBYOPT *
remove it from profile.env and csh.env or wherever it is.

Ну и еще, чтобы не мучатся с указанием пути до папки с установленным ruby-ee при запуске ruby или rake, надо добавить этот путь первым  в PATH
export PATH=/opt/ruby-enterprise-X.X.X/bin:$PATH

з.ы. набирал этот пост на свеженькой Opera 10.50 - наконец то я дожил до момента, когда окна от java скрипта не грузят систему под завязку. Жизнь налаживается.

Компиляция git

Сейчас собирал текущую стабильную версию git v1.7.0.1 на linux - я под впечатлением. Вот люди с душой подошли к созданию make файла. Нет лишнего вывода на экран, что этот файл строится с такими то опциями, и зависит от других. Кратко, что делаем и с кем. Приятно читать лог процесса сборки.

Понаблюдал развитие git под виндой - отстает, порой сильно, от linux дистрибутива. Ни под mingw, ни под cygwin нету той же 1.7 , хоть она вышла уже давно. Все на энтузиазме строится. У svn такого нет, т.к. дистрибутив под windows собирают компании.

воскресенье, 28 февраля 2010 г.

Всплыть по рубку (С)

Давно что то не отписывался, забросил блог. Сегодня вот всплыл, как обычно пишет Goblin.

Первым делом подкрутил настройки блога.

  • обновил тему  Lightword Theme . Правда допиливать пришлось её - слева, в окошке с датой, не влазит месяц июнь или июль. Пришлось расширять картинку. Моих скуднейших знаний Photoshop хватило на это, удивительно. Да и подписи с количеством комментариев привести к великому и могучему пришлось.

  • подправил mime type , теперь при скачке rar или 7z архивов не происходит открытие страницы

  • поглядел статистику поиска - смешно, поиск в гугле или яндексе  bill.8mkr (это биллинговый сайт местного провайдера) первой ссылкой ведет ко мне,  а ссылок на провайдера вроде нет

  • статистика скачиваний ColorerSE с redmine просто бъет рекорды. Я в шоке. То ли  народ по недоглядению скачивает старую версию, не видя новых, то ли поисковики накручивают. В общем принял решение прикрыть( оставить только для истории) проект ColorerSE т.к. я давно уже вхожу в группу разработчиков оригинального Colorer

  • моего "всплытия" не выдержал сайт. стал тупить сильно, до ошибок в логах. Обратился в саппорт 1gb.ru, проблема видимо оказалась в загруженности mysql сервера. Перенесли базу на другой сервер, и все стало нормально. За что огромное спасибо тех поддержке хостинга.


Стал осваивать Git. Интересная штука по сравнению с  SVN. Счас вот думаю надо поднять сервер Git на projects.dobrih.net . Только вот выдержит Боливар или нет, не понятно. Хотя там уже давно пора обновится, ruby-ee вышел новый, обещают рост скорости. да и редмайн тоже не отстает.

В последние месяца 3 почти не программировал на Delphi. Упала мотивация на работе, простые исправления багов и все. Сидел и программировал на C++. И вот сейчас как то возвращаться к Delphi не очень охота. Чем то он стал меня раздражать, чем пока понять не могу. Вот открою окно и строчки кода не хотят идти. Хотя наверное все дело в мотивации.

Да, кстати, кто-нибудь в курсе, что с блогом Andy’s Blog and Tools ? что то не открывается который день.

UPD: ожил блог Andy. вопрос снимается.

суббота, 5 декабря 2009 г.

Орфографический ступор

Недавно, гуляя по улице, увидел рекламный плакат одной сотовой компании. Рекламировали новый тариф, и ключевое крупное слово там было "Ноль". Увидев это, я улыбнулся, мол с ошибками пишут. Правильно ведь "Нуль". Потом появилась доля сомнения.
В общем до программировался называется. Везде Null мерещится. Конечно же правильно "Ноль".
Но и тут я оказался не прав. НаЯндексил сейчас
Как правильно? “Ноль” или “нуль”?

Слова ноль и нуль совпадают в значении, но различаются употреблением. Как правило, ноль употребляется в обиходной речи и в ряде устойчивых сочетаний, нуль - в терминологии, в научной речи. Правильными будут оба варианта написания этого слова. Например: Деление на ноль. Ноль целых. В двенадцать ноль-ноль. Ноль внимания. Ноль без палочки. Абсолютный нуль. Ниже нуля. Равно нулю. Свести к нулю (c)http://internetlesson.ru/archives/16

Век живи, век учись.

среда, 11 ноября 2009 г.

Все гениальное просто

Решил рассказать, как на своем опыте столкнулся с верностью этого высказывания.

Шел 2002 год. Первый курс университета.  В городе рассвет компьютерных клубов. Для одного из которых я написал программу, для управления и учета средств. Первая моя более менее серьёзная программа, испытываемая в таких масштабах. Но как ни странно все вроде бы работало.
Все хорошо, все замечательно. Но приходит день X . Рядовому игроку мало игр по локалке. Нужен доступ в интернет и игры по интернету. Как раз появился Warcraft 3, и битвы на Battle.net завладели умами игроков.
Начальством поставлена задача  - реализовать в программе возможность подсчета и блокировки интернет-трафика.
В тот период, программ для компьютерных клубов, которые продавались в интернете, было не так много. А уж считающих трафик - одна/две. Те что работали с трафиком, реализовали это через работу с сервером на linux. Он считал и блокировал интернет. Для меня же Linux тогда был  священной коровой. Программировать под него даже и мысли не было. Нужно было найти решение под Windows ( в тот момент Windows 98).

Поиски в интернете приводили только к одному - надо писать драйвер для Windows. На этом фоне перспектива использования Linux ,  была более радужной. Но в итоге, половину задачи удалось решить с помощью драйвера WinPCap. Он как раз таки позволял считать трафик на локальной машине. Нашлись и примеры использования его на Delphi. Использование его показало, что считает примерно правильно, не учитывая видимо некоторый служебный трафик. Но такого результата было достаточно.

Подсчет подсчетом, а блокировать трафик надо. Попалась на глаза следующая идея. Можно получить список открытых сетевых сессий, как программа netstat, а потом каждое соединение убить. Все это делать в цикле, т.к. новые соединения появлялись периодически. Был найден пример кода, и реализовано в программе. Радость была безмерной, работало, считало, блокировало... но не все блокировало. Например, в Counter-Strike можно было играть вечно. Трафик не блокировался. Оказывается UDP пакеты не блокировались моим методом. Облом был сильным. Всяко пробовал, но трафик не блокировался.

Не помню уже как мне пришла эта мысль,  решение было очень простым и действенным. Нужно было просто посмотреть как работает сеть. Чтобы попасть в интернет, пакеты должны попасть на шлюз. А если шлюза нет - нет и интернета. ЭВРИКА!!! Просто удаляем шлюз по умолчанию и интернета нет. Добавляем шлюз - интернет есть. За это отвечает команда 
route delete
и 
route add
Все работало как часы.

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

суббота, 7 ноября 2009 г.

Проблемы с SVN

Столкнулся недавно с одной проблемой в моём svn репозитарии. Точнее  проблема была давно , а я обратил на неё внимание вот только что. Пытался просмотреть с помощью черепахи лог изменений в репозитарии, а он выдавал список ревизий, но без дат и описаний. Причем проблема возникала только на приватном репозитарии, а на публичном, там где colorer_se - все нормально.

В итоге появилась такая вот запись номером 3516 в баг-трекере Subversion. Если на русском, то суть вот в чем.
Имеем svn сервер с sasl. В нем два различных репозитария, один публичный, другой закрытый. Отличаются они записями в файле authz. Для публичного
[/]
*= r
master=rw
Для приватного  
[/]
*=
master=rw
Т.е. если ты не прошел аутентификацию , то тебе ничего нельзя.
Пробуем посмотреть лог обоих репозитариев. Для публичного он будет такой (это вывод в консоль, так что все нормально) 
r10 | sonar | 2009-03-16 09:21:53 +0300 (Mon, 16 Mar 2009) | 1 line

?\209?\131?\208?​180?\208?\176?\2​08?\187?\208?\181​?\208?\189?\209?​139 ?\208?
\191?\209?​128?\208?\190?\2​08?\181?\208?\186​?\209?\130?\209?​139 ?\208?\180?
\208?\187?\209?\143 ?\208?\188?\208?​184?\208?\179?\2​09?\128?\208?\176​?\209?
\134?\208?​184?\208?\184 ?\209?\129 ?\208?\190?\209?​135?\208?\181?\2​08?\189?
\209?\140​ ?\209?\129?\209?​130?\208?\176?\2​09?\128?\208?\190​?\208?\185 ?\208?
\178?\208?​181?\209?\128?\2​09?\129?\208?\184​?\208?\184 ?\208?\189?\208?\176 ?
\208?\189?\208?​190?\208?\178?\2​09?\131?\209?\142​.
--------------------​--------------------​--------------------​------------
r9 | sonar | 2009-03-16 09:06:05 +0300 (Mon, 16 Mar 2009) | 1 line

?\208?\161?\208?​190?\209?\133?\2​09?\128?\208?\176​?\208?\189?\208?​181?\208?
\189?\2​08?\184?\208?\181​ ?\208?\178?\208?​181?\209?\128?\2​09?\129?\208?\184​?
\208?\184 0.9
--------------------​--------------------​--------------------​------------
Тут мы видим и дату , и пользователя, и сообщение ревизии. Для приватного вывод будет следующим 
--------------------​--------------------​--------------------​------------
r10 | (no author) | (no date) | 1 line

--------------------​--------------------​--------------------​------------
r9 | (no author) | (no date) | 1 line

--------------------​--------------------​--------------------​------------
r8 | (no author) | (no date) | 1 line
Тут мы видим "ничего".

Может возникнуть мнение, что ошибка в самом хранилище. Но я объясняю на двух разных для наглядности. Тоже самое будет, если для публичного отредактировать файл authz  как у приватного. Следующий возникающий вопрос - а ты то под тем логином/паролем заходишь? Специально проверил такой командой 
svn log svn://address --username master --password pass
Результат прежний.

В итоге напрашивается такое объяснение. Команда log  не использует логин/пароль для чтения данных, а ломится на сервер под anonymous.

Будем надеяться, что исправят эту ошибку, либо укажут что я делаю не правильно. Жаль только, что аж с 27 октября к багу ни одного комментария.

понедельник, 31 августа 2009 г.

ООП и я

На каждом шагу звучат эти три буквы  ООП. Причем так же часто, как  на заборе пишут другое слово из трех букв. А уж с выходом новых версий delphi только и слышишь про генерики и подобное. Вроде и в университете проходили ООП, и кой какую литературу из нетленки по этой теме читал. Но вот не вижу я места где применить его. Не, ну конечно delphi и окна построенно на классах, пользуюсь этим. Но чтобы что то свое сделать, какой-нибудь маленький классик замутить - неа. То ли задачи у меня на работе мелкие, недостойные классов, то ли я все таки не понимаю нафиг оно надо. А может не дорос я?

Найти бы какую идейку программки, в которой бы ооп можно было бы использовать. Да так чтоб затянуло. Но пока идей ноль. А работа начинает доставать. Не приносит того удовольствия, что по началу. И искать в основной работе такую идею вообще нет смысла.

четверг, 20 августа 2009 г.

Баг Оперы и TineMCE 3.2.4 в WordPress

Пока писал предыдущий пост заметил следующую багу. Если в окне редактора в начале строки стоят пробелы или табы, то при сохранении поста эти символы в начале строк удаляются. Воспроизводится в Opera 9.64 и 10 beta 3 . В IE8 все отлично.
Думал запостить в багрепорт TineMCE , но у них на тестовой странице с TineMCE 3.2.5 из под оперы все нормально работает. То ли они это исправили (явно в ченджлоге не видно), толи это бага WordPress. Но блин я вчера из-за этого убил 4 часа времени. Проверил предыдущие свои посты, там тоже самое  - форматирование сбивается.

понедельник, 17 августа 2009 г.

Зацепило

Прочитал на днях две цитаты. Зацепили ...

Взросление, это когда ты вместо того что бы написать какой-нибудь коммент в обсуждении, опровергающий остальные мнения, написав половину, стираешь все с мыслями - а кому это на*уй надо. (С) BashOrg

Вот ведь. Я ж взрослею  :lol: . Со мной такое бывает раз в неделю. Ну коммент мой конечно не опровеграет все остальные, но вносит какую то ясность. И вот пишишь  его пишишь, а потом раз и удалил.
А еще бесит, что иногда тоже развернешь пост на форуе свой, распишишь. А после твоего поста тишина. Вообще никто ничего не пишит, ни мне в ответ, ни дальше в тему. И происходит это на разных ресурсах. Тут напрашивается вывод, что я тормоз , пишу в темах когдак ним пропадает интерес у народа.

Вторая цитата

Hаpодная пpимета: Если пpогpаммист в pабочее вpемя игpает, значит — либо у него мало pаботы и большая заpплата, либо у него много pаботы и маленькая заpплата. (C) взято с http://pankratov.org.ua/it/dev-play

актуальна она что то в кризис. В общем зацепило, задело.