xml parsing error trapping in libxml

11/11/2009 - autor: riasol

zmodyfikowany przykład z dokumentacji php. Oryginalny kod na windows nie pokazywał w której linii/kolumnie jest błąd – problem z końcami linii

public function validateXml($inStr){
libxml_use_internal_errors(true);
$inStr=preg_replace("/\r/","\n",$inStr);
$doc = simplexml_load_string($inStr);
$xml = split("\n", $inStr);
$ret=false;
if (!$doc) {
$ret='';
$errors = libxml_get_errors();
foreach ($errors as $error) {
$ret.= $this->formatXmlError($error, $xml);
}
libxml_clear_errors();
}
return $ret;
}
private function formatXmlError($error, $xml)
{
$return = $xml[$error->line - 1] . "\n";
$return .= str_repeat('-', $error->column) . "^\n";

switch ($error->level) {
case LIBXML_ERR_WARNING:
$return .= “Warning, code $error->code: “;
break;
case LIBXML_ERR_ERROR:
$return .= “Error, code $error->code: “;
break;
case LIBXML_ERR_FATAL:
$return .= “Fatal Error, code $error->code: “;
break;
}

$return .= trim($error->message) .
“\n Line: $error->line” .
“\n Column: $error->column”;

if ($error->file) {
$return .= “\n File: $error->file”;
}

return “$return\n”.str_repeat(‘.’, 40).”\n\n”;
}

explorer 8 stage.stageHeight fix

21/10/2009 - autor: riasol


package flashprolib.fix {
import flash.display.DisplayObjectContainer;
import flash.display.Sprite;
import flash.events.TimerEvent;
import flash.utils.Timer;

/**
* Poprawka bedu występującego w iexpore 8: stage.stageWidth ( stage.stageHeight ) ma wartość 0
* przy korzystaniu z swf zapisanego w cache
*/
public class IEStage extends Sprite {
private var handle:Function
private var tmr:Timer;
/**
* @param container DisplayObjectContainer do którego dołączony zostanie fix
* @param method Function metoda która zostanie wywołana po zaistnieniu wartości stageWidth>0
* Using:
* var fix:IEStage=new IEStage(this,startDisplayObejcts)
*/
function IEStage(container:DisplayObjectContainer, method:Function) {
handle=method
container.addChild(this)
tmr=new Timer(20)
tmr.addEventListener(TimerEvent.TIMER, testStageSize)
tmr.start()
testStageSize()//wywołanie, które zadziała dla browser != ie8, żeby nie było opóźnień
}
private function testStageSize(e:TimerEvent=null):void {
if(stage.stageWidth > 0 && stage.stageHeight > 0) {
tmr.removeEventListener(TimerEvent.TIMER, testStageSize)
handle.apply(parent)
parent.removeChild(this)
}
}
}
}

locale, mxmlc, ant

18/10/2009 - autor: riasol

Kroki niezbędne do kompilacji projektu

  1. We FLEX_SDK_HOME/bin: copylocale.exe en_US pl_PL
  2. Zakładając standardowy projekt flexbuildera,  *.properties w katalogu src/locale/pl_PL. Parametry mxmlx -source-path+=${workspace}/${ant.project.name}/src/locale/{locale}  -locale pl_PL lub -locale=en_US,pl_PL

configuration variable ‘target-player’ must only be set once

24/07/2009 - autor: riasol

Frustrujący komunikat flexbuildera. Powodem był forma zapisu opcji w .actionScriptProperties

winno być -target-player=10 zamiast -target-player 10 .

flex componets lifecycle- niezwykłości

02/07/2009 - autor: riasol

removed before created ;)

container generuje zdarzenia Event.REMOVED_FROM_STAGE w trakcie tworzenia, prawdopodobnie przy sprawdzaniu scrollbars. Tak więc nie wolno w mxml ustawić chandlerów creationComplete i removedFromStage gdyż drugi wywoła się wcześniej, można np. w as w chandlerze  creationComplete dodać manualnie obsługę Event.REMOVED_FROM_STAGE

ref: http://jonathanbranam.net/book/export/html/1

Ogólne rozwiązanie może wynikać z przypadków uzycia obsługi _REMOVED_FROM_STAGE – zazwyczaj to czyszczenie pmięcie przy usuwaniu elementu z widzianych elementów. Można więc zastosowac algorytm, że przed prawdziwym usunięciem ustawia się z zewnątrz flage  i tylko wówczas w ciele metody obsługi zdarzenia wykona się blok kodu. Dla ModuleLoader bedzie to taki pseudokod:

//loader jest instancją ModuleLoader, BaseModule to klasa rozszerzająca Module

if(loader.child is BaseModule){
BaseModule(loader.child).unloading=true
}

//w obsłudze REMOVED_FROM_STAGE w klasie rozszerzającej BaseModule

if(unloading){//wykonaj blok

}

użycie swf z flash ide w actionscript – uwagi

02/07/2009 - autor: riasol
  1. Podwójna instancja obiektu na timeline w jedenej klatce może spowodować że w kolejnej klatce nie można uzyskać odniesienia do obiektu o takiej samej nazwie.

flasplayer10 3d

09/06/2009 - autor: riasol

flash-3d_basic

Model 3d w fp

punkt zanikania jest ustawiany raz – przy starcie, przy zmianach rozmiaru filmu trzeba go ekstra ustawiać

root.transform.perspectiveProjection.projectionCenter=new Point(stage.stageWidth/2,stage.stageHeight/2);

flexbuilder3 kompiluje przy użyciu flex sdk4.0 beta

tester możliwości 3d

flash player debugger na ubuntu

02/06/2009 - autor: riasol

Dla testu postanowiłem zainstalować flashplayer na ubuntu. Nie znalazłszy pakietu pobrałem archimum z adobe i skopiowałem bibliotekę *.so do /usr/lib/flashplayer-installer

ExternalInterface – tworzenie javascript w actionscript

23/05/2009 - autor: riasol

Można więcej w actionscript. Zamiast pisać równolegele w javascript możliwe jest stworzenie kodu js z wnętrza swf. np.

if(ExternalInterface.available) {
ExternalInterface.call('document.insertScript=function(){window._getTitle=function(){' +
'return document.title;' +
'};}')
}

Najważniejsze jest wywołanie ..document.insertScript… – jest to używcie metody, która tworzy nową metodę w DOM oszadzającego dokumentu. Sprawdzone we flex

cache’owanie swf – definitywne rozwiązanie

19/05/2009 - autor: riasol

Kolejny raz problem z swf który lezy w cache proxy. Mam pomysł na globalne rozwiązanie, może znajdę czas by go zrealizować. Pomysł: zakładam że html osadzający, czy js, czy statyczny nie będzie cacheowany.

  1. Wstawiam w kod html znacznik cache,
  2. w pliku swf wkoplilowuję zmienną równą znacznikowi cache. Wkopilowanie jest proste jeśli to flex sdk, dla swf typu baner kompilowany przez grafika musi to być zmiana kodu as, może jslt (ale chyba nie bo nie ma tam generowania zdarzenie np.  onsave)
  3. kod (w as3, 2 może nawet 1)  porównuje i jeśli różne to komunikuje się z js który jeszcze raz wygeneruje kod osadzający ze zmiennymi dodanymi do ścieżki swf ( .swf?v123 ). Musiałby tu być znacznik z zapisem do LocalSharedObject żeby ograniczyć możliwość wystąpienie wielokrotnego ładowania

Na serwerze testowym chyba najprościej użyć mod_header w apache

LoadModule headers_module modules/mod_headers.so
<FilesMatch “\.swf$”>
Header set Cache-Control no-store
</FilesMatch>