Flex и RIA блоги
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. А в Москве сегодня — снова задержания на Болотной:
|
2014-04-21 |
Update: запись онлайн-встречи с Adobe 21 апреля прошла онлайн-встреча Adobe Flash Online Conference #9 (спасибо, Сергей Гончар)! Из Adobe участвовали Chris Campbell, Govinda Gupta, Romil Mittal, Ashok Mathew Kuruvilla и Cheng Liao. Появилась запись этой встречи: http://gonchar.me/blog/goncharposts/2279 |
Как отделить мух от колет? Рано или поздно любой flex-разработчик понимает, что нужно что-то сделать с собственным “винегретом” в коде, состоящим из mxml-разметки вперемешку с inline-кодом. А, собственно, что с ним не так? Если кратко, то:
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" height="450"> <s:layout> <s:VerticalLayout/> </s:layout> <fx:Script> <![CDATA[ import spark.events.IndexChangeEvent; private function myChangedHandler(event:IndexChangeEvent):void { var selIndices:Vector.<int> = event.currentTarget.selectedIndices; var selItems:Vector.<Object> = event.currentTarget.selectedItems; var numItems:Number = selIndices.length; selIndicesTA.text = ""; selItemsTA.text = ""; for (var i:Number = 0; i<numItems; i++) { selIndicesTA.text = selIndicesTA.text + selIndices[i] + "\n"; selItemsTA.text = selItemsTA.text + selItems[i] + "\n"; } } ]]> </fx:Script> <s:List allowMultipleSelection="true" change="myChangedHandler(event);"> <mx:ArrayCollection> <fx:String>Flex</fx:String> <fx:String>Flash Builder</fx:String> <fx:String>Flash</fx:String> <fx:String>Director</fx:String> <fx:String>Dreamweaver</fx:String> <fx:String>ColdFusion</fx:String> </mx:ArrayCollection> </s:List> <s:Label text="Selected indices"/> <s:TextArea id="selIndicesTA" height="75"/> <s:Label text="Selected items"/> <s:TextArea id="selItemsTA" height="75"/> </s:Application>
Вместо того, чтобы пропагандировать “здоровое кодирование”, а также потому, что не смогла, Не будем о грустном. Так как же можно отделить просо от гречки? Если хорошо поискать, то Adobe предлагает следующие варианты:
<s:Button label="Convert" click="celsius.text=String(Math.round((Number(fahrenheit.text)-32)/1.8 * 10)/10);"/>
Много кода в инлайн обработчике не напишешь. Нельзя использовать операторы сравнения. Да и не похож этот вариант на разделение, скорее наоборот. Проходим мимо. Описывание кода в отдельном as файле ни к чему, кроме головной боли, не ведет. Как минимум, код в пустом (безо всяких package, class и тд) файле выглядит странно, запутывает и приводит в уныние, наверное, все современные IDE. Кто-нибудь сейчас так пишет? Получается, название статьи расходится с её содержанием. Зачем она нужна Вот мы все ругаем Adobe за Flex. Так ведь да, в один прекрасный момент она сама это поняла и переписала часть фреймворка, как надо. Ввела новый жизненный цикл компонентов и отделила логику/поведение компонентов от их внешнего вида и увеличила цифру у фреймворка аж до 4.00. Можно даже почитать, как правильно готовить такие компоненты. Переписать все компоненты сил не хватило, теперь этим занимается Apache Foundation. Что же делать? И как быть? Наверное, многие уже поняли, к чему я клоню, и вспомнили о старом, добром CodeBehind-е. Идея этого архитектурного паттерна проста: всю бизнес-логику пишем на чистом as3 (базовый класс), а расположение и внешний вид контролов, описываем, используя mxml-разметку. Все контролы, которые будут использоваться в коде, должны иметь id и быть описаны в базовом классе как публичные переменные с соответствующим типом. Звучит страшно, но на самом деле все просто. Рассмотрим пример: // BaseControlPanel.as public class BaseControlPanel extends Group { public var stopButton : Button; public var startButton: Button; public function BaseControlPanel() { super(); } /** * @inheritDoc */ override protected function createChildren():void { super.createChildren(); stopButton.addEventListener(MouseEvent.CLICK, onStopButtonClicked); } /** * Обработчик клика по кнопке старт * @param e */ protected function onStartButtonClicked(e:MouseEvent):void { trace("Start"); } /** * Обработчик клика по кнопке стоп * @param e */ private function onStopButtonClicked(e:MouseEvent):void { trace("Stop"); } } // ControlPanelView.mxml <?xml version="1.0"?> <local:BaseControlPanel xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:local="*" xmlns:layouts="spark.layouts.*" xmlns:components="spark.components.*"> <local:layout> <layouts:HorizontalLayout paddingLeft="5" paddingTop="5"/> </local:layout> <!-- Кнопка запуска --> <components:Button id="startButton" label="start" click="onStartButtonClicked(event)"/> <!-- Кнопка остановки --> <components:Button id="stopButton" label="stop"/> </local:BaseControlPanel> В приведенном примере мы видим два варианта подписки на событие клика по кнопке. Стоп-кнопку мы подписываем на клик mxml файле. Для этого необходимо, чтобы обработчик события был виден, т.е. был либо protected либо public. Старт-кнопку мы подписываем в createChildren, сразу после того, как она создастся. Оба варианта приемлемы. Вариант с подпиской в разметке, как нам кажется, короче, но не так универсален. Если нам нужно будет создать еще один вариант разметки, нам придется еще раз подписывать кнопку на это событие, что избыточно и легко может привести к ошибке, если мы забудем это сделать. С другой стороны, если нам нужно подписаться на это событие не сразу, или подписать вообще другой компонент (который также может послать это событие), то сделать это без изменения as3 кода не получится. А так как именно эту проблему мы и решаем, то вариант с подпиской на событие в разметке в данном случае подходит лучше. Используем тот вариант, который решает нашу задачу лучше. Таким образом, мы частично решили поставленные в начале статьи задачи, и даже получили некоторые другие преимущества:
Но, как и у любого другого шаблона, у CodeBehind есть не только плюсы, но и минусы:
Другим вариантом реализации отделения логики от разметки является приём, называемый CodeFront (или code in front). Идея его (вы наверное и сами догадались) так же проста и кристальна, как и в случае с CodeBehind, и заключается в том, что сначала мы реализуем расположение компонентов, и только потом наполняем их жизнью (добавляем логику). Пример: // BaseControlPanelView.mxml <?xml version="1.0"?> <s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:local="*" xmlns:layouts="spark.layouts.*" xmlns:components="spark.components.*" xmlns:s="library://ns.adobe.com/flex/spark"> <!-- /** * Внешний вид панели управления * Created 18.04.2014 * Version 1.0 * Copyright (c) 2014 * @author ChessMax (www.chessmax.ru) */ --> <s:layout> <layouts:HorizontalLayout paddingLeft="5" paddingTop="5"/> </s:layout> <!-- Кнопка запуска --> <components:Button id="startButton" label="start"/> <!-- Кнопка остановки --> <components:Button id="stopButton" label="stop"/> </s:Group> // ControlPanel.as public class ControlPanel extends BaseControlPanelView { public function ControlPanel() { super(); } /** * @inheritDoc */ override protected function createChildren():void { super.createChildren(); startButton.addEventListener(MouseEvent.CLICK, onStartButtonClicked); stopButton .addEventListener(MouseEvent.CLICK, onStopButtonClicked); } /** * Обработчик клика по кнопке старт * @param e */ protected function onStartButtonClicked(e:MouseEvent):void { trace("Start"); } /** * Обработчик клика по кнопке стоп * @param e */ private function onStopButtonClicked(e:MouseEvent):void { trace("Stop"); } } Используя CodeFront, нам больше нет необходимости описывать все необходимые переменные в классе, чтобы использовать их в логике. Так как мы наследуемся от mxml-разметки, то компилятор делает это за нас. Но теперь мы лишены возможности назначить обработчик события inline-внутри mxml-разметки, так как описан он будет только в наследнике. Также нет возможности полностью заменить layout получившегося компонента, по понятным причинам. Да и перенести логику в другой проект без layout-а теперь не получится. Возможно, поэтому этот вариант гораздо менее популярен, чем CodeBehind. Заключение. CodeBehind/CodeFront - архитектурный прием, который позволяет относительно легко сделать код чистым и структуированным, что легко дает возможность модифицировать его в будущем. Хотя поначалу довольно непросто привыкнуть писать код так, и это сильно раздражает. Даже кажется, что мы делаем слишком много дополнительной работы. Но, как говорится, стоит только начать, а уж когда втянетесь… Становится легче абстрагировать логику от разметки. Гораздо легче наследоваться от чистых AS3 классов, нежели от MXML классов с необходимостью изменять layout. Попробуйте один из перечисленных приемов в своем проекте. И обязательно оставляйте комментарии о своем положительном/отрицательном использовании перечисленных техник. Почитать: Code Behind |
2014-04-18 |
Александр Письменчук - Flash ActionScript 3 разработчик Ищу постоянную работу в компании с полной занятостью Мое резюме: Кто я:
ActionScript 3 разработчик. Flash занимаюсь с 12.2008 по наст. время (более 5 лет)
На данный момент работаю на фриланс биржах
Чем я занимаюсь:
Программирование функционала flash/air компонентов, сайтов, интерактивов. Больше скажет портфолио.
Портфолио: http://fl.ru/
Все работы: http://www.weblancer.net/
Что я ищу:
Работу в г.Киеве. Достойную оплата, интересный проект (не игровой), слаженный коллектив, удобное рабочее время, бесплатные печеньки :). Плюсом будет считаться помощь при переезде или поиске жилья
Основные навыки:
ActionScript, OOP, Air Desktop
Дополнительные навыки можно узнать по запросу
Достежения:
Интерактивы для Winston, Camel, Dirol, Vertu. Volvo, игры для FixiClub, Nestle
Знание языков:
Английский - начальный, Русский - продвинутый, Украинский - родной
Мои контакты можно посмотерть на сайте http://alexvoz.net/
Минимальная зарплата: $2000 Максимальная зарплата: $2500 |
Кефирам нужен человек в Киеве Kefir Games (тюряга) ищет Требования:
Компания дает хорошую зарплату и там есть куда расти |
2014-04-15 |
Generic Animation Format и оптимизация Adobe AIR: записи докладов 12 апреля в Харькове прошел UAFPUG №46. Доклады были записаны на видео:
Важно: по горячим следам Антон сделал разбор полетов к собственному докладу про AIR. Также во время доклада мы долго обсуждали оптимизацию списков в Adobe AIR, и один из наших онлайн-слушателей, Виталий Кононец прислал ссылку на свой блог по теме: Оптимизация списков в мобильном приложении. Спасибо, Виталий! Фото с UAFPUG-46:Вадим Митин вкратце рассказывает о разработке Generic Animation Format: Нас было немного: Но интересно: Баги Flash IDE достали!На встрече мы собрали список самых назойливых багов Adobe Flash IDE. Причешем его и устроим витруальный майдан Адобу. Присылайте свои жалобы на Flash в комменты или на мою почту rostislav.siryk. Спасибо всем, кто пришел и был с нами онлайн! Гду будет следующий фпуг?Следующая встреча пройдет в городе, жители которого первыми предложат два доклада. Прошу писать в комменты или на почту выше: кто о чем хочет рассказать. Указывайте город. Люблю вас!
|