четверг, 22 мая 2014 г.

Интересная работа современного фотографа

На этих снимках запечатлен модный современный фотограф за работой: Иртегов Дмитрий Валентинович. Мы Видим как он работает над своим фото-проектом: "ОСи и бараны".














Writeup by Arina(blondie task)


Writeup by Arina

Сategory: Crypto(100)

From: PHDays-2014 (Novosibirsk) 

Task:
Seems this blondie read Stephen King:
JACK TORRanc@E THOUGHT: oFFIciOuS lItTlE PrIck.
Ul@LMAN STOOd fIvE-FI@VE, AND WHEN he MoVed, it Was WitH The PrIsSy SPeed tHAT sEEMs To BE tHE EXcluSiVe doMain Of ALl SmalL pLuMP mE@N. THE PART In HiS haiR wAS exACT, anD H@IS DARK SUIT wAS sOBEr BUt COmFOrTinG. I am A Man You CAN BRinG yOUr PrOblEMs To, That SuIT sAId tO The pAYinG CuSTomER. tO tHE@ HIRED HELP I@T SPOKE MORe c@URTLY: tHIs HAD B@ETTER BE GOOD@, YOU. TheRe wAS a rED CARnatIOn In Th@E LAPEL, PERHAPs So That N@O ONE ON TH@E STREET wOuLD MiStAKe sTuARt UlLmAN fOr The lOcal UndErTakER.
as He@ LISTENED TO uLLmAN sPeAK, jACk ADMiTtEd To hImSelF tHAT he PrObablY couLD NoT havE LiKed ANy MAN oN tHAT s@IDE OF THE DESk-uNDEr ThE@ CIRCUMSTANces.
UlLmAN had ASked A QuEStIoN hE hADN't CAUght. ThAT wAS bad; uLLmAN wAS tHE TyPe oF Man Who WouLD F@ILE SUCH LapSes AWay IN a mE@NTAL ROLODeX for LATer COnSideRatIoN.
"i'M sOrRy?"
"I ASkE@D IF YOUR Wife fUllY uNderStO@OD WHAT You WoUld B@E TAKING ON HERe. anD TherE'S yOUr Son, Of CoUrSe." hE gLanCED dOwN at ThE apPlIC@ATION IN frOnT oF HiM. "danIeL. yOUr wIFE IsN@'T A BIT INTIMiDATed by ThE iDEa?"
"wENDY is AN exTrAORdinARy WoMan."
"ANd yOUr SoN is ALSo eXtrAORdinARy?"
JACK sMIlE@

Solve:
Первое, что бросается в глаза в этом тексте – это расставленные через некоторые интервалы символы ‘@’ и странно чередующиеся заглавные и прописные буквы. В решении и будем опираться на эти факты.
Подсчитываем количество ‘@’ – их 24 штуки. Их количество и довольно большие буквенные интервалы между собаками дают нам факт полагать, что флаг будет состоять из 24 символов, каждый из которых нужно вычленить из этого интервала.
Как вычленять их – сразу непонятно. Первая мысль: из каждого интервала нужно получать некую сумму в зависимости от регистров  и/или порядка букв. А потом полученное число сопоставить таблице ASCII или просто английскому алфавиту.
Думаю, что стоит пояснить наш ход мыслей, прежде чем мы пришли к правильному ответу.

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

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

Попытка третья (Удачная!): прибавляем к сумме номер буквы в алфавите, если буква заглавная и отнимаем ее номер, если строчная (учтем, что алфавит у нас начинается с символа ‘a’ с индексом 0). Получаем последовательность:

73 95 97 77 95 115 84 117 80 105 68 95 98 76 111 78 100 73 101 95 70 108 65 103

Преобразуем каждое число последовательности в соответствующий ASCII символ, и, PROFIT, флаг получен:
I_aM_sTuPiD_bLoNdIe_FlAg

четверг, 15 мая 2014 г.

Пищалка


Пищалка


Коллеги, я хочу показать вам как должна выглядеть 21 лаба, чтобы всемогущий её принял, потому что лаба реально простая, но ему не нравиться, что при решение срабатывает не только DELETE, что возникает при использование массива c_cc в termios.

Задача:

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


Проблема:

Я пытался в настройках терминала указать в массив c_cc, чтобы он по нажатию delete слал сигнал, но у delete нет ascii кода, он попадает в терминал как код сразу 4 символов, так как является управляющей клавишей.

Решение:

Я приделал функцию, которая четырьмя getchar проверяет, что пришёл именно delete.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
#include <signal.h>
#define ERR_CODE -1
#define ERR_PROC_CODE 1
//delete key codes
#define DELETE_1CODE 27
#define DELETE_2CODE 91
#define DELETE_3CODE 51
#define DELETE_4CODE 126

int bell_count = 0;
struct termios old_term;

int filenoe(FILE * f) {
    int desc = fileno(f);
    if(desc == ERR_CODE) {
        exit(ERR_PROC_CODE);
    }
    return desc;
}


void reset()
{
        if(ERR_CODE == tcsetattr(filenoe(stdin), TCSANOW, &old_term)) {
            perror("tcsetattr");
        exit(ERR_PROC_CODE);
    }
       exit(0);
}

void finprint(int sgn)
{
        printf("Bell ringed %i\n", bell_count);
        reset();
}

char delIsReading() {
    if((DELETE_1CODE  == getchar()) &&
       (DELETE_2CODE  == getchar()) &&
       (DELETE_3CODE  == getchar()) &&
       (DELETE_4CODE  == getchar())){
        return 1;
    } else {
        return 0;
    }
}

int main(int argc, char** argv)
{
        struct termios term;
        if (ERR_CODE == tcgetattr(filenoe(stdin), &old_term))
        {
             perror("tcgetattr");
        exit(ERR_PROC_CODE);
    }
        if(SIG_ERR == signal(SIGQUIT, finprint)) {
        perror("signal");
        exit(ERR_PROC_CODE);
    }
        term = old_term;
        term.c_lflag &= ~ (ICANON | ECHO);
        term.c_cc[VMIN] = 1;
        if (ERR_CODE == tcsetattr(filenoe(stdin), TCSANOW, &term))
        {
             perror("tcsetattr");
        exit(ERR_PROC_CODE);
    }
        while (1)
        {
        if (1 == delIsReading())
        {
            printf("din-don\a\n");
            bell_count++;
        }
        }
        reset();
        return 0;
}


P.S. Если кто не в курсе, то SIGQUIT по умолчанию посылается на "ctrl+\". И если придумаете как отловить delete более изящным способом, мне скажите))

вторник, 13 мая 2014 г.

The Liskov Substitution Principle(LSP)

The Liskov Substitution Principle(LSP)

Давайте посмотрим почему то, что пишут в русских интернетах не правда:

«Пусть q(x) является свойством верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.» © wikipedia

Наследующий класс должен дополнять, а не замещать поведение базового класса. ©habrahabr

А теперь обратимся к оригинальной статье Барбары Лисков:

“If S is a declared subtype of T, objects of type S should behave as objects of type T are expected to behave, if they are treated as objects of type T” 
© Barbara Liskov 

Что на советском языке звучит как:
Если S дикларирован подтипом типа T, объекты типа S должны вести себя ожидаемо если они рассматриваются как объекты типа T.
Обратите внимание что LSP это об ожидаемом поведение объектов. Вы следуете LSP если получаете ожидаемое поведение объектов.

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

И вообще ознакомьтесь с вот этим:
http://www.engr.mun.ca/~theo/Courses/sd/5895-downloads/sd-principles-3.ppt.pdf



среда, 7 мая 2014 г.

ITOAR


ITOAR
Интерактивная обучающая программа на аугментированной реальности

Где это примененятся?

Программа предназначена для использования в школах. В младших классах она поможет развить мелкую моторику у детей, а также в игровой форме подать им изучаемый материал. Например, показать детям упругое и неупругое соударение(физика): ребёнок сталкивает два шара, они отталкиваются, и на экране тут же появляется описание произошедшего процесса. Или, например, на уроке биологии ребёнок сможет кормить с руки различных животных и запоминать, кто что ест. Также можно сделать настольные игры, к примеру шахматы, с красивыми визуальными эффектами, чтобы детям было интересно играть.

Что из себя представляет программа?

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



Интересно ли это детям?

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












Time Shit

Time Shit


Для запуска откройте index.html браузером!

Здравствуйте всем. Сегодня я хочу выложить сюда игру, которую мы с друзьями написали ещё прошлым летом, и вот, когда у меня появился блог, я бы хотел ей поделиться))
Суть игр в том, что для прохождения уровня необходимо решать головоломки с перемещение во времени. Например нам нужно пройти сквозь дверь, которая открыта пока удерживается кнопка. Но кнопка находиться далеко от двери. А теперь представьте, что мы умеем перемещаться во времени. Мы подходим к кнопке, удерживаем. Потом идём к двери и переносимся в прошлое, где мы удерживали кнопку, теперь дверь открыта, и мы можем пройти.
По сюжету, мы играем за старика физика, который всю жизнь разрабатывал крутые штуки и очень много курил. В следствии чего он получил докторскую степень и рак лёгких. С его здоровьем нашему герою не хочется оставаться в городе и он отправляется на природу. Но... Мы же знаем чтобы наш мужичёк крутой учёный, а значит он живёт в закрытом городе, где делают супер крутые и секретные штуки. Выход курильщик находит в канализации: по водосточным тоннелям мы должны провести его за город. В помощь нам костюм с экзоскелетом, для усиления старого прокуренного физика, и машина времени его собственного производства.
Давайте попробуем разобраться как работает машина времени.

Ладно... Для начала просто освоим управление. Итак, чтобы начать перематывать время нужно однократно нажать клавишу ENTER, чтобы остановить перемотку в нужный момент повторно кликаем ENTER. Вот мы и в прошлом!!!!
Чтобы понять в каком времени мы находимся и окончательна не заблудиться в часах, они выведены на экран, с верхнего боку(да-да, именно там).
Красный сектор на циферблате показывает время прошедшее с начала игры, когда мы несёмся сквозь время и пространство в прошлое красный сектор уменьшается. Ну вот, будем считать управление освоили.
Что ж, давайте подглядим какие сложности готовит нам канализация.
Кнопки - активируют другие игровые элементы:

Движущиеся платформы. В любой уважающей себя игре есть платформы))

 И гравитационные подушки. Я правда не знаю как они оказались в канализации, будем считать, что в этом виноваты черепашки ниндзя:
В общем с этим багажом знаний уже вполне можно попытаться не умереть. Удачи!

P.S. В конце вас ждёт бонус-левел)))

четверг, 1 мая 2014 г.

Oculus Rift

Oculus Rift

На днях мне дали поиграться с Oculus rift (официальный сайт). 

Довольно залипабельная штуковина. Пропустим ту часть истории, где я в экстазе бегал по виртуальному миру. После "пробежки" было решено всё таки заняться делом, и я открыл Visual Studio 2010 и документацию по API, которую на сайте раздают разработчикам, вместе с самой библиотекой. Документацией я в целом доволен, но... Но там нет не звука как подключить библиотеку, зато 25 листов, как её использовать. В принципе всё подключается довольно изящно и просто, вот только названия подключаемых хедоров не совпадают реальными. Подключается это всё следующим образом:
  • Папка LibOVR(скачанная с сайта, для этого необходимо зарегистрироваться как разработчик) копируется туда где вы её не потеряете, я просто положил рядом с моим проектом.
  • Подключаем OVR.h из папки Include в вашей программе.
  • Заходим в Visual Studio. Project->... Properties->Configuration Properties->Linker->Input
  • В поле Additional Dependencies добавляем через точку с запятой libovr.lib;libovrd.lib;winmm.lib
  • А файлы libovr.lib и libovrd.lib переезжают жить в корень проекта
Если и после этого примеры из документации не будут собираться, попробуйте выставить режим сборки в Release))
Ну и, собственно, после ознакомления с первой половиной доков, я научился узнавать куда повёрнута голова в Oculus:


  P. S. В документации приведён пример использования класса Posef для получения угла поворота головы, но нет ни звука про пространство имён. Так вот, ситуация исправляется с помощью: using namespace OVR;(если, конечно, ваша религия позволяет использовать using namespace, а иначе везде приписывайте OVR, кстати, второй вариант лучше).
P. S. S. Буду сюда докладывать, когда что нибудь напишу.