Monthly Archives: March 2006

Web technologies paradox

Reading The Art of Unix Programming… This talk about C/C++ being put out of general use by higher-level languages. Well, I can sort of understand this, there are really specialized languages that better suited for a specific jobs than C or even C++. Take Perl for example. There is no way you can achieve the same degree of text processing power with C++, provided that you do not have too much free time. And even if you do have this time, you probably will just end up with another Perl implementation in C++ ^_^

But I am here not to judge about it all. I just want to note one strange thing. Among all kinds of development, there is one area where lower-level languages would be more appropriate than anything. No, I am not talking about nuclear explosions modeling nor about real-time streaming application (telemetry?) and 3D graphics. There is much more common thing. We all know it by the name of WWW. Yes, the World Wide Web. I mean that even nowadays web applications have pretty high hardware requirements. Not just to run, but to process a lot of requests simultaneously and to share limited resources of the same web server. Look at the prices and resources! Lowest possible configuration for a virtual dedicated server gives you only about 32 MB RAM! And people still tend to run Perl CGI scripts on that! At the same time, people tend to write desktop software in C, while it could be also written in any language without any visible effect on the performance at all (well, I am not talking about buggy Java implementations here!).

I am not going to blame people for using C and C++ for desktop software development. In fact, I am one of those people as well – it is way too difficult to develop desktop software in plain C or C++, but with the help of great toolkits such as Qt (and possibly GTK+) it is much easier and more fun. And after all, if I am able to quickly produce a short, high-quality maintainable source code in C++ for some task, why in the world should I go with another language? Well, enough of this, it is too philosophic question to answer it in a short and definite way.

What I am talking about is another part of this paradox. Why in the world are people using Perl, PHP and even Java for web software development?! Because C/C++ is importable? Bullshit! C is one of the most portable languages in the world and C++/Qt combination is more portable than Java, for example. And if we are talking about binary code portability, then I am going to ask: how often you are going to move your web applications from one server to another? Probably not too often. Another reason may be lack of the web technology in C/C++ toolkits. Well, I can sympathise with this. But then the next question arises: why are web technologies in C/C++ world so underdeveloped? Why have we monsters like Java JSP/Servlets, Perl mod_perl and CGI modules, PHP as a specialized language and a lot of other stuff, but have not simple libraries that would allow us to do the same things in C++? I am completely at a loss here!

Just being curious, I have made a prototype of such a technology. It took me about one week of lazy coding in evenings. It is a simple module for the Apache web server that looks for specific requests, then maps these requests to the application (which is just a shared library, to reduce latency), loads and runs it. It gives low enough latency, I have compared it with equivalent Perl CGI (without mod_perl), C CGI, C++ CGI and PHP. Of all those, only PHP has lower latency because of its high integration with web server. But I am talking only about startup latency here! If I were to measure execution performance for some typical task, I am sure that implementation in C++ would be much faster than in PHP, just because it is not interpreted language. And there are also optimizations possible, such as application caching and deferred unloading.

I am not sure yet whether I will be able to make this technology into something better than just a prototype, but the point is that I just do not see any good reason why nobody did not do that before me!

Copying text from this document is not allowed?! You are kidding, right?

Сегодня был ещё один классный прикол. Л. поинтересовалась, нельзя ли из PDF скопировать текст. Я ответил, что вообще-то можно, но далеко не всегда и далеко не всегда – просто. Подошёл, смотрю, Adobe Reader дурит – текст выделяет, а копировать почему-то не хочет. Взял файл себе, открыл его xpdf и был до глубины души потрясён сообщением на терминале:

Copying text from this document is not allowed
или что-то вроде того.

Нет, ну я вообще… если эта дрянь может отобразить его на экране, какого, извините, чёрта она не может передать его в буфер?! Кем не разрешено? В общем, я подумал, и пришёл к выводу, что это в принципе невозможно реализовать на криптографическом уровне – программа должна иметь доступ к тексту, чтобы его нарисовать, если только он не хранится в графическом виде, но тут явно не тот случай…

Тогда я взял исходники xpdf и нашёл в них это сообщение. Там было что-то типа if(!okToCopy()) бла-бла-бла… Тогда я нашёл okToCopy(), которая делала странные манипуляции с какими-то правами доступа. И написал там вместо этого просто

return true;

Перекомпилировал, запустил. Работает! Правда текст почему-то перекодируется в Latin1, но это любой дурак может превратить обратно в русские буквы…
Потом я сделал патч на основе имеющихся исходников, запихнул его в /usr/ports/graphics/xpdf/files и сделал make package clean. Теперь у меня есть установочный пакет xpdf, в котором исправлен баг, заключающийся в корректной интерпретации прав доступа к документам PDF ^_-

Изврат с датой и временем

Сегодня был классный прикол. Приходил П. и спрашивал, в каком виде хранится дата в определённом ТМ параметре. Ему было честно сказано, что в секундах. Тогда ему стало интересно, с какого момента. Тут ему уже ничего толкового не объяснили, так как на этот вопрос ответа просто не было, а объяснять ему почему, не захотели из политических соображений. Последнее на меня навело, тоску, как водится, а вот техническая подоплёка была довольно весёлой.

Прикол в том, что есть два понятия: время и дата со временем. Время – это миллисекунды от начала суток, и форматируются они как “чч.мм.сс.ммм” (какого хера время разделяется точкой – вопрос тот ещё), а дата и время – это секунды от ниоткуда и форматируется оно как “ддд:чч.мм.сс”, где “ддд” – дни, получающиеся делением этих самых секунд на количество их в сутках. То есть, к примеру, “128:13.25.30” – это 128-й день, 13 часов, 25 минут, 30 секунд. При этом откуда отсчитывается 128-й день систему совершенно не волнует. Тот, кто на это будет смотреть, располагает этой информацией. Другими словами, это относительное время.

Далее. Чтобы получить дату в виде “день-месяц-год” (который системой не поддерживается) был проделан следующий прикол: в дату со временем день был засунут на своё законное место, месяц – на место часов, а день – на место минут. Секунды остались нулевыми. В результате 25:03.06.00 – это 23 марта 2006 года. Вот тут-то П. и оказался в полной жопе. Даже сама идея хранения даты со временем в относительном виде и то вызывает у нормального человека глубокий шок, а уж додуматься, что часы – это месяц, а минуты – это год, это уже ни один нормальный человек не в состоянии. Ну сами посудите, эта переменная увеличивается за год на величину, в 60 раз меньшую, чем за один месяц!