В Киеве прошел запуск Visual Studio 2010. Ну, что можно сказать... За что я люблю Microsoft-овские сборища, так это за то, что там хорошо кормят и кофе бесплатно. ;-)
Это, как вы понимаете, шутка. А теперь серьезно.
Лично я был на серии докладов о VS и TFS (большой зал) и меня очень удивило, насколько сама Microsoft и ее продукты agile-ready. Надеюсь, они скоро выложат видео-запись, а пока скажу, что в самом начале серии докладов они сказали: "Сегодня не будет показано ни одного слайда. Мы прямо перед вами "в живую" отработаем один спринт (второй в проекте, если быть точным)". Обещание было сдержано - слайдов не было. Они действительно отработали одну scrum-итерацию распределив между собой роли (заказчик, скрам-мастер, pm, архитектор, разработчик, qa), полноценно от UserStory's до тестирования, демо и ретроспективы. Конечно, было много "домашних заготовок", вся инфраструктура уже была развернута и задачи были не сложными, но все же это было интересно и очень удивительно для меня. Да, глюки тоже были. ;-)
О самой VS. Что можно сказать. Это монстр. Нет. Это МОНСТР! Оно, как вы догадываетесь, интегрируется со всем чем можно и полноценно использует развернутую ms-инфраструктуру. О разных новых фичах можно рассказывать долго, но лучше вы почитайте обзоры, а я расскажу о том, что мне особенно понравилось.
Первое - это архитектурный контроль. Архитектор может построить некую диаграмму объектов проекта, где в качестве объектов могут выступать классы, модули, библиотеки и пр. И установить между ними связи. При вызове функции архитектурного контроля VS проверяет насколько существующий код соответствует диаграмме. Например, если у вас есть UI, который обращается к классу DBIntreface, который в свою очередь должен работать с БД, то построив диаграмму связей вы сразу же можете обнаружить где разработчик напрямую из UI дергает БД в обход DBIntreface, и указать ему на ошибку.
Второе, что очень запомнилось это "Центр тестирования". Интересный продукт, позволяющий проводить автоматическое и ручное тестирование приложений. Удобные инструменты, плюс опять-таки интеграция. Тест-кейсы с привязкой к юерз-сториз и все-такое.
Это была положительная сторона. О слабых моментах и негативе писать не буду, потому что, те, кто реально будет работать с Visual Studio 2010 найдут их сами, а общие о том, что "продукты MS слишком "толстые", что "нормально интегрируются только с другими продуктами MS" и т.д. и так все знают.
Конечно, доклады от Microsoft теперь все меньше похожи на доклады для технических специалистов, а скорее напоминают театрализованное представление, но в целом от продукта впечатление приятное, а главное, что я теперь как-то глубже и нагляднее представляю себе scrum. Вот уж чего не ожидал! =)
четверг, 22 апреля 2010 г.
среда, 21 апреля 2010 г.
Волшебство n &= (n - 1);
Как всегда уважаемый Александр радует интересными вопросами. На этот раз это формализованное доказательство того, что следующая функция вернет количество единиц в числе переведенном в двоичную систему:
Т.е. фактически количество итераций цикла, равно количеству единичных (не нулевых) бит.
Хоть я и не математик, но попробуем внимательнее взглянуть на код...
int bitcount (unsigned int n) {
int count = 0 ;
while (n) {
count++ ;
n &= (n - 1) ;
}
return count ;
}
Т.е. фактически количество итераций цикла, равно количеству единичных (не нулевых) бит.
Хоть я и не математик, но попробуем внимательнее взглянуть на код...
Выполнение цикла будет прервано когда n станет равным нулю. Я считаю что формула
n &= (n - 1);
вызванная в цикле, убирает из n единицы (в двоичном представлении) до тех пор пока их совсем не останется.
Попробую доказать.
Для начала рассмотрим операцию n-1. Что будет происходить с числом в двоичном представлении? При вычитании единицы с числом в двоичном виде произойдет следующее: первый с правого края единичный бит будет обнулен, а предшествующие ему нули инвертированы. Вот так:
xx...xx100...00 - 1 = xx...xx011...11
где x -произвольные биты в левой части числа.
Это можно доказать следующим образом (если это нужно). Любое число A можно представить в виде:
А = bx*2x+bx-1*2x-1+...+b1*21+b0*20
где x - порядок бита в двоичном представлении числа,
а bx - сам бит в позиции x.
Значит и единицу можно представить следующим образом:
1=(1*20)=(1*21-1*20)=(1*22-1*21-1*20)...
Предположим, что b0=1, тогда:
A - 1 = (bx*2x+bx-1*2x-1+...+b1*21+1*20) - (1*20) = (bx*2x+bx-1*2x-1+...+b1*21+0*20)
Т.е. мы видим, что на место b0 подставился ноль, т.е. первый единичный бит справа был обнулен. (желтым я подсветил части выражения, которые взаимоуничтожаются из за разности знаков)
Если же первый единичный бит справа это b1 то можно сделать другую подстановку:
A - 1 = (bx*2x+bx-1*2x-1+...+1*21+0*20) - (1*21-1*20) = (bx*2x+bx-1*2x-1+...+1*21+0*20) - 1*21 + 1*20 = (bx*2x+bx-1*2x-1+...+0*21+1*20+0*20) = (bx*2x+bx-1*2x-1+...+0*21+1*20)
Теперь в позиции b1 ноль, зато в позиции b0 - единица.
Для предположения, когда первый единичный бит это b2:
A - 1 = (bx*2x+bx-1*2x-1+...+1*22+0*21+0*20) - (1*22-1*21-1*20) = (bx*2x+bx-1*2x-1+...+1*22+0*21+0*20) - 1*22+1*21+1*20 = (bx*2x+bx-1*2x-1+...+0*22+1*21+1*20)
И так далее и тому подобное.
Не знаю, считаются ли мои корявые рассуждения доказательством у настоящих математиков, но отсюда во-всяком случае понятно что происходит: в битовом представлении числа самая правая единица превращается в ноль, а все остальное за ней превращается в единицы.
Следующая операция это побитовый И.
Что произойдет с числами А и B когда с ним будет произведена побитовая операция И, если мы знаем, что:
1. B = A - 1, а значит, что
2. До бита с номером Y эти числа совпадают.
3. Бит с номером Y - самая правая единица в числе A, за которым идут нули.
4. Сам бит с номером Y в числе A равен единице, а в B равен нулю и
5. далее в числе A все последующие символы равны нулю, а в B - единице.
Очевидно, что часть числа ДО бита с номером Y останется неизменной, так как a&a=a.
Бит с номером Y будет обнулен и так же будут обнулены все последующие за ним, так как там один из операндов равен нулю.
Т.е. мы видим, что в результате этой операции самый правый единичный бит в байте превратился в ноль.
Мы сможем повторять эту операцию и результат не будет равен нулю до тех пор, пока последний единичный бит не станет нулевым. Очевидно, что количество итераций и будет равно количеству единиц в числе.
Извините, если мое описание немного сумбурное, буду благодарен за подсказки о том "как правильно".
n &= (n - 1);
вызванная в цикле, убирает из n единицы (в двоичном представлении) до тех пор пока их совсем не останется.
Попробую доказать.
Для начала рассмотрим операцию n-1. Что будет происходить с числом в двоичном представлении? При вычитании единицы с числом в двоичном виде произойдет следующее: первый с правого края единичный бит будет обнулен, а предшествующие ему нули инвертированы. Вот так:
xx...xx100...00 - 1 = xx...xx011...11
где x -произвольные биты в левой части числа.
Это можно доказать следующим образом (если это нужно). Любое число A можно представить в виде:
А = bx*2x+bx-1*2x-1+...+b1*21+b0*20
где x - порядок бита в двоичном представлении числа,
а bx - сам бит в позиции x.
Значит и единицу можно представить следующим образом:
1=(1*20)=(1*21-1*20)=(1*22-1*21-1*20)...
Предположим, что b0=1, тогда:
A - 1 = (bx*2x+bx-1*2x-1+...+b1*21+1*20) - (1*20) = (bx*2x+bx-1*2x-1+...+b1*21+0*20)
Т.е. мы видим, что на место b0 подставился ноль, т.е. первый единичный бит справа был обнулен. (желтым я подсветил части выражения, которые взаимоуничтожаются из за разности знаков)
Если же первый единичный бит справа это b1 то можно сделать другую подстановку:
A - 1 = (bx*2x+bx-1*2x-1+...+1*21+0*20) - (1*21-1*20) = (bx*2x+bx-1*2x-1+...+1*21+0*20) - 1*21 + 1*20 = (bx*2x+bx-1*2x-1+...+0*21+1*20+0*20) = (bx*2x+bx-1*2x-1+...+0*21+1*20)
Теперь в позиции b1 ноль, зато в позиции b0 - единица.
Для предположения, когда первый единичный бит это b2:
A - 1 = (bx*2x+bx-1*2x-1+...+1*22+0*21+0*20) - (1*22-1*21-1*20) = (bx*2x+bx-1*2x-1+...+1*22+0*21+0*20) - 1*22+1*21+1*20 = (bx*2x+bx-1*2x-1+...+0*22+1*21+1*20)
И так далее и тому подобное.
Не знаю, считаются ли мои корявые рассуждения доказательством у настоящих математиков, но отсюда во-всяком случае понятно что происходит: в битовом представлении числа самая правая единица превращается в ноль, а все остальное за ней превращается в единицы.
Следующая операция это побитовый И.
Что произойдет с числами А и B когда с ним будет произведена побитовая операция И, если мы знаем, что:
1. B = A - 1, а значит, что
2. До бита с номером Y эти числа совпадают.
3. Бит с номером Y - самая правая единица в числе A, за которым идут нули.
4. Сам бит с номером Y в числе A равен единице, а в B равен нулю и
5. далее в числе A все последующие символы равны нулю, а в B - единице.
Очевидно, что часть числа ДО бита с номером Y останется неизменной, так как a&a=a.
Бит с номером Y будет обнулен и так же будут обнулены все последующие за ним, так как там один из операндов равен нулю.
xx...xx100...00 & xx...xx011...11 =
---------------
xx...xx000...00
Т.е. мы видим, что в результате этой операции самый правый единичный бит в байте превратился в ноль.
Мы сможем повторять эту операцию и результат не будет равен нулю до тех пор, пока последний единичный бит не станет нулевым. Очевидно, что количество итераций и будет равно количеству единиц в числе.
Извините, если мое описание немного сумбурное, буду благодарен за подсказки о том "как правильно".
четверг, 8 апреля 2010 г.
Решение задачи о гномиках в разноцветных шапках
Александр выложил интересную задачу про гномиков.
Не придумал как вставить картинку к нему в каменты, поэтому решение привожу здесь.
Итак, вот схема:
В первой строке отмечены номера гномиков (для удобства), во второй их реальное расположение. Гномики смотрят вправо, т.е. номер первый видит всех, последний никого. Далее идут шаги которые гномикам нужно предпринять, чтобы всем спастись (в колонках отмечено кто и что делает).
Итак, первый гномик делает операцию последовательного XOR-а. Т.е. он берет 2-го и 3-го гномика и проводит XOR, результат я записал в колонку G (под третьего гномика). После чего он берет результат и XOR-ти с 4-м (результат под 4-го), потом этот результат XOR-ит c 5-ым и т.д. В итоге он получает значение, которое и называет (отмечено желтым). В зависимости от того совпало оно или нет людоед его съедает или нет и тут работает чистая удача.
Но дальше, все уже знают конечный XOR последовательности и могут понять кто они. Например на шаге 3 второй гномик предполагает, что он 0 (отмечено голубым). Исходя из этого он проводит последовательный XOR (шаг 4) и получает в результате 0 (отмечено красным). Поскольку его результат не совпадает с начальным, который посчитал 1-й гномик (желтым) он понимает, что предположение о том, что он 0 было не верным, а значит он 1. И на 5-м шаге говорит: 1. Дальше аналогично третий гномик делает предположение и считает XOR и т.д.
UPD.: (извините, нужно было убегать, потому набросал саму идею, теперь формализую)
Или, говоря строгим языком математики:
Обозначим состояние шапки каждого гномика как X. Тогда состояние шапки n-го гномика будет Xn. Пусть, для определенности, у черных шапок X=1, а для белых X=0.
Так же для определенности, пусть общее количество гномиков равно m.
Вначале первый гномик (который видит всех) должен вычислить "общий XOR" (обозначим его Z) последовательности гномиков по формуле:
Z1=(((X2 XOR X3) XOR X4) XOR X5) ... XOR Xm)
Полученный результат он называет и в зависимости от удачи людоед его съедает, либо нет. (Если Z1 совпало с X1, то, соответственно не съедает). Однако таким образом всем становится известно состояние X1.
Дальше каждый гномик делает предположение о своем состоянии (Xn) и вычисляет собственный "общий XOR" (Zn) по формуле:
Zn=(((Xn-1 XOR Xn) XOR Xn+1) XOR Xn+2) XOR Xn+3) ... XOR Xm)
Если Zn отличается от Z1 то это означает, что предположение гномика о собственном состоянии было ошибочным и он называет противоположное. При совпадении, соответственно, предположение считается верным и называется именно оно.
Таким образом все гномики начиная со 2-го назовут заведомо верные собственные состояния.
Задача решена.
Не придумал как вставить картинку к нему в каменты, поэтому решение привожу здесь.
Итак, вот схема:
В первой строке отмечены номера гномиков (для удобства), во второй их реальное расположение. Гномики смотрят вправо, т.е. номер первый видит всех, последний никого. Далее идут шаги которые гномикам нужно предпринять, чтобы всем спастись (в колонках отмечено кто и что делает).
Итак, первый гномик делает операцию последовательного XOR-а. Т.е. он берет 2-го и 3-го гномика и проводит XOR, результат я записал в колонку G (под третьего гномика). После чего он берет результат и XOR-ти с 4-м (результат под 4-го), потом этот результат XOR-ит c 5-ым и т.д. В итоге он получает значение, которое и называет (отмечено желтым). В зависимости от того совпало оно или нет людоед его съедает или нет и тут работает чистая удача.
Но дальше, все уже знают конечный XOR последовательности и могут понять кто они. Например на шаге 3 второй гномик предполагает, что он 0 (отмечено голубым). Исходя из этого он проводит последовательный XOR (шаг 4) и получает в результате 0 (отмечено красным). Поскольку его результат не совпадает с начальным, который посчитал 1-й гномик (желтым) он понимает, что предположение о том, что он 0 было не верным, а значит он 1. И на 5-м шаге говорит: 1. Дальше аналогично третий гномик делает предположение и считает XOR и т.д.
UPD.: (извините, нужно было убегать, потому набросал саму идею, теперь формализую)
Или, говоря строгим языком математики:
Обозначим состояние шапки каждого гномика как X. Тогда состояние шапки n-го гномика будет Xn. Пусть, для определенности, у черных шапок X=1, а для белых X=0.
Так же для определенности, пусть общее количество гномиков равно m.
Вначале первый гномик (который видит всех) должен вычислить "общий XOR" (обозначим его Z) последовательности гномиков по формуле:
Z1=(((X2 XOR X3) XOR X4) XOR X5) ... XOR Xm)
Полученный результат он называет и в зависимости от удачи людоед его съедает, либо нет. (Если Z1 совпало с X1, то, соответственно не съедает). Однако таким образом всем становится известно состояние X1.
Дальше каждый гномик делает предположение о своем состоянии (Xn) и вычисляет собственный "общий XOR" (Zn) по формуле:
Zn=(((Xn-1 XOR Xn) XOR Xn+1) XOR Xn+2) XOR Xn+3) ... XOR Xm)
Если Zn отличается от Z1 то это означает, что предположение гномика о собственном состоянии было ошибочным и он называет противоположное. При совпадении, соответственно, предположение считается верным и называется именно оно.
Таким образом все гномики начиная со 2-го назовут заведомо верные собственные состояния.
Задача решена.
воскресенье, 4 апреля 2010 г.
1Cv8 и gource
Раньше я уже приводил пример, как может быть красиво визуализирована работа с любым проектом при помощи утилиты Gource, если он хранится в системе контроля версий, например svn или git.
Платформа 1С версии восемь имеет собственную систему контроля версий из которой тоже можно получить визуализацию и сейчас я покажу как это можно сделать.
Для начала сохраним лог изменений из хранилища конфигурации. Для этого зайдите в 1С в режиме конфигуртора. Естественно, при входе вы должны будете подключиться к вашему хранилищу:
Теперь выберите в меню пункт "Конфигурация - Хранилище конфигурации - История хранилища":
В открывшемся окне нажмите кнопку "Отчет по истории хранилища" или аналогичный пункт в меню действия:
Дальше откроется окно настройки лога. Выберите отчет по версиям хранилища, с выводом в текстовый документ и нажмите "Ок":
А полученный текстовый файл сохраните на диск (например с именем conf_report.log):
К сожалению эту операцию нельзя сделать из командной строки, потому что в параметрах отсутствует режим получения изменений по версиям.
Теперь, когда мы сохранили лог изменений его нужно преобразовать в формат понятный gource. Для этого я написал небольшую утилиту на С++, которую назвал log-1c-to-gource.
Скачайте ее и сконвертируйте файл лога:
Теперь осталось только "подсунуть" этот лог gource:
Естественно, вы можете поиграться с параметрами gource как вам нужно и т.д.
А вот несколько скринов, которые получились у меня.
Это скрин с первого комита, когда в хранилище разворачивается вся конфигурация (УТП, если интересно):
Действительно "взрыв" объектов.
А вот конфигурация уже развернута:
Здоровенный "одуванчик" слева это документы (с формами и пр.). Их действительно много.
И вот работа с некоторыми объектами (я предварительно почистил лог, убрав из него первый комит и теперь огромное дерево не строится):
К сожалению у меня не нашлось хранилища с длиной историей, чтобы записать красивое видео. Если у кого-то такое есть, было бы интересно посмотреть. К тому-же есть несколько идей о том, как можно подправить конвертер, но нужно смотреть как он ведет себя на визуализации больших и долгих проектов. Так что буду благодарен за ваши логи.
Эта статья на Инфостарт
Платформа 1С версии восемь имеет собственную систему контроля версий из которой тоже можно получить визуализацию и сейчас я покажу как это можно сделать.
Для начала сохраним лог изменений из хранилища конфигурации. Для этого зайдите в 1С в режиме конфигуртора. Естественно, при входе вы должны будете подключиться к вашему хранилищу:
Теперь выберите в меню пункт "Конфигурация - Хранилище конфигурации - История хранилища":
В открывшемся окне нажмите кнопку "Отчет по истории хранилища" или аналогичный пункт в меню действия:
Дальше откроется окно настройки лога. Выберите отчет по версиям хранилища, с выводом в текстовый документ и нажмите "Ок":
А полученный текстовый файл сохраните на диск (например с именем conf_report.log):
К сожалению эту операцию нельзя сделать из командной строки, потому что в параметрах отсутствует режим получения изменений по версиям.
Теперь, когда мы сохранили лог изменений его нужно преобразовать в формат понятный gource. Для этого я написал небольшую утилиту на С++, которую назвал log-1c-to-gource.
Скачайте ее и сконвертируйте файл лога:
log-1c-to-gource.exe conf_report.log conf_report_gource.log
Теперь осталось только "подсунуть" этот лог gource:
gource.exe --log-format custom conf_report_gource.log
Естественно, вы можете поиграться с параметрами gource как вам нужно и т.д.
А вот несколько скринов, которые получились у меня.
Это скрин с первого комита, когда в хранилище разворачивается вся конфигурация (УТП, если интересно):
Действительно "взрыв" объектов.
А вот конфигурация уже развернута:
Здоровенный "одуванчик" слева это документы (с формами и пр.). Их действительно много.
И вот работа с некоторыми объектами (я предварительно почистил лог, убрав из него первый комит и теперь огромное дерево не строится):
К сожалению у меня не нашлось хранилища с длиной историей, чтобы записать красивое видео. Если у кого-то такое есть, было бы интересно посмотреть. К тому-же есть несколько идей о том, как можно подправить конвертер, но нужно смотреть как он ведет себя на визуализации больших и долгих проектов. Так что буду благодарен за ваши логи.
Эта статья на Инфостарт
четверг, 1 апреля 2010 г.
Первоапрельское мироздание и его чувство юмора
Сегодня мне снилось, что меня рекрутили в GameDev и предлагали вдвое больше того, что я получаю сейчас.
среда, 31 марта 2010 г.
1С + JavaScript
Интересная публикация появилась на InfoStart. Технология шифрования кода 1С (а это пока скорее только технология) Golden Key 8.1 Prototype.
Основной смысл заключается в том, что часть кода 1С преобразуется в html-код (а если быть точнее в JavaScript), который хранится в соответствующих контейнерах внутри конфигурации (обработки). А сам html-код "шифруется" известными преобразователями кода, которые делаю его не читаемым, но с сохранением функциональности.
Конечно, как сторонник OpenSource, я не поощряю такие методы, однако надо отметить, что вызов JavaScript, а главное работа с объектами метаданных 1С из JavaScript это сам по себе достаточно интересный ход.
Основной смысл заключается в том, что часть кода 1С преобразуется в html-код (а если быть точнее в JavaScript), который хранится в соответствующих контейнерах внутри конфигурации (обработки). А сам html-код "шифруется" известными преобразователями кода, которые делаю его не читаемым, но с сохранением функциональности.
Конечно, как сторонник OpenSource, я не поощряю такие методы, однако надо отметить, что вызов JavaScript, а главное работа с объектами метаданных 1С из JavaScript это сам по себе достаточно интересный ход.
воскресенье, 28 марта 2010 г.
Старый хлам в картонной коробке
Знаете, как обычно бывает, когда делаешь уборку и находишь коробку с разным старым хламом.
"Ну, вот я ее щас выкину, - думаешь. - Только погляжу что там лежит".
И вот тут уборка останавливается. Начинаешь доставать, разглядывать. А потом задвинешь ее обратно как есть, потому что жалко же выбрасывать, столько воспоминаний. Примерно тоже происходит и со старыми исходниками, разными файлами, старыми проектами. Набрел сегодня на такую свою "коробку" и кое-чем поделюсь с вами.
Lab_5_18
Когда-то я зарабатывал карманные деньги тем, что делал лабораторки для старшекурсников. Все это было, конечно, примитивно и скучно: работа с массивами, списками, основы языка... Но одна лабораторка мне нравится до сих пор. Каждый раз как запускаю умиляюсь, до чего хорошо получилось. Это парсер, который раскладывает арифметическое выражение в дерево:
Кстати, тут видно, что он не только строил дерево, но и немного сжимал его, избавляясь от сложения с нулем и подобных операций. Конечно, когда формула уже лежит в дереве, то работать с ней становится легко и приятно, можно применять разные шаблоны, тасовать узлы как угодно и получать просто восхитительные результаты. Например, формульный калькулятор в компилируемых языках. Думаю, что именно такой способ представления формул используется в каком-нибудь MathLab.
DemoAsm
Первая программа на ассемблере. Скомпилирована еще тогда, но до сих пор работает. Чего бы ей не работать. Собственно включает режим 0x13h и рисует желтую точку на экране. Управлять точкой можно с помощью клавиш q,a,o,p, выход - Esc. Скриншот, к сожалению, не делается. Кстати! Размер EXE-шника всего 956 байт.Т.е. меньше килобайта. Нет, все-таки в ассемблере что-то есть.
Патчер примечателен тем, что в нем переопределялся знакогенератор для режима 0x03h и менялась палитра. За счет этого достигался эффект плавной бегущей строки (в текстовом режиме) и плавного появления/исчезновения звезд на фоне. Тут я тоже не осилил сделать скриншот, но вы можете посмотреть сами.
Вообще-то Poin1 это часть общей задачи которая изначально решалась в 3D для точек и многогранника. Это же ее разновидность для плоскости.
Вот, собственно, и все что нашлось из интересного. А еще больше было потеряно, стерто и отформатировано. Мои эксперименты с 3D, куча разных мелких утилит под Windows и еще много чего.
Естественно, выкладываю все файлы (с исходниками) в архиве: old_prog.zip
"Ну, вот я ее щас выкину, - думаешь. - Только погляжу что там лежит".
И вот тут уборка останавливается. Начинаешь доставать, разглядывать. А потом задвинешь ее обратно как есть, потому что жалко же выбрасывать, столько воспоминаний. Примерно тоже происходит и со старыми исходниками, разными файлами, старыми проектами. Набрел сегодня на такую свою "коробку" и кое-чем поделюсь с вами.
Lab_5_18
Когда-то я зарабатывал карманные деньги тем, что делал лабораторки для старшекурсников. Все это было, конечно, примитивно и скучно: работа с массивами, списками, основы языка... Но одна лабораторка мне нравится до сих пор. Каждый раз как запускаю умиляюсь, до чего хорошо получилось. Это парсер, который раскладывает арифметическое выражение в дерево:
Кстати, тут видно, что он не только строил дерево, но и немного сжимал его, избавляясь от сложения с нулем и подобных операций. Конечно, когда формула уже лежит в дереве, то работать с ней становится легко и приятно, можно применять разные шаблоны, тасовать узлы как угодно и получать просто восхитительные результаты. Например, формульный калькулятор в компилируемых языках. Думаю, что именно такой способ представления формул используется в каком-нибудь MathLab.
DemoAsm
Первая программа на ассемблере. Скомпилирована еще тогда, но до сих пор работает. Чего бы ей не работать. Собственно включает режим 0x13h и рисует желтую точку на экране. Управлять точкой можно с помощью клавиш q,a,o,p, выход - Esc. Скриншот, к сожалению, не делается. Кстати! Размер EXE-шника всего 956 байт.Т.е. меньше килобайта. Нет, все-таки в ассемблере что-то есть.
Fistpath
Патчер для какой-то из версий игры "Элита" (кажется First Encounters). Добавлял произвольное количество денег. Кажется, речь шла о "стартовых" деньгах.Патчер примечателен тем, что в нем переопределялся знакогенератор для режима 0x03h и менялась палитра. За счет этого достигался эффект плавной бегущей строки (в текстовом режиме) и плавного появления/исчезновения звезд на фоне. Тут я тоже не осилил сделать скриншот, но вы можете посмотреть сами.
WinKley
Софтина задумывалась как "клей" для windows-программ. По-идее должна была "склеивать" два EXE-шника в один таким образом, чтобы сначала загружался один, а за ним другой. Сам клей реализован так и не был, но зато получился симпатичный интерфейс (нужно помнить, что речь идет о времени, когда WinXP с ее красивыми темами еще не вышла). Он весь подсвечивается и подзвучивается при наведениях и нажатиях. Кстати, что-то оно с EXE-шниками все же делает, во всяком случае мой антивирус ругается на Output file.Kt
Электронный камертон. Ничего необычного, просто пищит через PC-спикер. Замечательно то, что тут используется библиотека sCrt. Это моя собственная библиотека (очень примитивная надо отметить, были намного профессиональнее) упрощающая построение интерфейса в стиле Norton. Тогда это, был самый популярный пользовательский интерфейс для DOS-приложений. Кажется это было одно из последних приложений под DOS. Все-таки 2001-год, я уже писал под Windows.Poin1
После запуска на экран будет выведено несколько точек, а после нажатия клавиши точки будут обведены в многоугольник, причем так, что крайние точки станут его вершинами, а все остальные окажутся внутри. Т.е. многоугольник как бы "обтянет" эти точки. Такой же эффект, как если бы вы бегали с ниткой вокруг группы деревьев, некоторые оказались бы внутри ниточного ограждения, а на некоторые (самые внешние) оказались бы в вершинах ниточного многоугольника.Вообще-то Poin1 это часть общей задачи которая изначально решалась в 3D для точек и многогранника. Это же ее разновидность для плоскости.
Matrix
Не думаю, что нужно объяснять что именно делает эта программа. Совершенно ничего особенного. Обычный Screen saver. Таких были сотни разновидностей. Вот еще один для DOS-а. Да, я немного подправил его сегодня, поставлял задержек, чтобы на современной машине можно было хоть что-то разглядеть.Вот, собственно, и все что нашлось из интересного. А еще больше было потеряно, стерто и отформатировано. Мои эксперименты с 3D, куча разных мелких утилит под Windows и еще много чего.
Естественно, выкладываю все файлы (с исходниками) в архиве: old_prog.zip
суббота, 27 марта 2010 г.
rlinkf v1.0
Ура! Ура! Я закончил первую версию моего скрипта-редиректора и теперь я смогу быстро и просто делать всякие короткие ссылки вроде http://zfilin.org.ua/link/how-to-read (оригинальная ссылка: дли-и-и-и-и-и-инная ссылка)
Если вы хотите себе такое-же, то скрипт можно скачать по адресу http://zfilin.org.ua/link/rlinkf в разделе Downloads
Если вы хотите себе такое-же, то скрипт можно скачать по адресу http://zfilin.org.ua/link/rlinkf в разделе Downloads
четверг, 25 марта 2010 г.
среда, 24 марта 2010 г.
Agile такой agile!
Все-таки методики гибкой разработки это очень интересно. Надеюсь, что узнаю много нового на Agile Base Camp 2.
Ну, кто со мной?
Ну, кто со мной?
понедельник, 22 марта 2010 г.
О сложности C/C++
Когда-то я совсем-совсем не умел программировать и только играл в компьютерные игры. Но я знал, что игры на чем-то написаны, что существуют языки программирования. Я спрашивал: "На чем написана эта игра?" А мне отвечали: "На си!"
Какой же сложный этот C, раз на нем можно написать такую игру! - думал я.
Позже я стал писать программы на бейсике, паскале, немного познакомился с ассемблером для Z80 и освоил ворох разных технологий вроде программирования COM-порта или OpenGL, прочел книжку Питера Нортона о жестких дисках и получил первые деньги за программу. Примерно тогда же нам читали курс лекций по C и я думал:
"Все-таки C это очень сложно. Пожалуй, сложнее всего, что я знаю".
Шло время я, наконец, понял что такое "указатель", успел пожалеть о том, что почти не осталось конспектов с того курса лекций. Я стал 1С-программистом, перестал писать на других языках, снова начал писать на других языках, увлекся PHP и веб-разработкой, начал читать Дональда Кнута, освоил еще ворох новых технологий, поучаствовал и успешно угробил несколько стартапов, сменил несколько фирм,захватил власть в Изумрудном городе с помощью племени Марранов (извините, это не оттуда) наконец перестал воспринимать менеджера проекта как личного врага, а тестера как недочеловека, купил красный галстук и черный костюм... И установил Visual C++ Express Edition 2008 взамен привычной, но неизбежно устаревающей Delphi7. Я открыл редактор в который автоматически был загружен "Hello world" и, знаете что я подумал?
Какой же этот С все-таки сложный!
P.S.: Надеюсь это не последняя моя мысль о СИ и наша любовь еще впереди.
Какой же сложный этот C, раз на нем можно написать такую игру! - думал я.
Позже я стал писать программы на бейсике, паскале, немного познакомился с ассемблером для Z80 и освоил ворох разных технологий вроде программирования COM-порта или OpenGL, прочел книжку Питера Нортона о жестких дисках и получил первые деньги за программу. Примерно тогда же нам читали курс лекций по C и я думал:
"Все-таки C это очень сложно. Пожалуй, сложнее всего, что я знаю".
Шло время я, наконец, понял что такое "указатель", успел пожалеть о том, что почти не осталось конспектов с того курса лекций. Я стал 1С-программистом, перестал писать на других языках, снова начал писать на других языках, увлекся PHP и веб-разработкой, начал читать Дональда Кнута, освоил еще ворох новых технологий, поучаствовал и успешно угробил несколько стартапов, сменил несколько фирм,
Какой же этот С все-таки сложный!
P.S.: Надеюсь это не последняя моя мысль о СИ и наша любовь еще впереди.
пятница, 19 марта 2010 г.
Gource
Очень красивые визуализации активности работы с вашими хранилищами исходников может делать утилита Gource.
В честь юбилейного, 512-го комита моего основного рабочего проекта я визуализировал его активность:
Кстати, Стас Фомин сделал хорошую обертку для gource и codeswarm и использует как хороший рабочий инструмент. Знакомьтесь - ShowTeamWork.
На AgileDays'09 есть его доклад "Увидеть лес за деревьями" (особенно доставляет надпись, которую видно на скриншоте: "Стас потерял впустую месяц на архитектурные бантики", обязательно надо посмотреть все видео).
В честь юбилейного, 512-го комита моего основного рабочего проекта я визуализировал его активность:
Кстати, Стас Фомин сделал хорошую обертку для gource и codeswarm и использует как хороший рабочий инструмент. Знакомьтесь - ShowTeamWork.
На AgileDays'09 есть его доклад "Увидеть лес за деревьями" (особенно доставляет надпись, которую видно на скриншоте: "Стас потерял впустую месяц на архитектурные бантики", обязательно надо посмотреть все видео).
среда, 17 марта 2010 г.
Хроники пикирующего вебинара
В настоящий момент идет вебинар с темой "Как сделать так, чтобы управление рисками работало". Вебинар проводит компания Luxoft, докладчик Антон Грачев. Вебинар идет ТАМ, а я пишу ЗДЕСЬ. Потому что нет никакой возможности слушать как из тебя заживо тянут жилы и что-то рассказывают монотонным голосом. Возможно я переоценил свой интерес к управлению рисками, но скорее всего из происходящего следует извлечь печальный опыт.
Во-первых только самые профессиональные докладчики могут проводить чистые вебинары без живых слушателей. Ведущие на радио, MC и тому подобное. Не все "п-р-о-д-ж-е-к-т-м-е-н-е-д-ж-е-р-ы" обладают талантами ведущих. Во-всяком случае, если бы передо мной поставили микрофон и сказали: "Вещай!", я бы оказался в затруднительном положении. Нужно уметь общаться со стенкой при этом представляя перед собой большой концертный зал. Аудитория, которую ты видишь, подсказывает тебе как вести себя, о чем говорить. Думаю, что через пять минут скучающие физиономии в зале натолкнули бы докладчика на мысль о том, что надо добавить больше жизни в монотонное бубнение и вздохи. Затравить байку, рассказать анекдот и тому подобная классика выступлений. Стенка не сможет ничего подсказать, живой слушатель вносит живое общение, добавляет "экшена" и стесняется уйти посреди доклада. Кстати, мне интересно что будет когда счетчик слушателей вебинара у них упадет до нуля в середине доклада. Он продолжит рассказывать пустоте? =)
Вторым пунктом идет ряд чисто технических замечаний. Совершенно невыносимо читать (и слушать) громоздкие конструкции типа "как сделать так, чтобы". Обратите внимание, что в названии половина строки (чисто визуально, по длине) это вот это самое "как сделать так, чтобы". И это только название.
Нужно запомнить для себя раз и навсегда, что читать цифры со слайда это то, за что нужно вырезать язык. Особенно четырех-, пятизначные.
И, наконец, я считал, что повторяться это хорошо. До сегодняшнего дня. Нет, нужно все таки выделять главную мысль и проговаривать ее несколько раз по возможности слегка меняя "декорации". Но слушать несколько раз о том, о чем мы сегодня будем говорить, то есть несколько раз слушать содержание презентации, ну то есть несколько раз слушать о том, какие слайды мы посмотрим, и как я уже говорил, по-пунктам слушать о том, о чем будет сегодня рассказано... Ну, вы поняли. =)
Как бы мне хотелось самому не наступить на такие же грабли. Мне точно нужен опыт выступлений и вебинаров. Но где?..
Во-первых только самые профессиональные докладчики могут проводить чистые вебинары без живых слушателей. Ведущие на радио, MC и тому подобное. Не все "п-р-о-д-ж-е-к-т-м-е-н-е-д-ж-е-р-ы" обладают талантами ведущих. Во-всяком случае, если бы передо мной поставили микрофон и сказали: "Вещай!", я бы оказался в затруднительном положении. Нужно уметь общаться со стенкой при этом представляя перед собой большой концертный зал. Аудитория, которую ты видишь, подсказывает тебе как вести себя, о чем говорить. Думаю, что через пять минут скучающие физиономии в зале натолкнули бы докладчика на мысль о том, что надо добавить больше жизни в монотонное бубнение и вздохи. Затравить байку, рассказать анекдот и тому подобная классика выступлений. Стенка не сможет ничего подсказать, живой слушатель вносит живое общение, добавляет "экшена" и стесняется уйти посреди доклада. Кстати, мне интересно что будет когда счетчик слушателей вебинара у них упадет до нуля в середине доклада. Он продолжит рассказывать пустоте? =)
Вторым пунктом идет ряд чисто технических замечаний. Совершенно невыносимо читать (и слушать) громоздкие конструкции типа "как сделать так, чтобы". Обратите внимание, что в названии половина строки (чисто визуально, по длине) это вот это самое "как сделать так, чтобы". И это только название.
Нужно запомнить для себя раз и навсегда, что читать цифры со слайда это то, за что нужно вырезать язык. Особенно четырех-, пятизначные.
И, наконец, я считал, что повторяться это хорошо. До сегодняшнего дня. Нет, нужно все таки выделять главную мысль и проговаривать ее несколько раз по возможности слегка меняя "декорации". Но слушать несколько раз о том, о чем мы сегодня будем говорить, то есть несколько раз слушать содержание презентации, ну то есть несколько раз слушать о том, какие слайды мы посмотрим, и как я уже говорил, по-пунктам слушать о том, о чем будет сегодня рассказано... Ну, вы поняли. =)
Как бы мне хотелось самому не наступить на такие же грабли. Мне точно нужен опыт выступлений и вебинаров. Но где?..
вторник, 16 марта 2010 г.
Подписаться на:
Сообщения (Atom)

![[Image]](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDce-AhoAOkDEybOlTaggtO0K-xa8MsTphgXcWz7UY-JoQpGOmPN_TmXQUTZ0Nhht4JyLOUyorLZ3txm5gTVKx4vH5gnFnhn3E8OzQw0XZHW_7koLe8j4KGp5vFsGw2LN0er0JjO7h-K-q/s640/xor.gif)
![[Image]](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6E7qn0MjHJt-uuX8l_rnQQOrPttWgQgzOT2Nl1lpAYpAyHvkFYkJAlCGddhWvrM-tO6zj3BsWxIh7VqTdeQ_DA7mN3FDagTt_Nxim_TTVgfElif7o80hyphenhyphenniOtMsjCmCbTV6-Veg9l_0ZC/s320/1c_save_1.gif)

![[Image]](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBIiwUtKgmOqJ5CHG-vDyk3JzasQxqCcWMuWaiGhqCcSzH3XpI8sUGZrLjXxsSaP6O2hFFbGzKGoH84c5U4pA5dBIs3ZnA2dWnxSe5vDOxPJUHZztRn5q8FlpPIzQKCIvfk472O3GzrfSt/s640/1c_save_3.gif)












