Встречайте — Google Web Designer

В Google подсуетились и выпустили Google Web Designer — инструмент для разработки на HTML5, который делает упор на удобстве реализации дизайна и приятной разработке кроссплатформенных решений.

image

Из приятных фишек — визуальный редактор для 3d-элементов и встроенный редактор… рекламы. Теперь, будем надеяться, легче будет привести рекламу к общему стилю.
Доступно для Mac и PC.

ссылка на оригинал статьи http://habrahabr.ru/post/195892/

Чиним автомобиль при помощи 3D принтера

Вступление

3D принтеры сейчас на слуху. Здесь, на Хабре, публикации 3д тематики появляются довольно часто. Идет активное формирование сообщества вокруг объемной печати, и нам еще предстоит понять зачем же простому человеку это все нужно. Некоторые производители и евангелисты технологий доступной 3д печати считают, что 3D принтер должен быть у каждой домохозяйки. Этим путем идет Makerbot, производитель самого раскрученного принтера Replicator 2 и партнер Microsoft. Компания активно инвестирует средства в свое сообщество Thingiverse, где пользователи могут делится своими моделями. Там уже сейчас можно найти много полезных моделей, в том числе и запчасти для самих принтеров. А включение поддержки Репликаторов в Windows 8.1 говорит о серьезном настрое Microsoft и Makerbot.

Зачем простому человеку 3D Принтер? Считается что житель будущего будет печатать необходимые бытовые предметы прямо дома на подобном устройстве. Также этот человек будущего будет чинить все вокруг при помощи хитрого девайса. Мне повезло иметь 3д принтер Makerbot Replicator 2 в личном пользовании, и в этой статье я попытаюсь раскрыть его хозяйственную сторону с уклоном в автомобили.

Ситуация 1 Ситроен

Ребята из знакомого автосервиса, специализирующегося на шумоизоляции, при разборке салона повредили деталь кресла Citroen DS5. Была сломана крошечная шестеренка, приводящая в движение трапецию сидения. Сделана она была, к позору французов, из хрупкого пластика.

Копия сломанной детали из второго кресла:
Виновник торжества

Было решено снять запчасть из второго работающего кресла. Дальше деталь была передана мне, и оставалось взять штангенциркуль, снять размеры и сделать 3д модель и распечатать ее с максимальным качеством на моем Makerbot Replicator 2 из PLA пластика. Габариты детали: 12.5мм х 12.5мм х 15.5мм.

Модель:

3D модель шестеренки в программе для подготовки GCode:

Оригинал и его клоны:

Клонированная шестеренка в механизме:

Проверка работоспособности:

Напечатанная копия идеально подошла в механизм и кресло снова заработало.

Ситуация 2 Шкода

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

Было решено использовать в починке домашний 3D принтер, раз уж он есть. Были сняты размеры, подготовлена модель и отправлена на печать с учетом будущих нагрузок на деталь (были выбраны соответствующие температура, толщина слоя и цвет пластика). Дальше оставалось приклеить деталь на место.

Модель простейшего объема перед выводом на печать:

Установленный в багажнике фиксатор:

Теперь можно спокойно оставлять вещи в багажнике!

Выводы

Уже сейчас технология позволяет применять 3D печать в быту, все зависит от вашей фантазии и познаний в 3д редакторах.3D редакторы тоже не стоят на месте, самый простой из них — SketchUP потребует всего нескольких часов чтобы начать создавать пригодные для печати модели, а редактор Blender вообще бесплатный и OpenSource.

Учитывая крайне низкую стоимость материалов и предложений на рынке (грамм отпечатка из PLA или ABS пластика стоит в районе 30 рублей), было бы странно не пользоваться теми возможностями, которые открывает объемная печать. Стоимость самих принтеров тоже стремительно снижается: можно собрать неплохой станок в пределах $1000.

Можно только представить какая революция случится когда на рынок выйдут принтеры, печатающие металлом и другими материалами!

ссылка на оригинал статьи http://habrahabr.ru/post/195810/

Снова пенсии и снова сюрпризы

Пенсионные накопления россиян за 2014 год будут направлены в распределительную систему, сообщил «Прайму» замминистра финансов РФ Алексей Моисеев.

«Только за 2014 год, и они будут учитываться на индивидуальных страховых счетах граждан», — сказал он, отвечая на соответствующий вопрос. Моисеев подтвердил, что эти решения учтены в проекте федерального бюджета на 2014-2016 годы.

Нерадостные новости публикует сегодня РИА Новости.

Согласно данной информации все пенсионные накопления, будь они перечислены в НПФ или в ПФР будут перечисляться в некий распределительный фонд. Обещается правда, что через год они будут возвращены. При этом, все средства, направленные на формирование накопительной части в 2013 году так же отправятся в распределительный фонд Внешэкономбанка.

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

Будете ли вы при, таком раскладе, переводить свои накопления в НПФ и писать заявление на сохранение накопительной части?

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

Проголосовало 5 человек. Воздержался 1 человек.

ссылка на оригинал статьи http://habrahabr.ru/post/195888/

Развитие таксономии творческого самовыражения через понятийный аппарат математической теории игр

Данная статья является логическим продолжением предыдущей.

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

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

  1. Наличие нескольких участников игры.
  2. Неопределенность поведения участников, связанная с наличием у каждого из них нескольких вариантов действий.
  3. Различие (несовпадение) интересов участников
  4. Взаимосвязанное поведение участников, поскольку результат получаемый каждым из них, зависит от поведения всех участников.
  5. Наличие правил поведения, известных всем участникам.

Как мы видим, уже первый признак игры пересекается с вопросом-разветвителем таксономии Кроуфорда — «Наличие соперника», что переносит математические игры в категорию "Конфликт".
Второй признак дополняет данный вывод заявляя, что соперник должен быть действующим агентом, т.к. алгоритмы искусственного интеллекта рано или поздно можно просчитать.
Третий и четвертый признаки не позволяют выйти нам за пределы данной категории, т.к. они одновременно удовлетворяют требованиям категории "Соревнование" и категории "Игра".
Пятый признак соответствует категории "Забава", но т.к. у нас есть признаки категории более низкого класса "Конфликт", то для развития мы выберем именно её.

Типы игр в математической теории игр

— Кооперативные, некооперативные и гибридные игры

Кооперативные или коалиционные игры в теории игр — игры, в которых игроки могут объединяться в группы, взяв на себя некоторые обязательства перед другими игроками и координируя свои действия.
Некооперативные игры — игры, в которых каждый игрок должен играть за себя.
image
Слева направо: 1. Настольная игра Dungeons&Dragons 2. Настольная игра Монополия 3. Шутер от первого лица Halo 4. Файтинг Mortal Kombat

Гибридные игры — игры, которые включают в себя элементы кооперативных и некооперативных игр. В таких играх игроки могут образовывать группы, но игра может вестись в некооперативном стиле (к примеру kill stealing в League of Legends).
image
Скриншот из игры League of Legends

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

— Симметричные и несимметричные игры

Симметричная игра — игра, в которой игроки могут поменяться местами и при этом их выигрыши за одни и те же ходы не изменятся (соответствующие стратегии игроков равны).
Несимметричная игра — игра, в которой соответствующие стратегии игроков не равны.
image
Слева направо: 1. Техасский холдем разновидность карточной игры покер 2. Экономическая игра-дилемма Ультиматум 3. Многопользовательская онлайн арена League of Legend 4. Командный онлайн шутер Counter-strike.

Из приведенных здесь примеров игр, хочу отдельно рассказать про игру Ультиматум. Данная игра относится к классу игр, используемых в экспериментальной экономике. Правила довольно просты. Один из участников должен разделить некоторую сумму денег (для наглядности возьмем сумму в миллион евро) между собой и вторым игроком, причем размер долей он решает сам. Второй участник должен решить, взять ли предложенную сумму или отказаться. В случае отказа оба участника остаются ни с чем. В случае согласия все остаются при своих долях.
Казалось бы что игрок два должен соглашаться в любом случае, ведь иначе он не получает ничего. Однако экспериментальные исследования показывают, что при предложении доли меньше 30% второй игрок отказывается от предложения.
В следующей статье я рассмотрю эту игру подробнее с целью раскрытия механизма принятия решения игроком с позиции нейробиологии.

— Игры с нулевой и ненулевой суммой

Игры с нулевой суммой — игры, в которой игроки не могут увеличить или уменьшить имеющиеся игровые ресурсы или фонд игры.В этом случае сумма всех выигрышей равна сумме всех проигрышей при любом ходе.
Игры с ненулевой суммой — игры, в которых игроки могут увеличить фонд игры. Сюда также входят игры, в которых выигрыш одного игрока не обязательно означает проигрыш другого, и наоборот.
image
Слева направо: 1. Карточная игра Blackjack 2. Настольная игра Scrabble 3. Файтинг Tekken 4. Экшн Castle crashers

— Параллельные и последовательные игры

Параллельные игры — игры, в которых игроки ходят одновременно, или по крайней мере, они не осведомлены о выборе других игроков до тех пор, пока все не сделают свой ход.
Последовательные или динамические игры — игры, в которых участники могут делать ходы в заранее установленном либо случайном порядке, но при этом получают некоторую информацию о предшествующих действиях других.
image
Слева направо: 1. Игра Rock-paper-scissors (Камень-ножницы-бумага) 2. Настольная игра Jenga 3. Сетевой режим игры стратегии в реальном времени Starcraft 2 4. Пошаговая стратегия Heroes of Might and Magic 3

— Игры с полной и неполной информацией

Игры с полной информацией — игры, в которых игроки знают знают все ходы, сделанные до текущего момента, равно как и возможные стратегии противников.
Игры с неполной информацией — игры, в которых игрокам не известна информация о всех ходах противника.
image
Слева направо: 1. Настольная игра Agricola 2. Игра-дилемма Prisoner’s dilemma (Дилемма заключенного) 3. Компьютерная логическая игра Pure Chess 4. Онлайн шутер от первого лица Quake 3 Arena

По аналогии с игрой Ультиматум, хочу отдельно рассмотреть игру-проблему Дилемма заключенного. Небольшое вступление: во всех судебных системах кара за бандитизм (совершение преступлений в составе организованной группы) намного тяжелее, чем за те же преступления, совершенные в одиночку.
Формулировка игры такова:
"Двое преступников, А и Б, попались примерно в одно и то же время на сходных преступлениях. Есть основания полагать, что они действовали по сговору, и полиция, изолировав их друг от друга, предлагает им одну и ту же сделку: если один свидетельствует против другого, а тот хранит молчание, то первый освобождается за помощь следствию, а второй получает максимальный срок лишения свободы (10 лет). Если оба молчат, их деяние проходит по более лёгкой статье, и каждый из них приговаривается к 0,5 года. Если оба свидетельствуют против друг друга, они получают минимальный срок (по 2 года). Каждый заключённый выбирает, молчать или свидетельствовать против другого. Однако ни один из них не знает точно, что сделает другой. Что произойдёт?"
image
Матрица игры Prisoner’s dilemma (Дилемма заключенного)

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

— Бесконечные и дискретные игры

Бесконечные игры — игры, способные продолжаться бесконечно долго, причем победитель и его выигрыш не определены до окончания всех ходов.
Дискретные игры — игры, имеющие конечное число игроков, ходов, событий, исходов и т.п.
image
Слева направо: 1. Онлайн ММОРПГ Dream Of Mirror Online 2. Настольная игра Uno 3. PVP сервера онлайн ММОРПГ World of Warcraft 4. Настольная карточная игра Magic: The Gathering

В итоге мы получаем следующую схему раскрытия таксономии творческого самовыражения.

Раскрытие таксономии
Исходная таксономия творческого самовыражения

image

Раскрытие таксономии через понятийный аппарат математической теории игр

image

ссылка на оригинал статьи http://habrahabr.ru/post/195882/

Timers in .Net

В последнее время не в первый раз сталкиваюсь с тем, что разработчики не до конца понимают как работает один из стандартных таймеров в .NET — System.Threading.Timer.
Т.е. в общем-то они вроде понимают что таймер что-то выполняет, скорее всего в ThreadPool — и если его использовать для периодического выполнения чего-либо, то он вполне подойдет. Но вот если вам надо создать не один таймер, а положим 1000, то тут люди начинают волноваться: а вдруг вот что-то там не так, а вдруг это все-таки 1000 потоков и даже боятся использовать их в таких случаях.

Хотелось бы пролить немного света на этот «таинственный» System.Threading.Timer.

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

Немного о том, как бы мы могли реализовать таймер.

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

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

WaitHandle.WaitAny(/*timerHandles[]*/) 

Но, к сожалению или нет, в .NET нет API для прямой работы с такими объектами(таймерами ядра).

Есть третий вариант реализации таймера(получившийся у разработчиков класса System.Threading.Timer)
При создании первого в домене приложения таймера через механизм P/Invoke создается объект ядра «таймер» это можно увидеть в классе System.Threading.TimerQueue:

    [SecurityCritical]     [SuppressUnmanagedCodeSecurity]     [DllImport("QCall", CharSet = CharSet.Unicode)]     private static TimerQueue.AppDomainTimerSafeHandle CreateAppDomainTimer(uint dueTime);  // some code      if (this.m_appDomainTimer == null || this.m_appDomainTimer.IsInvalid)       {         this.m_appDomainTimer = TimerQueue.CreateAppDomainTimer(dueTime); // some code 

Также создается отдельный поток который высчитывает сколько надо подождать до ближайшего срабатывания одного из таймеров, устанавливает соответствующие параметры объекту ядра «таймер» и ждет.
Давайте посмотрим как это выглядит. Создадим консольный проект и подключим SOS Debugging Extension.

image

Как мы видим, перед созданием таймера у нас всего два потока: «основной» и поток «финализатора». Давайте продвинемся на одну строку ниже.

image

У нас появились два потока — один, ID 3, это как раз и есть поток который работает с объектом ядра «таймер». А второй, ID 4, это рабочий поток пула, он еще не успел запуститься, в нем будут исполняться наши callback.

Теперь как это все работает если вы последовательно создаете несколько таймеров
Возвращаемся к классу System.Threading.TimerQueue. Он является синглтоном. Каждый раз когда вы пишете код вида:

            new Timer(First, null, 0, 250); 

Это приводит к добавлению экземпляра класса System.Threading.TimerQueueTimer в его внутреннюю очередь(являющуюся чем-то вроде LinkedList). Т.е. этот класс содержит внутри себя все созданные таймеры(я склоняюсь что в рамках домена).
После того как первый таймер был создан. У TimerQueue будет регулярно вызыватьcя метод FireNextTimers.
Что он делает(код длинный, я не стал приводить исходники, кому интересно может посмотреть сам):
Он быстро пробегается по всем сохраненным в нем таймерам и находит время до ближайшего срабатывания таймера и настраивает объект ядра таймер на посылку нотификации через этот интервал. Как только эта нотификация будет получена, время следующего срабатывания будет пересчитано и объект ядра таймер будет настроен на новый интервал. При добавлении нового таймера время следующей нотификации будет пересчитано.

Давайте попробуем создать 1000 таймеров и посмотрим что из этого получится:

image

Мы видим, что создание 1000 таймеров не влечет за собой создание 1000 потоков. CLR создало один поток для работы с таймером ядра и несколько рабочих потоков для обработки срабатываний таймера.

Итого:
Когда вы работаете с классом System.Threading.Timer создается один(на домен приложения) объект ядра «таймер» и один поток для работы с ним который работает по принципу схожему с работой структуры данных «куча».
К вопросу о 1000 таймеров — накладно ли создавать такое количество таймеров в приложении, думаю что каждый конкретный случай надо рассматривать отдельно. Но знание того как устроены таймеры изнутри поможет принять правильное решение.

Испытывалось на Windows 7 64, .Net 4.5, VS2012.
Используемая литература: Duffy «Concurrent Programming on Windows», MSDN

ссылка на оригинал статьи http://habrahabr.ru/post/195814/