Перейти к основному содержимому

6 записей с тегом "soft"

Посмотреть все теги

Как записывать экран с круглой камерой

· 1 мин. чтения

Часто приходится по работе записывать видео скринкасты для репорта багов, описания глубоких сценариев их возникновения, неудобного UI; Кроме того я использую видео для описания pull-request'ов в дополнение к тексту.

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

Обзор PHPStorm 1.0

· 5 мин. чтения

Профессия обязывает каждый день писать на php и поэтому первый важнейший инструмент после головы для меня является среда разработки (IDE). До сих пор я сидел на Zend 5.5, но столкнувшись с PhpStorm 1.0 от чехов русских с JetBrains сразу перешёл на него.

Понятно что редактор - дело субъективное и многое зависит от проектов с которыми вы работаете. Zend 5.5 мне нравился удовлетворительной скоростью и простым доступом к ftp. Я знал что там ещё были всякие дебаги, интеграция с SVN и sql-серверами но практически их не смог применить. Я пробовал NetbeansAptana и PDTZend 6 но во все они медленные особенно при индексации файлов и монстроидальный интерфейс с кучами кнопочек. Поэтому и начну сразу с недостатков.

Недостатки

  • Невозможно сразу начать работать при медленных (>5 сек) сетевых соединениях (VPN) и обращению к файловой системе

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

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

  • Р****едактирования по FTP нету. Можно файлы читать, но для полноценного редактирования надо делать локальную копию проекта с настройкой синхронизации и deployment'а, а при переходе с одного IDE на другой и большом количестве проектов ждать скачивание каждого - жуть

  • Автосохранение файлов сразу во время редактирования, хотя и компенсируется "локальной версией изменений файла", однако многим может быть непривычно при переходе из других IDE.

  • Глупое автодополнение тэгов в html режиме (вечно мне добавляет comment тэг!). В редактировании php кода методы не подсказываются автоматически а только с нажатием Ctrl+Space, видимо из-за погони за скоростью.

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

  • Пугающие настройки. Их просто много. Разве что они понятней чем в Эклипсе - сразу разбиение на настройки проекта и настройки IDE.

  • Непривычность клавишных связок (hotkey binding) - например у меня несколько раз возникала ситуация когда я двигался назад по истории изменений (Undo), а потом хотел вернуться нажимая Ctrl+Y и вместо этого терял Redo-историю потому что Ctrl-Y на самом деле удаляет строку

  • Мало плагинов. Из серверов управления задачами только Jira и собственній youtrack. То же касается систем версионирования (Есть CVS, SVN, git, perforce). В основном они пишутся для общего редактора IntelliJ idea, а php-просто как частный случай

Как у всех..

Редактор визуально очень похож на все существующие IDE - динамические панели как у eclipse но с меньшим визуальным шумом иконок. Тут собственно меню, панель дерева файлов, панель структуры класса, внизу дополнительные панельки для todo, версионирования, иерархий и удалённого редактирования (появляются по мере необходимости).

Очевидно что редактор не компилятор и не настолько умён что-бы понимать переменные при использовании extract() или при переменных с динамическими именами через $$var — анализ этого на лету просто нереально ожидать и соответсвенно в проектах такие дела подсвечиваются как ошибки деклараций переменных. То же касается закриптованных частей через Ioncube или Zend guard.

Про автодополнение с Ctrl+Space я уже говорил, так же тут и Ctrl+click работает для перехода к собственно декларации метода или класса. И Ctrl+D дублирует строку. Тут есть и закладки строчек через Ctrl+Shift+цифра. Есть тут и поддержка PHPdoc и @todo синтаксиса.

Основные фишки

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

  • Поиск классов Ctrl+N и файлов Ctrl+Shift+N в том числе и со звёздочками (wildcard). Очень полезно и быстро, потому что файлы как правило разбросаны в разных ветках дерева и консоль всегда оперативна

  • Скролл при поиске или при навигации по своим закладкам строк через Ctrl + цифра. Очень помогает не потеряться и интуитивно понимаешь в какую сторону файла ты прыгаешь.

  • Рефакторинг имён файлов, классов и методов во всём проекте и/или поиск их использования. Потому что часто просто боишься поменять старое название на более информативное потому что не помнишь где это используется, а искать как фразу через Ctrl+F запаришься

  • Подключение внешних папок. Скажем если у вас 10 проектов в которых используется повторяемый фреймворк (PEAR к примеру) или закриптованный код, то можно подключить внешнюю папку чтобы IDE понимала пространство имён

  • Версионирование. Как встроенная история изменений, так и отлично встраиваемый SVN со всякими диффами, определённо лучше TortoiseSVN.

Приятно удивили и некоторые мелочи

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

  • Иерархия вызовов метода и вызываемых методов в hierarchy блоке

  • Статус и ручная чистка памяти в статус-баре - сразу говорит о заботе

  • Локальная история изменений файла

  • Перетаскивание строки или целого выделенного блока с сохранением табуляции через Ctrl+Shift+Up/Down вместо того что-бы делать Copy-Delete-Paste с ручным форматированием

  • Вернуться к последнему месту редактирования Сtrl+Shift+Backspace

Кроме этого в редакторе есть простор для изучения до которого я ещё не дорос:

  1. XDebug для профилирования скриптов.. Для удалённого проекта надо что-бы расширение на сервере было установлено, поэтому всюду использовать нельзя.
  2. PHPUnit для автоматического тестирования кода
  3. SASS для более гибкого написания css

Unity3D

· 7 мин. чтения

Unity3D это игровой движок 3D-игр в основном стрелялок и аркад, но при большой сноровке можно реализовать и RPG, RTS, квесты, 2D-игры, встраиваемые в браузер, iPhone и с использованием сети. Движок понимает множество разные форматы файлов

  • 3д модели и анимация из Maya, Cinema 4D, 3ds Max, Cheetah3D, Modo, Lightwave, Blender. Форматы 3ds, fbx и dae
  • практически все растровые изображения для маск и текстур
  • звуковые mp3, wav форматы для эффектов и фона

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

IDE

Графическая оболочка разработчика (IDE) состоит из 4 основных панелей

  1. Графическое поле, переключающееся / вид игры (Game & Scene)
  2. Иерархия объектов (Hierarchy)
  3. Инспектор объекта (Inspector)
  4. Библиотека доступных ресурсов (Assets)

По используемости самое важное место это Инспектор, потому что именно в нём видны внутренности объекта (GameObject)

Создание карты

Карта (Terrain) создаётся очень просто из меню и по умолчанию уже есть. Курсором как в фотошопе можно изменять высоту рельефа (в том числе используя Shift). Более продвинутые господа придумали как импортировать карты из реального мира с помощью google earth, openTDD, делая так называемые heightmaps. Встроенный импорт работает только с raw форматами, надо использовать хак. Недавно вышел генератор карт

Игровой объект Unity

Игровой объект может состоять из скриптов-компонентов, некоторые из них встроенные, некоторые надо писать самому, тоесть:

Свои скрипты добавляются очень легко перетаскиванием в инспектор и публичные переменные сразу переводятся в названия с пробелами и значением по умолчанию. Для игрового объекта добавленные компоненты и с точки зрения ООП являются инкапсулированными объектами, хотя и играют в большинстве своём роль свойств (т.е. прилагательных - движущийся, крутящийся, выбираемый и тп.). По синтаксису скрипты пишутся на Javascript, C# или Boo скриптах со своими прибамбасами - глобальными объектами Unity, некоторыми своими ключевыми словами..


Взаимодействие объектов

Теперь когда понятно что игровое пространство состоит из кучи моделей у которых есть свои свойства и своё поведение встаёт вопрос а как же сама игра должна писаться. В отличие от desktop- и web- приложений, игры и сетевые приложения более асинхронны и поточны, тут как правило нет монолитных глобальных классов - объекты общаются между собой и в этом сила масштабирования - надо просто объекту написать события которые он поддерживает согласно игровой механике.

Поскольку объекты можно вкладывать друг в друга как dom-блоки, то искать по иерархии объекты можно несколькими путями. Жалко что ребята изобретали велосипед, вместо того что-бы взять существующие аналоги из html/js

  • Сразу писать название компонента скажем myWorkerGuy.someColorParam

  • Поиск по иерархии - transform.Find("MyWorkerGuy") - аналог html'ного getElementById

  • По тєгам, через GameObject.FindWithTag ("Worker")

Компонент объекта доступен через - GetComponent("Moveable").

Ещё одно мощное решение - вместо поиска объекта с проверкой наличия метода и затем вызова его, можно просто послать сообщение - gameObject.SendMessage("BegForFood",true), причём метод вызывается у всех компонентов.

Каждый компонент наследует класс Monobehaviour (в Javascript синтаксисе объявлять не нужно) и именно с ним приходится работать описывая логику и расширяя наследуемые методы которые сами вызываются когда движок решит это нужным, например:

  • Invoke - вызов третьего метода, в том числе периодический, аналог call_user_method в php + cron

  • Awake - своего рода конструктор, вызывающийся когда все объекты уже существуют.

  • Start - конструктор второго рода, вызывается после Awake

  • Update - вызывается каждый фрейм. Сюда идёт основная логика.

  • FixedUpdate - вызывается каждый n-фрейм, полезен для вычислений твёрдых тел

  • LateUpdate - вызов после всех Update вызовов, полезен для камеры

  • OnGui - сюда идёт показ кнопок, цифр для управления

Реальные нужды

После того как вы придумаете историю, надо продумать основные технические моменты. К этому моменту вы знаете что есть объекты и их характеристики (компоненты), но из чего состоит процесс игры?

Рождение (Spawn) юнитов и врагов. Объект создаётся с указанием, где и с каким вращательным моментом. Как оказывается нарожать много умных юнитов с поддержкой всех фич (в частности физики) очень нагружает процессор.

GameObject go = Instantiate (building,hit.point,Quaternion.identity) as GameObject;

Управление камерой. Существуют уже заранее сделанные компоненты-скрипты на всякие случаи жизни, которые учитывают в том числе столкновение камеры со стеной и тп. Вот часть кода для изометрической камеры (добавьте остальные направления сами)

if (Input.GetKey("up") && transform.position.z < terrain.terrainData.size.z) {
transform.position += linearSpeed * Vector3.forward * Time.deltaTime;
}

if(Input.GetAxis("Mouse ScrollWheel") > 0 && transform.position.y > 1){
transform.position -= linearSpeed * Vector3.up * Time.deltaTime;
}

Выделение юнитов мышкой. Достаточно сложная задача - в кратце на камеру вешается обработчик нажатий и передвижения курсора. Независимо создаётся singleton-объект для хранения всех юнитов. При нажатии и передвижении курсора происходит проекция прямоугольника с маской ландшафта. Задача не из лёгких, потому что обрабатывать надо и deselect, учитывать клики для передвижения и атаки, рождение юнитов и тп. Возможно singleton не самое хорошее решение и лучше это сделать тэгами.

mouseButton1UpPoint = screenPosition;
var hit : RaycastHit;
ray = Camera.main.ScreenPointToRay (screenPosition);
if ( Physics.Raycast (ray, hit, raycastLength, terrainLayerMask) ){
selectionPointEnd = hit.point;
UnitManager.GetInstance().SelectUnitsInArea(selectionPointStart, selectionPointEnd);
}

Поиск пути (Pathfinding) и передвижение юнита кликами мышки очень алгоритмически увлекательная задача. К счастью существует отличное решение Арона Гранберга. Алгоритм A* интересно в теории, но в редакторе можно и запутаться. Основная идея в том что юниты имеют дискретную сетку клеток для расчёта передвижения. 

Сетка генерируется из ландшафта и можно задать ограничения по углу наклона, максимальной высоте и тп. В плане кода - очень сложная штука. На практике его решение подразумевает что у каждого передвигаемого объекта есть Seeker компонент которому прицеплена цель куда надо дойти. При установки цели буквально надо выполнить

GetComponent("Seeker").StartPath (transform.position,destinationPoint);

Seeker расчитает путь по которому можно добраться до цели (обычно это ломанная кривая из 3х отрезков) и дальше уже своими силами надо реализовывать передвижение по этим точкам.

Движение юнитов. Пожалуй самое сложное, поскольку если юниты обладают физикой то это усложняет задачу. Надо просто понимать что нельзя сказать юниту x=x+1 через фиксированные участки времени. По идее надо использовать rigidbody.AddForce и учитывать ситуации OnCollision. Ещё одна проблема - повороты объекта. Они далеко не простые

transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);

Минусы и сложности

Эта статья написана в 2010 году, поэтому вероятно эти минусы уже исчезли, но всё-таки..

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

Падения. Движок падает в разных случаях - как от неосторожного движения с интерфейсом, пробного Run с косячным скриптом, так и просто при работе. Порой обидно что «не сохранился».

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

Глупый GUI. Во времена когда HTML5 реализуется всеми браузерами, тут приходится писать очень странный код, напоминающий layout в Java Swing (sic!) и порой вычитывать недокументированные особенности на форуме (например что при декларации кнопки его onclick event сразу внутри скобок, а вот как получить onmouseover и другие события или изменить её дизайн - та ещё тайна).

Синтаксис. Согласен - трёхмерный мир это сложно и я даже могу понять почему используются математические термины типа кватерниона вместо "поворота в пространстве", но почему нельзя использовать короткие методы для основных функций, или почему нельзя в JS создавать глобальные объекты.

Дебаг. Из-за того что код размыт на объекты-компоненты очень сложно организовывать нормально проект и как следствие сложно дебагить, даже несмотря на консоль, подсветку и возможность поменять значения на лету. Сложно и оттого что Scite который по умолчанию редактирует скрипты не знает никаких подсказок о пространстве переменных Unity, не умеет ничего подсказать, нельзя перепрыгнуть в нужное место как то привычно в других языка и IDE.

Расширения

Unity позволяет не только писать скрипты под существующие объекты, но и изменять саму IDE добавляя новые панели управления и меню, то движок можно расширить своими мини-фреймворками

  • Explosion- многопараметрические взрывы (цвет, взрывная волна, дым, размеры)
  • Locomotion - движение людей и зверюшек c вызовом нужной анимации при соответсвующих вводах с клавиатуры
  • Skydome - динамическое небо
  • Last Bastion Games - диалоги, recorder, прототип RTS и гонок

Обязательно гляньте:

  • LearnMeSilly - набор основных уроков по работе с редактором, объектами

  • Blender - бесплатный редактор. Можно в нём создать модели и экспортировать в 3ds

  • Turbosquid - коллекции 3д моделей (в т.ч. платные)

  • Unity3D Answers - своего рода база проблем и решений

Синхронизация Google Calendar c MS Outlook

· 1 мин. чтения

Синхронизируем Outlook и Google calendar. Самый недавно вышедший и простой способ - Google Calendar Sync.

Iframe

Для начала самый простой и не настоящий способ. Идём в Outlook под Calendar слайд, и под "My Calendars" жмём правой кнопкой по нужному календарю, ставим на нём Properties->Home Page->Address равным http://www.google.com/calendar/render. Браво, теперь у вас iframe вместо настоящего календарика.

Plug-in RemoteCalendars

  1. Закрываем Outlook
  2. Устанавливаем NET 2.0
  3. Устанавливаем RemoteCalendars (включая файлы O2003PIA.EXE, O2003PIA.MSI, vstor.exe, RemoteCalendarsVSTOSetup.msi)
  4. Открываем Outlook, ставим во вдруг появившемся окошке настроек временную зону и Auto Update.
  5. Видим такую панельку
  6. Добавляем новый календарь. Для этого берём из Google Calendar настроек ссылку . После этого - вводим логин пароль, и вуаля - двусторонняя синхронизация есть.

Читайте также:

CVS и SVN

· 2 мин. чтения

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

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

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


Для windows можно посоветовать tortoiseSVN. В настройках устанавливается связь с localhost:3690, где висит SSH-тунненель putty (настраивается в Connection/SSH/Tunnels) или SSH tunnel client. Если хочется платного, то есть SmartSVN.

После настроек - создаём папку под проект и работаю полностью из контексного меню эксплорера делаем операцию checkout (копирование working copy в локальную папку). Что-бы сохранить свои изменения в файлах делаем операцию update (копирование изменений из svn в локальную папку) и commit (сохранение своих изменений в svn). В случае если файлы были изменены одновременно, то svn не позволит вам сохранить файл и отметит его как конфликт, который надо решить либо через diff (сравнение svn и локальной версии), либо через solved (перезаписать версию svn своей). В особо запущенных случаях, когда файлы переименовываются или удаляются не используя функции svn, вам прийдётся запускать cleanup.

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

Плагины браузеров

· 2 мин. чтения

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

Первым делом - увеличьте число одновременных соединений с сервером, поскольку у вас соединение уже не dial-up. В firefox это доступно в about:config / network.http.pipelinining=true и network.http.pipelining.maxrequests=10.

Firefox

  • Sync синхронизирует закладки, историю и пароли между платформами и компами

  • FastDial показывает наиболее используемые страницы, настраивается вручную

  • Chromifox theme очень простой и красивый внешний вид на подобие браузера Google Chrome

  • Mouse gestures так же пришли из Opera и позволяют более удобную навигацию

  • All-in-One sidebar очень схож с левой панелью в Opera, где значительно удобней оперировать данными чем из меню

  • Firebug незаменимый компонент для разработки современных javascript технологий, плюс отличная возможность просмотра реально изменяющегося html и функции inspect element. Только не забывайте отключать когда он не нужен.

  • Web developer очень помогает показывая все используемые css и js на странице


Вторичные, не столь важные плагины:

  • NoScript - защита от XSS атак

  • ietab даёт два браузера в одном

  • GridFox - показывает параллельные линии фиксированной ширины на странице для сеточной визуальной разметки

  • Memori.ru - аналог bobrdobr.ru, del.icio.us.. онлайн закладки

  • pagerank от Google для веб-мастеров (+ для 3.5)

  • PicLens предоставляет трёхмерныйинтерфейс и подгрузку на лету при поиске картинок в гугле

  • aging tabs визуально подчёркивают давно не используемые табы

  • WindowResizer - изменение размера экрана под определённое расширение экрана

  • Mini Map sidebar показывает карты

  • Table2Clipboard позволяет копировтаь таблички сохраняя форматирование

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

  • Hide MenuBar - прячет меню, подобно IE7 + HideCaption подобно Chrome

  • Feedburner - показывает число RSS подписчиков в строке состояния

  • MeasureIt позволяет измерить в пикселях,что сколько занимает места на экране

  • ColorZilla позволяет пипеткой выбрать нужный цвет со страницы - часто экономит время

  • locationbar2 улучшает читаемость URL в адрессной строке

  • XHTML validator

  • Selenium IDE - для тестеров

  • Ad block plus

IE плагины

Chrome

Остальные:

  • Dragonfly - аналог firebug для Opera, в Safari он встроенных