понедельник, 27 сентября 2010 г.

В спину капитану (культпросвет)


Кстати, такое поведение, когда выражение вычисляется только в том случае, когда результат его вычисления необходим для дальнейших расчетов называется "Ленивые вычисления".
Пишут, что Haskell весьма хорош в них.

Программист или убийца?

Забавный тест (хоть и баян) на тему "кто-кого видит издалека".



Спасибо Александру за ссылку.

четверг, 23 сентября 2010 г.

Эскалационные письма

Недавно послушал увлекательный вебинар "Составление эскалационных писем" (Luxoft, Дудкина Анна).
До вебинара я понятия не имел что это такое - эскалационное письмо. А яндекс с википедией предательски молчали.
Теперь же, я с полной ответственностью могу рассказать что:

Эскалационное письмо это такое письмо, в котором ты эскалируешь руководству какую-то проблему, которую невозможно решить на твоем уровне. По нашему - кляуза.

понедельник, 20 сентября 2010 г.

Вебкамера на орбите

Митч пишет, что на МКС установили веб-камеру.
Посмотреть на землю в режиме реального времени можно по ссылке:
mms://a1709.l1856953708.c18569.g.lm.akamaistream.net/D/1709/18569/v0001/reflector:53708
Этот адрес нужно задать любому плееру, поддерживающему потоковое вещание. Лично я воспользовался способом "Пуск - Выполнить" и вставил ссылку в строку команды. Медиа-плеер распознал и открыл ссылку.

Так же интересно было почитать блог космонавта, который он писал прямо с орбиты.

пятница, 17 сентября 2010 г.

IE9

biz.liga.net сообщает, что "15 сентября 2010 года корпорация "Microsoft" во время мероприятия в Сан-Франциско представила публичную бету своего браузера "Internet Explorer 9". В Украине презентация состоялась на день позже и...
Чтобы участники киевского события смогли проникнуться духом нового продукта, собственно, рассказ о новых качествах браузера предварял небольшой перформанс: сама презентация проходила в галерее, а для большей наглядности свойства IE9 демонстрировались не только в рабочем режиме на экране, но и "в танце".

А так как сами представители microsoft утверждают, что...
"Internet Explorer 9" в 11 раз быстрее, чем предыдущая, восьмая версия.
То по логике вещей девушка, демонстрирующая ИЕ9 должна была танцевать в 11 раз быстрее...

Да.

А девушка изображающая ИЕ6 - лежать и под музыку дергаться в конвульсиях.

среда, 15 сентября 2010 г.

IT-Jam 2010

В эти выходные успешно прошел и закончился IT-Jam 2010.
Событие большое во всех смыслах. Большое по количеству участников (~1200 участников), по значимости для развития IT в Украине и для меня лично.

Все было очень замечательно и я рад что был на таком отличном мероприятии. Очень понравилась Business Value Game (Тим прекрасен, да), были хорошие доклады и отличная IT Jam Music Session.

Ну, и на закуску обо мне. Кажется, что мне пора иначе воспринимать подобные мероприятия и вливаться в "формат". Некоторое время назад такие конференции и base-camp'ы были более "домашними" и более "локальными". Наполненными атмосферой некоторого уюта. Сейчас же на каждой все больше и больше людей, докладчиков и все меньше и меньше времени. Теперь нужно быть еще более активным, быстрее ориентироваться в бурлящей среде докладов и, как ни жаль, еще более избирательным в темах докладов. Потому что никак не получается объять необъятное. Хотя и хочется.

Ссылки на разные отчеты есть на официальном сайте.
А вот кадр с Business Value Game:
 Наша команда знакомится с заказчиками на карточках.

вторник, 14 сентября 2010 г.

CEE SECR 2010

Очень хочу поехать на CEE SECR 2010. Послушать Бьярна Страуструпа и Стива Тодда.

Здесь и сейчас

Мария Евграшина знакомит нас с концепцией "Здесь и теперь" в блоге tim.com.ua.
 Мне нравится этот настрой, как и любые идеи, возвращающие в реальность.

понедельник, 13 сентября 2010 г.

вторник, 7 сентября 2010 г.

Почти по Орлову

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

Чувствую себя примерно так же - демотивированный конь.

четверг, 2 сентября 2010 г.

DrupalCamp'2009

Друпал такой друпал!
Obrygan's community в полном составе:

четверг, 26 августа 2010 г.

Условия и переменные (заметки Кэпа)

Решил я как-то проверить каким образом вычисляются составные условия в 1С 8.1
Не думаю, что профи найдут для себя в этой статье нечто новое или интересное, но Капитан Очевидность продолжает вещать.
Первое, что пришлось проверить - не инициализированные переменные:

На код вроде:
    А = 1;

    Если (
А=1) и (Б=1) Тогда
       
Сообщить("Ок!");
    КонецЕсли;

Выругался сам "компилятор" при попытке сохранить обработку. Логично, так как переменная Б нигде не определена. Но, если обмануть синтаксический контроль следующим образом:
    А = 1;

    Если
0=1 Тогда  // заведомо ложное условие
       
Б=1;        // никогда не выполняющийся код
   
КонецЕсли;

    Если (
А=1) и (Б=1) Тогда
       
Сообщить("Ок!");
    КонецЕсли;

В этом случае при сохранении ошибки синтаксиса не будет, а при запуске надписи "Ок!" не появляется. По логике следования кода мы нигде не определяли переменную Б, но код успешно выполняется.
Что говорит нам отладчик?
Обратите внимание, что в самом начале, когда ни одна переменная еще не определена память под них уже зарезервирована и им назначен тип "Неопределено", в отличии от переменной В, которая вообще не упоминается в процедуре.
Сделаем пару шагов:

Теперь все очевидно. Условие совершенно корректно и дает на выходе ложь, так как единица не равна "Неопределено" и вообще разных типов.

Итак, предварительный вывод:
Под переменные, которые могут быть инициализированы, внутри своей области видимости память выделяется в самом начале и они неявно инициализируются типом "Неопределено".

Чисто теоретически следующий код мог бы работать:
    А = 1;

    Если (
А=1) и (Б=1) Тогда
       
Сообщить("Ок!");
    КонецЕсли;

    Если
0=1 Тогда
       
Б=1;
    КонецЕсли;

Но нет. Не проходит синтаксический контроль, что вообщем-то правильно.

Чем же эта информация может быть полезна? Например тем, что если в процессе отладки у вас какая-то переменная имеет тип "Неопределено", то возможно она была инициализирована неявно и вам стоит проверить свои условия. Хотя, вносить инициализацию переменной в условие вообще-то плохой тон. Да, да, как раз из-за вышеизложенного.

Однако, неявная инициализация это не совсем то, что я собирался выяснить с самого начала и я вернулся к условиям.

Следующий код работает как положено и выдает правильный результат:
    Товар = Справочники.Номенклатура.НайтиПоКоду("00000026");

    Если  (
ТипЗнч(Товар) <> Тип("Неопределено")) и (Товар.Наименование = "Тест") Тогда
       
Сообщить("Ок!");
    КонецЕсли;

В описании функции "НайтиПоКоду" написано, что:
Если не существует ни одного элемента с требуемым кодом, то будет возвращена пустая ссылка.
Если код не задан, то будет возвращено Неопределено.
Если честно, я не смог сразу добиться от функции возврата значения "Неопределено" и потому поступил проще:
    //Товар = Справочники.Номенклатура.НайтиПоКоду("00000026");
   
Товар = Неопределено;

    Если  (
ТипЗнч(Товар) <> Тип("Неопределено")) и (Товар.Наименование = "Тест") Тогда
       
Сообщить("Ок!");
    КонецЕсли;

Запускаем - бинго! Все работает, несмотря на то, что в составном условии есть обращение к реквизиту переменной "Товар", к "Наименованию", которого у типа "Неопределено" быть не может.
Для проверки попробуем еще два вида условия:
1.
    Если  (ТипЗнч(Товар) <> Тип("Неопределено")) или (Товар.Наименование = "Тест") Тогда
2.
    Если (Товар.Наименование = "Тест") и (ТипЗнч(Товар) <> Тип("Неопределено")) Тогда

В первом случае мы поменяли "и" на "или" в условии, во-втором поменяли местами части условия.

В обоих случая при попытке выполнения мы получили сообщение об ошибке. Почему? Потому, что "компилятор" вычисляя выражение условия идет от начала к концу по-очереди вычисляя каждое вложенное выражение (по правилам арифметики, ага) и как только становится очевидно, что все выражение имеет определнный результат (истина/ложь) вычисление прекращается.

В нашем случае, когда мы сначала проверяли не является ли переменная "Товар" неопределенной и получали "ложь" смысл проверки остальных операндов утрачивался, так как в операции "И" достаточно одному операнду быть ложным, чтобы остальные можно было не проверять - все-равно конечный результат будет "ложь".

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

Во-втором варианте, результат выполнения так же изменился, несмотря на то, что операция "и" коммутативная. Теперь проверка начинала выполняться с первого, заведомо провального операнда.

Такое поведение, на мой взгляд оправдано и удобно. Сравните, например с похожим кодом в платформе 7.7:
    //Товар = СоздатьОбъект("Справочник.Номенклатура");
    //Товар.НайтиПоКоду(" 52200");
   
Товар = ПолучитьПустоеЗначение();

    Если (ПустоеЗначение(
Товар) = 0) и (Товар.Наименование = "Тест") Тогда
        Сообщить(
"Ок!");
    КонецЕсли;

В отличии от 8.1 он не будет работать, так как проверяются все операнды операции "и", а второй у нас будет выдавать ошибку.
 

Для платформы 7.7 пришлось бы применить следующее:
    Если (ПустоеЗначение(Товар) = 0) Тогда
        Если (
Товар.Наименование = "Тест") Тогда
            Сообщить(
"Ок!");
        КонецЕсли;
    КонецЕсли;

Что на мой взгляд является неоправданным (хоть и небольшим) усложнением структуры кода.

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

Спасибо за внимание и хорошего вам кода!

среда, 18 августа 2010 г.

Сила слова

На секлабе очередная статья про ужасного хакера подозреваемого во взломе банка. Статья уныла, но каменты жгут:

Гость: гик 17.08.2010 10:00:06

Уж сколько раз твердили миру, что если подразумевается негативный смысл, то надо говорить "кракер" или "крекер", или "крэкер".

Как всегда всё опошлили, на этот благородное слово "хакер", теперь все думают, что "хакер" - это плохо.
Гость: 23404 17.08.2010 11:31:47
если подразумевается негативный смысл, то нужно говорить: "кракен".

вторник, 17 августа 2010 г.

it-jam 2010

Очередной IT-Jam, на этот раз в Харькове.

среда, 4 августа 2010 г.

Сам я считаю, что дефектом многих существующих учебников по технологиям программирования (это относится не только к COM, но и вообще к любой технологии излагаемой в современных учебниках) является то, что они начинаются "сверху" - "вызовите Wizard, отметьте в нём... поставьте... Wizard сгенерировал вам код...". Но в учебнике очень невнятно объясняется, почему Wizard сгенерировал именно такой код! Что означают те или иные макросы по ходу текста, как выглядит и сам протокол к которому Wizard строит реализацию. Словом, современные учебники пытаются обучить сложению используя в качестве наглядного пособия калькулятор - а как калькулятор выполняет сложение учебник не объясняет. С моей точки зрения это - тяжелейший порок, поскольку квалификация программиста определяется прежде всего пониманием философии, основ, концепций. Писать реально работающие программы, конечно, нужно с применением соответствующих инструментов. Писать вручную - анахронизм, часто выдающий дремучесть программиста. Но и владея распрекрасным инструментом всё равно нужно знать, как работает механизм, потому, что в какой-то момент времени может обнаружиться ошибка в самом инструменте, произойти несчастливое стечение обстоятельств и параметров, а тогда программист должен суметь, пользуясь своим общим знанием, отыскать то самое место, в котором возникает ошибка и исправить её.
(с) Михаил Безверхов, "Технология COM"