8 ловушек программирования


Оглавление (нажмите, чтобы открыть):

Великая ловушка программирования

Привет, друзья! Долгожданный новый сезон подкастов стартовал, и мы сразу обливаем вас ручьём новых интересных тем: UX «хлебных крошек», UI и притяжательные местоимения, 5 проблем, которые решает адаптивная вёрстка и ещё много всего интересного! Но самое главное то, что мы наконец-то ответили на вопрос «как всё успеть, работать и изучать новые технологии?», смотрите весь подкаст и подписывайтесь!

Тему к следующему выпуску предлагайте здесь: Тему к подкасту #95.

«Дизайн»

«Разработка»

«Светские новости»

«WordPress»

«Начно-популярное»

Темы к выпуску #94

Спасибо всем, кто предлагал темы к этому выпуску, с ними можно ознакомиться по ссылке: Темы к подкасту #94.

Удачи и дай вам Бог на эти коротенькие семь дней.

3 комментария

Надоело на YouTube оставлять комменты, поблагодарю тут! 🙂 Спасибо за очередные 2 часа приятного времяпрепровождения, ребят. А также спасибо тем, кто делится темами, это даёт разнообразие подкасту. В этом выпуске статья про ловушку программирования… не знаю, как сказать… жиза, ё-маё. Надо это как-то исправлять! Так порой и хочется сказать себе: «оглянитесь, глупец, что ты оставляешь после себя, кроме этого говнокода?». На 1 минуту задумываешься, что отходишь от тех жизненных ценностей, что делают тебя полноценным человеком. А потом… бац «ааа, вот тут я точку с запятой забыл поставить»… и дальше понеслось.

Комментарий какой-то тоже жизненный, спасибо!

А вообще в любом деле оно так: спасись сам и вокруг тебя спасутся тысячи.

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

Добавить комментарий Отменить ответ

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Поиск

uWebDesign настоятельно рекомендует!

Темы к ближайшему подкасту (6 комментариев)

Предлагайте свои темы для выпуска #214 в комментариях!

Великая ловушка программирования

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

Основной инстинкт человека

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

Если верить Википедии, то «эволюция жизни на Земле началась с момента появления первого живого существа — около 3,7 миллиарда лет назад». Все это время микро- и не очень организмы плодились, совокуплялись, размножались и пожирали друг-друга. Организмы действительно шли по направлению, заданному их основным инстинктом — размножением.
Именно этот инстинкт дал шанс на эволюцию и на развитие жизни в целом. Природа в этом плане умна — она не оставила выбора живым существам, а наделила их однозначной «прошивкой» плодиться и размножаться.

Природе потребовалось 3 миллиарда лет, что бы создать ЖИЗНЬ и эволюционировать в… человека. Человеку потребовалось 2000 лет, что бы вылезти из пещер и каких-то лет 200-300, что бы познать законы природы и полететь в космос. Научиться «чинить» самого себя. Создать технологии, которые по своей сложности просто не уместить в рамки познания одного человека. Само человечество стало природой, творцом, Богом.

На фоне этих, без преувеличения сказать, действительно масштабных подвигов человечества, утверждение о том, что основной инстинкт человека — размножение, выглядит как-то не очень. Возможно, это применимо к животным и иным организмам. Но тот взлет, который испытал человек, заставляет действительно пересмотреть теорию «основного» инстинкта и принять теорему, утверждающую что основной инстинкт человека — это любознательность и созидание. Вспомните хотя бы детей в песочнице. Чем занимаются мальчики? Строят дома из песка, играют в «высокотехнологичные» игрушки — машины, танки. Мальчики любят конструкторы. Сейчас это буржуйский Lego, кто родился в «союзе», тот наверняка помнит железные советские конструкторы, позволяющие делать массу отличных вещей. Когда мальчики вырастают из детского возраста, то на смену конструкторам приходят иные увлечения — развитие в одной из областей жизнедеятельности. Молодые люди выбирают свой путь в жизни.

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

Т.е. мужчины в большей степени ориентированы на изучение и созидание. У женщин — иная функция в целом, кардинальное отличие на уровне «прошивки».


Попадание в ловушку

Знаете, чем бы занималась добрая половина из вас, родившись в средневековье? Вы бы исследовали мир. Через военные походы, наблюдая за звездами, участвуя в покорении неизведанных вершин или еще как-то. Однако, цивилизация все уже сделала за вас — вершины покорены. В радиусе сотен километров нет ничего, что хоть как-то могло заинтересовать вас, как исследователя. Конечно, можно пойти в поход, но для большинства жителей индустриальных районов планеты это задача не простая. Да и в любом походе вы наткнетесь на мусор от жизнедеятельности человека — нас стало слишком много, мы все изучили и везде пролезли. Все стало прозрачно и откровенно скучно. Об этом неплохо сказал персонаж «Писатель» в советском фильме «Сталкер» 1979 года:

… Нет никакого Бермудского треугольника. Есть треугольник а бэ цэ, который равен треугольнику а-прим бэ-прим цэ-прим. Вы чувствуете, какая унылая скука заключена в этом утверждении? Вот в средние века было интересно. В каждом доме жил домовой, в каждой церкви — Бог… Люди были молоды! А теперь каждый четвертый — старик. Скучно, мой ангел, ой как скучно.

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

И вот, вы остаетесь один на один со своим желанием поиска чего-то нового, стремления изучать, создавать. Реальность описана выше — она скучна и банальна, она ограничена для вас многими факторами. Но существует мир, со своими законами, многогранный и очень сложный — мир информационных технологий. Этот мир многим кажется скучным, не интересным. Но он действует как наркотик для человека, который имеет тягу к познанию. Сделав одно погружение в IT, человек делает это еще раз и еще. В конечно счете он — на крючке. Человек начинает изучать целые технологии, тратит тысячи человеко-часов сидя напротив коробки монитора, фанатично работает днями и ночами. Что это может быть, как не проявление инстинкта исследования, о котором говорил «Палеонтолог»?!

Как устроена ловушка

Конструктивно ловушка очень проста: человек начинает изучать технологию. Практикуется. Добивается успеха. Инстинктивная потребность в созидании и исследовании полностью удовлетворяется:

  • Человек изучил технологию — совершил исследование
  • Человек на базе технологии создал уникальный продукт — совершил созидание

Мой первый проект в программировании состоялся в 2002 году. Тогда я, будучи совсем молодым студентом, создал веб-сайт для группы «Гражданская оборона». За месяц кропотливой работы был написан движок на PHP 4, потом несколько недель наполнения контентом и вауля — был создан уникальный продукт, который исправно работает до сих пор. Признаться, тогда, я был на седьмом небе от полученного результата — я научился технологии и произвел вполне нужный для многих веб-сайт.

Любой язык программирования, любая технология — это бездонный океан возможностей, свой мир с определенными правилами и постулатами, с подводными камнями и нюансами. Узнав о foo() остановиться невозможно, в конечном счете нам потребуется bar(). И так далее, по нарастающей — изучив технологию A, мы понимаем, что нам её не хватает и мы изучаем технологию В, C, D. Желание познать непознанное вынуждает нас погружаться все глубже и глубже в бесконечный мир разработки. Мы тратим на это сотни часов, отдавая своё бесценное время, зачастую — свободное время, которое можно было бы потратить с куда большей пользой.

Внутри ловушки

Если программирование, разработка — это ваше хобби, то это пол беды. Если программирование — это ваша работа — это уже беда.

1. Конкурентоспособность

Вы всегда должны быть на «волне». Вы всегда должны быть в курсе последних изменений в версиях языка, появлении новых стандартов. Без этого вы безбожно теряете свою цену. В отличие от других специальностей, где ГОСТы и стандарты могут не меняться десятилетиями, в IT все движется очень быстро. И будет еще быстрее и «жёстче» — программирование — относительно молодая профессия, которая вышла из рамок НИИ и стала на уровень промышленного использования относительно недавно, особенно в нашей стране.

Возникает закономерный вопрос — а способны… Нет, не так формулирую вопрос — сможете ли вы 10, 20, 40 лет изучать технологии, что бы быть «в форме»? Даже в свободное время? Жертвовать своим свободным временем, своей семьей и общением с друзьями ради удовлетворения нужд профессии, которая диктует довольно жесткие правила игры?

Когда вам 20 лет и у вас горят глаза, когда у вас получается что-то в области разработки, это здорово. Я помню весь тот кайф от освоения новых горизонтов и еще больший кайф, когда твой проект в интернете посещают 2000 человек в сутки, а при встрече говорят тебе за него «Спасибо». Я помню тот кайф, когда я понял суть объектно-ориентированного программирования и стал играючи писать качественный объектно-ориентированный код.

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

2. Самопожертвование

В одном из недавних, простите, срачей, устроенных мной, я акцентировал своё внимание на следующей ветке дискуссии:

Люди признаются в том, что издержки профессии, а именно — возможность не привязываться географически к месту своего проживания, вынуждают их отказаться от создания семьи.

Увлеченность своим делом доходит до абсурда, во главу угла ставится уже не продолжение рода, наличие семьи или благосостояния, а сама технология:

3. Мифы

Область разработки переполнена мифами более чем полностью.

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

С моей личной точки зрения зарплата программистов должна быть ещё выше — это с учетом описанных выше двух пунктов. Дело в том, что программист настолько увлечен своей профессией, что даже в свободное время он «работает» — пишет свой open source или просто читает документацию и стандарты. Ни одна другая профессия не допускает такое самопожертвование своего времени:

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

Кстати, я не знаю ни одного коллегу-программиста, который бы имел золотые горы, о которых так часто пишут в СМИ.

Другой миф о программировании тесно связан с некими мифическими «интересными проектами», работой в Google и т.д.


Так получается, что очень многие разработчики ассоциируют себя чуть ли не с сотрудниками какого-нибудь ЦЕРНа. Не надо. Действительно уникальных людей, задающих вектор развития в глобальном масштабе — единицы, по сравнению с общей частью «клиентов», т.е. простых смертных. Задача программиста — писать код. Код вы пишите для бизнеса и под нужды бизнеса. На работу вас зовет бизнес. Бизнес занимается зарабатыванием денег. Вы в этой пищевой цепочке как и остальная часть сотрудников — «офисный планктон».

Я даже не рассматриваю в последнее время вакансии, где написаны такие слова, как «стартап», «интересный проект» и т.д. Меня раздражает это ханжество, а именно — преподносить очередной программный код как нечто уникальное, то, что изменит мир. Как правило в этих проектах довольно все стандартно.

Мастер Йода рекомендует:  Как объединить ячейки в таблице HTML

Я работал в больших предприятиях, я знаю и вижу чем занимаются программисты — они пишут код больших корпоративных систем. В этих системах нет ничего «интересного». Это системы для взаимодействия бизнес-процессов. Интеграции со сторонними системами предприятия, получение и обработка данных, обычная рутина с зашкаливающим количеством строк кода. Мои коллеги — прекрасные профессионалы своего дела, я практически не встречал за последние 5 лет глупых людей. Но реальность такова, что все мы пишем довольно унылые вещи. Багфиксинг, разработка на существующем коде, интеграции — это все реальность. «Интересные проекты» — это миф, придуманный блоггерами и «эйчарами».

4. Люди и коллеги

Я разделяю всех программистов на «нормальных людей» и «не очень». И с уверенностью могу сказать, что в программирование попадают совсем не случайно. Недавно я прочел комментарий программиста в ютубе, где он писал следующее:

На мой взгляд, программирование это разновидность эскапизма, бегства от реальности.

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

Например, для меня всегда будет загадкой, как мужчина за 30 лет, вроде даже имеющий детей, может ездить на работу на… самокате. Я право не хочу слышать какие-то объяснения, что так удобнее/выгоднее/круче и т.д. Особенно при условии, что машину сейчас можно купить за одну зарплату программиста. С моей точки зрения мужик на самокате выглядит просто дико и отвратительно. Эдакое не наигравшееся дитё, переросток, инфантилизм в терминальной стадии. Хочется подарить ему слюнявчик и игрушечный пистолетик. Причем, подобное решение — кататься на работу на самокате будет в 99% случаев присуще именно офисному работнику с «творческой» натурой, как программист/дизайнер/верстальщик. Ни один автослесарь, сантехник или банкир не додумается ездить на работу на самокате.

Другой сотрудник, бегал на 7 этаж пешком и «заставлял» это делать всех новых сотрудников, т.к. именно он всегда пропускал их через турникеты, когда новые сотрудники ещё не имели пропусков. Т.е. на работу приходил новый человек, звонил Пете, Петя спускался и невольно заставлял нового сотрудника не пользоваться лифтом, а бежать вместе с ним на 7 этаж пешком.

Разговоры коллег в курилке меня мягко говоря огорчали. Заученные до неприличия новости про флагманские смартфоны и новости из мира Apple, но полное отсутствие интереса к другим сферами жизни, будь то политика, автомобили, оружие, бизнес или что-то еще, отличное от гаджетов. Для меня правда остается загадкой, зачем знать столько бессмысленной информации о гаджетах, ведь это по сути — бусы для папуасов.

В заключении

Я очень люблю программирование, но чем больше я погружаюсь в ту или иную технологию, тем больше приходит понимания, что «я знаю только то, что ничего не знаю». Маниакальное желание познать необъятное, удержать в голове массу информации дает о себе знать — мне все больше и больше надоедает бежать за этим ветром. Хочется остановиться.

Мне, как веб-разработчику, необходимо уметь отлично разбираться как минимум в двух-трёх языка программирования и в стандартах W3C. Я начал замечать, что разрываюсь между этими технологиями, их рост в последние годы прошел настолько интенсивно, что каждая из них уже тянет на отдельную специализацию.

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

8 ловушек программирования

Когда пишется код CSS, очень легко попасть в одну из ловушек. Чтобы их преодолеть, нужно использовать небольшие и эффективные трюки.

В данном уроке описывается несколько моментов, которые помогут при работе над CSS частью вашего проекта.

1. Задаем стили для кнопок
Начнем с классических кнопок HTML. Когда создаются кнопки, например, input type»submit» или button, и хочется получить точность до пикселя, нужно вспомнить о следующих командах:

2. Используем псевдо-элементы
Несомненно, что вам уже известны псевдо-элементы, такие как :before и :after, которые помогают определять содержание, вставляемое перед (или после) основного элемента. Однако, элементы input и img не имеют содержания и псевдо-элементы не работают с ними. А элемент hr позволяет использовать псевдо-элементы.

Также нужно помнить о разнице между :before и ::before. IE8 допускает использование только одинарного двоеточия.

3. Фоновый градиент для всего раздела body
Если вы пробовали использовать CSS3 градиент для тега body, то наверняка заметили, что он не растягивается, а повторяется. Чтобы исправить положение используйте следующий код:

4. Отсутствие переходов для градиентов
К сожалению, ни один из браузеров не поддерживает переходы градиентов (пока).

Но можно использовать следующие трюки:

1. Использовать свойство background-position для :hover, чтобы создать иллюзию перехода градиента. В действительности используется сдвиг по оси Y.

2. Трансформация background-color и использование изображения градиента, которое будет иметь изменяющуюся прозрачность. Такая техника создаст иллюзию перехода градиента.

5. Зазор между элементами inline-block
Допустим, вы используете inline-block вместо float для горизонтального списка. При этом появляется зазор между вашими элементами inline-block. чтобы исключить его необходимо использовать «грязную» разметку.

То есть, вместо четкой структуры:

Нужно писать так:

6. Когда height: 100% действительно работает?
Все достаточно просто: когда вы используете height: 100% для элемента, всегда думайте о высоте его родителя. Если высота родителя не определяется в стилях, то внутренний элемент будет иметь 100% высоты от ничего.

Вот такой широко распространенный пример разметки:

Зеленый цвет элемента #child с помощью правила height: 100% будет растянут на все 400px по вертикали.


7. Скругленные углы для таблиц
Трюк заключается в установке свойства таблицы border-spacing в значение 0. Свойство border-collapse по умолчанию имеет значение separate, поэтому нужно установить его в значение collapse для IE7 и старше (для обратной совместимости кода).

8. Модель элемента ввода
Когда разрабатывается элемент поиска, например, то после установки одинаковых значений для свойств height или w результат обычно расстраивает.

Причина расстройств заключается в том, что для элемента input type=»submit» используется модель определения размеров border-box, а для элемента input type=»text» — модель content-box (в IE и FF).

Чтобы устранить причину расстройств, нужно использовать одинаковые модели для элементов ввода. Для этого используется свойство CSS3 box-sizing:

box-sizing: content-box | padding-box | border-box;

Как это работает8 ловушек, в которые попадает сознание

Почему люди мыслят ограниченно

В науке о сознании существует понятие «когнитивное искажение» — повторяющиеся ошибки в мышлении, которые есть у всех людей. Некоторые из этих ошибок совсем не вредны (а можно даже сказать, что полезны), но многие приводят к неточным суждениям и к тому, что мы не мыслим рационально. Look At Me рассказывает о самых распространённых ошибках, которые возникают в нашем сознании.

Мы спорим, чтобы победить,
а не чтобы добраться до истины

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

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

Мы не понимаем вероятность

Человеческий мозг с большим трудом оценивает вероятность в бытовых ситуациях. Классический пример: мы не боимся садиться в машину, но многие из нас очень боятся самолётов. В то же время почти все знают, что шанс умереть в автокатастрофе гораздо выше, чем разбиться на самолёте, но наш мозг не соглашается с этим. Хотя статистически шанс погибнуть в машине — 1 к 84, а в самолёте — 1 к 5 000, а то и 1 к 20 000. Это называется отрицанием вероятности, когнитивная ошибка, которая зачастую приводит к тому, что мы преувеличиваем риск безобидных вещей и недостаточно сильно боимся действительно опасных. Кроме того, тут в сознание часто вмешиваются эмоции: считается, что чем больше эмоций связано с маловероятным событием, тем более вероятным оно нам кажется.

У нас двойные стандарты
по отношению к другим людям

В социальной психологии существует понятие «фундаментальная ошибка атрибуции». Звучит сложно, но на самом деле оно означает простую вещь: мы склонны осуждать других и не вникать в обстоятельcтва и оправдывать себя. Ошибки других людей мы объясняем их личными проблемами и особенностями, а своё поведение и ошибки оправдываем внешними обстоятельствами. Скажем, ваш коллега сильно опоздал на работу, да ещё и пришёл пьяным — это ужас, он неконтролируемый алкоголик! А если вы опоздали и пришли пьяным — ну, у вас тяжёлый период в жизни, и вам нужно было отвлечься.

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

8 ловушек программирования

Когда пишется код CSS, очень легко попасть в одну из ловушек. Чтобы их преодолеть, нужно использовать небольшие и эффективные трюки.

В данном уроке описывается несколько моментов, которые помогут при работе над CSS частью вашего проекта.

1. Задаем стили для кнопок
Начнем с классических кнопок HTML. Когда создаются кнопки, например, input type»submit» или button, и хочется получить точность до пикселя, нужно вспомнить о следующих командах:

2. Используем псевдо-элементы
Несомненно, что вам уже известны псевдо-элементы, такие как :before и :after, которые помогают определять содержание, вставляемое перед (или после) основного элемента. Однако, элементы input и img не имеют содержания и псевдо-элементы не работают с ними. А элемент hr позволяет использовать псевдо-элементы.

Также нужно помнить о разнице между :before и ::before. IE8 допускает использование только одинарного двоеточия.

3. Фоновый градиент для всего раздела body
Если вы пробовали использовать CSS3 градиент для тега body, то наверняка заметили, что он не растягивается, а повторяется. Чтобы исправить положение используйте следующий код:

4. Отсутствие переходов для градиентов
К сожалению, ни один из браузеров не поддерживает переходы градиентов (пока).

Но можно использовать следующие трюки:

1. Использовать свойство background-position для :hover, чтобы создать иллюзию перехода градиента. В действительности используется сдвиг по оси Y.

2. Трансформация background-color и использование изображения градиента, которое будет иметь изменяющуюся прозрачность. Такая техника создаст иллюзию перехода градиента.

5. Зазор между элементами inline-block
Допустим, вы используете inline-block вместо float для горизонтального списка. При этом появляется зазор между вашими элементами inline-block. чтобы исключить его необходимо использовать «грязную» разметку.

То есть, вместо четкой структуры:

Нужно писать так:


6. Когда height: 100% действительно работает?
Все достаточно просто: когда вы используете height: 100% для элемента, всегда думайте о высоте его родителя. Если высота родителя не определяется в стилях, то внутренний элемент будет иметь 100% высоты от ничего.

Вот такой широко распространенный пример разметки:

Зеленый цвет элемента #child с помощью правила height: 100% будет растянут на все 400px по вертикали.

7. Скругленные углы для таблиц
Трюк заключается в установке свойства таблицы border-spacing в значение 0. Свойство border-collapse по умолчанию имеет значение separate, поэтому нужно установить его в значение collapse для IE7 и старше (для обратной совместимости кода).

8. Модель элемента ввода
Когда разрабатывается элемент поиска, например, то после установки одинаковых значений для свойств height или w результат обычно расстраивает.

Причина расстройств заключается в том, что для элемента input type=»submit» используется модель определения размеров border-box, а для элемента input type=»text» — модель content-box (в IE и FF).

Чтобы устранить причину расстройств, нужно использовать одинаковые модели для элементов ввода. Для этого используется свойство CSS3 box-sizing:

box-sizing: content-box | padding-box | border-box;

8 ловушек программирования

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

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

Неоправданная оптимизация

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

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

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

Излишнее абстрагирование

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

Мастер Йода рекомендует:  Click.tv продвигает свежие идеи

Вывод: не делайте абстракции ради абстракций. Лучше сделать проще, чем создать универсальное решение и использовать 30% процентов от его функционала.

Перфекционизм

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

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

Вывод: держаться посередине. Выделите время, которое будет отводиться на рефакторинг в обязательном порядке, например руководствуйтесь правилом 20/80. Когда обнаружится недостаток, подумайте, так ли он важен чтобы исправлять его прямо сейчас. Примите, что переписывать проект с нуля – крайняя мера, но иногда это придется делать.

Технологии и инструменты

Использовать инструменты для облегчения своей работы, конечно же, важная часть работы программиста. Но иногда это начинает работать по принципу «забивать гвозди микроскопом». Если вы разрабатываете сайты, и привыкли включать jQuery под каждый чих – нужно задуматься, не стоит ли написать на несколько строк больше на чистом JavaScript и не тянуть ради ерунды целую библиотеку.

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

Вывод: используйте сторонние инструменты соразмерно проекту. Знакомьтесь с новыми инструментами и пользуйтесь старыми, но не делайте это бездумно – в некоторых проектах можно обойтись и без них.

Идеальное решение

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

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

Кроссплатформенность

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


Вывод: определитесь с основной платформой. Сделайте стабильно работающее приложение, а потом занимайтесь портированием на другие ОС и платформы.

Защита

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

Вывод: не пытайтесь проверить все, тщательно обдумывайте, что стоит проверять, а что нет. Основное внимание при проверках уделяйте пользовательскому вводу и внешним ресурсам.

Откладывание на потом

Еще одна непростая ловушка, найти баланс в которой сложно. Если в коде множатся отметки TODO, а реализация отложенного функционала так и не приходит – значит что-то не так.

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

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

Ловушки в Microsoft Windows

Когда то давно возникла у меня необходимость написать программку для создания скриншотов. А именно пользователь выделяет мышью необходимую ему область на экране, затем отпускает кнопку и получает скриншот. В то время я про ловушки еще не знал. Несколько дней я “бился” над поставленной задачей, но мои эксперименты так и ни к чему, ни привели. Почитав различную литературу и статьи, и узнав, что такое ловушки, и с чем их “едят”, я принялся экспериментировать дальше. А начал я с книги Михаила Фленова «Программирование в Delphi глазами хакера». На то время, все то, что я почерпал из его книги, мне показалось довольно легко, но только потом я понял (когда в этом деле поднабрался опыта), что сильно ошибся.

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

Но произошло чудо. Попала ко мне в руки книга Юрия Ревича “Нестандартные приемы программирования на Delphi”. Полистав которую, я был немного шокирован, вот оно то, что мне нужно. А не получалось ранее, потому что нужно передавать значения из ловушки через MAP файлы (Memory Mapped Files) – отображение файла на память.

Ну что начинаем писать шпиона?

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

Все, хватит теории, начинаем писать. Мы напишем простой клавиатурный шпион. Почему простой? Да потому что шпион должен не только перехватывать нажатые клавиши, а также следить за приложениями, в которых эти клавиши нажимались. Еще можно записывать и время запуска ловушки, приложения которое имело на момент нажатия клавиш фокус ввода и т.д. Но это вы уже сможете реализовать сами.
Создаем новый проект. Бросаем TMemo и две кнопки:

Затем объявляем константу с пользовательским сообщением:

Теперь нам надо импортировать процедуры запуска и удаления ловушки. Хотя библиотека еще не написана, но это так, чтобы потом не возвращаться. Добавьте у себя такие вот строки:

На следующем шаге создадим, обработчики для кнопок и в них напишем следующий код:

В обработчике кнопки «Start» есть переменные, которые не были объявлены, эти переменные находятся в другом модуле, который мы рассмотрим позже.

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

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

В переменной Message, в параметре Wparam, находится код с виртуальным идентификатором клавиши. Вся проблема в том, что по этому коду мы не можем определить, ни в каком регистре находится символ, ни уж тем более раскладку клавиатуры, при которой он был веден. Именно поэтому я привожу функцию GetCharFromVKey, которая возвращает именно тот символ, который мы ввели. В ней различается и регистр и раскладка.

Сама функция предназначена только для конвертирования клавиш по их коду. Поэтому на ней мы останавливаться не будем. Скажу только что, она распознает все символы от A до Z, от a до z, от А до Я и от а до я и т.д. То есть по регистру и по раскладке.

Теперь нам предстоит написать модуль для создания общей разделяемой области. Модуль у меня называется IniHook, с дополнительными секциями initialization и finalization. Создаем новый модуль и называем его IniHook. Подключаем два модуля: Windows и Messages.

Объявим указатель на переменную THookInfo
Затем напишем запись THookInfo.

Далее объявляем две переменные:

Через переменную DataArea мы будем обращаться к полям записи THookInfo, hMapArea будет содержать дескриптор объекта «проецируемого» файла.

Далее в разделе initialization вызовем функцию CreateFileMapping и присвоим ее возвращенное значение переменной hMapArea. Затем вызовем функцию MapViewOfFile и присвоим ее возвращенное значение переменной DataArea. Исходный код смотрите ниже:

Кратко рассмотрим использованные здесь функции.
Создание и использование объектов файлового отображения осуществляется посредством функций Windows API. Этих функций три:

  • CreateFileMapping;
  • MapViewOfFile;
  • UnMapViewOfFile.


Отображаемый файл создается операционной системой при вызове функции CreateFileMapping. Этот объект поддерживает соответствие между содержимым файла и адресным пространством процесса, использующего этот файл. Функция CreateFiieMapping имеет шесть параметров:

Следующая задача – спроецировать данные файла в адресное пространство нашего процесса. Этой цели служит функция MapviewOfFile. Функция MapViewOfFile имеет пять параметров:

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

Здесь только следует отметить, что функция UnMapViewOfFile должна вызываться перед функцией CloseHandle. То есть ни в коем случае этот порядок нарушать нельзя.

Ну что модуль мы написали, теперь его необходимо подключить к основной программе. Осталось нам написать саму ловушку, которая будет размещаться в библиотеке. А пока идем пить кофе. Попили? Продолжаем. Начните новый проект, только не для написания приложения, а для библиотеки. Для этого нужно выбрать команду File/New/Other, затем перед вами откроется следующее окно:

Найдите элемент DLL Wizard и дважды щелкните на нем. И Delphi создаст пустой проект динамической библиотеки. Не забудьте сразу сохраниться. Ниже представлен исходный код моей библиотеки:

Теперь обо всем по порядку. Для начала необходимо подключить три модуля: Windows, Messages, SysUtils и один наш модуль, а именно IniHook Чтобы мне не держать копии модуля в каталоге самой программы и в каталоге библиотеки я его вынес в общий каталог, в котором находятся каталоги основной программы и библиотеки. Но вы можете его подключить стандартным способом, то есть, объявив его со всеми модулями, только тогда вам придется положить этот модуль в каталог с библиотекой. Это уже дело вкуса.

Теперь, как и в основной программе, мы объявили константу WM_ReadWithHook = WM_USER + 120, для нашего пользовательского сообщения. Функция KeyboardProc – это обработчик нашей ловушки. Эта функция имеет три параметра. Сейчас мы и их рассмотрим более подробно. При установленном типе ловушки WH_KEYBOARD, эти параметры могут иметь следующие значения:

  • nCode: Определяет код использования процедуры ловушки, чтобы определить как обработать сообщение. Этот параметр может иметь несколько значений.
  • AC_ACTIONWParam и LParamпараметры содержат информацию относительно нажатой клавиши. Сообщения другого типа у нас нет необходимости обрабатывать.
    • WParam: Определяет код с виртуальным идентификатором клавиши, которая генерировала сообщение нажатия клавиши.
    • LParam: определяет повторный счет, скэн-код, флажок расширенной клавиши, контекстный код, предыдущий флажок состояния клавиши, и флажок переходного состояния. Этот параметр может иметь комбинацию определенных значений. Но мы их рассматривать не будем, поскольку они в нашем случае не предоставляют интереса.

Функция CallNextHookEx имеет четыре параметра:

  1. (hhk)– дескриптор ловушки, возвращенный функцией SetWindowsHookEx;
  2. (Code) – определяет код перехвата;
  3. (WParam) – определяет приходящую длину в процедуре по обработке ловушки. Его значение зависит от типа установленной ловушки;
  4. (LParam) – определяет приходящую длину в процедуре по обработке ловушки. Его значение зависит от типа установленной ловушки.

В данный момент нас интересует вот эта строка кода:

В этой строке мы передаем команду нашему приложению, в котором вызывается обработчик нашего пользовательского сообщения WM_ReadWithHook = WM_USER + 120 и параметр WPARAM, который содержит код клавиши.

И, на конец я вызываю опять функцию CallNextHookEx, возвращаемое значение которой я передаю в переменную. Я заметил, что так практически никто не делает. Оно то все работает. Но в игре, к примеру «Counter-Strike» при включенной ловушке, были зависания клавиш. А после добавления в конец нашего обработчика функции CallNextHookEx, пришло все в норму.
Процедура SetHook содержит всего лишь одну строку кода:

Здесь вызывается функция установки ловушки SetWindowsHookEx. У этой функции должно быть четыре параметра:

  1. Тип ловушки. Указан WH_KEYBOARD, эта ловушка контролирует сообщения нажатия клавиш;
  2. Идентификатор, содержащий процедуру ловушки;
  3. Указатель на приложение;
  4. Идентификатор потока. Если параметр равен нулю, то используется текущий.

Процедура DelHook также имеет всего одну строку кода:

Функция UnhookWindowsHookEx имеет всего один параметр и это дескриптор ловушки.
Процедуры SetHook и DelHook объявлены как экспортные.
Ну вот и все. Вы можете скачать demo версию или полный исходник проекта.

5 ловушек, 2 головоломки, 0 строк кода

Команда из Европы и России пару лет назад задалась вопросом, «А что, если перейти на новый уровень абстракции и убрать программирование из разработки?» (я про них уже писал месяц назад) Пока, судя по каналу, можно делать только игры с видом сбоку, базовой физикой, простыми задачками, ловушками и/или противниками – в роли логической машины используются коллайдеры, которые могут триггерить действия других объектов на сцене, анимировать и менять их настройки. Материалы (с нормалями, дисплейсментом и AO) в наличии, но пока говорят, что не PBR, а по-старинке.

Мастер Йода рекомендует:  Курс «Алгоритмы и структуры данных»

Дубликаты не найдены

Команда из Европы и России пару лет назад задалась вопросом, «А что, если перейти на новый уровень абстракции и убрать программирование из разработки?»

Как-то долго они идут к ответу «Получится полная хуета».

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


Кажется, я про такое слышал еще в начале 2000-х. Не взлетело и не взлетит.
Я вообще не понимаю, в чем сложность программирования на фоне огромного количества более сложной работы при создании игры? Особенно сегодня, с современными движками.

А что более сложно в таком случае? Есть вот тридешник, он отлично делает модели, есть художник 2D, есть композитор и есть сценарист и им прям голова не варит делать код. Так что кажется, тут каждому своё.

А что более сложно в таком случае?

Кодить игру при известной заранее логике — это техническая работа с минимумом творчества. Ее намного меньше шансов сделать откровенно плохо.

Опять же, мое имхо — идея «вот сейчас мы тут мышью все накликаем» очень ограниченная. Windows пользователя развратил, продвигая ее всюду.

Характерный пример — мне студенты делали отчеты. Оформление довольно строгое.
Чтобы не мучить себя и их множеством переделок, я сделал шаблон в латехе. Казалось бы, выучи 5 основных команд латеха, следи за синтаксисом самого текста — и проблем не будет. Но самые «прошаренные» решили таки переделать все в ворде. Так же проще — мышкой тыкай и все, ничего кодить не надо. Результат немного предсказуем.

«Кодить игру при известной заранее логике — это техническая работа с минимумом творчества. Ее намного меньше шансов сделать откровенно плохо.» Смешно. Когда дело доходит до не очевидных багов, то мозги закипают.

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

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

Кто где говорил о «программировать без багов»? Тебе было смешно от того, что программировать именно игровую логику — чисто механическая работа. — я ответил.

Но игровая логика нефига не механическая. Ни с какой стороны.

RPG Maker для платформеров. Камон, тут даже ловушки не работают. Чем блюпринты не устраивают?

про редактор карт Варкрафт 3 забыли 😀

Это совсем не ново

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

Зачем? Что это даст, кроме как повыебываться?

А собственно зачем развивать и делать?

Смысл убирать из разработки далеко не самую скучную часть, чтобы получилось не оч

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

Плохой код игру не убьёт — если в неё есть ради чего играть то в неё будут играть и ругать баги, которые можно будет пофиксить.

С позиции разработчика, у которого уже есть документация, арты и всё что надо и осталось собрать это воедино — уж лучше заплатить копеечку кодеру и он всё сделает, чем самому тратить в n раз больше времени на осваивание сомнительного инструментария

О сообществе

Разработка видеоигр и всё, что с этим связано. Концепции, иллюстрации, 3D-моделирование, программирование и многое другое геймдев-направленности.

-Уважайте чужой труд и используйте конструктивную критику

-Не употребляйте мат без необходимости

-Посты определённой тематики стоит помечать соответствующими тегами (см. последний пункт).

-Пост о Вашей игре, желательно — с историей разработки и описанием полученного опыта

-Обучающие посты, туториалы

-Интервью с именитыми разработчиками

-Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
-Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ НУЖНО ПУБЛИКОВАТЬ:


-Одну гифку/арт/скриншот из игры и т.д. Гораздо лучше выложить подборку из нескольких изображений, а ещё лучше — написать краткий пост о своем проекте и вставить изображения после него

-Посты, единственная цель которых — набор команды для разработки игры по вашей гениальной идее

-Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

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

-Выдавать чужой труд за свой

Подобные посты будут удалены, а авторы таких постов будут внесены в игнор-лист сообщества.

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

-Пост должен быть содержательным и интересным для пользователей

-Ссылка должна размещаться непосредственно в начале или конце поста и только один раз.

-Cсылка размещается в формате: «Страница игры в Steam: URL»

СПЕЦИАЛЬНЫЕ ТЕГИ СООБЩЕСТВА:

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

«Gamedev-Interview» — интервью с известными разработчиками

«Gamedev-Event» — объявления о мероприятиях для разработчиков

«Gamedev-Assets» — посты с вашими бесплатными ассетами

Установка ловушек в Windows

Сегодня мы поговорим об установке hook’ов (ловушек) в Windows. Hook — это механизм перехвата сообщений, путем установки специальной функции на верх стека hook-функций системы. Без установки таких ловушек практически невозможно обойтись при написании различных средств удаленного администрирования, шпионов и других программ в той или иной степени осуществляющих контроль за пользователем, использующем ОС Windows. Hook’и бывают глобальные (на всю систему) и локальные (на какой-либо поток).

Установить в систему hook можно при помощи функции SetWindowsHookEx(), со следующим заголовком:

HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD
dwThreadId);

Если ты плохо воспринимаешь Си-шный код, на Delphi заголовок выглядит так:

SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId:
DWORD): HHOOK;

Функция SetWindowsHookEx() в случае установки hook’a возвращает его дескриптор, в случае ошибки возвращает 0.
Разберем подробней все входящие параметры этой функции:

1. idHook — константа, определяет типа устанавливаемого hook’а. Может принимать одно из ниже перечисленных значений:

WH_CALLWNDPROC — Следит за сообщениями до отправки в оконную функцию и вызывается, когда процедуре окна посылается сообщение. Ловушка срабатывает при каждом вызове функции SendMessage.

WH_CALLWNDPROCRET — Контролирует сообщения после их отправки в оконную функцию.

WH_CBT — Вызывается перед обработкой большинства сообщений окон, мыши и клавиатуры (созданием окон, активация окон, уничтожением окон, сменой размера окон, перед установкой фокуса и.т.п.)

WH_DEBUG — Вызывается перед любой другой ловушкой. Полезно для отладки hook’ов.

WH_GETMESSAGE — Вызывается, когда из очереди приложения считывается сообщение.

WH_HARDWARE — Вызывается, когда из очереди приложения считывается сообщение установленного на компьютере оборудования.


WH_JOURNALPLAYBACK — Вызывается, когда из очереди системы считывается сообщение. Применяется для добавления в очередь системных событий.

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

WH_KEYBOARD — Вызывается, когда из очереди приложения считывается сообщения WM_Keydown или WM_Keyup. Одна из самых распространенных ловушек -).

WH_MOUSE — Вызывается, когда из очереди приложения считывается сообщение мыши.

WH_MSGFILTER — Вызывается, когда сообщение должно быть обработано диалоговым окном приложения, меню или окном приложения.

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

2. lpfn — указатель на саму hook функцию. Ее заголовок:

function HOOKFUNCTION(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT
stdcall;

Значения входящих параметров зависят от типа hook’a. Если ставится глобальный hook, эта функция должна обязательно находиться в dll.

3. hmod — принимает значение hInstance или дескриптор DLL (в глобальных ловушках).

4. dwThreadId — идентифицирует поток, в который вставляется ловушка. В глобальных hook’ах этот параметр должен быть равен 0.

Для удаления установленной ловушки существует функция UnhookWindowsHookEx(). В качестве параметра нужно использовать указатель (дескриптор) на hook функцию (значение, которое возвращает функция SetWindowsHookEx()).

Ну вот и все, с основами ты ознакомлен. Теперь напишем маленькую шуточную программу, ставящую hook на считывания сообщений мыши (WH_MOUSE). Сделаем так, чтобы при нажатии на правую кнопку мыши скрывалась кнопка «Пуск», при нажатии на левую — появлялась, среднею — изменялся заголовок активного окна. Сама hook функция будет находиться в dll. Кроме того, в dll будут находиться две процедуры — sethook() и removehook(), соответственно устанавливающие и удаляющие ловушку.

Привожу код dll библиотеки:

uses
windows,messages;
var
H : THandle;

< Экспорт процедур установки и удаления hook'a >
exports
sethook index 1 name ‘sethook’,
removehook index 2 name ‘removehook’;
end.

В самой программе ловушка будет устанавливаться вызовом из dll процедуры sethook, удаляться — вызовом процедуры removehook. Пример установки и удаления hook’а, а также исходник dll библиотеки есть в прилагающемся архиве.

bezpalov

Александр Безпалов

Ментальные ловушки нашего ума. (8) восемь примеров

Ментальные ловушки — это «накатанные» и привычные пути, по которым мучительно и безрезультатно движется наша мысль, сжигая невероятные объемы нашего времени, высасывая энергию и не создавая никаких ценностей ни для нас самих, ни для кого бы то ни было.

1. Упорство
Первая из ментальных ловушек. Не надо путать упорство с упрямством. Суть ее заключается в том, что мы продолжаем дело, которое заведомо обречено на провал или не доставляет нам былого удовольствия. Мы делаем то, что уже давно неактуально, и не можем прекратить, потому как «надо доделать» или «ну, не выбрасывать же». Глупая трата своих сил и времени.
Примеры: Досматривать неинтересный фильм; хотеть прекратить что-либо делать, но не знать, чем заняться вместо этого.

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

3. Фиксация
При фиксации наше продвижение к цели заблокировано. Мы не можем начать или продолжить начатое дело, пока не дождемся телефонного звонка, разрешения, вдохновения. Вместо того, чтобы обратиться к другим делам, мы остаемся в подвешенном состоянии до тех пор, пока не сможем снова продолжить работу над этим же проектом.
Примеры: Следить по часам, как долго еще до назначенной встречи; делать что-нибудь, лишь бы быть занятым.

4. Реверсия
Иногда становится очевидным, что наши планы однозначно потерпели неудачу. Игра закончена, мы проиграли, время ушло. Последствия неудачи могут быть пугающими, однако здесь ничего не поделаешь, но если и на этом этапе нас продолжает волновать все та же проблема, значит, мы оказались в ловушке реверсии. При реверсии мы тщимся изменить необратимое прошлое.
Примеры: Стыдиться, что мы не достигли цели; говорить о том, что было бы, если бы мы выиграли.

5. Опережение
Опережение — это ментальная ловушка, в которую мы попадаем, начиная слишком рано. Когда мы опережаем события, то сплошь и рядом перерабатываем и работаем впустую, когда того же самого результата можно достичь с большей легкостью
Примеры: Готовить несколько вариантов одного письма, отчета, начинать решать задачу не получив еще всех условий, заданий.

6. Противление
Порой бывает так, что от нас требуется изменить курс наших действий, даже если мы уже заняты делом вполне полезным или приятным. Звонок в дверь раздается в тот самый момент, когда мы дошли до самого интересного места в фильме, который смотрим. Или будильник звенит, и нам так не хочется вставать. Во всех этих случаях наступает момент, когда надо переключить свое внимание. Но если в этой точке времени и пространства мы продолжаем упорно цепляться за прежние занятия, то попадаем в ловушку противления.
Противление — это болезнь «ну еще чуть-чуть». Нежелание изменить курс действий, под воздействием внешних обстоятельств.
Примеры: Погрузиться в игру на столько, что забыть обо всем остальном; стоить планы, а затем быть вынужденным корректировать их.

7. Затягивание
Нередко бывает так: мы однозначно решились на какое-то дело, но нам трудно приступить к нему. Мы откладываем на потом, придумываем несущественные дела с целью отложить выполнение неприятных обязанностей. Наш ум просто отказывается сразу переходить к делу. Затягивание, оно же «procrastination», — одна из самых больших проблем в бизнесе и жизни.
Примеры: Связывать одни дела с другими и ставить их в зависимость друг от друга; давать обещания себе и другим; медлить.

8. Разделение
В ментальную ловушку разделения мы попадаем тогда, когда пытаемся делать два дела одновременно. Мы беседуем с кем-то, слушая вполуха, в то время как в уме пытаемся решить финансовую проблему, не дающую нам покоя.
Внимание неделимо по определению. Работать, значит работать, общаться, значит общаться. Когда в беседе мы думаем о работе и когда на работе думаем об общении, все что мы делаем — это думаем.
Примеры: Быть в настоящем, но думать о будущем и прошлом; заниматься сексом и думать о цвете потолка.

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

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

Добавить комментарий