четверг, 17 декабря 2009 г.

Добавил в rss-2-lj обработку ошибок <Fault 320: 'Client error: Sorry, there was a problem with content of the entry'> и <Fault 211: 'Client error: Invalid or malformed tag list'>

Поиск разнотипных сравнений

(выношу из комментов)
henic@lj заинтересовался возможными решениями поиска разнотипных сравнений двух enum-ов в большой программе (Visual Studio).
Я ему предложил Александреску-style решение:
enum    E1 
{
V1,
V2
};

enum E2
{
V3,
V4
};

template <typename T1, typename T2>
bool operator==(T1 t1,T2 t2)
{
float a = "asd";
}

template <typename T1, typename T2>
bool operator!=(T1 t1,T2 t2)
{
float a = "asd";
}

int main()
{
E1 e1=V1;
E2 e2=V3;

if (e1==V2)
std::cout<<"+\n";
if (e1==V3)
std::cout<<"-\n";
if (e1!=e2)
std::cout<<"-\n";
if (e2==V4)
std::cout<<"+\n";
if (e2!=V2)
std::cout<<"-\n";
if (e2==e1)
std::cout<<"-\n";

return 0;
}

в строках где разнотипное сравнение VS2003 дает ошибку типа
main.cpp(235) : error C2440: 'initializing' : cannot convert from 'const char [4]' to 'float'
There is no context in which this conversion is possible
main.cpp(251) : see reference to function template instantiation 'bool operator !=<E2,E1>(T1,T2)' being compiled
with
[
T1=E2,
T2=E1
]
болдовая строка - как раз место сравнения
Если же разнотипных сравнений уже нет - все будет компилироваться без ошибок

по словам henic@lj-а решение оказалось эффективным: "Оппа... Какой паровоз других не совсем корректных сравнений эта штука мне нашла. :)"

понедельник, 14 декабря 2009 г.

Google Wave

Кстати инвайты на Google Wave никому не надо?

воскресенье, 6 декабря 2009 г.

Снова заработал rss-2-lj.
Для этого убрал ссылку из сообщений на собственно http://rss2lj.service42.com/. Я так понимаю, что это так ЖЖ продолжает воювать со спамерами. Поэтому нет никаких гарантий, что в любой момент опять что-нибудь не сломается :(

четверг, 26 ноября 2009 г.

Сервис rss-2-lj опять к сожалению остановлен. Сегодня lj на каждый пост начал выдавать ошибку <Fault 320: 'Client error: Sorry, there was a problem with content of the entry'>. Что делать - пока не представляю

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

Google Chrome OS

Решил посмотреть subj. Скачал VmWare образ виртуальной машины с Google Chrome OS, запустил его под VirtualBox и увидел вот это:
Альбом: Компьютерное

Немного посображал какой user и password вводить, оказалось Gmail-вский. Зашел и увидел обычный Chrome.
Альбом: Компьютерное

Кроме Chrome-а там больше ничего нет, вообще ничего. Даже выйти нормально не смог, пришлось в VirtualBox-е запустить ACPI shutdown.
В общем ОС просто запускает Chrome и с ним вы работаете. Не забудем что часто сайты, без которых не обойтись (банковские, почта, сервисы некоторые), на Chrome-е или вообще не работают или работают криво. Отсюда вывод - гаджет с установленной Chrome OS будет не очень полезной игрушкой. Google-у теперь нужно взяться за всемерную поддержку разработчиков сайтов. В общем "developers, developers, developers, ..."


Update:
Оказывается в этом Chrome есть поддержка extensions.
Альбом: Компьютерное

Правда пока там пусто, но направление верное
Альбом: Компьютерное

Хроники безумия

В ru-sysadmins прочел, что для DNS зона .рф кодируется как .XN--P1AI
Адрес КРЕМЛЬ.РФ будет выглядеть как xn--e1ajeds9e.xn--p1ai.
Писец какой-то

четверг, 19 ноября 2009 г.

ICU & VS 2003

Для одного из своих рабочих проектов на C++ (MS Visual Studio 2003) использую бывшую IBM-скую библиотеку ICU (International Components for Unicode). Начиная с версии 3.8 для сборки под MS VS 2003 стало необходимо иметь установленный CygWin (установленный MinGW, как ни странно, не подошел). CygWin-вские bash & make & ar нужны только для сборки, но тем не менее. Binaries для Windows у них лежат только для VS 2005, а в последней версии 4.2 - для VS 2008.
Поэтому я установил на отдельной виртуальной машине VS 2003 + CygWin и откомпилировал последние версии. Теперь бинарные сборки последних версий ICU под Microsoft Visual Studio 2003 я выложил на http://160soft.com/icu.html.
В целом для нормальной работы с Unicode на C++ ICU пожалуй лучшая библиотека с которой я сталкивался, всячески рекомендую.

четверг, 5 ноября 2009 г.

erlang & c++ & ocaml vs haskell

zabivator@lj набросал говна на вентилятор выступил против Haskell-я. Уже 742 коммента, хе-хе

понедельник, 26 октября 2009 г.

На ixbt.com появилась замечательная статья Современные десктопные процессоры архитектуры x86: общие принципы работы (x86 CPU digest 2.0)
Очень хорошо описана архитектура современных десктопов. Откровений в ней конечно нет, но все очень ясно разложено по полочкам. Советую почитать

воскресенье, 25 октября 2009 г.

работа rss2lj частично возобновлена

Ответа от саппорта LJ нет и видимо уже не будет.
Сейчас я "запроксировал" доступ к LJ через другой хостинг, но решение явно временное. Трансляции возобновились, но настройка трансляций на сайте пока не работает.
Надо будет видимо ограничить "спамные" трансляции для уменьшения вероятности блокировки со стороны LJ.
lj2blogger естественно тоже перестал работать, но никаких текущих трансляция в нем не было, в ближайшее время я его тоже подключу тем же образом

воскресенье, 11 октября 2009 г.

rss2lj приостановлен

Начиная с 01:00 09.10.2009 по Гринвичу сервис начал получать ошибку 403 "Access denied" со стороны LJ на все новые записи.
Тестирование показало эта проблема видимо заключается в блокировке IP хостинга. Видимо в процессе борьбы со спамом LJ занесли rss-2-lj в какой-нибудь бан-лист.
Я окрыл ticket в LJ-support, но пока ответа не получил. Будем надеяться на лучшее.
До решения этой проблемы трансляция полностью остановлена.

вторник, 6 октября 2009 г.

channel9.msdn.com

А слона-то я и не приметил!
Открыл для себя subj. Очень мне нравится, жаль только все ограничивается Windows

четверг, 1 октября 2009 г.

Настройка сети в VirtualBox

Задача: прозрачный сетевой доступ к Интернету из гостевых ОС а также сетевой доступ к гостевым ОС из хостовой ОС (доступ по ssh, ftp, mysql, etc).
В VmWare это легко решается путем установки bridged network для виртуальной машины, однако в VirtualBox возникают проблемы со второй частью. В документации предлагается использовать mode NAT для виртуальных машин с пробрасыванием входных портов что мне категорически не нравится. Bridged networking в VirtualBox "садится" на реальный сетевой адаптер и перехватывает пакеты, в этом случае ip адрес на гостевой ОС должен быть из подсети локальной сети (насколько я понимаю), что в моем случае проблематично, ибо делалось на рабочем компьютере.

После нескольких экспериментов сделал так:
Хостовая ОС - Win XP, гостевые - Win Xp и Ubuntu Server.
1. В хостовой ОС установил дополнительный сетевой адаптер "Microsoft Loopback adapter".
2. Выставил ему IP типа 192.168.1.1 с маской 255.255.255.0
3. Добавил в route table запись такого вида: "route -p add 192.168.1.0 mask 255.255.255.0 192.168.1.1"
4. Для гостевых ОС выставил 2 сетевых адаптера - первый использует mode NAT и дает прозрачный доступ к инету, второй использует bridged networking через "Microsoft Loopback adapter".
5. В гостевой Win XP просто выставил получение адреса по DHCP для первого адаптера, а для второго - адрес 192.168.1.101 и gateway 192.168.1.1. После этого все заработало (для входных соединений в гостевой Win XP еще нужно настроить firewall)
6. В гостевой Убунте аналогично настроил два адаптера (второй с ip 192.168.1.102), но дополнительно в Убунте пришлось удалить из route table запись: "route del default gw 192.168.1.1" - после этого заработал инет.

Возможно такое решение не самое оптимальное, однако оно работает

Upd Запись "default" из route table в п.6 после перезапуска восстанавливатся, поэтому нужно в /etc/network/interfaces прописать "up route del default gw 192.168.1.1"

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

Взялся за изучение Erlang-а.
Написал quicksort:
  1 myqsort([])->[];
2 myqsort([First|Rest])->
3 myqsort([X || X<-Rest, X<First])++[First]++myqsort([X || X<-Rest,X>=First]).
4

Прикольно.
Для сравнения написал аналогичный quicksort на C++:
  1 std::vector<int>    sort(const    std::vector<int>&    list)
2 {
3 if (list.empty())
4 return list;
5
6 int elem = *list.begin();
7 std::vector<int> left,right;
8 std::vector<int>::const_iterator it = list.begin()+1;
9
10 for(;it!=list.end();++it)
11 if (*it<elem)
12 left.push_back(*it);
13 else
14 right.push_back(*it);
15
16 std::vector<int> res_l = sort(left),res_r = sort(right);
17
18 res_l.push_back(elem);
19 res_l.insert(res_l.end(),res_r.begin(),res_r.end());
20 return res_l;
21 };
22

Очевидно что фунцкциональный код короче и понятнее. Отсортировал однинаковый входной список из 2 млн записей. По скорости получилось так: C++ - 7 секунд, Erlang - 12 секунд.
В общем очень интересно, буду продолжать изыскания дальше

вторник, 11 августа 2009 г.

1. В последние дни трансляция rss-лент сервисом rss-2-lj несколько раз останавливалась на несколько часов. Оказалось что это были проблемы с хостинговым MySql сервером. Добавил в код обработку таймаутов БД, надеюсь это поможет.
2. По моей оплошности в несколько журналов (tandp_science, karl911, возможно еще какие-то) оттранслировались повторные посты. Мои искренние извинения.

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

Попалось на глаза интервью А. Степанова еще 2003 года. Какое-то мутное оно, разочаровывающее

вторник, 21 июля 2009 г.

Большие изменения в сервисе RSS-2-LJ

1. Теперь он перехал на собственный домен rss2lj.service42.com с адреса service42.com/rss2lj.html
2. Полностью переделан веб-интерфейс. Можно заходить в свой эккаунт и добавлять, редактировать или удалять трансляции (максимум 3 трансляции)
3. Добавлена трансляция в коммьюнити
4. Добавлена возможность редактирования подписи трансляции
Предложения и замечания как всегда приветствуются
Золотые слова: "Понимание того, что лучше написать 100 строчек в день, но почти не тратить время на отладку, вместо 1 000 строчек в день плюс месяцы отладки, приходит не сразу и не ко всем" ©Max Kraynov

среда, 15 июля 2009 г.

Добавил поддержку в rss-2-lj gate поддержку LJ-communities

среда, 8 июля 2009 г.

Благодаря багу в моей функции 30 тысяч sms посланных на израильского провайдера P. застряло в очереди за последние полчаса. Причина - в кривой постановке задачи и выполнении чужой работы (данная функция выполняет часть работы, которую должен делать SMSC производства известной израильской фирмы C.)

четверг, 11 июня 2009 г.

Поразительное

Понадобилось обрабатывать длинные битовые массивы. Сначала быстренько написал на C++ класс BitVector, потом нашел готовый dynamic_bitset в Boost-е. Тесты показали что мой класс быстрее процентов на 5-10. Совсем я такого не ожидал

четверг, 14 мая 2009 г.

вторник, 5 мая 2009 г.

В rss2lj сделано 2 исправления.
Первое - оказывается в LJ есть ограничение на длину записи (65535 байт), поэтому я стал резать более длинные записи.
Второе - человек руками вставил пост с будущей датой и не поставил галочку "Date Out of Order". После чего LJ стал выдавать ошибку вставки на новые записи. Теперь я обрабатываю такую ошибку и при необходимости вставляю "Date Out of Order" в новые посты.

четверг, 23 апреля 2009 г.

Пока я был в Канаде, Завалишин замутил качественный флеймище на тему "ООП против ФП": 1, 2, 3, 4,
5

вторник, 21 апреля 2009 г.

четверг, 26 марта 2009 г.

Yahoo! Pipes

Посмотрел на Yahoo! Pipes - совершенно замечательная штука, я бы назвал его "конструктор Web 2.0".
Совершенно не мешало бы нечто аналогичное для программистов - несложные программы писались бы быстро и с хорошим качеством

понедельник, 16 марта 2009 г.

судя по всему Python Blogger Api не поддерживает не-gmail эккаунты

четверг, 12 марта 2009 г.

Проблема использования RotatingFileHandler & TimedRotatingFileHandler в конфигурационном файле logging и ее решение

При использовании FileHandler или StreamHandler все работает замечательно, как и описано в примерах из документации, но при использовании RotatingFileHandler или TimedRotatingFileHandler, выполняя командуlogging.config.fileConfig("logging.conf") получаем exception типа:

File "rss2lj.py", line 275, in <module>
   main()
 File "rss2lj.py", line 261, in main
   logging.config.fileConfig(config.getLogFileName())
 File "/usr/lib/python2.5/logging/config.py", line 84, in fileConfig
   handlers = _install_handlers(cp, formatters)
 File "/usr/lib/python2.5/logging/config.py", line 149, in _install_handlers
   klass = eval(klass, vars(logging))
 File "<string>", line 1, in <module>
NameError: name 'RotatingFileHandler' is not defined

Поискав на гугле пришел к выводу, что проблема известная, но никаких решений не нашел
Нашел такое вот решение:

logging.TimedRotatingFileHandler=logging.handlers.TimedRotatingFileHandler
logging.RotatingFileHandler=logging.handlers.RotatingFileHandler
logging.config.fileConfig("logging.conf")