SoundManager 2 is Audio for Javascript.
SoundManager 2 is an attempt at providing the sound API which Javascript has been missing. It's a Javascript library which wraps and extends Flash's sound capabilities, bringing cross-platform audio functionality to Javascript.
Disclaimer: This is comedy jokes. Sense of humour required.
SoundManagR 2.0 Betatm is a social, long-tail-oriented RIA-based enterprise javascript sound platform which leverages streaming AJAX push technology, Web 2.0, and leveraging. Including plenty of ajaxy goodness, this turn-key, SOA-based and Ajax-enhanced platform will take your Rich Enterprise Applications to the next level, connect the dots and move the needle when mashed up with Web 2.0 collective wisdom of the crowd-wowing features such as drag and drop, auto-complete and real-time performance thanks to enterprise mashup servers.
By leveraging the collective blogosphere and rich folksonomy aspects of the web, it is expected that these supporting technologies may be joining the RIP (Rich Internet Professionals) and DOA (Development Of Asininity) groups within the next few years.*
Woah, cutting-edge semantic web goodness!
"Web 3.0" hasn't been defined yet, but I'm sure it'll be really semantic, have new buzzwords and there will be conferences about it.
Of course 2.0 is still cool, but 3.0 is the new ZOMG. SoundManager "Semantic Web Edition" of course is going to leverage the *#@! out of this. How, you ask? Why, with "platforms", "openness", being "open" and "opening up" of course! It'll be a "software-as-an-API-as-a-platform-as-a-service" service-type offering, naturally "cloud"-based to be sure. Perhaps it'll include a widget or two, and maybe a Facebook app to manage your "social graph" (though I hear those are going out of style because nobody likes "walled gardens" any more...)
<jokes />
.. Actually, that's your job, gentle reader: Use this if it works, and go build cool stuff.
SM2 was originally designed as a personal utility, freely shared with the hopes of being useful to others. It should be immune to IPOs, Web x.0 nonsense, buzzwords and VCs. ;)
Demos
Less Talk, More Show.
Some examples of Javascript-driven sound, and applications implementing SoundManager 2:
-
"Page as a playlist" | ..with debug output
Muxtape.com-style UI example, list of playable links with loading/progress/timing display and controls
-
"Make MP3 links playable in-place"
A simple way to play MP3 links "in-place" on a page, easily skinned with CSS.
-
jsAMP MP3 Player Alpha demo | ..with debug output
Experimental MP3 player demo app / API test suite.
-
A drum machine/sampler-style demo.
-
Example illustrating sequencing/timing issues.
-
Simple API call examples.
Getting Started
"I'd like to use this on my site. Where do I start?"
No problem! See this template example which shows the basic requirements of SoundManager 2. (For technical requirements, refer to Requirements + Specifications.)
Like a fine whiskey, SoundManager should come with a disclaimer that reads, "Use Responsibly." You should know when to stop, too.
Licensing
SoundManager 2 is provided free of charge under a BSD license. If you find a nifty or innovative use for it (or just want to comment), feedback is always appreciated.
Download
Current version: 2.5b.20080525
Note: Loading/init routine has been rewritten since 2.2 to be much faster, somewhat experimental; please report any bugs! :)
SoundManager v2.5b.20080525 (~1.5 MB, .zip)
Includes API, ActionScript source, documentation, examples and demos.
Archived beta version (older, onerror()-based startup method): 2.2.20080420 (1.44 MB, .zip)
Basic Use
Adding SoundManager 2 to your page
A single Javascript include will link in all of the required code for the library, which will automatically begin loading either at document.onDOMContentLoaded()
if supported, or alternately, after window.onload()
(eg., IE 6 and others.) The default behaviour is to start "as soon as possible", but the library can be configured to wait for window.onload()
in all cases as well. Loading and initialisation are separate events, and are detailed below.
Once initialised, SM2 will call either soundManager.onload()
or soundManager.onerror()
, event handlers which you can define just as with window.onload()
.
Including SoundManager
Within <head>
:
<script type="text/javascript" src="soundmanager2.js"></script>
Alternate "minified" version (no debug output nor comments, ~50% reduction in file size):
<script type="text/javascript" src="soundmanager2-nodebug-jsmin.js"></script>
For a live example of this code, check the template example.
SoundManager's Asynchronous Nature
SM2 will successfully initialise when the SoundManager Flash controller (movie) has loaded and makes a successful callback to Javascript. (Or in Safari's case when you open a tab in the background, "when the tab finally receives focus and the Flash movie loads" - even though window.onload()
may have already fired. Fun, eh? ;))
The key point to remember with SM2 is that it will load asynchronously and its onload/onerror handlers may be called either long before or after window.onload()
, depending on a number of factors. For this reason, do not rely on soundManager's onload event to trigger the start of your own app; use the standard "DOM ready" or window load event handlers instead.
Because sound may not become available for some time (eg., Safari and the specific "background tab" use case), ideally your code should be able to handle sound becoming available after your application has initialised itself. Setting a simple "sound enabled" variable in your code could be one way to do this.
Successful Initialisation
Once SoundManager has initialised and soundManager.onload()
has fired (onload() example), sounds may be created, loaded and played in one call using minimal parameters.
Example SoundManager calls you can make within soundManager.onload()
:
soundManager.play('mySound','/path/to/some.mp3');
Sounds can also be created without automatically loading or playing, for later use:
soundManager.createSound('myNewSound','/path/to/some.mp3');
Once defined, sound objects have methods and properties which can be accessed by the soundManager controller.
soundManager.play('myNewSound');
soundManager.setVolume('myNewSound',50);
soundManager.setPan('myNewSound',-100);
Initialisation Failure + Error Handling
In the event SoundManager encounters an error during loading, it will silently fail and disable itself; all subsequent calls to the soundManager controller object will return false. If defined, soundManager.onerror()
will be called rather than soundManager.onload()
. If debug mode is enabled, error messaging will be written to the Javascript console and/or browser.
Flash Security: Sandbox Types
Flash has a few different sandbox modes; effectively, a Flash movie cannot have access to both the local file system and remote (network/internet) resources simultaneously unless specifically granted access (ie., by whitelisting in the Flash security settings panel.) By default, Flash will be given access to the hosting environment, but not the other. When viewing SM2 demos on your local file system, you may see these warnings as internet URLs may not be loaded by default. When served over HTTP, internet URLs may be loaded but not local filesystem resources by default.
Once initialised, soundManager.sandbox.type
will give the Flash-defined sandbox type; for determining restrictions, the following booleans will be defined (initially as null, then false or true once determined): soundManager.sandbox.noRemote
and soundManager.sandbox.noLocal
. In the event SMSound.onload()
fires and the loaded
property is false, either a 404 (file not found) or flash security error has likely occurred.
The most common-encountered sandbox types are "remote" (when on the web/HTTP), "localWithFile" and "localTrusted" (when opened from a hard drive directly, and in the latter case, when "whitelisted" under the flash player global security settings panel [see here].)
Debugging + Console Support
During development, SoundManager may throw custom errors to help debugging. For post-live testing, debug mode can be forced by appending debug=1
somewhere in the URL (eg. #debug=1
or ?debug=1
) and refreshing the page. In the event pre-onload() errors are preventing debug messages, debug=alert
may serve as a last-effort debugging tool. You may also view some live debug output on this page.
Supported debug tool/browser consoles:
- Firefox, via Firebug (console[log|warn|info|error])
- (Theoretically) any UA supporting console.log(string) natively, including Opera + Safari
For those browsers without native console support (or when configured to echo to both console and browser), an element with CSS matching div#soundmanager-debug
will be created and appended to the document as soon as possible. Messages will be appended in reverse order in-browser to ease reading, with most recent at the top. You may put this element (an empty DIV with the debug ID) in your page's HTML, and can then apply your own CSS to make it look pretty.
For configuring default debug behaviour, see SoundManager Global Properties.
SoundManager onload() Equivalent
This is a user-defined onload-style function implemented by SoundManager. Because of the overhead associated in creating and initialising the Flash and Javascript code necessary for SoundManager to function, a separate "onload"-type function is provided so your code can hook into it.
soundManager.onload = function() { // soundManager should be ready to use/call at this point soundManager.createSound('mySound','/path/to/mysoundfile.mp3'); soundManager.play('mySound'); }
Keep in mind that this event is asynchronous and may be called long before or after window.onload()
, depending on circumstances; therefore, it should not be used as the trigger for initialising your core application code. It only serves as an indicator of SoundManager's availability (ie., "ready to use.")
SoundManager onerror() Equivalent
If something breaks after Flash attempts to make a call to "JS-land" and vice-versa, soundManager.onerror()
should be called if defined. (Note that soundManager.onload()
will not be called given the failure.) You can assign a handler here to be notified of failure, and take appropriate action. Again, note that this event is also asynchronous and not attached to window.onload()
.
soundManager.onerror = function() { // soundManager failed to initialise - ExternalInterface or other JS error, or missing/old Flash plugin // Notify user if needed, disable sound-specific functionality etc. }
Forcing "delayed" / conservative initialisation
If you would like SoundManager to always wait for window.onload()
to fire before calling soundManager.onload()
or .onerror()
, you may set soundmanager.waitForWindowLoad = true;
A delayed init can be useful when creating and preloading sounds immediately for example, as sounds loading after window.onload()
will not slow down the document loading process itself.
By default, SoundManager will try to initialise and call a user-defined onload function before window.onload()
if possible.
SoundManager supported() Method
If you would prefer to call a function to determine the state of SM2 at various times, soundManager.supported()
will return a boolean based on 1) An initialisation attempt, and 2) A successful result. This also means that calling supported()
prior to SM2's initialisation/onload/onerror process will return false until support has ultimately been determined.
Object Literal Format
Sounds can be created with instance-specific parameters in an object literal (JSON) format, where omitted parameters inherit default values as defined in soundManager.
soundManager.createSound({
id: 'mySound',
url: '/path/to/some.mp3',
autoLoad: true,
autoPlay: false,
onload: function() {
alert('The sound '+this.sID+' loaded!');
},
volume: 50
});
This object can also be passed as an optional argument to the play
method, overriding options set at creation time.
For a full list of available options, see Sound Properties Object
SoundManager API
The following are methods, collections, properties and event handlers provided by the globally-scoped soundManager
Javascript object. Both sound properties and methods can be set on a global (inherited) default, or per-sound basis.
SoundManager Core Methods
- object:SMSound createSound(object:options)
- Creates a sound with an arbitrary number of optional arguments. Returns a
SMSound
object instance. -
Example:
soundManager.createSound({ id: 'mySound', // required url: '/audio/mysoundfile.mp3', // required // optional sound parameters here, see Sound Properties for full list volume: 50, autoPlay: true, whileloading: soundIsLoading // remember to omit comma on the last item });
Each
createSound
call results in the creation of aSMSound
object which stores all properties, methods and events relevant to that particular sound instance.Individual sound objects can also easily be referenced as returned from
createSound
:var mySoundObject = soundManager.createSound({ id: 'mySound', url: '/audio/mysoundfile.mp3' }); mySoundObject.play(); // new SMSound object reference, equivalent to referencing soundManager.getSoundById('mySound')
(Note: Code formatting is stylistic, not necessarily recommended.) See Object Literal Format.
- createSound(id:string,url:string)
- Creates a sound with the specified ID and URL (simple method.)
- Example:
soundManager.createSound('mySound','/audio/mysoundfile.mp3');
- destroySound(id:string)
- Stops, unloads and destroys a sound specified by ID.
- Example:
soundManager.destroySound('mySound');
- didCreate:boolean play(id:string,[options object])
- Starts playing the sound specified by ID. (Will start loading if applicable, and will play ASAP.)
- Optionally, returns a boolean value indicating "sound created", ie. if the related sound object didn't exist prior to this call and was created to do so.
- Example:
soundManager.play('mySound');
- Note that the second parameter,
options object
, is not required and can take almost any argument from the object literal format (eg. volume.) These should be applied on an instance-specific basis (only overriding existing options for this play instance), but may persist due to an incomplete implementation. (To be fixed.) - Example:
soundManager.play('mySound',{volume:50,onfinish:playNextSound});
- setPosition(id:string,msecOffset:integer)
- Seeeks to a given position within a sound, specified by miliseconds (1000 msec = 1 second.)
- Example:
soundManager.setPosition('mySound',2500);
- Can only seek within loaded sound data, as defined by the duration property.
- pause(id:string)
- Pauses the sound specified by ID. (Does not toggle.)
- Example:
soundManager.pause('mySound');
- resume(id:string)
- Resumes the currently-paused sound specified by ID.
- Example:
soundManager.resume('mySound');
- togglePause(id:string)
- Pauses/resumes play on the sound specified by ID.
- Example:
soundManager.pause('mySound');
- setVolume(id:string,volume:integer)
- Sets the volume of the sound specified by ID. Accepted values: 0-100
- Example:
soundManager.setVolume('mySound',50);
- mute([id:string])
- Mutes the sound specified by ID. If no ID specified, all sounds will be muted.
- Example:
soundManager.mute('mySound');
- unmute([id:string])
- Unmutes the sound specified by ID. If no ID specified, all sounds will be unmuted.
- Example:
soundManager.unmute('mySound');
- setPan(id:string,volume:integer)
- Sets the stereo pan (left/right bias) of the sound specified by ID. Accepted values: -100 to 100 (L/R, 0 = center)
- Example:
soundManager.setPan('mySound',-80);
- stop(id:string)
- Stops playing the sound specified by ID.
- Example:
soundManager.stop('mySound');
- stopAll()
- Stops any currently-playing sounds.
- Example:
soundManager.stopAll();
- unload(id:string)
- Stops loading the sound specified by ID, canceling any current HTTP request.
- Example:
soundManager.unload('mySound');
- Note that SoundManager does this by loading a new, tiny "stub" MP3 file,
./data/null.mp3
, which replaces the current one from loading. This is defined in the SM2 global object asnullURL
, and can be edited. - getSoundById(id:string)
- Returns an
SMSound
object specified by ID. - Example:
var mySMSound = soundManager.getSoundById('mySound');
- loadFromXML(xmlURL:string)
- Loads and creates sounds as defined in a SoundManager v1 XML file (legacy)
- Note that per-sound options are not supported with this method, and sound objects will be created immediately upon loading and parsing of the XML. The sounds will inherit the
defaultOptions
settings, with the exception of thestream
attribute as set in the XML (true if defined, defaultOption applied if omitted.) - Example:
soundManager.loadFromXML('/path/to/some.xml');
- XML format example: MPC drumkit XML file
- supported:boolean supported()
- Returns a boolean indicating whether soundManager has attempted to and succeeded in initialising. This function will return false if called before initialisation has occurred.
- Example:
var isSupported = soundManager.supported();
Sound Properties Object
The soundManager.defaultOptions
object contains parameters which are inherited by default when sounds are made via createSound
. They can be overridden on a per-sound basis at create time, or changed dynamically in some cases. Note that none of these options are required when calling createSound
, as the defaults will be inherited if unspecified.
soundManager.defaultOptions
apply the properties and event handlers as specified above. Defaults are shown below as an example.
soundManager.defaultOptions = {
'autoLoad': false, // enable automatic loading (otherwise .load() will be called on demand with .play()..)
'stream': true, // allows playing before entire file has loaded (recommended)
'autoPlay': false, // enable playing of file as soon as possible (much faster if "stream" is true)
'onid3': null, // callback function for "ID3 data is added/available"
'onload': null, // callback function for "load finished"
'whileloading': null, // callback function for "download progress update" (X of Y bytes received)
'onplay': null, // callback for "play" start
'onpause': null, // callback for "pause"
'onresume': null, // callback for "resume" (pause toggle)
'whileplaying': null, // callback during play (position update)
'onstop': null, // callback for "user stop"
'onfinish': null, // callback function for "sound finished playing"
'onbeforefinish': null, // callback for "before sound finished playing (at [time])"
'onbeforefinishtime': 5000, // offset (milliseconds) before end of sound to trigger beforefinish..
'onbeforefinishcomplete': null,// function to call when said sound finishes playing
'onjustbeforefinish': null, // callback for [n] msec before end of current sound
'onjustbeforefinishtime': 200, // [n] - if not using, set to 0 (or null handler) and event will not fire.
'multiShot': true, // let sounds "restart" or layer on top of each other when played multiple times..
'position': null, // offset (milliseconds) to seek to within loaded sound data.
'pan': 0, // "pan" settings, left-to-right, -100 to 100
'volume': 100 // self-explanatory. 0-100, the latter being the max.
}
Note: For live examples, see the code behind the jsAMP MP3 Player demo which uses much of this functionality.
SMSound (Sound Object) Properties
Each createSound()
call generates a matching SMSound
(sound instance) object, which lasts for the life of the page or until explicitly destroyed. Each instance stores stateful information (eg. playState
) and provides event handlers for state changes (eg. onload()
.)
- sID
- Sound ID string as provided from
createSound()
orplay()
. - If an ID is known, the related SMSound object can be retrieved via
getSoundById
or directly referencingsounds[sID]
on the SoundManager global object. - url
- The specified URL from which the sound is loaded.
- id3
- An object literal populated, if applicable, when ID3 data is received (related handler:
onid3()
) - For property details, see onid3().
- bytesLoaded
- The number of bytes currently received while loading a sound.
- bytesTotal
- The total number of bytes to be downloaded, while loading a sound.
- position
- The current location of the "play head" within the sound, specified in milliseconds (1 sec = 1000 msec).
- duration
- The current length of the sound, specified in milliseconds.
- Note that during loading, this property reflects the length of downloaded data, not the full length, until completely loaded (see whileloading().) For an approximate "full duration" value while loading, see
durationEstimate
. - durationEstimate
- The estimated duration of the sound, specified in milliseconds.
- Due to the dynamic nature of
duration
while loading, this attempts to provide the full duration by calculatingparseInt((self.bytesTotal/self.bytesLoaded)*self.duration)
and is updated with eachwhileloading()
interval. - Once the sound has fully loaded,
duration
should be referenced as it will contain the final and accurate value. - Note that this method works only with Constant Bitrate (CBR)-encoded MP3s due to the consistent data/time assumption. VBR-encoded MP3s will give inaccurate results.
- loaded
- Boolean value indicating load success as returned from Flash. True indicates success, False is a failure or strangely, a successful load (?) from cache.
- Because of the potential for false positives,
duration
and other properties could be checked as a test of whether sound data actually loaded. For more granular state information, see readyState. - playState
- Numeric value indicating the current playing state of the sound.
- 0 = stopped/uninitialised
- 1 = playing or buffering sound (play has been called, waiting for data etc.)
- Note that a 1 may not always guarantee that sound is being heard, given buffering and autoPlay status.
- paused
- Boolean indicating pause status. True/False.
- Treat as read-only; use
pause()
,resume()
andtogglePause()
methods to affect state. - readyState
- Numeric value indicating a sound's current load status
- 0 = uninitialised
- 1 = loading
- 2 = failed/error
- 3 = loaded/success
- didBeforeFinish
- Boolean indicating whether
beforeFinish()
condition was reached. - didJustBeforeFinish
- Boolean indicating whether
justBeforeFinish()
condition was reached.
SMSound (Sound Object) Events
Not unlike common javascript objects, each SoundManager SMSound
(sound instance) object can fire a number of events including onload
and others. Functions can be assigned and will be called as needed, and are scoped to the relevant sound object. Specifically, the this
keyword will point to the sound object on which the event fired such that its properties can easily be accessed - eg. within an SMSound
event handler, this.sID
will give the sound ID.
- onload(boolean:success)
- Fires on sound load. Boolean reflects successful load (true), or fail/load from cache (false).
- False value should seemingly only be for failure, but appears to be returned for load from cache as well. This strange behaviour comes from Flash. More detail may be available from the Flash 8 sound object documentation.
- Failure can occur if the Flash sandbox (security) model is preventing access, for example loading SoundManager 2 on the local file system and trying to access an MP3 on a network (or internet) URL. (Security can be configured in the Flash security panel, [see here].)
- whileloading()
- Fires at a regular interval when a sound is loading and new data has been received. The relevant, updated property is
bytesLoaded
. - Example handler code:
soundManager._writeDebug('sound '+this.sID+' loading, '+this.bytesLoaded+' of '+this.bytesTotal);
- Note that the
duration
property starts from 0 and is updated duringwhileloading()
to reflect the duration of currently-loaded sound data (ie. when a 4:00 MP3 has loaded 50%, the duration will be reported as 2:00 in milliseconds.) However, an estimate of final duration can be calculated usingbytesLoaded
,bytesTotal
andduration
while loading. Once fully-loaded,duration
will reflect the true and accurate value. - onplay()
- Fires when
sound.play()
is called. - whileplaying()
- Fires at a regular interval when a sound is playing, and a position (time) change is detected. The relevant, updated property is
position
. - Example handler code:
soundManager._writeDebug('sound '+this.sID+' playing, '+this.position+' of '+this.duration);
- onpause()
- Fires when a sound pauses, eg. via
sound.pause()
. - Example:
soundManager.mute('mySound');
- onresume()
- Fires when a sound resumes playing, eg. via
sound.resume()
. - Example:
soundManager.unmute('mySound');
- onstop()
- Fires when
sound.stop()
is explicitly called. For natural "sound finished"onfinish()
case, see below. - onfinish()
- Fires when a playing sound has reached its end. By this point, relevant properties like
playState
will have been reset to non-playing status. - onbeforefinishcomplete()
- Fires when a sound has finished,
onfinish()
has been called, but before the sound play state and other meta data (position, etc.) are reset. - onbeforefinish()
- Fires when a playing, fully-loaded sound has reached
onbeforefinishtime
(eg. 5000 msec) from its end. - onjustbeforefinish()
- Fires approximately
justbeforefinishtime
before the end of a fully-loaded, playing sound. - This is based on a polling approach given SM2 must track the sound's position, and is approximated (eg. a 200 msec value may fire at 187 msec before the end of the sound.)
- onid3()
- Fires when ID3 data has been received. Relevant property is
id3
, which is an object literal (JSON)-style object. Only fields with data will be populated. - Note that ID3V2 data is located at the beginning (header) of an MP3 file and will load almost immediately, whereas ID3V1 data is at the end and will not be received until the MP3 has fully loaded.
-
Example handler code:
soundManager._writeDebug('sound '+this.sID+' ID3 data received'); var prop = null; var data = ''; for (prop in this.id3) { data += prop+': '+this.id3[prop]+','; // eg. title: Loser, artist: Beck }
- Refer to the Flash 8 Sound.id3 documentation for a list of ID3 properties.
- When parsing ID3 data, it is best to check for the existance of ID3V1 data first, and apply ID3V2 if no matching ID3V1 data is defined. (V1 should "inherit" from V2, ideally, if available.)
- Note that Flash's cross-domain security restrictions may prevent access to ID3 information, even though the MP3 itself can be loaded. (crossdomain.xml files on the remote host can grant Flash permission to access this.)
SMSound (Sound Object) Methods
SoundManager provides wrappers for all SMSound methods - eg. soundManager.play('mySound')
checks for a valid sound object, and then calls soundManager.sounds['mySound'].play()
on that particular object.
The following methods can be called directly on a SMSound instance. The method calls are the same as the SoundManager global methods documented above for existing sound objects, minus the sound ID parameter.
- play([options object])
- setPosition(msecOffset:integer)
- pause()
- resume()
- togglePause()
- mute()
- unmute()
- setVolume(volume:integer)
- setPan(pan:integer)
- stop()
- unload()
SoundManager Global Properties
SoundManager includes a few global parameters which configure debug mode, flash movie path and other behaviours.
soundManager.url = '/path/to/soundmanager2.swf';
soundManager.debugMode = true; // enable debugging output (div#soundmanager-debug, OR console..)
soundManager.useConsole = true; // use firebug/safari console.log()-type debug console if available
soundManager.consoleOnly = false; // if console is being used, do not create/write to #soundmanager-debug
soundmanager.waitForWindowLoad = false; // force SM2 to wait for window.onload() before calling soundManager.onload()
soundManager.allowPolling = true; // allow flash to poll for status update..
soundManager.nullURL = '/null.mp3'; // URL of silent/blank MP3 to use when unloading/canceling a loaded/loading sound
To modify global SoundManager defaults, edit the main soundmanager2.js file (look for above section in code) or assign new values in your own application script before either window.onDOMContentLoaded()
or window.onload()
fire. (Specifically, both external and inline script blocks which immediately execute are OK.)
Example per-application override:
soundManager.debugMode = false; // disable debug mode
soundManager.defaultOptions.volume = 33; // set global default volume
SoundManager Core Events
The following events are attached to the soundManager
global object and are useful for detecting the success/failure of the API's initialisation.
Keep in mind that these core events are effectively asynchronous (ie., they may fire long before or after window.onload()
) and therefore should not be relied on as the "ready" event for starting your application. Use the standard "DOM content loaded" or window load events for your own initialization routines.
- onload()
- Function called when SoundManager has successfully loaded.
- Example:
soundManager.onload = function() { alert('SoundManager ready to use'); }
- Once this function has been called, all core methods will be available to use.
- Note that
onload()
is not called when SoundManager fails to load; instead,onerror()
is called. - onerror()
- Function called when SoundManager fails to successfully initialise after Flash attempts an init call via ExternalInterface.
- Example:
soundManager.onerror = function() { alert('SoundManager failed to load'); }
- This handler should be called if there is an ExternalInterface problem or other exceptions that fire when the initialisation function is called.
SoundManager Object Collections
- soundIDs[]
- An array of sound ID strings, ordered by creation. Can be used to iterate through
sounds{}
by ID. - sounds{}
- An object literal/JSON-style instance of
SMSound
objects indexed by sound ID (as insounds['mySound']
orsounds.mySound
), used internally by SoundManager.soundManager.getSoundById()
may be used as an alternate to directly accessing this object.
Requirements + Specifications
Prerequisites (client)
- Flash plugin, version 8 or higher
- Supported Browser
Supported Browsers/Platforms
Javascript-to-flash communication is possible through Flash 8's ExternalInterface feature, which (as I understand) uses a standard browser plugin architecture implemented by each browser manufacturer (see NPAPI.) As a result, the following browsers should be supported:
- IE 5.0+, Win32
- Netscape 8.0+, Windows/Mac
- Mozilla 1.7.5+, Windows/Mac
- Firefox 1.0+, Windows/Mac
- Firefox 1.5+, Linux (Flash 9 beta)
- Safari 1.3+, Mac
- Opera 9.10+ (slightly buggy, 9.5+ ideal), Windows/Mac
For reference, see Adobe's ExternalInterface support page which documents supported browsers.
At this time, not all combinations of browser/OS have been tested. Some unlisted configurations may be supported, but have not been explicitly verified to work.
Unsupported Configurations
The following browser/OS combinations have been reported as buggy, or may be unsupported:
- Konqueror (version unknown)
Caveats + Limitations / FAQ
Supported sound format (MP3-only, with caveats)
SM2 uses Flash's native Sound object for loading and managing sound, so it is subject to the same limitations that Flash 8 is. Perhaps a design decision, the Flash 8 sound object only supports MP3 files through the loadSound()
ActionScript method. SM2 is not able to load other sound formats, including audio-only SWF files, due to this limitation. Refer to the Flash 8 sound object documentation for details.
MP3 Format Caveats
Additionally, some very low and very high bitrate MP3s, and Variable Bitrate (VBR) MP3s may play either too quickly or too slowly (see "the chipmunk problem"); if you are encountering this issue, try re-encoding at a different bitrate (between 64 kbps and 192 kbps, for example.) Using Constant Bitrate (CBR) encoding may also alleviate this problem.
It has been suggested that sample rates that are neither 22/44 KHz can also contribute to this issue. 44 KHz is the standard CD-spec sample rate, and is recommended for "hi-fi" recordings.
Looping + multi-shot (overlaying)
Perhaps due to the way Flash dynamically loads and decodes MP3 data, seamless looping doesn't seem to be fully implemented. Loops have a noticeable gap between the finish and start. This has been an issue since the original version of SoundManager. Rather than have a broken feature, the funcionality has been omitted until a solid workaround is found.
Regarding overlaying, even though a multi-shot option can be specified, it does not work in practice; a single instance of a sound can only have one timeline. The current behaviour is that when multiShot
is specified and play()
is called on a currently-playing sound, it will restart from the beginning without an overlay.
However, the API does provide some creative ways (onbeforefinish
for looping, multiple sound objects for multi-shot layering) of working around these Flash limitations.
It should be noted that sounds can loop seamlessly and be layered when linked and exported to SWF from within the Flash IDE, but SoundManager does not support SWF-based audio.
ID3 Parsing
ID3 data can differ in formatting, version and subsequently be oddly-parsed by Flash. Values may sometimes be repeated across different fields.
ID3 info seems to fail to load for iTunes 7-edited files, perhaps due to the format or inclusion of album artwork (image data.)
Performance Notes: Caching + RAM Obeservations
Flash appears to use the browser cache (presumably the OS' native, or closest browser,) so the browser's cache size and other settings may affect Flash's cache behaviour. It is safe to assume a 100 MB MP3 will probably not be cached, for example, but a 16 MB one most likely will be.
MP3s appear to be loaded and stored in RAM while loading over HTTP, so memory use needs to be considered for both large MP3s and streaming radio-type applications.
Timing/Latency (JS + Flash, ExternalInterface-related)
Javascript-to-Flash communication is not instantaneous on slower systems, but can be much better on more modern systems. Latency (timing lag/delays) can be noted in some cases from function call to sound execution. It is possible some performance analysis can help to speed up this area for timing-critical applications involving animation etc., but this area has not been thoroughly investigated yet. Brad Neuberg has some notes on speeding up ExternalInterface which may be relevant.
Additionally, MP3 files may contain audible gaps at the beginning or end by default when encoded, even if the source (eg. WAVE) file did not. Using optional "nogap" encoding options with programs such as LAME may help to remedy this.
Revision History
-
V2.5b.20080525 (current)
The latest and greatest. (Download)
- Added
waitForWindowLoad
for delayed init - Added
onpause()
andonresume()
event handlers - Added
mute()
andunmute()
- Updated demos, revised documentation
- Added
-
V2.5b.20080505
- To improve startup time,
soundManager.go()
(createMovie()
alias) now fires atdocument.onDOMContentLoaded()
by default if supported. (Otherwise, falls back towindow.onload()
.) - Improved initialisation routine -
soundManager.onerror()
is called when the Flash init "times out." Specifically,onerror()
is called when Flash fails to make an ExternalInterface (Flash-> JS) call to SM2 within 1 second ofwindow.onload()
firing. - Added logic to handle special Safari delayed init case (Flash not loading when in a new, unfocused tab until focused) as a exception to the above.
- Added better exception handling + debug messaging for initialisation failure cases (Flash security restrictions due to loading from local file system, no flash support, no ExternalInterface support etc.)
- Updated .swf appendChild() target to use best-to-worst options:
(document.body || document.documentElement || document.getElementsByTagName('div')[0])
- Safari console[log|warn|error]-style messages are now properly formatted.
- Added tons of semicolons to closing braces, eg.
};
- "No-debug", minified version of SM2 included: soundmanager2-nodebug-jsmin.js (17.4 KB, down from full size of 35 KB.) With Gzip compression, file size is ~6 KB. (Commented, debug-enabled version compresses to 10 KB with Gzip.)
- To improve startup time,
-
V2.5b.20080501
Warning: A little experimental too, read details below.
Changelog:
- Rewrote SoundManager initialisation: "Way faster." Communication now initiated from Flash, verification callback then performed by JS; far faster, hopefully more-reliable (TBD.) Init time drastically reduced from seconds to milliseconds in most cases, dependent primarily on Flash movie load rather than
window.onload()
. - Above change also fixes Safari "loading SM2 in background tab" issue, where Safari does not init Flash until background tab comes into focus (when a link is opened in a new, non-focused tab.)
- Current drawback: Difficult to determine, save for falling back to
window.onload()
plus focus methods due to above issue, whether SM2 is actually available or not (ie.,soundManager.onerror()
will not likely be called as in past.) However, thesupported()
method will correctly reflect if SM2 has successfully initialised, for example. - Added sandbox/security model code; SM2 can now tell if it is restricted to either local or internet access only, for example. Helpful in potential debugging errors, plus viewing demos off the local filesystem should no longer throw init errors requiring whitelisting (seemingly due to the new initialisation method.) Win!
- Opera 9.27 has been noted to have some bugs relating to ExternalInterface, seems to be unable to make calls from ActionScript-level methods using
setTimeout()
orsetInterval()
. As a reulst, SoundManager 2 events likeonfinish()
,whileplaying()
andonfinish()
can be sporadically called or missed altogether. No known workaround at this time, but Opera 9.5 (beta 2) does not have this issue. Popular MP3 "mix tape" site muxtape.com uses similar techniques for JS-Flash communication and appears to suffer from the same problem. - Warning: Random crash issue noticed when using IE 6 + 7 and this demo page, calling
createSound()
whensoundManager.defaultOptions.autoLoad = true;
from withinsoundManager.onload()
, for creating + preloading the tab/theme switch sounds. Removing autoLoad=true (leaving the default of false) fixed the crash. Exact reason not determined, perhaps recursive calls or pre-onload issue (?), seems to be isolated to the home page. MPC demo uses autoLoad also, but did not crash. Mentioning just in case. - Updated Muxtape-style demo: More themes, load/security debugging info etc.
- Rewrote SoundManager initialisation: "Way faster." Communication now initiated from Flash, verification callback then performed by JS; far faster, hopefully more-reliable (TBD.) Init time drastically reduced from seconds to milliseconds in most cases, dependent primarily on Flash movie load rather than
-
V2.2.20080420
Changelog:
- More demos! "Page as a playlist" (muxtape.com-style) example, "Make MP3 links playable inline" demo
- Corrected
onStop()
handler inheritance/overriding behaviour (was incorrectly checking defaultOptions) - Added debug output of options object for
createSound()
calls. Full options (result of merging global default + sound-instance-specific options) displayed, helpful in troubleshooting. Event handler function code is intelligently (hopefully) displayed, truncated at 64 characters of first block or end of line, whichever comes first. - Removed most HTML markup from non-HTML (eg. console)
_writeDebug()
calls soundManager.destruct()
writes to console, to be consistent
V2.1.20080331
Changelog:
- Modified
createSound()
to return a sound object if successful (more logical) - Updated
setPosition()
method and addedposition
option parameter, documentation + demo (bugfix) - Corrected
createSound()
andplay()
sound option inheritance/overriding behaviour (eg.position
) to work as expected (most to least important: Method call options -> sound object instance options -> SM2 global options) - Updated
deleteSound()
so Array.splice() is used instead of delete, the latter doesn't cause Array.length to update (bugfix) - Modified debug=alert to only work when debug mode is enabled (potential annoyance aversion)
- Modified
togglePause()
to useposition
option parameter rather than undocumentedoffset
(oops :D) - Added
supported()
convenience method (indicates pass/fail after SM2 has initialised.) - Added disabling debug calls from Flash (performance)
- Added URL hash updating/bookmarking and page title updating to jsAMP demo app
- Updated project page layout
V2.0b.20070415
Changelog:
- Added
destroySound()
method - Made debug output slightly less-verbose (commented out)
- Safety tweak for position-related Flash bug when loading new sounds
- Highly-expanded documentation (
SMSound
events + properties, examples, caveats, FAQs etc.) - Added time-sensitive light/dark theme for documentation
V2.0b.20070201
Second beta?
Changelog:
- Fixed stopAll() bug (previously broken)
- Added
nullURL
parameter - Updated documentation
V2.0b.20070123
V2.0b.20070118
V2.0b.20070115
-
V2.0b.20070107
First beta
-
V2.0a.20060904
Prerelease alpha
"Use Responsibly"
A Word Of Vice
Not every button, link, element or paragraph on the web needs to zoom, move, change colour and be noisy, repetitive and annoying all at the same time. Use your own discretion! :)
Demo Credits
Background Tile
Modified from squidfingers.com (free patterns)
Sound Sources
MPC Demo Sounds downloaded from AKAI.com
Theme switch SFX from user pempi, freesoundproject (Creative Commons Sampling Plus 1.0 License)
Tab switch SFX from user TicTacShutUp, freesoundproject (Creative Commons Sampling Plus 1.0 License)
General
SoundManager was written to meet a desire to have Javascript-driven sound for interactive web-based projects. It is free for use in both personal and commercial projects (see Licensing.) It was originally developed for personal use and has been packaged with the hopes of being useful to others.
Related Projects
JavaScript/DHTML/Flash MP3 players
If you're searching for an included/embedded-type media player, these related projects might of use.
- Yahoo! Media Player supports a number of different formats depending on installed plugins (WMA etc.), can display artist / album information and so on.
- JSSoundkit, an MP3 player with a simple UI.
Links
- SoundManager 2 Project Page (schillmania.com)
- Flash 8 sound object documentation (livedocs.macromedia.com)
- Flash Player Global Security Settings Panel - Configure your Flash Player security, eg., allow SM2 .swf on your local filesystem to have internet access for testing by whitelisting its location eg. file://Users/Administrator/Desktop/soundmanager... etc. Alternately, view the page over HTTP and access internet resources that way.
About
Scott Schiller (contact) is a Front-end Engineer (previously "Web Developer") who builds fun creative and technical stuff on the web - or failing that, tries - when he has free time. He likes building cool things which contribute to, yet enjoys mocking, the Web 2.0 meme. (See How Web 2.0-Aware Are You?)
Debug Output
Live debug info from SoundManager 2, active on this page for demo tests.
If you're seeing errors here or in demos, this info can help in troubleshooting.


EBD - Easton Bible DIctionary
Syntyche
SYNTYCHE
"SYNTYCHE "fortunate; affable, a female member of the church at Philippi, whom Paul beseeches to be of one mind with Euodias (Phil. 4:2,3).
"SYNTYCHE "fortunate; affable, a female member of the church at Philippi, whom Paul beseeches to be of one mind with Euodias (Phil. 4:2,3).


 After that you can call us to change the payment date. Your prepayment will automatically renew in 12 months.  After that you can call us to change the payment date.
Your prepayment will automatically renew in 12 months.
Cancel


KHE CTF
Home
Note:
Do not attempt to bruteforce any challenges, it result in a ban. It's not recommended, it won't work...
{% for name in challenges -%} {% set indexval = loop.index %} {% set ignoreTrue = {'doneVal': False} %}
{{ name }}
Link to challenge {{ loop.index }}
{%- endfor %}


Hi, my name is Andrea Im from living in now in Jumala. You appear to be truly familiar, and I suppose there is no doubt that am sure we have hooked up before, do U remember me? Because I definitely remember you. We have met at a pub a year ago, and we possessed a truly rough party ;).
Message me back and I'll provide U my digits. Im 25, then do not feel stressed! I'm just looking for a incredible time, no other obligations at all, just some type of intimate pleasure.


--- title: Distributed Agile Teams excerpt: date: '2022-07-25 08:11:46 +0100' categories: - Agile - Books - Motivation - Teams image: path: /assets/images/social/distributed_agile_teams.jpg ---
A while ago I wrote about some of my favourite books on effective teams and leadership. I thought I'd expand that post and add some further thoughts on distributed Agile teams.
As one of my primary interests is team and personal development, the remote aspect only makes the job more appealing and challenging. That said, many of the challenges with distributed Agile teams are the same as working co-located, for example communication and collaboration.
The word "remote" in this context refers to being physically distanced from each other. However, if the team hasn't gelled yet, the team members can experience "remoteness" even at the office. The same is true for the wider organisation: existing on-site challenges with organisation-wide communication and collaboration can become even more visible and apparent when working remotely.
To reduce this “sense of remoteness”—whether co-located or distributed—it’s vital to get to know each other, have a shared goal, and build trust, transparency and psychological safety. Forcing people to the office even a few days a week (when that work can be done remotely) is dealing with a symptom rather than the root cause.
One of the Agile principles states that the most efficient and effective method of conveying information to and within a development team is face-to-face conversation
. Certainly so, but the world looked quite different in 2001 when the Agile Manifesto was written. We're still social animals, but today we have new technology that didn't exist in 2001. The goal of the above-mentioned principle is high bandwidth communication.
This is why I want to challenge the notion that co-located teams are a prerequisite for the Agile way of working. As always, it depends, because Agile is fiercely people-first. It's usually better to avoid absolute language. One size does not fit all.
There are at least three important advantages with distributed teams. First, you’ll have access to a wider talent pool. Second, you’re showing that you care about Diversity and Inclusion by empowering people. Third, less commuting means less pollution!
While there are extra challenges with distributed Agile teams, there are many factors why distributed teams can function just as well as co-located teams. Being a digital native certainly helps :)
After working 100% remotely with my team for almost two years (and 50% remotely after that), I’d like to offer some reflections. With distributed teams, you’ll need to do the following things more than usual:
Distributed Agile teams are an opportunity, not a threat. What matters is that you and your team(s) know what to do (the goal), have flexible working agreements (empowerment, trust), have the means and mindset to continuously deliver value (Agile), and lastly, have the ability to learn and improve. Micromanaging, or dictating whether all this should happen co-located or distributed is superficial, masking the fear of letting go of top-down control.
Whatever you do with the wider talent pool that distributed teams enable, ensure high bandwidth communication and collaboration, experiment, explore new ways, and have fun. There are no limits to what a team can achieve together when it has a shared, elevating goal. Keep in mind that one size does not fit every distributed Agile team. Let your teams self-manage where and how they want to do their best work, and you'll get the best and happiest teams.
In my earlier post, I listed some of my favourite books on effective teams and leadership.
I'll conclude this post with some additional good books on distributed teams, unlearning/relearning, and leadership:


Friendly officer Smithers caught you defacing the abandoned Johnson house. Oh no! What are your parents going to say?
You are finished trick or treating for this year. Too bad you lost all your candy to the local officer fund.  Happy Halloween!


{% load static %}
PROGRESSUS: free business bootstrap template by GetTemplate
The difference between involvement and commitment is like an eggs-and-ham breakfast:
the chicken was involved; the pig was committed.
待更新
待更新
待更新
待更新
待更新
待更新
待更新
待更新


part of the Destiny C++ Standard
The current scheme for writing C++ in Granite Foundation is to write a Resource class. This strategy works well for atomic objects, but has been judged too complex for even relatively basic composite classes, and unusably complex for a design with lots of interrelationships among the classes. In addition, many built-in facilities of RSL are available for free to "pure" RSL classes, such as object streaming and tests for equality, are simply not accessible to C++ generically; it requires significant one-off C++ coding for each class that is more complex than the general case. Ironically, Foundation 2.2 C++ Resources which are basically data-oriented are 90% glue code; not only would a pure RSL version of them be significantly smaller, but more efficient and more flexible. In summary, things that a C++ resource must do for which the general case is already provided to pure RSL classes:
Accessor methods
Every instance variable for a C++ class must have Get and Set methods. Not only does this add significant custom code to the objects, these methods must do data translation between C++ classes and RSL. For example, if the account number is stored as a char *, or any other non-Resource class, an equivalent Resource must be created and returned. This means that if this accessor method is called repeatedly, a new Resource will be created every time. This has another side effect, the next point, data duplication.Data duplication
When the accessor method returns a new Resource, now there are two copies of this datum.. If one is changed, now there are two different copies. Like two different watches, like design and implementation, they probably will drift and can't easily be synchronized.A solution?
One obvious first step is to try and store C++ data objects as Resources. This would eliminate the data copying problem of accessor methods except the need to write them, and the data would not be duplicated. Unfortunately, Resources in Foundation 2.2 were not originally intended to be used from within C++ like this, and clearly this places even more limitations on the use of such C++ classes outside of Foundation. It is the desire to be able to write C++ that can be used both inside and outside of Foundation which is driving some of the key design points of Destiny's C++ standard.Object streaming & ECI
Granite Foundation is a foundation for our other products, notably Sculptor and its descendants. ECI - the external client interface - is the mechanism by which these communicate. It requires an object to be able to stream and destream in ECI format. ECI's advantage is its extraordinary dynamic abilities; one can use it to externally control Foundation including parsing and loading of libraries, new class declarations, session instantionation, and arbitrary message passing. RSL classes get this functionality for free - regardless of their complexity. C++ Resources do not, for the same reasons that the rest of their downsides are: object structure is opaque from a dynamic perspective and compiler-implementation dependent as well. In other words, each C++ Resource must implement explicit streaming and destreaming; and again, the ironic reality is that this implementation is more complex for one individual C++ class than it is for the general case in RSL.Object equality
RSL objects get a default member-by-member equality operation for free; not bit comparison, but literally a message to each instance variable. If this is desired for the C++ class, equality operator has to be implemented.Object Assignment
RSL objects get member-by-member assignment for free...the frontier
From one point of view, the above drawbacks are common to all distributed object systems to one degree or another. There is no free lunch, so to speak, and the advantages of meta-level facilities that one needs to do dynamic distributed objects certainly require lots of "glue" code - at least, when using traditional compiled languages.RSL 2.1 and above have slowly introduced much more powerful facilities that simply require object metadata and more advanced built-in functionality to work. For example, in RSL 2.2, one may iterate across the instance variables of a object of any type! foreach instance variable... Facilities like that are the beginning, the essence of the abstract design layer. Compiled C++ is being left behind in this realm because, as even the simple examples above illustrate, this is a hard problem.
A conclusion
There is a way, however, that it can be addressed for C++. There is a way that the advantages of the abstract design layer and RSL can be given to C++ to some degree. It will never be as fluid as RSL is, but that isn't bad - we don't want that to be the case; that is what dynamic languages are for.What we need, however, is an efficient way for arbitrarily complex C++ to work as seamlessly as possible with RSL - so that the advantages of both systems are as complementary as possible.


A recent NIST net posting discusses its status. The article is titled, "High-Performance Composites for Large Commercial Structures" describes an ongoing ARPA project..
An SBIR project involving SCRIMP is also ongoing in the aircraft industry.
A large sailboat has been built using the SCRIMP technology. Some nice photos of the construction are available on the web site http://paw.com/sail/jboats/j32updte.htm.
Patent 5,439,635 was recently granted for a bag used in the process.
A basic article describing the current use of fiberglass in boat hulls, "Fiberglass: Just for the Hull of It" can be found in the July 27, 1995 issue of Machine Design on pages 54-58.
Return to Recreational Boat Building Industry Home Page


--- layout: post permalink: surveyupsell.html Tags: Array NameOfCoupon: Survey Upsell Cash Back Summary: See our Survey Upsell Coupon Code, Survey Upsell Rebate, Survey Upsell Promo Code, Survey Upsell Discount, Survey Upsell Coupon Cash Back Rebate here. MetaKeywords: Survey Upsell Coupon Code, Survey Upsell Rebate, Survey Upsell Promo Code, Survey Upsell Cash Back Rebate, Survey Upsell Discount, Survey Upsell Coupon Image: images/24130.png LinkURL: http://www.shareasale.com/r.cfm?b=192817&u=412002&m=24130 affiliate_url_link: http://www.icouponblog.com/jane.php?id=2211 thesis_readmore: See the Survey Upsell Coupon thesis_thumb: http://www.icouponblog.com/tn.php?merchantURL=surveyupsell.com Title: Save 25% - Survey Upsell Coupon Code for surveyupsell.com. Survey Upsell Rebate & Discount thesis_description: Our Survey Upsell Discount Coupon Code for surveyupsell.com. We have the best Survey Upsell Rebate anywhere. thesis_keywords: Survey Upsell, Survey Upsell Coupon Code, Survey Upsell Discount, Survey Upsell Rebate product_name: Survey Upsell hop_url: http://www.icouponblog.com/hop.php?id=2211 ---
Earn money and gain valuable insight to customers’ and consumers’ thought process and opinions. If you are a webmaster or have a website, you will love what Survey Upsell can do for you. It allows you to create unlimited custom surveys and feedback popup on your websites . You can use these to gain valuable marketing research data from site visitors and customers. Increase sales and optimize your website with Survey Upsell. Use our discount coupons for great savings.
Survey Upsell will provide you with valuable information from visitors to your website when they take the surveys placed in your website by Survey Upsell. When the survey is submitted by the end user a \"Thank you\" page is shown offering the survey taker suggestions about sites, products and services they may wish to try! So SurveyUpsell lets site owners and webmasters find out what people like and want on their sites and let them make money with upsells! It is the perfect sales application for any website owner. Check out Survey Upsell now and benefit from its application.
Survey Upsell is a very valuable tool that will help website owners optimize their profits by gaining valuable feedback into customer’s interest, buying habit and whatever else you want to know. Survey Upsell will allow you to create custom surveys and feedback forms that are easy to use. Survey Upsell will help you make more money, increase sales and your website. Try it out today. Visit .surveyupsell.com today.


Welcome to the first test launch of VoteWise.net. VoteWise is a non-profit non-partisan website where Voters and Politicians can connect without advertising dollars getting in the way.
You and your local politicians can take multiple choice questionnaires and get a simple side-by-side comparison. You can see what they want to do, and maybe more important, you can tell them what they SHOULD do. It’s fun. It’s easy. And it’s absolutely FREE. Don’t let big corporations and special interest groups buy the election with advertising. Stop trying to make sense of vague promises. Connect with your politicians directly and find out what they REALLY want to do if they get into office.


Inside I'm A Celebrity's Roman Kemp's lavish romance with girlfriend Anne-Sophie
The Capital radio star shares his luxury lifestyle with girlfriend Anne-Sophie, and it includes red carpet events, parties and lavish trips
by Brogan-Leigh HurstRoman Kemp boasts a millionaire lifestyle which he's left behind for the I'm A Celebrity Jungle.
The 26-year-old Capital radio DJ is used to the showbiz world, red carpet events and a jet set lifestyle, which he shares with girlfriend Anne-Sophie Flury.
The power couple have been dating since February 2018 and prove they have a loved-up romance by their cosy Instagram snaps.
Anne-Sophie - who is reportedly a neuroscientist - was born in Bern, Switzerland.
Roman's intelligent girlfriend lived and worked in Hong Kong when their romance began and they have since spent most of it long distance.
When the pair of them have spare time on their hands, the couple enjoy travelling together and it frequently makes an appearance on their social media.
During the start of their romance, they met up around the globe including Ibiza, Mexico, Venice and Miami.
As far as their luxury breaks away go, the sweet couple recently visited Formentera in Spain and went skiing in Anne-Sophie's native place.
The hunky presenter raves about his beau on Instagram very often.

And another one gushed: "She's gone back to Hong Kong but had the most amazing birthday weekend with my girl I love you and thank you for all the presents xxx".
As if the trips away aren't enough, Roman and Anne-Sophie also attend the BAFTAs and film premieres across the city, as well as fun nights out together.
But as Roman packed and prepared to head Down Under for I'm A Celebrity, his girlfriend shared the very romantic gift he left behind for her while he's thousands of miles away.
Revealing a different side to the Capital presenter, his partner explained how romantic Roman went to great lengths to ensure she won't be forgotten about while he's in Australia.
"He's left me a two minute video for every day that he can't speak to me," Anne-Sophie revealed. "I'll get to watch one of them every morning.
"He filmed them before he left and put them on a USB stick so I'll have to try and keep it to just one a day," she added.
Do you have a story to sell? Get in touch with us at<EMAIL_ADDRESS>or call us direct 0207 29 33033


Van
Truck
Mini Truck
Motor Bike
Thank You for choosing our website.Quotation will be sent to your Email ID and Contact Number.


Subversion stores everything it needs to know about the files in your repositories and working copies at the ‘folder level’. You can configure special Subversion properties for both folders and files, but folders have a different set of configurable properties than regular files.
When you add or modify a file, you can commit just that one file. But, when you have scheduled a file for deletion, keep in mind that Subversion considers that a change to the folder that contains the file, instead of to the file itself. It's easy to get the hang of, as long as you remember that folders are special in Subversion—and we mean that in a good way.
See the section titled Working copies for a primer on adding, deleting and committing changes.


{% extends 'base.html' %} {% block content %}
This action will remove all your data from Sublimall systems. No recovery.


Mandril is a plugin which provides a security layer to Monkey through rules which can be applied to the request URI or by network address.
For every incoming connection, the plugin take the defined security rules and check at first instance the incoming IP address and then the HTTP request, if some rule matches the server will behave as follows:
If the plugin have not been built in static mode (check with '$ monkey -b'), you can enable the the Mandril plugin through the steps mentioned on Plugins section. The plugin name is monkey-mandril.so, so make sure the plugin entry is Load and the absolute path is correct.
As mentioned there are two type of security mechanism that works at different stages of a live connection. Once a connection is accepted Mandril will check it blacklist rules for restrictions by IP, if there is a match, it will drop the connection. The restriction by URL happens at a later stage. Both security modes requires to have a set of rules in the conf/plugins/mandril/mandril.conf configuration file which are explained below.
note: restrictions by URL requires to set a proper Handler match rule.
An URI represent the relative address of the resource requested through HTTP, a common request looks like this:
GET /documents/ HTTP/1.1
Host: example.com
If we split the first request line in three parts, the first one is the HTTP method, the second the URI and the third one the protocol version used. So if you look to restrict the access to some client requesting a specific URI or using a specific keyword on it, you can add that rule to the RULES section, e.g:
[RULES]
URL documents
URL pictures
URL /private
then is mandatory to add a handler rule in your Virtual Host configuration file (e.g: conf/sites/default):
[HANDLERS]
Match /.* mandril
without the handler Mandril will not be able to apply security rules by URI once a request arrives.
You can define multiple rules to deny the access to a specific IP address or a network range, most well known as a sub-network, e.g:
[RULES]
IP <IP_ADDRESS>/24
IP <IP_ADDRESS>
In the first rule we are blocking a range of IPs from <IP_ADDRESS> to <IP_ADDRESS>. In the second example just one specific IP address. You can add as many restriction by IP as you want.
You can mix different rules type under the RULES section, check the following example which uses the data specified previoulsy:
[RULES]
URL documents
URL pictures
URL /private
IP <IP_ADDRESS>/24
IP <IP_ADDRESS>
Make sure to restart Monkey every time you edit the configuration file, so the changes can take effect.


Occasionally, an individual (usually the hero) when being tracked, will discover the Tracking Device. One's first instinct may be to destroy the device, but why deprive oneself of the opportunity to mess with your enemies? So the hero promptly attaches the device to something else that (preferably) moves a lot and away from himself, causing the trackers to follow it all over the place before they finally discover that they've been duped.
Compare Decoy Getaway (using a false target to distract pursuers, not necessarily involving a tracking device or a moving target). Also see Snipe Hunt.

- A variation of this happens in Ai no Kusabi novel and anime. The tracer is removed from the person being tracked so the pursuer is Lured into a Trap at another location.
- A variant occurs in Mobile Suit Gundam Unicorn. The titular mech's La+ Program basically acts as a tracer that details the next location the Unicorn should travel to, to in order to get the true coordinates of Laplace's Box, whenever the NT-D system is activated. As it turns out the final coordinates given by the program was that of Industrial 7, which is exactly where the entire story began.
- In Megazone 23, the main characters find a bug on the Garland super-bike and toss it onto a passing train to distract the people pursuing them. Shame they missed the other bug that eventually revealed the location of their base.
- In the original Total Recall (1990), the hero removes a tracking device from (apparently) his sinus cavity, shoves it in a bit of food, and tosses it to some nearby rats. Richter and his team, who later burst in, end up shooting at random spots in the area as the rats keep moving it.
- In another Philip K. Dick movie, Impostor, Spencer Olham plays silly buggers with his pursuers by removing his tracking device and slipping it into the pocket of the guy leading the hunt, leading to a lot of reports to the effect of "he just passed your position" before he figures it out.
- Happens in Short Circuit when Number 5 notices his tracking device and throws it into the pick up truck of an elderly couple. The soldiers in pursuit of him find the couple instead.
- Happens in Con Air when the convicts remove the plane's tracking device and place it on a scenic tours flight.
- In Heat, it is implied that Michael Cheritto ditched his police surveillance by putting the transponders on a bus to San Clemente.
- In The Siege Denzel Washington's character Agent Hubbard uses this without a tracking device as the US Army is tracking him. He has a decoy agent dressed to resemble him run in the wrong direction to divert attention away from his vehicle while he goes off to complete his original objective.
- In the John Wayne movie Brannigan (1975) the crooked lawyer doing a ransom drop finds the bug the police have placed on his car and attaches it to another vehicle while stuck in traffic. Unfortunately John Wayne has slipped a second bug into the money.
- In Now You See Me this amusingly happens to Rhodes in which he ends up tracking himself through New Orleans when Jack drops the tracker into his pocket.
- In Small Favor, a book of The Dresden Files, Harry does a magical version of this by suspending the device over a large map of the city and enchanting it to make it believe that the map is the city. Then he attaches a bag of catnip to it and sets Mister on it. It proves very effective.
- As leader of the search for Sirius Black in Order of the Phoenix, Kingsley Shacklebolt deliberately sends the Ministry on one, telling them that Sirius has been spotted in Tibet.
- In The Da Vinci Code, Langdon attaches a bug to a bar of soap and throws it into the back of a garbage truck to distract the French police and buy more time in finding clues in the Louvre. Notable in that the Louvre, like most public buildings, doesn't have bar soap.
- Non-technological example: In the Belisarius Series, Belisarius expects to be followed by a Scarily Competent Tracker as he is leaving India. So he marks his horse's hoof to leave a distinctive (but not obvious) print, and later trades the horse away and gives the trader an incentive to go in a direction Belisarius would be expected to go (as he heads out in a completely unexpected direction).
- The Kingkiller Chronicle: Kvothe foils a Tracking Spell by sneaking locks of his hair into multiple vehicles leaving the city by different directions. Sympathetic Magic can track all of them, but can't tell his pursuers which hair has the rest of him attached to it.
- In Buffy the Vampire Slayer, Xander does this inadvertently when Spike is tagged by the Initiative. After they remove the tracker, Xander flushes it, baffling the trackers.
- In Burn Notice Michael frequently has to thwart people who are tracking him.
- In the Tek War TV show, federal agents find a tracking program that they believe is following the man they're looking for. It's actually tracking the exact location of a randomly selected pizza delivery guy, for the purpose of sending the Feds on one of these.
- A variant is used in the Monk episode "Mr Monk and the Marathon Man.": Marathon runner and furniture showroom magnate Trevor McDowell killed his girlfriend, even though he had a chip in his shoe tracking his time at the checkpoints - that's because his chip wasn't in his shoe, but on a TV camera bike that was covering the race.
- In the Tie-In Novel Mr. Monk and the Dirty Cop, Monk and Natalie learn that their Intertect SUV is bugged. When staking out a person related to their suspect, the simple method is that they have Natalie's daughter Julie take the bugged car all across the city, while Monk and Natalie conduct the stakeout in Natalie's own Buick Lucerne, which is not bugged.
- In the Star Trek: The Original Series episode "The Ultimate Computer", when Kirk, Spock and Scotty attempt to do a manual override to disconnect the M5 computer from the Enterprise, it emits a decoy beacon for them to follow, giving it enough time to draw energy from the Warp Engines. Upon discovering the failure to disconnect the M5, Spock refers to the trope as "Pursuing a Wild Goose".
- Spock's Spiritual Successor, Data, naturally says the line with his usual embellishment in the episode "Data's Day", while investigating the apparent transporter death of a Vulcan ambassador. Having determined that nothing is wrong with the Enterprise-D's transporters, he has Dr. Crusher analyze the DNA trace left on the pad, and compare it to the ambassador's previous transporter trace records.
Data: I could be chasing an untamed ornithoid without cause.Beverly: A "wild goose chase"?
- Spock's Spiritual Successor, Data, naturally says the line with his usual embellishment in the episode "Data's Day", while investigating the apparent transporter death of a Vulcan ambassador. Having determined that nothing is wrong with the Enterprise-D's transporters, he has Dr. Crusher analyze the DNA trace left on the pad, and compare it to the ambassador's previous transporter trace records.
- In Day Break (2006), Hopper sends Buchalter and Fencik offtrack by disposing their Tracking Device in a garbage truck.
- Once on The Simpsons, Marge uses the GPS chip on Bart's cell phone to track him down and keep him from mischief. Bart finds out and ties the chip to a bird, who ends up taking the family all the way to Machu Picchu.
- Danger Mouse: "The Wild, Wild Goose Chase" is just that. DM discovers a device in a holed-out book that responds to Baron Greenback's voice and will tell where his next hideout is after telling where his present coordinates are. DM impersonates Greenback's voice with spooky perfection to learn the whereabouts of his next hideout, but each destination turns up a dead end. Concludes with an uncharacteristic Team Rocket Wins moment.
- In the Gravity Falls episode "Not What He Seems", Stan escapes federal custody and runs to a cab. He tells the cab to drive as far away from the Mystery Shack as possible. So while the agents follow the cab, assuming Stan is inside, Stan runs back to the shack.
- The Loud House: In "The Spies who Loved Me", Ronnie Anne accidently invokes this trope when a tracking device that Carl put in her backpack, and she didn't know was there, falls out of said backpack into a piece of discarded gum, which in turn gets stuck to a rat. This leads the Casagrandes to believe Ronnie Anne has wandered off into a dangerous, abandoned house, and they all go there to rescue her.
- In the Phineas and Ferb episode "Undercover Carl", Carl suspects Phineas and Ferb may be up to no good when they use the same plans that Doofenshmirtz used (it was actually Doof who took their plans), so Monogram sends Carl undercover to snoop. Meanwhile, because he's too close to the case, Monogram sends Perry off to search for the missing Agent G.
Carl: Who's Agent G, sir?Monogram: Gary the Gander? Oh, that's just a wild goose chase. Get it? Goose? Gander?
- In early 2012 a British CCTV operator alerted an undercover officer to a suspicious person in his area. After a 20 minute chase a supervisor wandered by the operator's station and pointed out that the "suspicious person" was the officer in question. Story here
- One of the teachers killed in the Sandy Hook Massacre saved her students' lives by barricading them into their classroom and telling the shooter that they were in the gym.


3 references to SetOpenAsCompleted
System.Management.Automation (3)
engine\remoting\client\RemoteRunspacePoolInternal.cs (3)
551
SetOpenAsCompleted
();
1733
SetOpenAsCompleted
();
1872
SetOpenAsCompleted
();


{% set suppress_feedback = true %} {% extends '_layouts/layout.html' %} {% block page_title %}{% endblock %} {% block body_css_classes %}nhsuk-frontend{% endblock %} {% block content %}
If you’re on public transport, go home by the most direct route. Stay at least 2 metres away from people if you can.
If you’re away from home:
To protect yourself and others, do not go to a GP, pharmacy or hospital
Because of your symptoms you’ll need to be tested for coronavirus.
If your symptoms are mild, you can safely wait at home until you’re contacted by the testing service.
If you’re very unwell, you might need to speak to a clinician.


Use wasd to move and
space to shoot and mouse to navegate.
PLAY
Username
Score


≡
×
Alphabetical
Highest Market Cap
Lowest Market Cap
Top Gainers
Top Losers
Highest Price
Lowest Price
Price BTC:
24h Volume:
Market Cap:
Available Supply:
Total Supply:
Max Supply:


Johnson: After Brexit, EU Citizens Will Be Treated Like Migrants from other Countries
British Prime Minister Boris Johnson has announced that after the expiration of the Free Movement Agreement in January 2021, Britain will treat EU citizens and immigrants from other parts of the world in the same way.
"As we come out of the EU we have a new opportunity for fairness and to make sure all those who come here are treated the same. We will make our immigration system equal," Johnson said in a statement.
Regarding the immigration policy after Brexit, Johnson announced that EU citizens will have to wait five years before receiving social assistance and will have to pay extra for health services.
“We can only invest in our great public services if we support the entrepreneurs, businesses and hardworking people who get up each day to build our strong economy.”, Johnson said in a tweet.


| Phase | Transmittal | |
|---|---|---|
| Document number | FAC10005-CTR-000-EXP-LAY-4891 | FAC10005-CTR-000-EXP-LAY-4891 |
| Title | Cause And Effect Chart | Cause & Effect Chart |
| Contract number | FAC10005 | FAC10005 |
| Revision | 04 | 05 |
| Status | IFA | STD |
| Pdf file | FAC10005-CTR-000-EXP-LAY-4891.pdf | FAC10005-CTR-000-EXP-LAY-4891.pdf |
| Native file | FAC10005-CTR-000-EXP-LAY-4891.zip |


# This is Paris
This is a tour of the fortification and how it shaped the streets.
Press `[space]` or scroll down.
# The roman fortification
On the _Île de la Cité_ where the first walls of Paris were built between 308 and 360.
The western part was the palace.
# The medieval fortification
Little is known.
It was probably built after the Vinkings’ siege from 885 to 887.
# Philippe-Auguste’s fortification
# Philippe-Auguste’s fortification
The largest remainder can be seen near the _collège Charlemagne_.
![Enceinte Philippe Auguste](images/Enceinte_philippe_auguste.jpg =80%x*)
# Charles V
At some point, the right bank of Paris had two walls.
# Mur des fermiers généraux
This wall was not defensive, its only function was to tax any goods
entering Paris.
It was highly impopular and might be one of the triggers of the French
revolution.
_“Le mur murant Paris rend Paris murmurant”_
# Mur des fermiers généraux
Four of the buildings used to collect the taxes are still visible.
Here, the _Barrière du trône_.
![Colonnes du trone](images/trone.jpg =80%x*)
# Mur des fermiers généraux
Four of the buildings used to collect the taxes are still visible.
Here, the _Barrière de Saint Martin_, known today as
_Rotonde de la Vilette_.
![Barrière de Saint Martin](images/rotonde.jpg =80%x*)
# Thiers
This wall was the last one in Paris.


Unzipping Template Package
After unzipping the template package you will find 3 folders: "documentation", "screenshots" and "site". You can also see a zip archive called "sources_############.zip" that you need to unzip.
The sources package contains all source files for the template. The package is password protected and can be extracted only with WinZip (Windows OS) and StuffitExpander (MAC OS) software.
You can download both applications for free using the free trial options:
While unzipping "sources_############.zip" archive you will be prompted to enter a password, which you can find at your Product Download Page (open the link in the email you received from our company).
As soon as you are done with the unzipping the template you should have 4 folders in total: "documentation", "screenshots", "site" and "sources".
General Information and Template Structure
Software requirements
Adobe Dreamweaver (download free trial). Used to edit the .HTML, .JS, .PHP and .CSS files.
Adobe Photoshop CS or later (download free trial). Used to edit .PSD files.
The following scheme displays the Bootsrap template files structure.
- "documentation" – contains documentation on template editing and installation.
- "screenshots" – contains screenshots of the template.
- "site" – contains the .html files of the template.
- - "assets" – contains assets and bonus add-ons.
- - "bat" – contains contact form processing .php script.
- - "css" – contains all the .css files used in the design.
- - "img" – contains all the images used in .html files.
- - "js" – contains JavaScript libraries and jQuery plugins.
- - "search" – contains .js, .php and .css file of the search engine.
- "sources" – contains source files.
- - "less" - contains .css LESS files used in the template.
- - "psd" – contains Adobe Photoshop .psd files.
- - "fonts_info.txt" – contains the list of fonts used in template.
- - "info.txt" – contains the information about password protected "sources" folder.
Editing Bootstrap template
Working with the template you need to edit the .html, .css, .js and .psd files.
Editing HTML and CSS files
All editable HTML files are located in "site" folder of the template package (index.html, index-1.html,index-2.html, etc.) Each index-#.html file represents a single template page.
To open .html file with Adobe Dreamweaver application, you should right mouse click on the file, and in the context menu select Open with -> Adobe Dreamweaver. When the file is opened you can start editing it.
Adobe Dreamweaver is a recommended application as it allows you to edit the HTML files content in visual mode. Open any .html file and click the Live Code button at the top of the screen to switch to visual mode.
Feel free to check the detailed text and video tutorials on how to edit HTML files with Adobe Dreamweaver.
CSS files are used to change the template appearance like fonts (font-family, font-size, color etc), backgrounds, column width values etc. You can edit the css files with Adobe Dreamweaver application. Detailed tutorials on how to work with the CSS files are available at our online help center.
Editing PSD files
PSD files are located in the "sources/psd" folder in your template package. PSD are the source files of the template design. They are divided into layers so any part of the template design can be changed.
During the customization process you can refer to the PSD files in order to change the images used in the content pages or in the design.
You can learn more about working with photoshop by checking the detailed tutorials.
Custom Fonts
Some templates may contain the non-default fonts used in the design. By default the internet browser can render only fonts that are installed to your operating system. In other words if your website design uses some custom fonts and these custom fonts are not installed on your website visitor's computer, custom fonts won't be displayed. Default fonts will be rendered instead. That's why web developers should look for some alternative solutions. In our Bootstrap templates custom fonts are embedded using Google Web Fonts technology.
Google Web Fonts
You can learn more on using Google Web Fonts by checking the tutorial on how to work with Google web Fonts.
Customization Tutorials
How to edit text
Bootstrap templates are HTML based templates so all content is stored and could be accessed though the .html files.
- Open your template package and go to the site folder.
- There open index.html file with your HTML editor.
- You can use the search tool CTRL+F to find any text you need.
- Edit text in HTML editor. Save the file and open it with your Browser to see the changes.
The other way is to use the browser developer tool to find the blocks you want to edit. You can learn more about the developer tools checking the tools description and tutorials.
Feel free to check the following Developer Tools article.
You can also check the video tutorial on how to edit text in JS Animated templates
How to edit images
Open the template folder, go to 'site/images' directory. You can upload your images with the same name and extension to replace the default ones.
The other way is to upload custom images with your titles and extensions. Then you’ll need to change the image file names in the html files.
- Open .html file from the “site” folder with your html editor.
- Use search tool CTRL+F to find the images in the html file.
- Replace the image title and extension.
You can also check the video tutorial on how to edit images.
- Open the template folder.
- Go the site/js directory.
- There open the 'forms.js' file with your editor (Adobe Dreamweaver, Notepad etc).
- Using the Find and Replace tool (CTRL+F) search for the ownerEmail or just scroll down to the very bottom of the page.
You should see the following line:
ownerEmail:'#'
replace # symbol with your email address. That’s all, now the contact form should send the messages to your email account.
You can see the detailed tutorial on how to activate contact form in your template.
TM add-ons
Bootstrap templates are provided with four free add-ons:
- Contact Form - gives visitors the opportunity to send messages to the site-owner.
- Search Engine - performs search through content of .html files.
- Under Construction - is the page with countdown timer.
- Subscription Form - allows to organize newsletter subscription.
Note, Contact Form, Subscription Form and Search Engine add-ons are already implemented into your template and working by default. Feel free to check the detailed documentation for each add-on in case of additional configuration or in case you are going to implement them into another website/project/template.
- Contact Form
- Search Engine
- Under Construction
- Subscription Form
Uploading template
In order to make your site "live", you need to upload all the content of "site" folder from your local computer to your hosting server.
Please note: your website root depends on the directory structure on your hosting server. If you upload the "site" folder itself into your server, the root to your website will be http://your_domain_name/site. To avoid this and make the website root http://your_domain_name/ please open the "site" folder and upload the folder content.
This video tutorial will show you how you can upload files to your host using free FTP software FileZilla.
This video tutorial will show you how you can upload files to your host using hosting cPanel (WebHost Manager, WHM).
Please do not upload the sources directory or any of the template source files to the hosting server.
Conclusion
We hope this manual was useful for you and helped you to install, edit the template and to resolve your issues.
In case of any difficulties you can contact our support team via the Live Chat or send a request to our senior technicians via the Online Help Desk.
More instructions are available from the following links:


|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
| PREV PACKAGE NEXT PACKAGE | FRAMES NO FRAMES |
See:
Description
| Interface Summary | |
|---|---|
| ActionListener | The listener interface for receiving action events. |
| AdjustmentListener | The listener interface for receiving adjustment events. |
| AWTEventListener | The listener interface for receiving notification of events dispatched to objects that are instances of Component or MenuComponent or their subclasses. |
| ComponentListener | The listener interface for receiving component events. |
| ContainerListener | The listener interface for receiving container events. |
| FocusListener | The listener interface for receiving keyboard focus events on a component. |
| HierarchyBoundsListener | The listener interface for receiving ancestor moved and resized events. |
| HierarchyListener | The listener interface for receiving hierarchy changed events. |
| InputMethodListener | The listener interface for receiving input method events. |
| ItemListener | The listener interface for receiving item events. |
| KeyListener | The listener interface for receiving keyboard events (keystrokes). |
| MouseListener | The listener interface for receiving "interesting" mouse events (press, release, click, enter, and exit) on a component. |
| MouseMotionListener | The listener interface for receiving mouse motion events on a component. |
| MouseWheelListener | The listener interface for receiving mouse wheel events on a component. |
| TextListener | The listener interface for receiving text events. |
| WindowFocusListener | The listener interface for receiving WindowEvents , including
WINDOW_GAINED_FOCUS and WINDOW_LOST_FOCUS events. |
| WindowListener | The listener interface for receiving window events. |
| WindowStateListener | The listener interface for receiving window state events. |
| Class Summary | |
|---|---|
| ActionEvent | A semantic event which indicates that a component-defined action occurred. |
| AdjustmentEvent | The adjustment event emitted by Adjustable objects. |
| AWTEventListenerProxy | A class which extends the EventListenerProxy , specifically
for adding an AWTEventListener for a specific event mask. |
| ComponentAdapter | An abstract adapter class for receiving component events. |
| ComponentEvent | A low-level event which indicates that a component moved, changed size, or changed visibility (also, the root class for the other component-level events). |
| ContainerAdapter | An abstract adapter class for receiving container events. |
| ContainerEvent | A low-level event which indicates that a container's contents changed because a component was added or removed. |
| FocusAdapter | An abstract adapter class for receiving keyboard focus events. |
| FocusEvent | A low-level event which indicates that a Component has gained or lost the input focus. |
| HierarchyBoundsAdapter | An abstract adapter class for receiving ancestor moved and resized events. |
| HierarchyEvent | An event which indicates a change to the Component
hierarchy to which a Component belongs. |
| InputEvent | The root event class for all component-level input events. |
| InputMethodEvent | Input method events contain information about text that is being composed using an input method. |
| InvocationEvent | An event which executes the run() method on a Runnable
when dispatched by the AWT event dispatcher thread. |
| ItemEvent | A semantic event which indicates that an item was selected or deselected. |
| KeyAdapter | An abstract adapter class for receiving keyboard events. |
| KeyEvent | An event which indicates that a keystroke occurred in a component. |
| MouseAdapter | An abstract adapter class for receiving mouse events. |
| MouseEvent | An event which indicates that a mouse action occurred in a component. |
| MouseMotionAdapter | An abstract adapter class for receiving mouse motion events. |
| MouseWheelEvent | An event which indicates that the mouse wheel was rotated in a component. |
| PaintEvent | The component-level paint event. |
| TextEvent | A semantic event which indicates that an object's text changed. |
| WindowAdapter | An abstract adapter class for receiving window events. |
| WindowEvent | A low-level event that indicates that a window has changed its status. |
Provides interfaces and classes for dealing with different types of events fired by AWT components. See the java.awt.AWTEvent class for details on the AWT event model. Events are fired by event sources. An event listener registers with an event source to receive notifications about the events of a particular type. This package defines events and event listeners, as well as event listener adapters, which are convenience classes to make easier the process of writing event listeners.
|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
| PREV PACKAGE NEXT PACKAGE | FRAMES NO FRAMES |
Copyright © 2004, 2010 Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Also see the documentation redistribution policy.


Welcome to the Mozilla community Matrix instance.
All participants are expected to respect and uphold Mozilla's code of conduct and etiquette guidelines. For more details, please read the Mozilla Community Participation Guidelines.
You can learn more about participating in Mozilla's Matrix instance on wiki.mozilla.org.


GeoStore Alternate Indexes
Alternate Indexes are a very powerful way to apply additional filters to your searches on properties
of a Feature
.
Link Using Alternate Indexes Back to Top
Alternate Indexes can be added to an existing GeoStore very easily:
// create an index on the properties.street value
gs.addIndex({
property: "street",
index: new BTree()
});
// create an index on the properties.crime value
gs.addIndex({
property: "crime",
index: new BTree()
});
Queries against Alternate Indexes are very specific to the index, but the basic syntax of a query is straightforward:
gs.within(
geojson,
{
"name": {
"equals": "Main"
},
"crime": {
"equals": "Arson"
}
},
function (err, res) {
// node.js style callback
}
);
In this example, first every Feature
that is within the GeoJSON is found in the Spatial Index, then
each of those entries are searched for in the B-Tree indexes. Only those entries that have a properties.street
of “Main” and a properties.crime
of “Arson” are returned.
Link Indexable Data Back to Top
Only data that is available in properties
is indexable. When a Feature
is added to the
GeoStore, the list of Alternate Indexes is scanned, and any property that is found is added to that Alternate
Index.
Alternate Indexes are asyncronous and use Node.js style callbacks.
Link Existing Alternate Indexes Back to Top
Terraformer currently ships with a single alternate index, with more coming soon.
- B-Tree - A B-Tree index
Link Writing an Alternate Index Back to Top
Alternate Indexes rely on two methods to be exposed to the GeoStore to add and remove data. Additional methods can be added for querying and are introspected for searching.
For instance, when a equals
query is made against an Alternate Index, if the equals
method is on the index, then it is called with all arguments from the contains
or
within
.
Link Index.add(value, id, callback) Back to Top
Add a value to the Alternate Index by id
.
| Option | Value | Description |
|---|---|---|
| value | String or Number |
The value to add to the index |
| id | String or Number |
The id of the Feature to be added |
| callback | function |
Callback to be fired when the add has been completed |
Example:
idx.add(value, id, function (err, res) {
// Node.js style callback
});
Link Index.remove(value, id, callback) Back to Top
Add a value to the Alternate Index by id
.
| Option | Value | Description |
|---|---|---|
| value | String or Number |
The value to remove from the index |
| id | String or Number |
The id of the Feature to be removed |
| callback | function |
Callback to be fired when the remove has been completed |
Example:
idx.add(value, id, function (err, res) {
// Node.js style callback
});


Localization and Internationalization
This week in DevBootcamp, we are asked to select an issue in the tech industry to write about. Instinctually my mind wandered to issues like women in tech, diversity in tech, educational opportunities for the low-income students to be exposed to tech, etc. Don't get me wrong, I could go on and on for hours on those topics, which is why I've decided to talk about something I've been marginally involved with in the past year, but don't particularly know too many details about.
That's why I'll try to focus this post on localization and internationalization of software and applications. I know a bit because I've been a localization project manager for the past year, which means I worked with various (tech company) clients to localize and internationalize their software, web/mobile apps, and sites into whichever languages are needed for their market. I've heard many times from engineers in the field that it's particularly difficult to write a program that will later be internationalized. My quest for today is to find out some reasons why it is difficult to internationalize code.
What are Localization and Internationalization?
Localization: L10n
Simply, localization adapts a product, application or content to match the linguistic and cultural needs of a specific audience. This is done by translators, usually with a CAT (Computer-Assisted Translation) Tool. CAT tools work by segmenting sentences into either whole sentences or phrases where it seems semantically logical to segment. This helps the translator break up the meaning of a sentence and restructure it as they need to for their language, and also saves the segments in a database called a Translation Memory (TM). The TM stores all the previously translated segments so that files that are updated later down the road can be analyzed and leveraged using previous translations. This helps translators to recycle and reuse past translations, and it also saves time and money. Localizing a product also means testing, which is a crucial step to ensure that everything in the UI and content makes sense in context.
One more quick note on the difference between "localization" and "translation". Localizing creates a new product that is culturally and linguistically appropriate for the country and audience. For example, a file may be translated into Spanish--but which Spanish? It will need to be localized for either Spanish for Spain, for Mexico, Argentina, Guatemala, Ecuador...I think you are seeing the point now...
Internationalization: i18n
Internationalization is done by developers, and is the process of reviewing a program's files to make sure the code ready for localization.This could include pulling out content from within code (i.e. removing user interface text from Javascript), supporting local standards, such as date, time and currency, and handling Unicode or other character encoding standards. This process would ideally create a new, global product can be localized to support any locale and target country's needs.
Issues related to Internationalizing Code
So in my breakdown of internationalization and localization, I hinted at some potential issues developers face while preparing content for translation. For one, if a software or app may eventually become localized, this should be taken into account in they first planning stages of the application and site. This will save a lot of time and effort in the future to retroactively make your software localizeable.
Here are some other issues or considerations for internationalizing code that may be interesting:
- Encoding
- Text Direction
- Text spacing, buttons, windows
- Remove Strings into a New File
- TIME
- Symbols, icons, colors
- Sorting
Usually some form of Unicode should be used
Does your UI design work for right to left languages?
A 5 letter word in English could be a 10 letter word in German, Turkish, or French. Consider the possibility of resizing windows and buttons
Do not hard code strings! Many CAT tools can't extract text from script files, so any content that needs to be translated should be pulled out and saved into a properties or resource file instead, and loaded as needed. The application can select the correct resource file for the language selected.
Time is its own issue. If you plan to localize, consider that it will take just as much time to localize (if not more) than it did to write the original source file. If you make periodic updates to source code, add in time to the development cycle for localization so that all versions are up to date around the same time frame.
Do these symbols, icons, colors work for all cultures?
Think about sorting A-Z, with all the letters in the Turkish alphabet. What about with Chinese characters?
I'm still learning, so although many of my "issues" sound very authoritative, think of them more as questions to open the dialogue of what we need to do to localize software.


2 Poems by Joe Nicholas
from The Beauty of Admission
In my dream death crawled out my mouth like a spider
I’m always spilling water when I try to make my tea
This is how I relax/Breathe in through the nose
Hold for seven seconds
Release for eight
from The Beauty of Admission
Anyone can predict the future although they’re not necessarily accurate
I’ll probably be alive tomorrow & that’s good enough to get out of bed today
How many bees have died today?/Scratch that
How many hives?
Sometimes I still eat my boogers/I’ve read
they might be good for you
Joe Nicholas (AKA Dirty 4 String Orchestra) is a canary breeder and author of Street Monk (Bottlecap Press 2015). Their work can be found or is forthcoming in alien mouth, Be About It, Fog Machine, Reality Beach, Souvenir Lit and other wonderful publications. They can be found at 8rainCh1ld.tk.


{% extends 'base.html' %} {% load staticfiles %} {% block home_nav %}class="active"{% endblock %} {% block content %}
Click the button below to exclude your IP {{ ip }} from Google Analytics.
This service is free and open source. We do not store your data.