Archive for the ‘Код и программистское’ Category

Считалочки.

Friday, March 5th, 2010

Эники Беники ели вареники
Эники Бэники клёц!
Вышел зеленый матрос.

Знакомо? :)

Пока я крапаю длинную статью на тему как научиться НЕ делать все самому, решил набросать коротенькую статейку/задачку. Задачка аналогично такой, которая дается на олимпиадах по программированию.

Слегка формализированные правила считалочки.

1) Пусть у нас есть N человек

2) И у нас есть считалка длинной в M слов.

3) Начинаем считать с первого человека, по одному слову на человека.

4) Человек на котором считалка закончилась выбывает.

5) Считалка продолжает считаться с следующего после выбывшего, повторяя пункт 4 и 5.

6) Оставшийся последним человек – выигрывает.

Задача:

Написать программу, которая считает порядковый номер человека который выигрывает. Входные данные N и M.

5 баллов – программа может рассчитать выигрывающего при N и M < 20.

10 баллов – программа может рассчитать при N < 20, а M порядка 1 триллиона (не фига себе считалочка), за разумное время.

25 баллов – программа может рассчитать при N порядка 1 миллиарда, M < 20, за разумное время.

50 баллов – программа может рассчитать при N и M порядка триллиона.

Если вы знаете/придумали решение на 50 баллов, прошу сразу его не бросать в комментарии, а просто написать что вы его знаете (чтобы дать остальным подумать).

Остальные решения вполне welcome в комментариях ;)

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

P.S.  Как оказалось, задача классическая (просто я с ней не сталкивался). На момент написания статьи, я знал решение на 5 и 10 баллов, примерно имел идею на 25 баллов и не знал, как решить на 50 баллов.

Agile и автоматизированное тестирование

Thursday, December 3rd, 2009

После года работы в Agile режиме (в нескольких их видоизменениях) осознал, что Agile НЕ может нормально работать для без автоматизированного тестирования.

Пойду доказательством от противного. Пусть мы работаем в Agile и у нас нету автоматизированного тестирования. У нас есть пять user story, которые мы делаем. Внутри каждой из них у нас есть какие-то разумные критерии по которой мы определяем, что user story сделана – они обычно включают ручное тестирование измененной/новой функциональности.

По окончанию скажем 6 Sprint’ов, мы решает, что пора выпустить новую версию и тут мы обнаруживаем, что оттестированная каждая user story не значит оттестированный весь продукт. Соответственно, мы стартуем большое регрессионное тестирование всего продукта. Исправляем баги (для них можно даже сделать отдельные user story), потом опять проходимся и делаем регрессионное тестирование (так как исправленные баги могли внести другие). Надеюсь это знакомо? Итого, нам понадобилось еще 3 Sprint’а, чтобы привести все к виду, в котором можно выпускать.

Итого, на самом деле мы похерили пару принципов из Agile
а) То что продукт постоянно близок по качеству к выпускаемому.
На самом деле, чем дольше мы работаем без release тем общее качество у него будет хуже и хуже
б) То, что заранее НЕ нужно планировать отдельные фазы (разработка/тестирование).
Теперь нам заранее надо таки планировать, что на каждые 6 sprint’ов разработки – 3 sprint’а тестирования и стабилизации.
Ой… А это случайно мы не в waterfall возвращаемся, когда мы делаем сначала разработку, а потом тестирование?
в) То, что по ходу, можно и нужно улучшать код рефакторингом.
Рефакторинг кода, становится делать опасно, так как зачастую только через месяца (во время большего тестирования) становится видно какие проблемы он добавил.

Сразу оговорюсь, может быть agile без автоматизации и лучше чем совсем уж классический waterfall. Но на самом деле он одной ногой в этом waterfall’е продолжает стоять.

P.S. Да, основная идея – автоматизировать регрессию или большую ее часть. Это позволит, во первых раньше поймать баги, которые внесены внутри user story, но которые лежат в функциональности вне ее. Во вторых – это резко сокращает период на ретестирование продукта и его стабилизацию.

Пуленепробиваемая система.

Thursday, October 29th, 2009

Как и подобает каждому приличному секуритяну, я задумываюсь иногда о большом, белом и добром – об абсолютной защите от уязвимостей. То есть, какая должна быть система, чтобы с математической точки зрения к ней нельзя было сделать exploit’ы. Сразу оговорюсь, мы говорим именно о технической стороне, а не о social engineering’е, когда человек сам отдает ключи от квартиры, где лежат деньги.

А кстати, навеяло это мне то, что блог взломали и поместили невидимые линки на какой-то сайт с рекламой всякого хлама. Забавно, что жил на старинном WordPress 2.3 больше года и не был взломан. Стоило перейти на распоследний 2.8.5 c Security updat’ами и не прошло и недели, как взломали. Но, это, так… к делу не относится.

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

Вероятнее всего, имеет смысл даже более жестко вводить разделение. Вообще, управление программой не должно быть возможно с помощью “сырых” данных. То есть, все методы условного и безусловного ветвления могут работают только на основе того, что храниться в флагах или коде. А уж только флаги в свою очередь могут быть выставлены какими-то операциями с обычными данными.

Так, что – долой архитектура фон Неймана и да здравствует архитектура Ронина (м… нужно какой-нибудь титул раздобыть).

Вторая идея, фактически продолжение первой – запрет всех интерпретируемых языков. Долой всякий SQL-injection. Увы, пока я не смог придумать, как с технической стороны можно ограничить возможность интерпретирования.

Увы, пока на этом мысль останавливаются.

Есть у кого-нибудь еще идеи и предложения по этому поводу?

P.S.1. Основная идея, не какой-то метод написания кода, который будет более стабильный, а система в которой потенциально нельзя написать код позволяющий сделать exploit. Понятно, что против SQL injection и buffer overflaw есть вполне четко описанные практики борьбы, весь вопрос, что программист должен об этом думать и может забыть/не знать и поэтому везде и есть куча дыр.

P.S.2. Отличная идея от Alex UK. Конечная state machine действительно хорошо справляется с поставленной задачей.

Маленькая развлекушка.

Monday, October 12th, 2009

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

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

Что собирается сделать сотрудник, это подключить эту платку к пульту радиоуправления игрушечной машинки и написать программку, которая потом будет управлять машинкой. И я решил повторить тот же самый проект, так как руки активно чешутся сделать что-нибудь такое.

Так, что заказал платку, прикупил дешевую радиомашинку (с которой с удовольствием эдак с пол часика поигрался без всяких плат), купил паяльник и сейчас активно штудирую основы радиоэлектроники. Кстати, обнаружил, насколько все таки отличаются старые советские книжки по хобби отличаются от иностранных. Советские выглядят так, как будто идет подготовка по закидыванию в тыл противника, где из трех проводов и такой-то матери надо собрать передающую радиостанцию. В иностранных книжках много упора на фан. Я например нашел вот эту книжку выпущенную компанией RadioShack.

На выходных разобрал пульт управления, срисовал схему с него. Хотя куда подключать плату я разобрался быстро, но хочется все таки понять полностью принцип работы пульта, но увы пока понимания не хватает.

Кстати, если таки кто-то знает где можно почитать о том, как понимать, что же делает схема – был бы очень признателен. Обозначения я уже знаю, но абсолютно не понимаю,

В общем, сбылась мечта идиота – добрался таки до железячек.

Выложил фотки пульта радиоуправления в трех файлах: 1,2,3