Flex и RIA блоги
2014-09-09 |
Тернисто-ориентированное программирование в JavaScript. Запись доклада После того, как популярность технологии Flash стала уменьшаться, многие разработчики задумались о том, чем теперь заняться. Кто-то ушел в Юнити (например, хардкорные игроделы), кто-то решил проверить, каково разрабатывать на HTML5 и JavaScript. Мы записали серию докладов в помощь тем, кто уходит в платформы Flash в другие технологии. Представляем первую из этих записей. Она отвечает на один из главных вопросов, встающих перед изучающим JS флэш-кодером: Как реализуется ООП на JavaScript?На конференции UAFPUG #47 в Харькове Женя Калоша сделал большой доклад о том, как выглядит объектно-ориентированное программирование в JavaScript. Его видение сформировано также под влиянием многолетнего опыта разработки на Flex, PHP и Java. Мы записали его доклад и выложили запись здесь: Запись: "OOP в JavaScript" на UAFPUG #47 в Харькове, 6.09.2014 г. Файлы примеров из доклада: скачать. В запись также включено общение участников встречи и онлайн-чат конференции. Слайды к докладу OOP in JavaScript:Другие записи доклада OOP в JS:Кроме этого, существуют записи этого же доклада, сделанные Евгением ранее для его компании: OOP with JavaScript. Eugene Kalosha: Part 1, Part 2, Part 3, Part 4. Рекомендуем также ознакомиться с ними. Надеемся, изложенные знания помогут найти ваш путь в увлекательный мир ООП на JavaScript (в целесообразности которого сомневаются некоторые успешно перешедшие с Flex на JS). А если учесть, что путь этот имеет множество вариантов, то путешествие становится еще интереснее. Мы его продолжим на наших следующих встречах. Следующая конференция: 20 сентября в КиевеВстреча UAFPUG-48 пройдет в Киеве 20 сентября в GL-Club-е. Ссылки:
Ждем ваши отзывы и пожелания в комментариях! |
2014-09-08 |
FlexJS: выход MXML и AS3 за рамки Flash FlexJS — это название следующего поколения Flex SDK. Его цель — дать MXML- и ActionScript-приложениям возможность работать не только в Adobe AIR и Flash, но и в браузерах без Flash, на мобильных устройствах, под PhoneGap/Cordova, во встраиваемых средах JS (например, Chrome Embedded Framework, используемой в Adobe Common Extensibility Platform). Это расширяет использование MXML- и ActionScript-кода до большего количества платформ, чем есть у Flash в настоящее время. Причина появления FlexJS — желание использовать готовые библиотеки кода. В то время, как флэш работает тольков в стандартных десктоп-браузерах, многие клиенты хотят, чтобы их Flex-приложения работали и там, где нет Flash или AIR, т.к. для их пользователей планшет является единственным компьютером. А стоимость переписывания приложения с нуля высока, как и сопутствующие риски потери качества, особенно при переходе к JavaScript как менее строгому языку. Здесь и приходит на помощь кросс-компилятор следующего поколения FlexJS. Как работает FlexJS?В основе FlexJS лежит концепция параллельных фреймворков. Компоненты имеют как AS-, так и JS- версию, а компилятор Falcon переводит MXML- и АS-код в JS. Для генерирования готового JS-кода связываются между собой не AS-, а JS-"классы".
А поскольку ActionScript и JavaScript основаны на ECMAScript, то большая часть AS-кода хорошо переводится в JS. Чаще всего большая часть готового кода Flex-приложения на самом деле не очень зависит от объектной модели Flash. Да, основные компоненты, типа Button и DataGrid зависят, но в HTML и JS для них есть эквиваленты. И так как код состоит из набора UI-элементов, управляемых AS-логикой видов, связанной с AS-логикой моделей, то можно компилировать в SWF элементы для Flash, а в веб-приложении — элементы для HTML, уже встроенные в браузер.
Смотрите презентацию по FlexJS и схему работы FlexJS на сайте Apache Flex JS Wiki.
Пример FlexJS-приложенияВот простое приложение для проверки концепции — позволяет смотреть биржевые курсы. Кликните на нем правой кнопкой мыши и выберите пункт "View Source". Вы увидите MXML и ActionScript для этого примера. Файл MyInitialView.mxml содержит UI, использует states, байндинг и CSS, как обычное Flex-приложение. Затем перейдите на Javascript-версию этого же приложения и посмотрите, как это работает в браузере без Flash. Это результат кросс-компиляции из того же исходного кода, что и код для SWF-файла. Кликнув правой кнопкой мыши на этой версии, вы не увидите Flash в контекстном меню. Но там вы тоже можете выбрать пункт View Source и увидеть минимизированный JS- код от FlexJS-компилятора Falcon.
Обратите внимание, что как SWF-, так и HTML-версии весят намного меньше, чем любая другая, которую вы можете создать в текущей версии Flex SDK (поэтому они стартуют намного быстрее).
Скачать FlexJSСвежая версия FlexJS SDK появилась в июле 2014 года и имеет номер версии 0.0.2. Скачать ее можно здесь: http://flex.apache.org/download-flexjs.html.
Если вы хотите создать свое FlexJS-приложение, то следуйте этим инструкциям для FlexJS и Flash Builder.
|
2014-09-04 |
От Флекса к JavaScript: как?
С этих слов начинается доклад Даниила, который мы добавили в повестку дня конференции UAFPUG — напомню, это будет 6 сентября в Харькове. Приходите на 11 утра на Новгородскую 3Б в офис GlobalLogic. Отчет о встрече: fpug.org.ua/meeting/47 |
2014-09-03 |
Первый XGamesDev в Харькове: 87 довольных участников при нулевом бюджете Пишет организатор XGamesDev — Вадим: Полный зал открытых и улыбчивых людей влюбленных в игры, новые полезные и просто приятные знакомства, две бочки выпитого лимонада и масса позитивных эмоций все это, и еще немножечко магии, сделали этот день незабываемым!
Учитывая что конференция независимая, бюджет был ровно 0.00, а организацией занимался только один человек - это отличный результат! Всего, конференцию посетило 87 человек. Главная цель достигнута, положено начало игровому комьюнити, теперь мы вместе с вами будем его развивать и укреплять!На основе собранного фидбека будет определена тема и дата проведения следующей конференции! Титры: Спасибо всем кто посетил конференцию, кто проявлял интерес! Спасибо Ростиславу Сирыку за предложенное место проведения, а Татьяне Змиевской за помощь, терпение и хорошее настроение. Кстати компания Global Logic предоставила свой GL-Club на безвозмездных началах, им не нужны были списки участников и так далее, так как эта компания не разрабатывает игры я с удовольствием принял их предложение. Спасибо докладчикам: Женька Притула, Евгений Овчаренко, Алексей Юрченкои Алёна Данилова - вы молодцы, вы стали первыми докладчиками на первой конференции! Отдельный респект Антону Калганову за чиптюн! Огромное спасибо Женьке Притуле за помощь в продвижении конференции, Женька ты крутой пиарщик и идейный человек!). Спасибо Машке за поддержку! Спасибо всем кто поверил в эту идею! Вместе мы делаем историю! Вместе мы сила! P.S. По результатам опроса 68% проголосовали за группу в ВК - её и сделаем! На странице встречи - масса классных фото и отчетов: http://vk.com/xgamesdevi UAFPUG #47 приближается!Итак, новой конференции быть! Мы очень рады, что местом ее проведения стал офис GlobalLogic. Напоминаю, что в этом же офисе, в субботу, пройдет встреча разработчиков UAFPUG #47 (ожидаются интересные гости, информация завтра). А пока — очень просим регистрироваться! |
2014-09-02 |
Facebook: конец фангейтинга (и слава Богу) В августе Facebook обновил API так, что теперь FB-вкладка (таб) больше не будет сообщать своему разработчику, понравилась она данному пользователю или нет. Поле
liked больше не возвращается в свойстве page объекта signed_request для приложений Page Tab.Таким образом, Facebook ликвидировал один из популярнейших механизмов раскрутки в FB, так называемый фангейтинг (он же лайкгейтинг, like-gating, он же "функция скрытия вкладки"). Это когда у вас, как у разработчика, была возможность показывать на вашей вкладке разный контент для подписчиков и не-подписчиков, определив, "лайкнул" ли уже вас данный пользователь, став "подписчиком".
Бренды успешно пользовались этим, представляя "незалайкавшим" пользователям версию вкладки с призывом нажать лайк и за это получить печеньку, часто в буквальном смысле. Для тех же, кто уже залайкал страницу, показывают другую версию, например, c формой для участия в промо-акции.
Лайкнув, пользователи не только подписываются на ваши посты у себя в ленте, но и получают шанс выиграть какой-либо приз или получить подарок типа скидки или электронной книги.
Фангейтинг был хорошим способом снижения стоимости привлечения подписчиков, теперь они станут дороже.
Для созданных ранее страниц фангейтинг будет действовать до 5 ноября 2014 г. но на новых его использовать уже нельзя.
Facebook объясняет свое решение:
В этом плюс нововведения: теперь, когда бизнесы не могут привлекать клиентов через фангейтинг, они будут чаще предлагать на своих страницах реально ценные для пользователей материалы, а не массовые завлекалки с призывом "залайкай меня и будь что будет". И на страницу будут подписываться лишь те, кто реально хочет видеть публикации этой страницы в своей ленте.
И статистика показывает, что привлеченные через фангейтинг клиенты менее лояльны и имеют меньшую ценность. Так что игра в целом очищается от раздражающего промо-мусора.
Конец фангейтинга !== конец гейтингаОбратите внимание, что остаются доступными другие параметры для гейтинга: пол, возраст и локация. По прежнему можно отделить женскую одежду от мужской, продвигать жителям одного региона путешествия в другой и ограничивать возраст участников онлайн-конкурса. Все это продолжает работать.
Гейтинг помогает точнее находить нужную аудиторию. Но теперь разработчикам и маркетологам придется перестать думать о пользователях как о "фанах или не фанах", а думать о создании лучшего контента для них и показывать его всем, независимо от "залайканости".
Тэги: |
2014-08-12 |
WebRTC — Hello, World! WebRTC — это технология передачи потоковых данных в реальном времени между браузерами или другими приложениями по типу peer-to-peer. В начале 2013 года состоялся первый видеозвонок между Chrome и Firefox. Разработчики могут создавать приложения на WebRTC для реализации голосовой и видеосвязи, например, видео-чата. На GitHub есть пример Hello World.html для WebRTC. Недавно появился WebRTC Media Server, он может потеснить Adobe FMS и Wowza которые продолжают удерживать позиции за счет того, что пока только во Flash реализован кодек H.264. В WebRTC его почему-то не внедрили до сих пор (Google никак не договорится с Mozilla, что лучше — H.264 или кодек VP8). С высокой вероятностью станет веб-стандартом. Его поддерживают все, кроме Майкрософт (ох, доиграются они). Схема работы WebRTC
С чего начать знакомство с WebRTC?
HTML5 наступает :)
Тэги: |
Две августовские встречи в Харькове 1. X Games Dev - 16 августа, суббота Украинская независимая конференция разработчиков игр.
2. JS+UI Dev Meetup - 19 августа, вторник
Доклады:
Приходите — ждем! |
2014-08-08 |
Sigma Ukraine ищет флэш-разработчика в Харькове Sigma приглашает сильного Flash-разработчика для разработки онлайн-казино (игровые автоматы, рулетки, покер и др.) для большого европейского заказчика. Язык — Action Script 3, есть готовая платформа.
|
2014-08-07 |
Онлайн-школа компьютерной графики и анимации на Flash
От себя добавлю: у студии много хороших работ в 2D-анимации, включая участие в таких проектах, как Фиксики: |
2014-07-25 |
UPDATE: Встреча UAFPUG-47 - Харьков, 6 сентября
ВАЖНО: изменилась дата встречи!
Флэш-разработчики снова встречаются в Харькове, чтобы обсудить все волнующие их вопросы. Список докладов и докладчиков вы увидите ниже, он также может еще уточняться. Координаты:
Программа встречи:
Хотите сделать доклад или услышать о чем-то конкретном?Пишите в комменты или на rostislav.siryk@gmail.com Как добраться?Карта:
Регистрация началась!
|
2014-07-24 |
Три вещи, которые айтишнику нужно знать о мобилизации1. Началась третья очередь первой волны мобилизацииВступил в силу закон о третьей очереди частичной мобилизации. 2. Список необходимых вещей для тех, кого мобилизуютРуководствуясь этим списком, снаряжают бойцов в батальон "Айдар" (уточнения и дополнения приветствуются):
3. Чтобы до вашей мобилизации дело не дошло, помогите армииС высокой вероятностью вы не попадаете в данную третью очередь первой мобилизационной волны. У вас есть шансы не попасть во вторую, третью и четвертую волну (возможна только, если война долгое время идет в самом разгаре и наступает всеобщая мобилизация). Чтобы четвертая волна не пришла, нужно помочь армии Украины прямо сейчас, пока вы в тылу, где я и желаю вам оставаться.
Мы помогаем, покупая израильские компрессионные повязки (индивидуальные перевязочные пакеты) для срочной помощи при ранениях.
Мир вашему дому! P.S. Справка: Украина воюет с организованными и хорошо вооруженными террористами.
Тэги: |
2014-07-23 |
Трансляция 3-го дня Web Camp Odessa Пишет Дмитрий Сподарец: Начали 3-й день Web Camp Odessa. Сегодня говорим об управлении проектами. Трансляция на сайте: http://webcamp.in.ua/ #geekslab Темы конференции: разработка, управление проектами, дизайн, интернет-маркетинг и мобильные технологии. Тэги: |
2014-07-22 |
Онлайн-трансляция дня мобильных технологий с WebCamp Odessa Пишет Дмитрий Сподарец из Одессы, организатор проходящей сейчас в рамках Odessa Innovation Week конференции WebCamp2014: "Сегодня говорим о мобильных технологиях." Онлайн-трансляция — на http://webcamp.in.ua
|
2014-07-21 |
Бесплатный шрифт Shket Shket is a modern sans serif typeface that comes with more than 460 glyphs to support a variety of languages. It also includes 471 kerning pairs, mathematical characters, and more. It's meant for use at large sizes, and is ideal for posters, headlines, and more. It's regularly updated and improved, too. |
2014-07-18 |
Как изменить все шрифты в файле FLA JSFL всех нас переживет: получил благодарность в твиттере за пост 2007 года на ActionScript.org — до сих пор актуальная инструкция. Так что перевожу на русский и делюсь по новой. Задача: есть масса чужих FLA файлов с кучей анимации на таймлайне. Нужно изменить все шрифты на новые. Решение: сценарий на JSFL. Он заменяет шрифты, строит и сохраняет отчет о каждой замене. Скрипт рекурсивно обходит весь документ, пока не найдет все текстовые элементы. Для каждого текстового элемента строится его путь, создается массив текстовых элементов документа для будущего использования. Итак, в первом JSFL-файле по адресу "\Documents and Settings\[]\Local Settings\Application Data\Adobe\Flash X\en\Configuration\Commands\[FR] Replace Fonts.jsfl" происходит замена и создание отчета: var dom = fl.getDocumentDOM(); dom.editScene(0); //dom.selection = dom.getTimeline().layers[0].frames[0].elements; fl.outputPanel.clear(); fl.trace("********************************************************************"); fl.trace(" START OF FONT REPLACEMENT REPORT\n"); fl.trace(" FONT REPLACEMENT UTILITY"); fl.trace(" v 1.0.2"); fl.trace(" Author: Rostislav Siryk"); fl.trace(" http://flash-ripper.com/"); fl.trace("********************************************************************"); fl.trace("\nFILE NAME:\t" + dom.name + ".fla"); fl.trace("FILE PATH:\t" + dom.path + "\n"); //fl.saveDocumentAs(.documents[0].path); // Font to be replaced var font_select = new Array("MyLifeSans", "MyLifeSer", "Myriad", "Myriad-Bold", "Myriad-Roman", "Frutiger 45 Light", "Frutiger 55 Roman", "Garamond Book", "ArialNarrow-Bold", "Avenir LT Std 65 Medium", "Helvetica", "Verdana", "Arial Black", "Arial Narrow", "Myriad Roman" ); var textElements = new Array(); var numTotalRuns = 0; var strOutput = ""; var fontsFound = new Array(); var strFoundFonts = ""; var numTextItemsTotal = 0; var numTextItemsReplaced = 0; var strLayerName = ""; var strItemFullPath = ""; var strItemHumanPath = ""; // Delimiters used to create element paths var strTimelinesDelimiter = ".libraryItem.timeline"; var strLayerDelimiter = ".layers"; var strFrameDelimiter = ".frames"; var strElementDelimiter = ".elements"; var BR_O = "["; var BR_C = "]"; findTextElements = function(theTimeline) { if(theTimeline && theTimeline.layers.length > 0) { var theLayers = theTimeline.layers; for(var numLayer = 0; numLayer < theLayers.length; numLayer++) { // Parse FRAMES of the LAYER var theFrames = theLayers[numLayer].frames; for(var numFrame = 0; numFrame < theFrames.length; numFrame++) { // Parse only KEY Frames. I said PARSE ONLY \KEY/ FRAMES. if (numFrame == theFrames[numFrame].startFrame) { // Parse ELEMENTS of the KEYFRAME var theElements = theFrames[numFrame].elements; for(var numElement=0; numElement < theElements.length; numElement++) { numTotalRuns ++; var foundElement = theElements[numElement]; // if element is not text but instance if(foundElement.elementType == "instance") { // Add LAYER to the item full path strItemFullPath += strLayerDelimiter + BR_O + numLayer + BR_C; strLayerName = "." + theLayers[numLayer].name; strItemHumanPath += strLayerName; // Add FRAME, ELEMENT and TIMELINE to the item full path strItemFullPath += strFrameDelimiter + BR_O + numFrame + BR_C + strElementDelimiter + BR_O + numElement + BR_C + strTimelinesDelimiter; strItemHumanPath += "[fr" + numFrame + "]" + (foundElement.name || "(unnamed)"); findTextElements(foundElement.libraryItem.timeline); } else if (foundElement.elementType == "text") { // Add LAYER to the item full path strItemFullPath += strLayerDelimiter + BR_O + numLayer + BR_C; strLayerName = "." + theLayers[numLayer].name; strItemHumanPath += strLayerName; // Add FRAME and ELEMENT to the full path and FINALIZE path strItemFullPath += strFrameDelimiter + BR_O + numFrame + BR_C + strElementDelimiter + BR_O + numElement + BR_C; strItemHumanPath += "[fr" + numFrame + "]" + (foundElement.name || "(unnamed)"); textElements.push({theElement: foundElement, itemID: numTextItemsTotal, itemPath: strItemFullPath, itemHumanPath: strItemHumanPath }); // Reset the paths for the next iteration strItemFullPath = "";//strLayerDelimiter + BR_O + numLayer + BR_C; strItemHumanPath = ""; numTextItemsTotal++; /* numElement = theElements.length; numFrame = theFrames.length; numLayer = theLayers.length; break;*/ } } } else { // NO KEYFRAME ACTION } } } } } /*for(var i=0; i < dom.library.items.length; i++) { fl.trace("LIBITITEM."); findTextElements(dom.library.items[i].timeline) }*/ function enumerateAllTextElements() { for(var numTe = 0; numTe < textElements.length; numTe++) { var te = textElements[numTe]; strOutput += "\n\tTEXT #" + te.itemID + "\n\tFont:\t" + te.theElement.getTextAttr("face") + "\n\tPath:\t" + te.itemPath //+ "\n\tSeek:\t" + te.itemHumanPath + "\n\tText:\t" + te.theElement.getTextString() + "\n"; } } function replaceAllFonts() { for(i=0; i < font_select.length; i++) { font_replaced = font_select[i]; font_replacement = "Arial"; if(font_replaced == "Garamond Book") { font_replacement = "Times New Roman"; } for(var te = 0; te < textElements.length; te++) { replaceFont(textElements[te]); } } } function replaceFont(objText) { var textElement = objText.theElement; //fl.trace("TE= " + textElement.theElement); if(textElement.getTextAttr("face")) { var oldFont = textElement.getTextAttr("face"); var oldSize = textElement.getTextAttr("size"); var txt = textElement.getTextString(); addFoundFont(oldFont); if(oldFont == font_replaced) { numTextItemsReplaced++; textElement.setTextAttr("face", font_replacement); var strSizeChange = ""; if(!isNaN(oldSize) && (oldFont == "FullLifeSans" || oldFont == "FullLifeSer")) { newSize = oldSize * 0.85 || Math.floor(oldSize * 0.85); textElement.setTextAttr("size", newSize); strSizeChange = "\n\tOLD Size:\t" + oldSize + "\n\tNEW Size:\t" + newSize; } strOutput += "\n\tREPLACE #" + objText.itemID + "\n\tOLD Font:\t" + oldFont + "\n\tNEW Font:\t" + font_replacement + strSizeChange + "\n\tPath:\t" + objText.itemPath //+ "\n\tSeek:\t" + objText.itemHumanPath + "\n\tText:\t" + txt + "\n" } else { //strOutput += "\t[NO CHANGES TO FONT]\n"; } } } function addFoundFont(fontName) { isInFontsFoundAlready = false; for(var i=0; i < fontsFound.length; i++) { if(fontsFound[i] == fontName) { isInFontsFoundAlready = true; break; } } if(!isInFontsFoundAlready) { fontsFound.push(fontName); strFoundFonts += "\n\t" + fontsFound.length + "\t" + fontName; } } /*font_replaced = "FullLifeSer"; font_replacement = "Arial";*/ findTextElements(dom.getTimeline()); strOutput += "FOUND TEXT FIELDS:\t" + numTextItemsTotal + "\n"; strOutput += "******************\n"; enumerateAllTextElements(); strOutput += "\n\nREPLACEMENTS MADE:\t" /*+ numTextItemsReplaced*/ + "\n"; strOutput += "******************\n"; replaceAllFonts(); fl.trace("TOTAL RUNS:\t" + numTotalRuns); fl.trace("ITEMS FOUND:\t" + numTextItemsTotal); fl.trace("ITEMS REPLACED:\t" + numTextItemsReplaced); fl.trace("FONTS FOUND:\t" + fontsFound.length + strFoundFonts + "\n"); fl.trace("DETAILS:"); fl.trace("********"); fl.trace("\n" + strOutput + "\n\n"); fl.trace("********************************************************************"); fl.trace(" END OF FONT REPLACEMENT REPORT"); fl.trace("********************************************************************"); // Saving created report to as file fl.outputPanel.save("file:///d|/Projects/eLearn2/reports/" + dom.name + "-report.txt"); fl.outputPanel.clear(); // NOW WRITE SOME INFO JUST ABOUT FONTS FOR STATISTICS fl.trace("\n=========================="); fl.trace("FONTS INFO FOR FILE:\t" + dom.name + ".fla"); fl.trace("FILE PATH:\t" + dom.path + "\n"); fl.trace("FONTS FOUND:\t" + fontsFound.length + strFoundFonts + "\n"); // Append font report to file fl.outputPanel.save("file:///d|/Projects/eLearn2/reports/global-font-report.txt", true); dom.publish(); dom.saveAndCompact(); dom.close(); Второй JSFL-файл управляет работой первого для процессинга нескольких FLAОн запускает первый на каждом из исходных FLA: 2. "\Documents and Settings\[]\Local Settings\Application Data\Adobe\Flash X\en\Configuration\Commands\[FR] Batch Replace Fonts.jsfl"fl.outputPanel.clear(); fl.trace("******************************************************"); fl.trace(" BATCH REPLACE FONTS IN MULTIPLE FILES"); fl.trace(" Author: Rostislav Siryk"); fl.trace(" http://flash-ripper.com/"); fl.trace("******************************************************\n"); function getDuration(tEnd, tStart) { var msecsDur = tEnd - tStart; var msecs = String(msecsDur).substr(String(msecsDur).length - 3); var secs = Math.floor(msecsDur / 1000); var mins = Math.floor(msecsDur / 60000); var hrs = Math.floor(msecsDur / 3600000); if (hrs < 10) hrs = "0" + hrs; if (mins < 10) mins = "0" + mins if (secs < 10) secs = "0" + secs; if (msecs < 10) msecs = "00" + msecs; else if (msecs < 100) msecs = "0" + msecs; return {durString: hrs + ":" + mins + ":" + secs + "." + msecs, durValue:msecsDur}; } function getTimeString(aDate) { time = aDate.getTime(); hours = aDate.getHours(); minutes = aDate.getMinutes(); seconds = aDate.getSeconds(); milliseconds = aDate.getMilliseconds(); if (minutes < 10) minutes = "0" + minutes if (seconds < 10) seconds = "0" + seconds; if (milliseconds < 10) milliseconds = "00" + milliseconds; else if (milliseconds < 100) milliseconds = "0" + milliseconds; return hours + ":" + minutes + ":" + seconds + ":" + milliseconds; } function getCurrentTime() { var dateNow = new Date(); return {timeString: getTimeString(dateNow), timeValue:time}; } var timeStart = getCurrentTime().timeString; var timeStartValue = getCurrentTime().timeValue; var numErrors = 0; scriptFile="file:///c|/Documents and Settings/rost/Local Settings/Application Data/Macromedia/Flash 8/en/Configuration/Commands/[FR] Replace Fonts.jsfl" // ADVANCED COURSE FILES LIST strPathsAdv = "file:///d|/Projects/eLearn2/Fla/sec01/s02_01_01.fla#" + "file:///d|/Projects/eLearn2/Fla/sec01/s02_01_02.fla#" + "file:///d|/Projects/eLearn2/Fla/sec01/s02_01_03.fla#" + "file:///d|/Projects/eLearn2Fla/site_files/ssecondary_4.fla#"; // BASIC COURSE FILES LIST strPathsBasic = "file:///d|/Projects/eLearn2/Fla/sec01/s01_01_01.fla#"+ "file:///d|/Projects/eLearn2/Fla/sec01/s01_01_02.fla#"+ "file:///d|/Projects/eLearn2/Fla/sec01/s01_01_03.fla#"+ "file:///d|/Projects/eLearn2/Fla/site_files/ssecondary_4.fla" fileStr = strPathsAdv + strPathsBasic; if(fileStr.length > 0 && scriptFile.length > 0) { var files = fileStr.split("#") var numFiles = files.length for(var f = 0; f < numFiles; ++f) { if(fl.fileExists(files[f])) { var tStart = getCurrentTime().timeString; var tStartValue = getCurrentTime().timeValue; fl.trace("Open File:\t" + files[f]); fl.openDocument(files[f]) fl.runScript(scriptFile) fl.trace("\tFILE COMPLETE"); fl.trace("\tSTART TIME:\t" + tStart + "\t(" + tStartValue + " msec)"); fl.trace("\tEND TIME:\t" + getCurrentTime().timeString + "\t(" + getCurrentTime().timeValue + " msec)"); fl.trace("\tDURATION:\t" + getDuration(getCurrentTime().timeValue, tStartValue).durString + "\t(" + getDuration(getCurrentTime().timeValue, tStartValue).durValue + " msec)\n"); } else { fl.trace("ERROR OPENING FILE: File doesn't exist:\t"+ files[f] + "\n"); numErrors++; } } } fl.trace("\n******************************************************"); fl.trace("FILES TOTAL:\t" + numFiles); fl.trace("ERRORS TOTAL:\t" + numErrors); fl.trace("\nSTART TIME:\t" + timeStart + "\t(" + timeStartValue + " msec)"); fl.trace("END TIME:\t" + getCurrentTime().timeString + "\t(" + getCurrentTime().timeValue + " msec)"); fl.trace("DURATION TOTAL:\t" + getDuration(getCurrentTime().timeValue, timeStartValue).durString + "\t(" + getDuration(getCurrentTime().timeValue, timeStartValue).durValue + " msec)"); fl.trace("******************************************************"); // Save report to file fl.outputPanel.save("file:///d|/Projects/eLearn2/reports/batch-font-replace-report.txt"); Когда-то JSFL стал моим первым шагом в JavaScript :) |
2014-07-17 |
Зачем в JavaScript используют return !0 Часто в JavaScript-коде можно увидеть такое: return !0; Зачем это нужно? Это такой хитрый способ записать true и результат минимизации JavaScript для экономии веб-траффика. Ведь для передачи !1 нужно всего 2 байта, а для передачи true — целых 4! А почему не return 1, ведь это тоже дает true и занимает всего один байт?А потому, что результат return 1 будет типа number, и если кто-то будет обрабатывать это строгими операторами типа === или !== , то получит ожидаемый результат от !0, а не от 1. Утащил со StackOveflow. См. также: JavaScript-компилятор Closure. Тэги: |
2014-07-15 |
Быстрый старт с ASDoc во Flash Builder 4 Пока Флекс не собирается исчезать, этото совет может кому-то пригодиться. Работа с ASDoc во Flex SDK обстоит неказуально, разобраться без посторонней помощи сложно, даже очень. Как-то я потерял на этом день и теперь знаю, как этого избежать. Ant ASDoc TaskFlex Ant ASDoc Task — это утилита-обертка вокруг ASDoc tool, позволюящая вынести опции сборки в файл build.xml, а затем собрать документацию через ASDoc с Apache Ant. Для быстрого старта с Ant ASDoc Task изучите и переделайте уже работающие примеры. Например, сборку документации к классам, идущим в составе Flex SDK. Начните с файла "c:\Program Files\Adobe\Adobe Flash Builder 4\sdks\4.X.X\asdoc\build.xml". Это готовый конфиг для сборки. В любом Flex SDK нужный билд-файл находится по относительному адресу "[FLEX_SDK_DIR]\asdoc\build.xml". Данный конфиг можно легко переделать под свой проект. Это легче, чем начинать с нуля, вы быстро поймете, что в нем вам нужно, а что — нет. Полезная ссылка: http://racer242.blogspot.com/2008/01/asdoc-as3.html |
2014-07-14 |
2014-07-13 |
2014-07-12 |
Мой фейл на Amazon Web Services Амазон AWS - хороший сервис для хостинга и подстраховки хостинга. И мы переехали на него в апреле 2012 г. Но потом отказались от его использования по двум причинам: дорого и сложно. Дорого: $86 в месяц за использование MySQLЯ этого не знал, пока не ощутил на себе, а дело было так:
Не готов быть суперадминомАмазон предлагает мощный конструктор по созданию хостинга и пытается сделать его использование простым, но сложное остается сложным. Нужно разбираться и держать в уме букет технологий, админить в Линуксе. На это просто не хватает времени. Занятие увлекательное, но если от него отвлечься на неделю, приходится вспоминать заново. Время, время, время. Сложная настройка FTP. В результате научился заливать обновления на сайт через svn, для чего установил его на сервере, настроил репозитории и т.п. И даже получал эстетическое удовольствие от использования такой изощренной системы. Но удовольствие - это одно, а каждодневное удобство оказалось важнее. Отсутствие обычного FTP-доступа делало работу совсем не такой удобной.Бесплатный сервер от Амазона не выдерживал нагрузки и часто лежал. Это подтвержадет правило: бесплатного сыра нет. За хороший сыр надо платить. Потрошитель использует Drupal, а это очень прожорливая система. Особенно много он хочет памяти и часто обращается к MySQL. А для чего подходит Amazon?На самом деле - много для чего. Например, для сайтов, не требующих работы с MySQL. Вот пример: Ексей рассказывает, как Амазон спасает его, когда трафик его сайта взлетатет. При этом он платит в Амазону в среднем $4 в месяц. Друг-админ предложил идею: а почему бы не запустить сервер MySQL на том же бесплатном микро-инстансе, на котором работает сайт, и таким образом получить MySQL бесплатно? Идея интересная, но подойдет скорее для сайтов с небольшой нагрузкой на БД. Например, для сайтов в разработке, без широкого публичного трафика, создающего массу запросов к БД. Также, думаю, при наличии хорошего админа Амазон подойдет многим высоконагруженным сайтам, в том числе и в качестве подстраховочного, резервного сервера. Амазон не виноват :)Моя ошибка с Амазоном была в том, что я хотел из бесплатного варианта выжать ресурсы, превосходящие его возможности. Я попытался хостить на нем сайт, отъедающий много памяти и интенсивно работающий с MySQL. Понимаю, что всегда есть варианты. Интересно услышать мнение знающих людей :- ) |
2014-07-11 |
Как восстановить исходник FLA-файла, если Flash CS5 его запорол Это не статья, а набор ссылок, которые могут помочь некоторым несчастным:
Корень проблемы: пустой тэг <frame/> в XML-файле и ETX (End of Text) character. Тэги: |
Правило минимальной власти
Этот закон вывел сооснователь StackOverflow Джеф Этвуд в 2007 году задолго до того, как JavaScript приобрел взрывную популярность. Он развил "Правило минимальной власти", задокументированное создателем интернета Тимом Бернесом Ли. В 2005 году Тим выпустил книгу, резюмирующую его видение семантической сети как надстройки над интернетом. В ней компьютеры могут анализировать существующее содержимое и повторно перерабатывать его, создавая все более более осмысленные структуры на основе сетевого контента. Язык, который не прячет данныеПравило минимальной власти в веб-программировании означает выбор наименее "властного" языка, пригодного для решения данной задачи. Чем описательнее язык (т.е. чем менее он процедурен, или императивен), тем больше можно сделать с данными, записанными на этом языке: повторно их обработать, и сделать это сколь угодно много раз, решая задачи в мире открытой информации. Наименее властный, т.е. максимально описательный язык — это текстовая база данных или HTML. Максимально властными, или процедурными, являются традиционные языки программирования, дающие результат в виде скомпилированного кода, в т.ч. ActionScript. JavaScript некомпилируем, т.е. менее властен. Отец интернета Тим Бернес Ли:
Недостижимо идеальная семантикаСеть Тима Бернеса Ли пока осталась мечтой. Она нереализуема в чистом виде, как, например нереализуем в чистом виде вечный двигатель. Но, подобно тому, как попытка создания вечного двигателя может дать лучший двигатель, мечта о семантической сети продолжает давать хорошие плоды. Например, микроформаты и стандарты мета-данных для адресации объектов сети. Многие разработчики радуются возможности компиляции своих приложений, предпочитая не думать о том, как мало это дает остальным. Некоторые свысока смотрят на веб-программирование, HTML и JavaScript. Но возможно, что фактор закрытости Flash-контента и стал препятствием на пути развития. C точки зрения семантики Flash, как бинарный формат, является властным, закрытым языком, пригодным для использования лишь конечным пользователем-человеком, но не компьютером. Флэш дает много конечному пользователю. Большинство визуальных эффектов было изобретено или впервые реализовано именно на Flash. Игры процветают (но все больше как Adobe AIR). Но из веба флэш уже ушел. Скажи мне, где мои данные и я скажу, кто тыФлэшеры критикуют несовершенство Javascript как некомпилируемого языка с "ненастоящим" ООП. Но благодаря этому "невластный" JavaScript больше подходит для открытой веб-разработки. Борьба открытости с закрытостью идет вечно, оба подхода имеют свои сильные стороны. Adobe ведет работы над конвертированием SWF в более открытый HTML5. Отдав технологию Flash сообществу для реализации бесплагинного внедрения в сетевой поток, Адоби сделает шаг к большей открытости Flash. Это может спасти Flash как технологию. Но изменит ли это отношение флэшеров к той сети, в которой они живут? |
2014-07-10 |
Освобожденный Flex ищет друзей Достаю из-под тэга TODO запись более чем годичной давности. Оказывается, актуально: Luxoft ищет флекс-разработчиков для работы в Польше. Большие вещи живут крепко и держат даже самые подлые удары судьбы. Например, Apache Flex. Даже крайне неудачные обстоятельства вокруг передачи Флекса из сложных корпоративных клоак Adobe в руки опенсорса не смогли умалить реальную ценность и красоту этого события. Жаль, что Адоби не смогли представить это событие в его лучшем значении (но они пытались). Это породило уныние среди флексеров, а тем временем можно отвлечься от иллюзии декаданса и увидеть красоту события. Освобожденный от грустного корпоратива Флекс попал в руки людей совсем другого рода, и они готовят ему интересную судьбу. Ссылки годичной давности:
Кстати, Balsamiq Mockups, каждый день спасающий меня при прототипировании веб-интерфейсов, написан еще на третьем флексе и просто офигенно работает — так ,что я не пожалел $70 и таки купил его себе. Тэги: |
2014-07-09 |
17 и 18 октября — DevGamm в Минске! В этом году гостеприимная столица Беларуси будет принимать участников международной игровой конференции DevGAMM! — сообщает блог конференции. Цитирую дальше:
-8<------------------------------------------------------- Добавлю от себя:
Легкого дебага! |
2014-07-08 |
Use Beautiful Fonts IN YOUR designs! TypeKit is a subscription font service that brings thousands of fonts from foundry partners into one library for quick browsing, easy use on the web or on your desktop, and endless typographic inspiration. |
Подготовка к мини-конференции игроделов в Харькове В Харькове идет подготовка к конференции по разработке игр. Пишет Вадим Водный (текст и иллюстрация автора):
Призываю всех флэшеров-игроделов Харькова обратить на это мероприятие пристальное внимание! |
2014-05-20 |
Электронное правительство Украины будет сделано в Ciklum Украинское правительство выбрало Ciklum как поставщика технологии для своего нового портала электронного правительства, обеспечивая безопасные онлайн-услуги для граждан и предприятий. Ciklum, один из ведущих европейских поставщиков аутсорсинга разработки программного обеспечения и ИТ-/ Agile консалтинговых услуг, сотрудничает с правительством Украины в поиске и выборе программных решений для модернизации и автоматизации государственного управления. Это партнерство направлено на поиск инновационных и устойчивых решений для украинского правительства, для надежного сотрудничества с гражданами и бизнесом. Вместе с украинским правительством Ciklum будет работать над реализацией решений для идентификации и аутентификации пользователя, системы учета данных, платежных шлюзов, Административных услуг портала, реестров, решений в области здравоохранения и т.д. http://www.ciklum.com/ciklum-news/ukrainian-government-chooses-ciklum-im... |
2014-05-14 |
Дмитрий Ганзин - Flash/Flex разработка Ищу работу для фрилансера, работаю удаленно или по гибкому графику Мое резюме: Имя: Дмитрий Ганзин
Опыт работы: 11 лет
Контакты:
skype: dganzin
mail: d@ganzin.ru
октябрь 2012 - май 2014
Flex\Flash разработчик. Разработка игры Гномград. Сервер, клиент, мобильная версия
MasterTigra, (mastertigra.com), Россия
июнь 2010 - октябрь 2012
Flex\Flash разработчик. Разработка социальных игр
GexSoft, (gexsoft.com), Франция
июнь 2009 — май 2010
Архитектор, консультант, тимлид на проекте Москва 3000
Pipe Studio, (pipestudio.ru), Москва, Харьков(Украина)
— занимался разработкой архитектуры Flash клиента
— сформировал ядро и принцип подключения внешних модулей на базе PureMVC
— разработал и реализовал систему кастомизации персонажей
— разработал и реализовал систему рендеринга векторной анимации в растровую, что дало большой прирост производительности
— курировал работу художников по оптимизации графики
апрель 2008 — май 2009
Flash программист
Project Axelarr, Омск
— разрабатывал клиента для игры. Использовал технологии Flex, PureMVC, Fabrication, PaperVision3D и др.
— участвовал в разработке Java сервера
май 2007 — апрель 2008
Программист
Freelance, Омск
— участвовал в разработках клиента для MMO игры
— занимался разработкой онлайн игры zibi.ru, всё полностью кроме дизайна сайта. Курировал художников.
февраль 2007 — май 2007
C# программист
Funlay, Омск
— разрабатывал приложения на C# и Python
июнь 2003 — сентябрь 2005
Глава отдела Flash разработок
ITPremium
— главы отдела флеш разработок
— занимался разработкой и партированием многих online игр
— участвовал в разработках игр онлайн казино, как клиента, так и сервера на Java
— разрабатывал GDP (Game Development Kit) - это внутриконторское SDK для разработки игр
— курировал разработку многих других проектов
skype: dganzin
mail: d@ganzin.ru
Минимальная зарплата: $3300 |
2014-05-12 |
Мастер-класс по Away3D от Роба Бейтмена — 17 мая в Москве! В конце прошлого года в Киевском HackerSpace (спасибо!) прошел мастер-класс по JS-версии Away3D от его создателя, Роба Бейтмена. Всем очень понравилось! Для тех, кто использует Away3D, этот мастер-класс Роба может быть реально полезен. И вот, 17 мая, на следующий день после DevGAMM в Москве, ОН СОСТОИТСЯ! Инфа о событии на блоге Away3D: Away3D Typescript training at DevGAMM Moscow Регистрация:Через EventBrite или через Timepad (чтобы заплатить в рублях) С любовью,
|
2014-05-06 |
Свободу узникам Болотной! Сегодня, 6 мая 2014 года, с 15.00 до 15.30 состоялся пикет консульства Российской Федерации "За Вашу и нашу свободу!". В непростое время нарастания политического противостояния между Россией и Украиной мы хотели поддержать тех граждан России, которые, как и участники движения Майдана в Украине, стремятся к демократизации общества, и, к сожалению, как и ряд украинских граждан, страдают от репрессивных карательных мер государства. Около 30 харьковчан собрались сегодня , чтобы:
Главными лозунгами пикета были: "За вашу и нашу свободу!" "Свобода политзаключенным!", "Свобода узникам Болотной!", символом акции были белые ленты.
Каждый из вас, друзья, может помочь политзаключенным!
P.S. А в Москве сегодня — снова задержания на Болотной:
|