Как стать автором
Поиск
Написать публикацию
Обновить

Уровни программирования

Приветствую сообщество!

Введение


Сейчас я заканчиваю учебу и готовлюсь к диплому. В процессе поиска темы сначала хотел написать нечто вроде PIM с гибким подходом к интерфейсу и данным (на основе семантической сети), но в процессе копаний в тырнете понял, что тему можно развернуть гораздо глубже и интересней, а именно — в сторону создания универсального визуального языка программирования. Перфекционизм не давал это сделать криво и коряво, поэтому я начал изучать языки программирования как явление: почему сложно программировать, почему ООП настолько популярен и распространен, в чем фишки декларативных и функциональных языков… В общем, джентльменский набор интересов программера — но на более глубоком, философском уровне.

Эта статья написана по результатам исследования «вглубь» процесса программирования. Она не претендует на супер-оригинальность и полезность, так как содержит только небольшие выводы, которые могут кому-нибудь показаться интересными ;)

Программирование, как явление и как дисциплину можно (условно — это все очень условно и не претендует на любую абсолютность) разделить на уровни. Под хабракатом даю эту классификацию с небольшими примерами из ООП — как наиболее понятной и распространенной парадигмы программирования.
Читать дальше →

Unix way

Есть программа на С++, которая является тестом, разработанного мною генетического алгоритма. Если её запустить с параметом enable_dump, то она на каждом шаге будет выводить на экран фитнесс всех хромосом. Есть программа которая преобразует файл такого формата (первой программы), в в следующий вид:
среднее значение фитнесса; номер поколения

Так же имеется скрипт на языке R следующего вида:

draw.field< — function(src){
ftns=read.table(src,sep=";");
plot(ftns[,1],type=«l»); }

ps.field < — function(src,dst){
postscript(file=dst); draw.field(src); dev.off(); } Теперь для получения графика, показывающего сходимость алгоритма
необходимо выполнить следующее:
Запускаем программу 1 и перенаправляем вывод в файл dump.csv
преобразуем файл dump.csv скриптом 2 в файл dump.4r.csv
рисуем график.
Получается C++ -> Python -> R -> Postscript. Unix way :)

Выявление места исключения по адресу инструкции

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

Разберем пример с ошибкой:

class Foo {
 public:
  Foo() : i(0) {}

  int bar() const {
    return i;
  } 
 private:
  int i;
};

int main(int, char **)
{
 Foo *foo = 0;
 foo->bar();
 
 return 0;
}



Конечно в данном случае ошибка видна явно. Но допустим, что мы не видим, где и как инициализируется указатель на foo. При запуске получим примерно такое вот сообщение:



Теперь нам нужен map файл для модуля, в котором произошла ошибка (аргумент /Fm компилятора Visual C++). Вот кусок из map файла для данной программы:

  Address         Publics by Value              Rva+Base     Lib:Object

 0001:00000000       _main                      00401000 f   crush.obj
 0001:00000020       ?bar@Foo@@QBEHXZ           00401020 f i crush.obj
 0001:00000030       _mainCRTStartup            00401030 f   LIBC:crt0.obj
 0001:0000010f       __amsg_exit                0040110f f   LIBC:crt0.obj
 0001:00000158       __cinit                    00401158 f   LIBC:crt0dat.obj
 0001:00000185       _exit                      00401185 f   LIBC:crt0dat.obj


Нас интересует колонка Rva+Base. Это адреса фукнций, по которым они расположены в памяти. А в сообщении об ошибке мы имеем адрес инструкции. В нашем случае он 0x0040102a. Найдя в таблице ближайший адрес меньше нашего, мы узнаем фукцнию и объектный файл, ответственные за это безобразие. Нам подходит адрес 00401020, следовательно это функция ?bar@Foo@@QBEHXZ в объектном файле crush.obj. Разумеется имя фукцнии декорировано. Разница между адресом фукнции и адресом исключение — будет локальное смешение внутри фукнции. Чтобы понять, что находится по смещению 0x0a (0x0040102a-00401020) нужен файл листинга (аргумент /FAsc компилятора Visual C++, результат в виде файла с расширением cod). Этот файл содержит C++ код, ассемблрные команды, в которые он был преобразован и машинный код.

Вот как выглядит результат для нашего метода Foo::bar()

; COMDAT ?bar@Foo@@QBEHXZ
_TEXT SEGMENT
_this$ = -4
?bar@Foo@@QBEHXZ PROC NEAR ; Foo::bar, COMDAT

; 5 : int bar() const {

00000 55 push ebp
00001 8b ec mov ebp, esp
00003 51 push ecx
00004 89 4d fc mov DWORD PTR _this$[ebp], ecx

; 6 : return i;

00007 8b 45 fc mov eax, DWORD PTR _this$[ebp]
0000a 8b 00 mov eax, DWORD PTR [eax]

; 7 : }

0000c 8b e5 mov esp, ebp
0000e 5d pop ebp
0000f c3 ret 0
?bar@Foo@@QBEHXZ ENDP ; Foo::bar
_TEXT ENDS
END


Чтобы не осталось вопросов, разберем детальнее. Код начинается со строки:

; 5    :   int bar() const {


; 5 — это номер строки в исходном файле. Дальше идет текст из исходного файла.

  00000 55   push  ebp
  00001 8b ec   mov  ebp, esp


Первая колонка, содержащая 00000 и 00001, это и есть нужные нам адреса инструкций. Следующие цифры представляют из себя так называемый опкод (от англ. operation code), это машинная инструкция, которая отправляется процессору. Из таких инструкций и состоит исполняемый код. Ну а после этого идет ассемблерная команда.

По искомому адресу 0x0a находится следующий код:

; 6    :     return i;

  00007 8b 45 fc  mov  eax, DWORD PTR _this$[ebp]
  0000a 8b 00   mov  eax, DWORD PTR [eax]


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

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

Я описал работу только с компилятором Visual C++, но описанная методика подходит и для других популярных компиляторов для ОС Windows. В Linux/unix, как правило, к таким ухищрениям прибегать не приходится.

FBA и саморегистрация в Sharepoint 2007

Добрый день. Хотелось бы поделиться некоторыми проблемами, возникающими у меня по долгу службы тимлида команды разработчиков корпоративных порталов под Sharepoint. Надеюсь, первая из статей кому-нибудь понравится и следующую можно будет публиковать уже не в песочнице :).
Итак, Form Based Authentication средствами Sharepoint 2007:

Исходные данные


Корпоративный портал, разработанный на базе MOSS 2007.

Требования


Разработать дополнительную часть по работе с заказчиками некоторых услуг. Часть должна устанавливаться на том же сервере, что и корпоративный портал. При этом часть, назовем ее «Услуги населению», должна быть общедоступна «извне» с возможностью регистрации пользователей. Сам корпоративный портал, разумеется, общедоступным быть не может априори. Кроме того, зарегистрированным пользователям «Услуг населению» не должны быть доступны заявки других пользователей.
Читать дальше →

Google Chrome + Linux + Flash

Итак. Не очень давно (примерно 18 июля) вышла первая dev-версия браузера Google Chrome для операционных систем на основе Linux. В данный момент ведётся поддержка только ОСей Debian и Ubuntu, поддержку остальных осей Google обещает организовать в ближайшем времени.


Для установки достаточно скачать и установить deb-пакет для вашей архитектуры (i386, amd64). Те, у кого другая архитектура (или им неизвестна их архитектура), могут попытаться установить пакет для архитектуры i386 следующей командой:
dpkg --force-architecture google-chrome-unstable_current_i386.deb
Правда это мувитон, да и вообще плохая идея.


При установке Google добавит свой репозитарий в ваш список репозитариев, что бы вы могли вовремя получать обновления. Те кто не хочет этого, могут перед установкой выполнить такую команду
sudo touch /etc/defaults/google-chrome
Но лично я в таком случае вообще не вижу смысла установки, ибо вы получите ничего не умеющий и не обновляющийся браузер...


Но это было небольшое лирическое отступление. Главным минусом этого браузера под линуксом, начиная ещё с момента первого релиза Chromium'а, было отсутствие поддержки flash-плеера и прочих плагинов. Но не так давно Google решил-таки разрешить поддержку плагинов, но предупреждает «Plugins (e.g. Flash) are partway implemented and will cause frequent crashe», т.е. плагины могут привести к краху.


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


А для того, что бы это сделать, нужно просто запускать браузер с параметром --enable-plugins. Сделать это можно двумя способами:


  1. Первый способ — просто запускать из терминала:
    google-chrome --enable-plugins
    Правда не все так любят, поэтому второй способ
  2. Немного подредактировать наше меню.

    Для этого надо выполнить всего несколько действий:


    1. Найти все файлы google-chrome.desktop, что можно сделать в терминале командой
      locate google-chrome.desktop
    2. А после этого, в каждом файле строку начинающуюся на «Exec» надо заменить вот этой:
      Exec=google-chrome --enable-plugins

      Внимание!!! Для изменения каждого файла понадобятся права root, поэтому редактор надо запускать через терминал с помощью команды sudo. Пример:
      sudo gedit /usr/share/applnk/google-chrome.desktop



    Но этот способ имеет тоже свой минус: при обновлении браузера все файлы примут первоначальный вид, поэтому делайте бэкапы.



Желаю наилучшего сёрфинга =)

Волшебный триптих (про информационную безопасность 3 святых всея Рунета)

Несколько лет уже существующий www.viruslist.com обзавелся новыми зеркалами www.securelist.com и www.securelist.ru. Владельцем новоявленного триптиха является “Лаборатория Касперского”, ведущий производитель систем защиты от вредоносного и нежелательного ПО, хакерских атак и спама (в этот же портал влился и www.spamtest.ru господина Ашманова). Главным редактором сайта стал Александр Гостев, руководитель Центра глобальных исследований и анализа угроз “Лаборатории Касперского”.

Как это обычно бывает в российском сегменте информационной безопасности, о безопасности веб-ресурса “про безопасность” можно слагать песни — как говорил известный поэт-песенник, “столько песен сложено, слажаю еще одну…”

Давайте посмотрим, чему может нас научить этот на самом деле замечательный информационный портал. Во-первых, пароли пользователей на нем хранятся в открытом виде, что будет весьма приятно тому, кто доберется до базы данных (интересно, пароль администратора сайта тоже в открытом виде? в таблице users?). Такой вывод можно сделать, банально запросив утерянный пароль:

image

Итак, урок от avschool №1 — храните пароли пользователей в Интернет-базах данных в открытом виде, чтобы их было легче украсть и использовать, когда украдете.

Кстати, как там поживают пользователи? Как и на всяком форуме, здесь есть страничка с информацией о пользователях:

image

Адрес страницы с пользовательским профилем: “http://www.securelist.com/ru/userinfo/номер_UID_пользователя“. Путь к профилям статичен и информацию о пользователях можно собрать с помощью автоматических средств (благо разметка стилей позволяет быстро автоматизировать процесс). Немного посканировав, можно увидеть, что пользователи добавлялись блоками (видимо для разных исходных сайтов — spamtest.ru, viruslist.com). Текущие регистрации открыты с позиций с номерами 19000.

В процессе регистрации пользователю предлагают указать два имени — одно для наглядного отображения на этой странице и еще одно в качестве имени учетной записи (login) для входа… Контроля качества пароля при этом нет. Контроля совпадения имени учетной записи и отображаемого имени пользователя также нет. Зачем это нужно? Резонный вопрос в ответ — а зачем тогда различать эти имена? Думаете, чтобы труднее было угадать “login” для входа? Запомним в уме этот коварный ход и смотрим дальше.

При вводе любого имени и пустого пароля, нам скажут, что пароль не указан:

image

Дальше — интереснее. Вот, что получается при вводе несуществующего имени учетной записи:

image

Сейчас будет тест на внимательность:

image

Да-да-да. Есть целых три варианта ответов: “Не указан пароль!”, “Неправильно введен логин или пароль!”, “Неправильный пароль!“. Если имя учетной записи правильное, а пароль нет — нам выдадут сообщение, подтверждающее корректность имени учетной записи — “Неправильный пароль!“…

Урок №2 — давайте автоматическим переборщикам паролей шанс. Можно даже не писать свой — достаточно использовать THC-Hydra (у этой старушки есть все необходимое). Постойте, куда же Вы? А-а-а… писать переборщик паролей? Ну, тогда учтите, что и cookie на этом сайте выставляют очень удобным для тотального опробования образом. Как? Давайте немного углубимся в дебри веб-аутентификации — насколько она здесь “bullet-proof”?

Как только веб-браузер подключается к сайту www.securelist.com, ему тут же отдают следующий набор cookie:

VLUserkaspru = _
uid = AAAAAkpkaNy0aU4CQQnfAg==


Параметр uid — это порядковый номер сеанса работы с сайтом, кодированный с помощью алгоритма BASE64:

00 00 00 02 4A 65 AB 57 70 CD 77 8C 0C 37 E1 02 ….Je.Wp.w..7…

Параметр VLUserkaspru заполняется только после успешной авторизации и состоит из двух частей — номера пользователя (он полностью совпадает с номером в страницах профилей — см.выше) и авторизационной части:

VLUserkaspru = 19434:19HsMQI/mz8hE


Самое интересное — это распределение значений параметра “uid”. Первые 4 и один последний байты неизменны, каков бы ни был посетитель. Если последовательно запрашивать значения uid, то изменяться будут только 3 байта из 16:

вариант № 1:

00000007: 88 57
0000000D: 3E 37
0000000E: D1 E1


вариант № 2:

00000007: 57 1F
0000000D: 37 30
0000000E: E1 3F


вариант № 3:

00000007: BF 21
0000000D: 23 0E
0000000E: DD 12


Получить вместо 2^128 всего лишь 2^24 вариантов… С учетом того, что это идентификатор работы одного из пользователей… Готов урок № 3 — делайте угадываемые номера сеансов и простые параметры cookie, они помогут при фиксации сеанса.

Так что, дерзайте. Тем более, что для нового автора блога надо набрать всего лишь 100 очков за комментарий… пользователи нам помогут. (-:

PS. За отдельную плату могу предоставить “аналитикам по ИБ” сведения о количестве пользователей сайта, использующих пароль “123456″.

Анонимность в сети. Установка и настройка Tor для Ubuntu.

Сегодня возникла рабочая необходимость обеспечить некоторым сотрудникам моей компании анонимность в сети. После недолгих поисков остановился на анонимной сети Tor. Поскольку эта система неоднократно уже упоминалась на Хабре, много о ней писать не буду, приведу лишь несколько предложений, взятых с сайта разработчиков:
«Tor это программный проект, который поможет вам защититься от „анализа потока данных“ — разновидности сетевого надзора, который угрожает персональной свободе и приватности, конфиденциальности бизнес контактов и связей, а также общегосударственной безопасности. Tor обеспечивает защиту за счёт маршрутизации вашего сетевого трафика по распределённой сети серверов запущенных добровольцами со всего мира: это не даёт возможности внешнему наблюдателю отслеживающему ваше интернет-соединение узнать какие сайты вы посещаете, а также не даёт возможности сайту узнать ваше физическое местоположение. Tor работает со многими существующими приложениями, включая веб-браузеры, системы мгновенного обмена сообщениями, клиенты удалённого доступа, и другие приложения использующие протокол TCP.»
Читать дальше →

Semantic Web: вы в него верите?

Я здесь буду говорить о том, как плох Semantic Web.

Я не так давно стал углубляться в эту тему, поэтому моя статья не является обоснованным заключением относительно этой вроде бы перспективной технологии, а всего лишь призвана обратить внимание читателей на некоторые важные вопросы, ответы на которые я пока найти не сумел. Конечно, много уже научных статей и диссертаций про Semantic Web понаписано, и многие читатели, наверно, раскритикуют меня, но мне важно, чтобы это была обоснованная критика по существу. Статьи, виденные мной, в большинстве своем опираются на то, что Semantic Web — это круто, что Semantic Web в силу своей архитектуры и красивого названия способен выполнять возложенные на него функции. А где их авторы это прочитали?

Читать дальше →

Мой интернет-провайдер. История о том как нельзя делать

«Из всех искусств, для нас являются важнейшими кино и интернет»


Есть на свете замечательный провайдер, который несёт людям свет как Прометей, не щадя себя. И люди благодарны ему за его дар. В каждой квартире есть это чудо, каждый может найти всё что угодно: любителю пообщаться – всегда доступные многочисленные чаты; киноман – в любой момент разыскать новинки; перед меломаном раскрывается целый мир музыки – всегда, в любое время, что бы он не пожелал; любой человек всегда может найти в необъятной сети, то, что он хочет. Беря совсем немного и отдавая целый мир… Но рассказ сегодня будет далеко не о таком интернет-провайдере. 300 км от города Новосибирска и цены взлетают в 15 раз. Вы такое можете себе представить? Добро пожаловать в город Бийск, по необъяснимым причинам носящий статус «наукоград»!


Моя история берёт начало осенью 2007 года, когда по совету друзей я стал счастливым обладателем десятиметрового кабеля у себя в квартире, а за одним и абонентом компании ООО «АБ-телеком» (в дальнейшем именуемой АБТ). До этого свет тёк мне в дом благодаря пчеле и яйцу, ещё ранее радовался прелестям диалапа (далёкие времена, когда можно было порадоваться трём женщинам за ночь, вспомнился сериал «Компьютерщики»).


Моё подключение сопровождалось крайне неприятным событием, провайдером не были выдержаны сроки по прокладке кабеля до квартиры. Решилось всё путём похода в офис и разговора с директором. Подключение осуществили в тот же день. Смутило довольно хамское отношение «монтажников», но в последствие я решил, что такие мелочи «сервиса» не должны меня расстраивать и я могу теперь наслаждаться всеми прелестями интернета, тем более что подключили меня, после посещения офиса, бесплатно. Каким наивным был я тогда, платя 300 кровных за 150 мегабайт ежемесячно.


Настал 2008 год, а с ним пришла ОАО «Эфортель» (в дальнейшем просто Эффортель), «молодая и перспективная» компания под эгидой которой стала работать АБТ. Сразу скажу, что сейчас работа Эффортель мне более чем непонятна, а тем более её доля в бизнесе АБТ, убедится в «прозрачности» своих бухгалтерских отчётов Эффортель предлагает по бумагам, представленным на сайте. Многие ждали перемен и они пришли…


Долго облизываясь на безлимиты, предоставляемые сетями нашего города и ругая сетку АБТ, я дождался счастливого часа, когда под напором пользователей и конкурентов, компания наступила себе на горло и… (тут должно быть что-то на подобие салюта).
Шло время, интернет становился частью повседневной жизни. Не обращая внимание на огрехи в работе сети, на довольно посредственный уровень предоставляемых услуг я гордо нёс звание пользователя сети АБТ.


2009 год. Со временем я всё больше стал проявляя интерес к качеству предоставляемых услуг, дизайну, соотношению цена/качество, стал задумываться о городе в котором я живу, что в последствии подвигло к некоторым размышлениям, одно из которых на тему отношений продавец/клиента.


Как ни печально, но вузы города Бийска работают на обеспечение магазинов, банков, рынков – свежей кровью. Я думаю, с кассой ни у кого проблем не будет, если немного попрактиковаться, но вот когда в иные сферы попадают неосведомлённый люди, которым всё как два пальца…, которым не то что книжку по своему направлению почитать, но и даже инструкцию лень. Понять можно – в погоне за нормальной зарплатой в маленьком городке, в какой только огонь и омут не кинешься. В городе, где зарплата в 3000, не поверите… – это зарплата. Понять можно, но как пользователю этих услуг порой становиться не по себе.


Так вернёмся к нашему цирку…, простите, то есть к нашему интернет-провайдеру. За небольшой промежуток времени в АБТ происходят перестановки кадров, увольняют старых сотрудников, принимают новых, какие-то передвижки в модерирующем составе форума. Но я не думаю, что это сильно повлияло на всё что происходило и до этого и сейчас.


Первое, на чём остановилось моё внимание это главная страница сайта АБТ – лицо компании. У любого человека, знающего как важен хороший добрый дизайн, юзабилити с его рюшечками и плюшками ммммм, может проявиться кататонический синдром, так что посещать – на своё усмотрение. Из весёлостей, к примеру, «панелька» с валютами, «зависла» навсегда, идут дни месяцы, а курс доллара по версии АБТ неизменен. Ещё где-то в марте месяце про этот «глюк» я написал на форуме в раздел «Жалобы и предложения», ответ «а ты что барыга? зачем тебе курс доллара!». За последнее время страница стала пестрить многообразием убогих баннеров, даже не знаю, куда они ещё рекламу догадаются впихнуть. Самое главное и интересное это новости компании… спорная информативность, но об этом далее. Все остальные страницы и прилагающиеся сайты просто сборники шаблонов, безвкусицы, и присущей всему этому нелепице. В общем, это хороший учебник, того как делать нельзя.


Обратимся к форуму. Слеплен на основе старой и доброй платформы. Причём упор надо сделать на старой. Цензура АБТ присутствует в полной мере, хотя, как пытался меня убедить модер «форум Бийска, а не конкретно компании» и это было прописано в ветке «Жалобы и предложения» (извините, но точно передать слова не могу, когда я писал это, какой-то желтый треугольник с восклицательным знаком закрывал компьютеры в трэйе). Вообще безнаказанность модеров это отдельный разговор. В двух словах: делают разное и нехорошее. Но в целом жить можно, если шибко не выступать и не говорить о своих правах.


11 июля 2009 года. Пропадает глобальная сеть. Огромное число людей на форуме с вопросом, а где наш интернет? Не сразу, но скоро выясняется, что сообщение о профилактике было на главной странице, но оно оказалось менее важным, чем то в котором говориться, что главный офис 8-го числа не сможет принимать платежи в течении нескольких часов. Наш народ не привык к такой щедрости на новости от компании и читает только верхнюю. Факт небрежно отношенного администратора становится серьёзно порчей нервов многих абонентов. Эта профилактика поставила жирную точку в функционировании сети. В последующие четыре дня ни глобальной, ни локальной сети не наблюдалось.


По фактам.


Факт первый. Было названо множество причин поломки! Классической является молния. Представьте себе, что каждый раз, когда гремит вдалеке гром – отключается вся сеть. Мифическая молния бьет каждый раз в оборудование АБТ. И даже когда компания перевела технический отдел в другой район, то молния усердно попадает точно в цель. Если кто-то из АБТ увидит молнию зимой, а такие случае бывали…


Факт второй. Главная страница оставалась доступна даже во время адских преследований молнией (иногда, кто-то дёргал рубильник на 2-3 минуты и было счастье). Но изменений на ней не было, хотя нет, кажется, баннер добавился. Где новости «о простите, у нас сломалось…», «извините, работаем…», «уже почти поймали молнию в сачок…»? Где? Звонить? Пальцем не пошевелю. Вместо того что бы убивать нервы себе и своим пользователям компания могла размести всего одно объявление, рассказывать абонентам о происходящем. Прошло 12 дней – заявлений нет.


Факт третий. Как мне объяснил модератор, перерасчёт будет сделан после того как начальство вернётся из отпуска!


Факт четвёртый. Отсутствие ответственных лиц. Добавить нечего.


Есть ещё один факт, который сподвиг меня написать всё это. Друг вернулся на днях из города Новосибирска и порадовал, что совсем недалеко есть жизнь. «Электронный город» живёт и процветает, за 400 рубликом можно получить скорость в 3мб/с и море разных приятных бонусов. после чего я посмотрел на бумажку в 500 рублей и подумал, а стоит ли нести её и отдавать конторе, которая даже мою несчастную скорость 256 кб/с не может обеспечить стабильно 24 часа, каждый день, семь дней в неделю.


Раздосадованный, я задал свой вопрос на форуме и высказал прочие претензии к компании. Выше я уже писал, что раздел «Жалобы и предложения» не предназначен для жалоб и предложений. Посоветовали обратиться в коммерческий отдел. Девушка на другом конце провода наверное ещё долго смеялась, после нашего разговора. «Почему цены на предоставляемые услуги в нашем городе в 15 раз больше чем в городе под названием Новосибирск?», «Не надо сравнивать нас с Новосибирском, ведь у нас такой маленький, а у них такой большой. У нас маленький, у них большущий» (может, я много смотрю «Южный парк», серию про чипокомонов никогда не забуду). Если даже учесть, что количество пользователей не такое уж и большое, цены просто астрономические. Может много топлива уходит привезти интернет из другого города, а может, действует какой то роуминг, такой что на каждый двадцатый километр цена в раз вырастает. Мой пытливый, но уже больной ум неспособен разгадать эту фантастическую загадку.


Прошло 12 дней, история повторяется вновь. Я думаю, что не я один сижу сейчас в богом забытом городе, без средств связи с «внешним миром». Отзовитесь, те, кому небезынтересна ситуация, с кем судьба распорядилась также. Как бы Вы поступили на моём месте?

Генерация PDF в Ruby

Почти все около-энтерпрайз разработчики сталкиваются с задачами генерации отчётов. При особо запущенном маразме отчёты нужны в MS DOC и прочих эзотерических форматах. Мне же повезло — отчёты нужны были в PDF. Казалось бы, что тут может быть сложного? Ну, по порядку.

1. За 5 минут был нагуглен Ruport. В наличии неплохая документация, гибкое API, классные таблички, графики, хорошие отзывы от уважаемых людей. Сказка просто, только вот русские буковки выводить он отказался. Надо сказать, я удивился. Последние лет 5 ни разу не встречался с проблемами локализации…

2. Следующие три дня я провёл в попытках пропатчить либу отвечающую за генерацию собственно PDF в Ruport (PDF::Writer). Выводы простые — авторам самого PDF было и есть плевать на «нестандартные» с их точки зрения глифы (см спецификацию ANNEX D), что в принципе подтверждалось нескольким десятком обсуждений. Я всё же человек упорный и вопрос решил с помощью перекодировки моего текста из UTF8 в CP1251 и использования результата как ISO-8859-1, создания таблицы подстановки, вычисления ширины и позиции каждого глифа и прочего страшного шаманства. Осталась только маленькая и нерешаемая проблемка — вместо русского текста из пдфки копировались кракозябры. Правильное решение потребовало бы переписывания половины PDF::Writerа.

3. Плюнув на всё я решил смотреть в сторону RTex. Как по мне, писал бы себе спокойно отчётики на LaTeX, но в наличии есть коллеги, которым его осваивать лень. Если есть возможность осваивать — очень достойный вариант.

4. И вот, после почти недели мучений, я случайно нашёл Prawn — аналог скорее PDF::Writer а не Ruport, но на безрыбье и рак рыба. Либа проста, удобна в использовании, не имеет проблем с юникодом, автоматический эмбединг фонтов, таблички (не забудьте поставить Prawn-Layout). Не хватает (пока) только такой мелочи как чарты, приходится вставлять внешнегенерённые PNGшки — PDF не умеет вставлять в себя SVG.

Выводы просты: пдф из рубей генерить можно, что вкупе с плагинами уровня предприятия делает рельсы пригодными для энтерпрайза; людей, которые при составлении спек или разработке плюют на юникод, надо расстреливать.

CD/DVD Флешка для пингвинов

Давным давно, в далекой галактике… в ядре linux появилась функция пакетной записи на cd/dvd. В системах windows-типа такая возможность существовала давно, но так просто ею нет возможности воспользоваться, надо устанавливать или специальный драйвер или утилитку наподобие NeroInCD (так она вроде называлась). На прилавках магазинов начали появляться диски DVD-RAM — жутко дорогие и дисководы тоже обзавелись поддержкой данного формата.

Вернемся в Linux.
Если зайти в каталог исходников linux и дать команду конфигурирования:
[root@IBM linux-2.6.30-ARCH]# make menuconfig
… то в разделе
Device Drivers ---> Block Devices
мы найдем опцию
[ M ] Packet writing on CD/DVD media

Вот справка:

If you have a CDROM/DVD drive that supports packet writing, say Y to include support. It should work with any MMC/Mt Fuji compliant ATAPI or SCSI drive, which is just about any DVD/CD writer.


То есть функцию пакетной записи можно включить прямо в ядро или вынести в качестве модуля (его название — pktcddvd).
Я так понял, что поддержка пакетной записи в пингвинах подразумевала использование файловой системы UDF и некоторую поддержку со стороны ПО для записи дисков, но никогда и ничего так и не встретил в {ру, интер}нете.

Так и не разобрался для чего нужна эта функция и как она работает. Зато, примерно год назад наткнулся на статью (ссылки не помню), в которой описывалось как отформатировать cd/dvd-rw болванку в файловую систему reiserfs. Тогда я попробовал воспользоваться советами автора статьи, вставил DVD-RW в привод, отформатировал, подмонтировал, записал, отмонтировал. Проделывал такое несколько раз — ну прямо как с флешкой! Единственное, мне не понравилась поддержка автомонтирования такого диска со стороны KDE и Гнома — они просто не могли этого сделать, а разбираться и прикручивать тогда что-либо мне хотелось (лень). Все благополучно забыл/забил.

Буквально несколько дней назад, у меня под рукой не оказалось флешки (надо было фильмец другу записать). Тогда я взял DVD-RW'шку вставил ее, дал пару команд:

mkfs.ext4 /dev/dvd (тут пришлось подождать — примерно минуту создавался журнал)
sync
eject

Снова вставил… о боже KDE 4.2 распознал диск и плазмойд «Подключаемые устройства» выскочил на экран с названием устройства Volume (ext4) и иконкой оптического диска. А дальше все как обычно — открываю дельфин, закидываю фильм на диск и нажимаю кнопку извлечения в плазмойде. У друга открываю диск, просто как флешку, переношу фильмец. КРАСОТА! При этом никакого модуля pktcddvd подгружено не было :-0 Все-таки Linux поражает своей гибкостью!

Кстати, винда, определяет такой диск как сырой RAW ;-)

Если, кто захочет форматнуть диск, лучше используйте не журналируемые ФС, все-таки быстрее будут происходить все операции чтения/записи. Я сам пробовал форматировать в vfat и ext2 (тут немного mkfs поругался, что нет патриции, но все равно форматнул) — работает также на ура.
Таким же образом можно поступить с любым RW носителем. Скорость записи равна обозначенной на носителе (у меня была 8x болванка Verbatim).
Удачи в экспериментах, хабровчане, ставьте баллы! :)

Освещение в доме по датчику движения

датчик Наверняка все слышали про технологию «умный дом». Одно из самых популярных применений этой технологии в автоматическом освещении — например, включение и выключение света при появлении или уходе людей из помещения. В этой статье хотелось бы показать, что ничего сверхествественного в этом нету, и реализовать эту возможность может любой человек. Итак, попробуем подключить к обычной лампочке Ильича в коридоре датчик движения, и заставим освещение работать в зависимости от наличия людей в помещении.
Читать дальше →

Где кончается экстремальное программирование

Пролог


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

Терновый путь


В первой организации использовалась методология RUP (Rational Unified Process). Начиналось все с анализа проблем, определения задач, выявления требований и заканчивалось детальной спецификацией к программному коду, который, как мы тогда шутили, могли писать обычные «рабы». Отклониться от спецификации – затянуть у себя петлю на шее. Сначала довелось мне побыть «рабом», а затем и менеджером проектов, потому хорошо прочувствовал все прелести этих ролей. Структура управления рабочим процессом была глубокая и разветвленная — шесть уровней от генерального директора до разработчика, не буду вдаваться в подробности, но бюрократии было много. Постоянные планы, отчеты, запросы, протоколы и т.д. – каждый шаг был задокументирован. Боюсь представить какая часть времени уходила на это. Может быть я отошел от темы, но началось все это с RUP, который подразумевает наличие определенного (немаленького) пакета проектной документации. Не буду распыляться — сразу расскажу о результатах применения такого подхода:
Во-первых, это полностью демотивированный штат разработчиков (назвать их программистами язык не поворачивается, больше подходит термин «кодер»), в течение двух лет он полностью обновился по понятным причинам.
Во-вторых, это огромная стоимость ошибок и недочетов на ранних этапах проектирования. Как показала практика избежать их практически не возможно, а найденная в конце цикла разработки ошибка может затронуть 90% проектной документации. Но, тем не менее, организация процветала и сейчас является одной из крупнейших веб-студий (входит в рейтинг top 50 российских веб-студий).

В раю


Спустя пару лет я устроился в другую крупную организацию по разработке ПО. Здесь царило экстремальное программирование. Сначала, после всего мною увиденного и пройденного ранее, мне показалось все это детским садом – ни менеджеров, ни бумажек, ни начальников — ничего из того к чему я привык. Только простенькая утилита для планирования релизов/итераций, простой баг-трекер и десяток проектных команд по 5-7 человек с тим-лидерами во главе. Парное программирование работает! Если бы кто-нибудь предложил это в первой организации его посчитали бы идиотом за предложение вдвое увеличить стоимость человеко-часа. Я влился шестым в одну из существующих команд и спустя какое-то время уже не мог представить, как раньше я мог работать по-другому и почему другие до сих пор работают по-другому. Качество продуктов было на высоте. Тесты, постоянная интеграция, постоянный фидбек кастомеров – все делало свое дело.

Гром среди ясного неба


Проект, над которым мы работали, оказался очень перспективным и быстро развивающимся — через год нас было уже 10 человек в команде. И появились первые проблемы «размера команды». Объем написанного кода значительно увеличился, а методология подразумевает совместное владение кодом. Если в 10 000 строк кода еще можно более или менее ориентироваться, то когда это 1 000 000 строк — начинают появляться «провалы», код начинает дублироваться и становиться менее качественным. Нарушаются коммуникации, каждый участник вносит свой элемент хаоса – проект набирает энтропию. Количество багов растет. Время, которое тратится на фиксы багов смещается с 30% до 90%. Развитие проекта замедляется, продажи падают.

Дорога в никуда


Волевым усилием руководство принимает решение о разделении команды на три подкоманды численностью не более 5 человек, назначаются лидеры каждой из команд. Каждая подкоманда работает над своей «зоной ответственности». Ситуация немного улучшается, в каждую команду приходит еще по 2 человека. Еще через год нас уже 20. Уже знакомые проблемы обостряются еще сильнее. Не смотря на то, что мы имеем 3 команды, не стоит забывать, что работают они над одним проектом и те завязки и зацепки между «зонами влияния», которые были еще до разделения, мешают сделать работу команд прозрачной и независимой. Объем кода утроился, теперь уже точно никто полностью не знает что, где и как. А требования к проекту растут, и удержаться на плаву становится все сложнее и сложнее. И вот уже можно выделить 10 псевдонезависимых областей, над каждой из которых может работать отдельная команда. И именно это собирается сделать руководство – разбить на команды и добавить людей.

Озарение


Теперь хочется на минуту остановиться и подумать. К сожалению или к счастью у этой истории пока нет конца. Я остановился на настоящем. Что будет дальше — покажет время. Но хотелось бы поделиться выводами, которые я сделал из всего этого для себя.

  1. Работа над проектом небольшой командой очень эффективна. Пять хорошо подобранных человек — видимо оптимальный вариант.
  2. Если возникла необходимость в дополнительных ресурсах для работы над проектом, то недостаточно просто создать две команды и заставить их работать над одним проектом. Предварительно необходимо исключить какие-либо зависимости между модулями, над которыми работают команды. На первый взгляд это кажется сложным, но выражаясь языком программиста, достаточно определить интерфейсы, посредством которых будет осуществляться взаимодействие результатов труда нескольких команд.
  3. Если над проектом работает более одной команды, то проекту нужен менеджер. Должен быть человек, который видит проект целиком и может задавать нужное направление каждой команде и проекту в целом. Даже несколько идеальных команд с идеальными лидерами не смогут идти к одной цели, если нет человека, который эту цель видит и может ее донести до каждой из команд.


Эпилог


Хотелось бы услышать мнения по сложившейся ситуации и прогнозы относительно судьбы описанного проекта. А я с удовольствием вернусь через некоторое время и расскажу что у нас получилось, если конечно кто-нибудь поделится со мною инвайтом :)

Спасибо за внимание.

Опыт примирения Google Contacts, Mirand'ы и записной книжки смартфона.

Я думаю, что в этой статье для большинства из вас я не скажу ничего нового, но все таки поделюсь своим опытом пользования такими сервисами от Google как Sync и GTalk. Первым я пользуюсь уже достаточно давно как архивной копией контактов своей записной книжки на моем стареньком Nokia 5500. А вторым заинтересовался недавно, после того как возникло желание хранить историю чата на сервере.

Чтобы не добавлять заново все контакты и не объяснять всем и каждому, что у меня сменился JID, решил подключить свой jabber-аккаунт через j2j транспорт. С ICQ поступил так же. Благо сейчас аськотранспорты стали достаточно функциональны и стабильны.

После добавления контактов аськи и джаббера в ростер GTalk'а они автоматически добавляются в Google Contacts. JID контактов отображаются как E-mail адрес, что не есть хорошо, хотя и не страшно. Я, например, напротив JID'ов ставлю тип почты Other, чтобы отличать от реального адреса почты. Получившиеся дубли (если у человек у вас есть и в записной книжке с номером телефона и в ростере) легко объединяются в один контакт.

Но что делать с теми контактами, чиьх телефонов нет, или если они не нужны? Ведь хранить все содержимое ростера в телефоне как-то нецелесообразно. Для этого следует помнить, что телефон синхронизирует не все контакты, а только те, которые находятся в группе My Contacts. Таким образом рассортировав контакты по группам, можно добиться, того чтобы в телефоне было только то что требуется.

Следует обратить внимание на такой ньюанс. Если контакта нет в Google Contacts, то и в ростере jabber-клиента его тоже не будет (он удаляется). Но не всякий контакт из Google Contacts добавляется в ростер (извиняюсь за сумбурность).

После долгих мучений у меня получилась следующая, интересная на мой взгляд, схема. В Google Contacts у меня находятся контакты из ростера GTalk'a, и контакты из записной книжки телефона. Некоторые, понятно, присуствуют и там и там. И теперь, переименовав контакт в любом джаббер-клиенте, он автоматически переименовывается и в телефоне (если он, конечно, присуствует в группе My Contacts для синхронизации), и наоборот, сменив имя в телефоне, вы переименовываете его и в ростере джаббер-клиента. Мне кажется это достаточно удобным, так как не приходится вспоминать под каким именем %nickname% записан в телефон — везде одно и то же имя.

Еще одной приятной особенностью стал поиск по истории переписки. Думаю не стоит объяснять, что искать стало удобно и быстро :)

Веб-сёрфинг через Jabber.

В один довольно насыщенный вечер, попивая пиво на краю обрыва с лучшим другом, думали о возможности сёрфинга по Интернету при наличии только локальной сети и бесплатного транспорта icq и jabber. Идея родилась довольно быстро, но она сразу показалась смешной и оригинальной.
Читать дальше →

Куда идут инвесторы с запросами в 50+% или как я искал инвестора.

Увидел спор в одном из тредов, и захотелось поделится опытом ;)

Немного истории. 3 года назад я проснулся утром, надо было идти на работу, которую я не сильно любил по некоторым причинам, и решил туда не идти. Отзвонился сказал что сегодня меня не будет, и остался лежать дальше глядя в потолок =) В итоге задумался: «Чем я занимаюсь? Почему я должен каждое утро себя поднимать пинками. Чем бы я действительно хотел занятся ?». После долгих раздумий стало ясно что нада поднимать свой проект, сразу появился следующий вопрос: «Какой проект, какого его социальная значимость и необходимость?».

Мысль озарила меня спустя час. Проект был придуман, после серфинга по инету ни российских, ни зарубежных аналогов не нашлось. Я обрадовался и подумал: «Вот оно!». Но не тут то было… почти год я ходил продумывал концепцию, от первоначальной не осталось не следа, точнее лишь вектор =) Сформировалось вполне себе четкое понимание чего я хочу, все мысли были занесены карандашем на бумагу. Драфтовое описание проекта составило 93 страницы 96-листовой тетради, не сильно крупным почерком. Ну что же осталось дело за малым — реализация ;) 2 года как раб на галерахне покладая рук я занимался в свободное от работы время проектом. Нашлись идейные помощники, были привлечены где необходимо математики =) итого коллектив разработки составил 5 человек. На берегу было сказано, что каждый участник включая меня будет иметь 7% от чистой прибыли предприятия в месяц. Остальное — дележка с инвесторами и финансы на дальнейшее развитие проекта. Долго ли коротко, появился результат. Нам потребовался инвестор.

Тут я сел за расчеты. Подробный бизнес-план выкладывать не буду, но основные «тяжелые» затраты вот:
Сервера — 5 штук стоимость каждого ~700 000р (единовременно)
Аренда места под сервера — 30 000р (ежемесячно)
Реклама в интернете 200 000р (ежемесячно)
Реклама на щитах и баннеры в оффлайне 300 000р (ежемесячно)
Зарплата менеджерам 10 человек — ~200 000р (ежемесячно)
Аренда помещений 5 — ~70 000р (ежмесячно)
(Зарплата либо что еще у команды разработки просто отсуствует, ради сокращения расходов и вообщем то все с этим согласны)

Введение монетизации планировалось на 4 месяц открытия с расширением функциональности, то есть 4 месяца проект должен жить и развиватся, и только после этого он начнет приносить хоть какую то прибыль. и спустя 9 месяцев после открытия выйдет на окупаемость.
Итого полуичилось ~11 000 000р для того чтобы запустить и довести проект до состояния начала окупаемости и получения прибыли.

Нашлось куча инвесторов которые предлагалаи до 3-4 млн и требовали 50% и выше. Такого мы позволить себе не могли, ведь в таком случае если брать нескольких таких инвесторов получалось бы мы должны были бы отдавать более 100% инвесторам.

В итоге сформировались требования к инвесторам(требуются только деньги, без юридической и прочей помощи):
либо сумма полностью и соответственно 35% от чистой прибыли проекта.
В случае ~3 млн 10% от чистой прибыли проекта.
В случае ~1млн 3% от чистой прибыли проека.

1000$-10000$ как вы понимаете даже не рассматривались, по вполне понятным причинам.

Эти цифры мы вполне себе смогли мотивировать. Наш вклад в проект предварительно составил около 11 млн рублей(стоимость разработки и все головняки по организации проекта на нас). Поэтому мы имеем право предложить равные условия 35% — на нас 5-ых и 35% на инвестора, и кроме этого еще 30% остается на развитие проекта.

В данный момент были найдены подходящие инвесторы, которые выслушали поняли и согласились с нами. Но не ожиданно у нас появилась возможность вытянуть проект своими силами =) Поэтому от инвесторов пришлось отказатся. Немного затянется срок запуска проекта, зато никому ничего не должны и работаем исключительно на себя.

Mojo perl framework, FastCGI, Nginx начало…

image Отсутствие документации для Perl фреймворка Mojo весьма угнетает. Несмотря на то, что исходники очень даже приятны для просмотра, первые шаги даются с трудом. Итак, пара советов всем кто решил не дожидаться документации, а приступить к изучению этого интересного фреймворка:

Читать дальше →

В БГУ открыли лабораторию по изучению Linux

В Белорусском государственном университете открылась лаборатория по изучению свободно распространяемых операционных систем (систем открытых стандартов). Она создана на факультете прикладной математики и информатики в рамках сотрудничества с белорусской компанией «Открытый код» — бизнес-партнером ведущих мировых представителей Linux-решений.
До недавнего времени операционная система Linux использовалась только энтузиастами, да и то в основном для обеспечения деятельности специальных серверов. В Беларуси в настоящее время на большинстве персональных компьютеров и рабочих станций установлена система Microsoft Windows. До начала XXI века почти все персональные компьютеры продавались с предустановленной системой Windows, теперь же стали появляться и иные операционные системы — GNU/Linux, FreeDOS и другие, сообщили в ВУЗе, передает БелТА.

Во многих странах стали более активно использовать свободное программное обеспечение. Среди стран, использующих в своей деятельности Linux, — Китай, Франция, Великобритания, Германия, Нидерланды, Япония и другие. Использование свободного программного обеспечения в Евросоюзе достигает 50%.

Как отметили в ВУЗе, такое быстрое внедрение невозможно без наличия квалифицированных кадров. Именно для этого на ФПМИ БГУ и открыта специализированная учебная научно-исследовательская лаборатория свободного программного обеспечения. На ее базе будет организовано изучение студентами операционной системы Linux, программных продуктов компании IBM (таких, например, как Lotus Notes и Tivoli), нашедших широкое применение в реальном сегменте ИТ-рынка.

Linux — система, являющаяся одним из вариантов (клонов) операционной системы типа Unix. В своем первоначальном виде она была создана Линусом Торвальдсом как версия ОС UNIX для IBM-совместимых персональных ЭВМ. При этом создатель, в отличие от авторов Windows, опубликовал исходные коды своей системы в интернете и к развитию системы подключились множество независимых разработчиков.

Благодаря этому на сегодняшний момент Linux — современная, устойчивая и быстроразвивающаяся система, почти мгновенно вбирающая в себя самые последние технологические новшества. Может использоваться как в качестве серверной ОС, так и на сетевых рабочих станциях или персональных компьютерах, рассказали в БГУ.