SoundManager 2: Download
Get SoundManager 2
Get the latest and greatest.
Download SoundManager 2
Latest changes: IE "Edge" 14 fix, onError()
and setPlaybackRate()
for sound objects, eslint
code modernization (maintaining back-compat to IE 6) and more. See revision history for details.
Download SoundManager 2.97a.20170601 or see on GitHub, or on npm
Performance tip: SM2's code size varies from over 150 KB (commented, debug-enabled) down to 12 KB (optimized) over HTTP; check the pre-optimized builds for details.
Side reading + video talks, slides etc.
- Video, 02/2012: Web Audio: HTML5 + Flash (in a tree) (slides.) Updated HTML5 content, demos and SURVIVOR C64 game demo.
- Video, 12/2011: Adding Sound To HTML (slides.) Overview + updated content from 06/2011 talk.
- Video, 06/2011: The State Of HTML5 Audio
- Article: "Probably, Maybe, No": The State of HTML5 Audio.
Revision History
Latest changes and archived notes from bug fixes, API updates, feature development etc.
Revision History
A changelog of sorts.
-
V2.97a.20170601 - IE "Edge" 14 fix,
onError()
andsetPlaybackRate()
for sound objects,eslint
code modernization (maintaining back-compat to IE 6) and more. See GitHub commits.-
Bug fixes
-
Internet Explorer "Edge" 14 fix,
try ... catch
due tonavigator.plugins
access now throwing an exception. See PR #150.
-
-
API Updates
-
Sound objects finally have an
onError()
event callback for load failures (and network/decode/playback for HTML5.) See SMSound.onError() for details. -
setPlaybackRate()
(HTML5-only), accepting values between 0.5 and 4. See SMSound.setPlaybackRate() for details.
-
-
Bar UI Updates
-
Touch events added for playback / progress track. Touch, drag and release to scrub through time.
-
whileplaying
callback added to playeron
object.SMSound
object also now provided to callback.
-
-
Miscellaneous
-
Large
eslint
modernization, stylistic and formatting updates to SM2 core and most demo JavaScript, whilst maintaining ES5 compatibility back to IE 6. -
FLAC
support check added toaudioFormats
. SM2 will always check for MIME/file extension support if not already known, but FLAC support has been added to Chrome 56. See Issue 148. -
De-cruftication and removal of many legacy
-o-
,-ms-
and-webkit-
-specific CSS prefixes.
-
-
-
V2.97a.20150601 - Minor tweaks for mobile and desktop Safari. Package/module (bower/npm) setup, "Bar UI" API update, Turntable UI demo and more. See GitHub commits.
-
Bug fixes
-
At some point (perhaps iOS 7.1?), iOS devices began allowing multiple HTML5
Audio()
instances to exist and play simultaneously. By default, SM2 will still apply the singleton pattern viauseGlobalHTML5Audio
for iOS because playlist-style behaviour may not work without it. If you aren't concerned with playlist-style behaviour and want to use multiple audio instances, seeignoreMobileRestrictions
. -
Added
forceUseGlobalHTML5Audio
setup option, to address desktop Safari breaking playlist-style playback when in a background tab (something withnew Audio()
prevents playback from starting automatically?) -
Improved RequireJS compatibility, correct
define()
usage and support forSM2_DEFER
.
-
-
API Updates
-
API now fires
onstop()
when destroying a sound. -
New setup option:
ignoreMobileRestrictions
. Enable if you want to avoid the singleton HTML5 object pattern used for mobile devices. iOS WebView purportedly allows use of multiple HTML5Audio()
objects. -
soundManager.setVolume(33)
now applies to all sounds. (Overloaded form; standard issoundManager.setVolume('mySound', 33)
.)
-
-
Bar UI Updates
-
Added
window.sm2BarPlayers
API including data and methods. Players are now scriptable / controllable from JS. -
on
object for event callbacks, global and per-instance - e.g.,window.sm2BarPlayers.on = { play: function() { ... }, stop: function() { ... } });
- or, per-instance:window.sm2BarPlayers[0].on = { ... }
-
New config option:
stopOtherSounds
(i.e., only one player active at a time) -
More config:
excludeClass
(default:sm2-exclude
), prevents SM2 from playing link. Will fall through, download etc. -
Added support for additional links in playlist: shopping cart ("buy now"), and music note ("download") next to each playlist item.
-
Playlist now scrolls currently-playing item into view by default.
-
Fix timing issue when user switches tracks in error case.
-
Improved playlist open-by-default UI state. Added playlist toggle to demo.
-
Check for
defaultItem
, handle case when starting with an empty playlist. -
Workaround for non-zero
scrollTop
offset the first time the playlist is opened. -
Minor UI tweaks for alignment, polish.
-
-
Miscellaneous
-
New 2015 Turntable UI Demo. Based on the 2011 "Wheels Of Steel" browser-based turntable UI prototype. Basic UI, API and load/play ability with easily customizable slipmats, record and album artwork.
-
Added
bower.json
,component.json
and npmpackage.json
definition files. -
Improved RequireJS compatibility, correct
define()
usage and support forSM2_DEFER
. -
soundmanager2.js
code style review (mostly for consistency.) Line breaks, quotes on strings, conditions and ternary statements, comment formatting etc. -
Side note: The prior release's pre-emptive fix for iOS 8 ended up being a non-issue, as the official iOS 8 release did not use "OS 10" in the user-agent string. Nonetheless, SM2 will now correctly identify iOS 10+ vs. incorrectly flagging it as "iOS 1".
-
-
-
V2.97a.20140901 - iOS 8 compatibility fix, "Bar UI" player demo,
durationchange
, buffering, edge case tweaks for HTML5 and RTMP, and browser environment checks. See GitHub commits, or download archived version.-
Bug fixes
-
Why UA sniffing is generally bad, real-world example #1048577: "That time a missing
/s
onnavigator.userAgent
(based on single-digit UA version assumptions) broke SM2 on iOS 8+ devices."The upside: The fix is adding
\s
to a UAregex
check targeting legacy iOS devices with brokenHTML5 Audio()
support, so that the"OS 10 "
portion of the UA string does not match the pattern"OS 1 "
.This is a pre-emptive fix for the pending iOS 8 release, which reportedly includes the string
"iPhone OS 10_10 like Mac OS X"
. Due to SM2 checking for/os ([12|3_0|3_1])/i
which had brokenHTML5 Audio()
support, and not considering the far future possibility of"iOS 10"
being included in the userAgent string at the time, HTML5 audio is incorrectly disabled on iOS 8 beta 3 and is likely to apply to the final iOS 8 release.This is a good example and reminder of why UA checks are generally bad, and dangerous; similar issues hit other libraries doing UA and plugin checks both client and server-side when IE hit 10, and Flash hit version 10, so this iOS pattern change may affect some other libraries targeting iOS as well.
-
HTML5: Listen to
durationchange
event, catch-all for duration update events. May help on mobile if duration is determined late. (Related discussion [Internet Archive].) -
Explicitly provide buffering status to
onbufferchange()
. Don't setbuffering(0)
when loading, since playback may still be paused. -
Flash: Fix edge case where
play({ url: xxx, position: 0 });
on existing sound with assigned URL. New URL wouldn't take effect.
-
-
API Updates
-
SMSound
onwarning
andonfailure
options for NetStream / RTMP error/exception handling. Removed additional sound param ononfailure()
callback. Apologies if this breaks anyone's implementation (disclaimer: these options are still experimental, and undocumented. :D) "Unhandled" exceptions are now considered non-fatal, usingonwarning
instead of presuming playback has failed etc.
-
-
Miscellaneous
-
"Bar UI" player demo added. SVG-based iconography, degrades nicely down to IE 8. See live demo.
-
Retina/hi-dpi updates for 360° canvas, small 360° player buttons and basic button player demo image assets.
-
CommonJS + AMD (requireJS)
module.exports
/define()
compatibility (see commit for details.) -
Check
window
&&window.document
, barf if loaded in server-side node environment vs. in a browser. (Even if Node.js etc. supportAudio()
at some point, SM2 was designed for a browser; this check is probably A Good Thing™ to have in place.) If you feel you have a use case that makes sense here, feedback is appreciated.
-
-
-
V2.97a.20131201 - 100% HTML5 mode by default. Duration fix for Adobe FMS/RTMP server-based streaming. HTML5 unload,
multiShot
andautoPlay
tweaks. See GitHub commits, or Download archived version.-
Bug fixes
-
Adobe FMS (RTMP Server) fix: Invoke server-side
getStreamLength()
call to determine duration. (Red5 and other free RTMP servers use NetStreamonMetaData()
to pass duration.) -
Fix
html5Unload()
by loading a tiny base64-encoded data: URI WAVe file where supported. Elsewhere, useabout:blank
. This fixes errors in Chrome where the browser attempts to load the url "null" (a string.) -
D'oh! Fix HTML5 sprite regression where
_oncanplay()
was not being picked up & fired, sound would not play on first click. -
HTML5: Fix double-play bug with
autoPlay: true
. Correct edge case whereonposition()
items would sometimes be cleared if called/assigned beforeplay()
. -
ontimeout: function(status) {}
callback parameter corrections. Fix missing error {type: 'INIT_TIMEOUT'
} for missing/404 SWF case, andINIT_FLASHBLOCK
for flashblock-specific case. -
HTML5: Apply volume to cloned sounds in HTML5
multiShot
case. -
Fixed issue in
_processOnPosition
where the item inonPositionItems[i]
can be undefined mid-loop if the callback that is triggered changes the length of theonPositionItems
array, whereonPositionItems.length
becomes zero and there's an uncaughtTypeError
when trying to accessitem.fired
the next time around. -
Fixed mute in HTML5.
-
Fix
onload
in Firefox 3.6 with no flash (and yes, Firefox 25 is the current release. :D) -
Correct event removal (cloned HTML5 nodes) -
onended
→ended
-
-
API Updates
-
Use 100% HTML5 mode by default, where available.
preferFlash: false
is now the default setting. Firefox does MP3 on Vista (and newer) via HTML5, and recently (via Firefox Aurora builds) on OS X - the last major hold-out. The vast majority of browsers now support MP3 via HTML5, thus reducing the reliance on Flash. -
Reboot into 100% HTML5 mode where supported if flash fails after loading, i.e., local/offline/file:// or other edge case.
-
-
Miscellaneous
-
Fixed
canPlayMIME()
documentation example.
-
-
-
V2.97a.20130512 - multiShot for polyphonic HTML5 clients.
createSound()
no longer requires anid
. Auto-reboot()
into 100% HTML5 mode where supported. HTML5 unload tweaks. (Download archived version)-
Bug fixes
-
Init enhancement: If
preferFlash: true
butuseFlashBlock: false
(the default SM2 config) and flash timeout / blocked case occurs, SM2 will reboot reboot into 100% HTML5 mode if available so init can succeed. If flash block handling is enabled, user interaction will be required to whitelist the flash movie and init will be delayed until the SWF loads. -
Correct
reboot()
to allow 100% HTML5 mode when Flash was previously required due topreferFlash: true
. Previously,soundManager.audioFormats.mp3.required = false; soundManager.reboot()
did not result in 100% HTML5 mode under Firefox. Now works as expected. -
HTML5 unloading: Firefox was supposed to like assigning
''
toAudio().url
for canceling requests, unloading and destroying the decoder (perhaps only on<audio>
, in retrospect?) - similarly,.src = null
did not seem to work, possible request to./
- undesirable.Now using more-conservative
null
URL for unload / destruct on webkit, iOS and others, andemptyURL
for Firefox (user-customizable,'about:blank'
by default.) -
More HTML5 safety checks so that
buffered
can't go beyond 100%. -
Improve Flash 9
load()
->onload()
failure case, when loading a non-404 (eg., HTTP 301 -> 200) with non-audio content. Improved messaging for Flash 8, Flash 9 + HTML5 with zero-duration (invalid / unsupported sound) case. -
Fix flash-only (no HTML5 /
useHTML5Audio: false
) init case, e.g., running under IE 8. -
HTML5: Fix legacy "overloaded" case when
soundManager.play('someID', 'some.mp3');
is called twice, second call would fail. This shortcut method is deprecated, and not recommended for use other than a conveience when in development / testing.
-
-
API Updates
-
createSound()
no longer requires anid
property. If omitted, a uniqueid
will automatically be generated for the new sound object with a prefix based on the SM2 setup optionidPrefix
.Specifying an
id
is useful if you want to look up the sound viagetSoundById()
- otherwise, you can simply use the object returned by thecreateSound()
call. -
multiShot
+multiShotEvents
for HTML5Audio()
-based sounds, allowing layered / "chorused" playback ifplay()
is called andmultiShot: true
has been specified to eithercreateSound()
orplay()
. Behaviour should mimic that of Flash 9. IfmultiShotEvents: true
is specified,onfinish()
will fire for each instance. Does not apply to mobile clients (e.g., iOS and Android) which only allow one sound to be played at a time.Implementation summary: A
new Audio(src)
instance is created with anonfinish
listener, and played immediately. It is unloaded and destroyed when playback finishes.Caveat #1: If a position argument is provided eg.,
play({ position: 1000 })
, the clonedAudio()
instance must wait for a HTML5canplay
event before a seek and playback can begin. This may mean playback *could* have a slight delay vs. playing without the position offset.Caveat #2: The from/to parameters used for "sound sprites", e.g.,
{ from: 500, to: 1500 }
, are not presently supported under multiShot.Caveat #3: multiShot is not supported where only a single audio instance can be playing at once, e.g., iOS (iPhone/iPad) and some Android devices.
Secondary instances are "fire-and-forget", similar to the Flash 9 implementation, and fire no events other than
onfinish()
. They do not respond to position, volume etc. after playback has begun.
-
-
Miscellaneous
-
Remove debug-related
complain()
calls from -nodebug and minified script builds -
Force data: URLs over to HTML5. Catch unsupported case under 100% HTML5 mode, preventing attempt to use Flash fallback.
-
Edge case: Fix error case if
setup()
called without arguments inline, before DOMReady / init etc. -
Tweak
soundManager.getSoundById()
to not throw error if ID omitted. Improve language on "not found" messaging. -
Warn on possible 32-sound channel Flash ceiling/limit, which can occur when Flash tries to begin playback and fails to start.
-
Documentation updates: How Clients Download Audio (Flash/HTML5 progressive download vs. byte streaming)
-
Improved API Examples page design, two-column layout with navigation
-
-
-
V2.97a.20130324 - Fix for playlist/event chaining when using
flashVersion = 8
with Flash Player 11.6.602.171. HTML5 iOSload()
fix. Added Opus to audio formats. (Download archived version)-
Bug fixes
-
Flash Player 11.6.602.171, released by Adobe on 02/26/2013, introduced an issue with SM2's default Flash 8 (
flashVersion: 8
) API-based JS/Flash interaction, where SM2 methods called from callbacks such asonfinish()
would not work. This primarily broke methods used for playing sounds in sequence, serially loading a series of sounds and so on. (See discussion (Internet Archive) for more.)Note that this does not affect cases where
soundManager.setup({ flashVersion: 9})
is being used; however, SM2 does useflashVersion: 8
by default.Specifically, Flash-initiated events (such as a sound finishing) make Flash -> JS calls to the SM2 API, which subsequently call user-specified event handlers. If the user-specified SM2
onfinish()
handler immediately calls a SM2 method likeplay()
that makes a JS -> Flash call, this call either silently fails or is blocked. Other JS + Flash libraries that use similar callback patterns may also be affected, if their SWF is built targeting the Flash 8 API.Suspecting a timing or recursion/stack issue, it was found that introducing a
setTimeout(callback, 0)
to user-specified SM2 callbacks likeonfinish()
restored sequential/playlist functionality.Flash Player 11.6.602.180, relased by Adobe on 3/12/2013, exhibits the same behaviour. To avoid additional hacks, SM2 applies this to all Flash 8-based API callbacks regardless of what version of Flash Player is installed. No regressions are anticipated as a result of this change.
Alternately, this issue can be avoided by using
soundManager.setup({ flashVersion: 9 })
as the Flash 9-based API does not appear to have this problem. -
HTML5: Fix for iOS
load()
case when using an auto-load and looping pattern (related discussion [Internet Archive, may not work, sorry.])
-
-
API Updates
-
HTML5: Added check for Opus (OGG-based audio codec,
audio/opus
).
-
-
Miscellaneous
-
Added documentation for Serving To Clients, and Mobile Device Limitations.
-
Minor SM2 homepage + documentation CSS tweaks (design)
-
This SM2 release is tagged "Mahalo Edition" to say thank-you, and because some SM2 work was done while on vacation in Hawai'i. Also, some new demo sound recordings from the beach on Kaua'i were added.
-
-
-
V2.97a.20130101 - Strict Mode. Android 2.3 HTML5 fixes, cleaner debug output, improved default flashblock handling. Confirmed compatibility with Firefox WMF-based HTML5 MP3 support. New
reset()
method,reboot()
tweaks (Download archived version)-
Bug fixes
-
HTML5: Reset last URL and load state for "singleton" (global HTML5 audio) case, on iOS + Android <= 2.3 for specific use case -
createSound()
->play()
->destruct()
->createSound()
->play()
with same URL/parameters. -
HTML5: Fix for Android 2.3 / Nexus 7 - they work better with the singleton HTML5
audio()
instance as well, same as iOS, for chained (i.e., playlist-style) playback cases. -
soundManager.setup()
now allowshtml5Test
(regular expression, eg./probably|maybe/i
) to be passed. Was previously unrecognized/rejected.
-
-
API Updates
-
The SoundManager 2 core API (soundmanager2.js) now runs in Strict Mode, via
"use strict";
. This is scoped to a closure within soundmanager2.js, and should not cause issues when combined (rolled-up and/or minified) with other JavaScript code. -
New
soundManager.reset()
method. Similar toreboot()
, but also nukes any registeredonready()
and related callbacks. Based on pull request from Github user jabr. Chaining is now possible too, e.g.,soundManager.reset().setup({onready:function(){console.log('reset() complete, reboot OK')}});
. CallsoundManager.beginDelayedInit()
to re-init after areset()
. -
soundManager.setup({url:...})
+ lazy-loading (dynamically-loaded JS) case: Ifsetup()
given aurl
parameter afterDOMContentLoaded
has fired, assume we should start right away. (Helps reduce need forbeginDelayedInit()
+ "just works" for most users). -
Don't init inline after
document.readyState === 'complete'
(improve lazy-loading case, wait forsetup()
withurl
instead).
-
-
Miscellaneous
-
Prerelease Firefox builds can play MP3 audio via HTML5 in some cases, as part of a move to support H.264 video (see Bugzilla #799318 for details). Firefox 20 (nightlies, and Aurora channel builds in January 2013) can get native MP3 support via Windows Media Foundation (OS-level codec support) components on Windows 8, Windows 7, and soon, Windows Vista. As of 12/2012, OS X support is planned, and Windows XP support is not. (Disclaimer: Vista, OS X and XP notes sourced from comments on Hacker News; see links).
When enabled with
media.windows-media-foundation.enabled = true
underabout:config
, Firefox may be able to play MP3s via HTML5 and thus get "100% HTML5 mode" whensoundManager.setup({preferFlash: false})
is used.At time of writing (12/30/2012), Firefox 20 (nightly) returns
""
forcanPlayType('audio/mpeg; codecs="mp3"')
, a test commonly used to query for MP3 support under HTML5 and one which works in other modern browsers. Firefox's behaviour differs because it is trying to follow the MPEG spec, which does not include an explicit MP3 MIME type. Instead,canPlayType('audio/mpeg')
, which is in-spec, presently returns a "maybe" when MP3 is supported under Firefox. -
Improved SM2
console.log()
debug output, aiming to be less "noisy". Core setup options are shown better at start-up, eg. "SoundManager V2.97a.20130101 (AS3/Flash 9) + HTML5 audio + preferFlash + html5PollingInterval (50ms) + flashBlock". -
Christmas light demo: Tweaks for iOS + Android touch devices.
-
MP3 Player Button demo: Include HTML
type
(MIME hint) attribute, if specified.
-
-
-
V2.97a.20121104 - HTML5 + iOS load fixes, Windows 8 App Store compatibility tweak, code pattern improvements (Download archived version)
-
Bug fixes
-
Fix HTML5
unload()
->play()
case (re-use of same object without assigning new URL). -
More global (iOS) HTML5 object
unload()
/play()
re-use tweaks, improved handling of re-use and empty /load()
cases -
HTML5: Ensure
instanceOptions
are set afterplay()
call results inload()
. NotedinstanceOptions
not being set from withinwhileplaying()
. -
Fix call signature for Flash 8 load method, was tying
usePolicyFile
(enables remote crossdomain.xml request for ID3/waveform data on 3rd-party domains) to precence ofwhileloading()
due to driver error. Derp. :D -
Windows 8 Store Apps (IE 10/"MSAppHost" in UA) don't support Flash or ActiveX, except for (at time of writing), three special ActiveX controls. Thus,
new window.ActiveXObject('ShockwaveFlash.ShockwaveFlash')
seems to work without error. However, an error is thrown if an<object>
with a Flash ActiveX CLSID is appended to the DOM. http://msdn.microsoft.com/en-us/library/windows/apps/hh465143.aspx
-
-
Miscellaneous
-
Death to underscores! Removed legacy pattern of
var _foo = ...
for most private internals. -
Better
typeof x === 'undefined'
->x === undefined
pattern per newer jslint rules.
-
-
-
V2.97a.20120916 - Inline, deferred and lazy-load init improvements, HTML5 format / detection improvements, "re-use" load/play URL fix. (Download archived version)
-
API Updates
-
Init improvement: Don't fail if Flash URL is null in normal include + init case. Instead, show note in debug input and wait for
soundManager.setup()
withurl
param, then treat as delayed init case. Improved experience if including<script>
, then trying to dosetup()
after DOM Ready (common jQuery case). -
soundManager.setup({url:...})
+ lazy-loading (dynamically-loaded JS) case: Ifsetup()
given url parameter after DOMContentLoaded has fired, assume we should start right away. (Helps reduce need forbeginDelayedInit()
+ "just works" for most users) -
Don't init inline after
document.readyState === 'complete'
(improve lazy-loading case, wait for setup() with url: instead)
-
-
Bug fixes
-
Fix
'audio/mpeg'
canPlay()
checks, was incorrectly returning false due toaudio/mpeg; codecs="mp3"
working and preventingaudio/mpeg
from being checked.  -
Safer HTML5 duration checks - null now assigned instead of undefined.
-
Improve durationEstimate under HTML5 during
whileloading()
. -
Flash 9/RTMP: Actually provide caption data to
oncaptiondata()
. -
Fix
SMSound.play({url:...})
"re-use" case where new URL wasn't being assigned + loaded right away, andSMSound.url
property was not being updated. -
Correct
load()
and play() with new URL parameter, so that subsequentplay()
call uses new URL (and not URL assigned with originalcreateSound()
call). -
Use seconds for
SMSound.buffered
(time ranges) whether HTML5 or Flash, since SM2 API uses seconds forsetPosition()
etc. -
Correct
play()
->pause()
->setPosition(0)
->play()
->pause()
case where the latter wasn't firing due to invalid state.
-
-
Miscellaneous
-
New Cassette Tape UI Prototype/demo (experimental).
-
Tweaked documentation layout for legibility. Webfont (deja vu sans mono) from dejavu-fonts.org for code examples.
-
Improved lazy-load / deferred example based on new
setup()
logic -
Added SMSound.buffered documentation
-
Added m4b extension as an mp4 format
-
Safer initial HTML5 support checks
-
-
-
V2.97a.20120624 - New
soundManager.setup()
method, numerous HTML5 improvements forcreateSound()
,load()
, progress and reuse cases, and minor flash audio bug fixes (Download archived version)-
API: New sugar-like stuff
-
New
soundManager.setup()
mixin-style method for assigning properties and common start-up callbacks. Collects top-level soundManager configuration properties and object collections -onready
,ontimeout
,defaultOptions
,flash9Options
andmovieStarOptions
- under a single method call.Upgrade / legacy note: This is a modern replacement for the direct property assignment method used in all previous versions - eg.,
soundManager.url = '/swfs/'
- the old method continues to work for legacy support, but you should migrate to using the new method as it's much cleaner. All included demos use the new method where applicable.New
soundManager.setup()
method examplesoundManager.setup({ // required url: '/path/to/swfs/', // optional flashVersion: 9, // convenience onready: function() { console.log('Ready to play sound!'); }, ontimeout: function() { console.log('SM2 start-up failed.'); }, // more custom parameters defaultOptions: { volume: 50 } });
See soundManager.setup() for details.
-
-
Bug fixes
-
Improve HTML5 audio load/playback reliability + stability on iOS, and for object reuse cases (
play()
->load({url: ...})
. Prior behaviour was making initial HTTP request when object was created (meta/preload, not necessarily loading entire file.) Request now only happens with preload/load/play-related calls. -
HTML5: Firefox seems to have changed when unloading HTML5 audio,
url = ''
now loads hosting page HTML (boo) instead ofnull
/ no request. Changed toabout:blank
like everyone else. Also fixed boolean logic onisMovieStar
assignment. -
Add
audio/mp3
and related MIME checks for flash, correct edge case whereplay({type:'audio/mp3'})
would use HTML5 whenpreferFlash = true
, due to seeming lack of Flash support for the MIME type. -
Fixed old Flash 8
onload()
edge case where loading from cache might return incorrectdidLoad: false
result - corrected by checking for a non-zero sound duration. -
Properly reset
SMSound.id3 = {}
with internal resetProperty and public methods likeload()
. -
Edge case fix: Don't attempt to remove flash unless reference exists (prevent false warning when
reboot()
called in 100% HTML5 mode.) -
Correct empty options JS error on internal
_setup_html5()
when reusing HTML5 audio object per V2.97a.20120527 bug report (Internet Archive) -
Fix minor false positive (undocumented error handler case) with HTML5
play()
falsely reporting 32-sound ceiling edge case and callingSMSound.onplayerror()
(if assigned) when using flashVersion = 9. Should only apply when flash 9 is being used for playback, and ceiling hit.
-
-
Miscellaneous
-
Finally assign + use
SMSound.id
(instead of sID), matchingcreateSound({id: 'foo'})
pattern; maintain legacy sID property (ancient behaviour, originally intended to avoid potential namespace conflicts many years ago - now silly and not a concern.) -
Improved handling of
whileloading()
vs. HTML5onload
(when using HTTP range/partial requests).HTML5
onload()
(now triggered via nativecanplaythrough
event) may fire early, followed by numerous HTML5progress
requests during playback as the audio object requests and buffers more audio ranges (eg., 0-10 seconds), eventually matching the total sound duration.Bytes loaded / total are not available, so bytesLoaded instead reflects a fraction of "duration loaded", between 0 and 1 as data is buffered in. Previously,
whileloading
events would not fire onceonload
had fired under HTML5. -
New (undocumented, for now)
buffered
array on SMSound objects; list of objects following the patternSMSound.buffered = [{ start: 0, end: 706 }]
representing loaded time ranges (somewhat similar to HTML5 TimeRanges spec, but using static properties instead of method calls with an index parameter.) Array will initially be empty, zero-length. This can be looped through to show overlays of "loaded" time fragments on progress bars, for example.SMSound
buffered
is updated duringwhileloading()
calls, where values are provided by the browser. For flash, will always be one item with{ start: 0, end: SMSound.duration }
assigned. Also stopped sending 1/1 values towhileplaying()
atonload()
, since HTML5 can fireonload()
(viacanplaythrough
) very early followed by many progress (whileloading()
) events.Support note: Not all browsers (eg., Safari 5.1.7) appear to provide buffer / TimeRanges data for HTML5 audio objects. At time of writing (06/2012), Firefox, Chrome Canary, IE 9 and Opera provide TimeRanges alongside progress events.
-
Upgraded demos to use to
soundManager.setup({...})
for most configuration cases (vs. settingsoundManager.url
,soundManager.defaultOptions.autoLoad
directly etc.) -
Warn if
soundManager.setup()
called withurl
orflashVersion
, and init has already fired (ie., flash options already set + movie already loaded) where changes will not take effect untilsoundManager.reboot()
. -
Assign top-level soundManager properties (eg.
soundManager.url
) fromsoundManager.setupOptions
atDOMReady
time; this allows legacysoundManager.url = ...
assignment to work, and helps to ensure legacy-style, directly-assigned top-level property values get written back tosoundManager.setupOptions
.
-
-
-
V2.97a.20120527 - Fix for
ontimeout()
regression. GWT/JSNI compatibility, slow connection and Safari "background tab" SWF load handling improvements (Download archived version)-
Bug fixes
-
Fix for
ontimeout()
regression seen when using lazy-loading / SM2_DEFER introduced with V2.97a.20120513; bug introduced when making edits to pass newer jslint rules regardingreturn
withinif...else
blocks. -
Replaced
instanceof Function
with "safer"typeof x === 'function'
foronready()
,ontimeout()
and related callback argument checks as GWT + JSNI was passing arguments that failed theinstanceof
check. (Related bug report.) -
Corrected another small regression for the
ontimeout()
->onready()
"recovery" edge case, ensuring "ready" does not fire after a timeout when init was unsuccessful.
-
-
Miscellaneous
-
Improved handling for special Safari page load case: When a new tab is opened that does not have focus, the Flash SWF does not load/init until the tab is brought to the foreground. SM2 now recognizes this special case and waits until
window.onfocus()
before attempting to do the JS/Flash part of init. Previously, it would fail with a timeout.Code written to originally handle Safari 3.1, which did not support
document.hasFocus()
, was modified and updated for this purpose. The Safari 3.1 logic previously deferred SM2's start-up in a similar fashion. (The old Safari 3.1mousemove()
focus-detection hack has been removed as Safari 4 has been out since mid-2009, and Safari 5 since mid-2010.) -
SM2 init process will now delay and retry if no Flash response, and SWF has loaded > 0 and < 100%. Timeout will now happen only after delay and when SWF has loaded 100%. Should help prevent first-visit (non-cached) failure on very slow or laggy connections.
-
Added note about potential Firefox regression: Offline JS/Flash start-up (viewing HTML pages via
file://
and/orc:/
and so forth), possibly not working as of Firefox 9 and newer (at time of writing, also up to and including Firefox 12), even despite special security whitelisting under Flash Player "trusted locations" preferences / control panel.After successful Flash -> JS call, SM2's "return" JS -> Flash call fails with unusual JS/Flash exception, "Error in ActionScript" error with no further detail. Offline viewing still works in other browsers.
-
-
-
V2.97a.20120513 - Fixes for Android 2.3 playback,
onPosition()
in HTML5, Flash 9 double-play edge case. Minor new Flash 9-specific features (Download archived version)-
Bug fixes
-
Android 2.3 playback fix (some sounds started only after 2+ play attempts due to Android not liking
load()
immediately followed byplay()
?) -
onPosition()
fix for HTML5 playback, items were mistakenly being removed. -
Fix RTMP stream duration reporting via
onmetadata()
(wrong value was being returned, previously.) -
Fix for Flash 9 double-play edge case (Internet Archive) found with
pause()
+setPosition()
calls. -
JSLINT validation per 04-15-2012 edition rules, mostly removal of multiple return statements within
if ... else
blocks and inverted loop tricks.
-
-
API updates
-
Enabled waveform/eq/spectrum data features for MovieStar (H.264/NetStream content.)
-
Added
oncaptiondata()
callback for caption data from Flash 9 (NetStream/RTMP-only, similar toonmetadata()
. Contributor: GitHub user karma.) -
Added
SMSound.onplayerror()
, presently for Flash 9 (non-MovieStar/NetStream) which can detect lack of available sound hardware or 32-channel ceiling as reasons for playback failure. -
Added
oncaptiondata()
callback for caption data from Flash 9 (NetStream/RTMP-only, similar toonmetadata()
.)
-
-
Miscellaneous
-
Scaling added to 360 UI (via GitHub user tomasdev)
-
-
-
V2.97a.20120318 - Minor updates.
from
/to
andonplay()
bug fixes,canPlayMIME()
andcanPlayLink()
Flash-specific corrections. (Download archived version)-
Bug fixes
-
Fix silly
undefined"soundID"
debug output message shown atSMSound.onload
(now saysSMSound._onload()
as previously.) -
soundManager.sounds = {}
instead of[]
on reboot (per bug report [Internet Archive]) -
Fix logic for calling
onplay()
, was always non-truthy. D'oh! -
Add missing
typeof
to fix html5 MIME check for playability tests -
Don't apply
width:auto
to SWF (invalid per HTML5, allegedly: Related patch.) -
Make
soundManager.canPlayMIME()
andcanPlayLink()
check flash support before returning (check afterontimeout()
was returning truthy when flash required under Firefox, for example, for'audio/mp3'
) -
Fix
play()
"from
" + "to
" sound sprite playback issue: In some cases, previously-fired "to" events were re-firing due to not being removed, because an equality check was comparing against a potential "to" value of a string rather than a number. (eg., 0-700 followed by 1500-2000; playback would stop in second case, saying 700 had been reached. (Related bug report [Internet Archive].) -
Re-appeased the jslint gods, removed unused variables and two-statement reverse loop
(for i=x; i--;) { }
trickery.
-
-
Miscellaneous
-
The SoundManager project turned 10 years old, having originally launched in late 2001. Thanks for using it!
-
-
-
Older Release Info
For release and changelog history going back to 2010, see the archive page.
Discussion / Support
For bug reports and technical support, see GitHub Issues.


goscripts.genelist_importer module¶
@author: Pieter Moris
-
goscripts.genelist_importer.
importGeneList
(path)¶ Imports the interest/background set (Uniprot AC).
Parameters: path (str) – The path to the file. Returns: - set of str – A set of background Uniprot AC’s.
- Notes (Gene lists should not contain a header. One gene per line.)
- Possible improvements (check for file structure and allow headers, comma separated lists, etc.)
-
goscripts.genelist_importer.
isValidSubset
(subset, background)¶ Checks if the gene subset of interest contains genes not present in the background set. If there are additional genes they are removed.
Parameters: - subset (set of str) – A subset of Uniprot ACs of interest.
- background (set of str) – A set of Uniprot ACs to be used as the background.
Returns: A cleaned subset of Uniprot ACs of interest.
Return type: set of str
-
goscripts.genelist_importer.
reportMissingGenes
(geneSet, gafDict, indicator)¶ Finds and reports Uniprot AC’s in the provided background/interest gene sets which are not present in the gene association file (most likely obsolete entries). Also returns a new set where these missing genes are removed.
Parameters: - geneSet (set of str) – A set of Uniprot ACs. Generated by importSubset() or importBackground().
- gafDict (dict of str mapping to set) – A dictionary mapping gene Uniprot AC’s (str) to a set GO IDs. Generated by importGAF().
- indicator (str) – A string signifying whether the set is the background or interest set of genes.
Returns: geneSet – The set after removal of Uniprot AC’s not present in provided gene lists.
Return type: set of str


MY LIFE FOR ZARAH LEANDER A film review by Manavendra K. Thakur Copyright 1987 Manavendra K. Thakur
Seen at the Boston Film Festival:
1985 MY LIFE FOR ZARAH LEANDER 83 mins.
West Germany-USA German with English subtitles Unrated Mono Color with B/W archival footage 16mm/1.33
Cast: Zarah Leander, Paul Seiler, Armand, Margot Hielscher, Rolf Hansen, Douglas Sirk, Michael Jary, Bruno Balz, Prof. Rolf Kutschera, Hans Weigel, Harold Prince, and Karl Schoenboeck
Credits: Director, Producer, Editor, Director of Photography, Sound: Christian Blackwood
Studio/Distributor: Christian Blackwood Productions 115 Bank St. New York, NY 10014<PHONE_NUMBER>
Zarah Leander, a Swedish-born chanteuse actress who became popular in Germany during the reign of the Third Reich in the 1930s and 1940s, is the subject of this fascinating documentary by Christian Blackwood. The film presents the enigmatic and multi-faceted personality of Zarah Leander through both archival footage as well as the eyes of an obsessive fan of hers, Paul Seiler. This dual approach keeps alive the memory of a famous figure from the past, but the film's value in exploring the private motivations of Zarah Leander's fandom far exceeds its historical description of her stardom.
 Her broad features, husky physique, and deep singing voice made her a much more masculine presence than Marlene Deitrich. She starred in a series of melodramas that were revered by her fans, both for her acting and her singing.
She was frightened of growing old, and she repeatedly tried to stage comebacks by singing her old hits to the accompaniment of her husband on the piano. The loss of her youthful beauty had unfortunately devastated her and her career, and she could not understand why current audiences devoted their attentions elsewhere. Blackwood depicts her rise and fall through numerous interviews with songwriters and directors who worked with her in the 1940s and 1950s. He also shows footage from her films as well as concerts she gave after her fame declined.
Blackwood also presents interviews with Zarah Leander in which another aspect of her personality becomes apparent: her complete lack of any political compunctions against working within the Nazi regime. In one particularly telling scene, she says that the adulation that she received from her fans was all that was important to her. What her fans did the rest of the time, she declares, was none of her concern. This uncompromising refusal to accept political realities undoubtedly was a factor in her decline as contemporary audiences were loathe to revere a figure so closely identified with the Nazi regime.
But at one time she was quite famous. Her ability to fascinate her audience is shown in this film through Paul Seiler, a homosexual and a fan who first heard Zarah Leander on Swiss radio in 1943 and finally met with her personally in 1955. He soon became her confidant, and she became the "super-mother" figure he craved to replace the loss of his mother in childhood. Paul Seiler plastered his apartment walls with photographs and articles about her. He would console her after a bad performance or critical review, and he would follow her where ever her schedule demanded. Her decline from fame and death in 1981 had a severe effect on him. While attending an auction of clothing and other memorabilia associated with Zarah Leander, he becomes outraged that other bidders consider the momentos of her life and career as little more than collectors' items for their own aggrandizement. Trying to come to terms with her demise, he seeks out and talks with a male professional Zarah Leander impersonator named Armand who sings her songs in a nightclub act. As the film ends with the Armand singing many of the songs we saw Leander sing earlier in the film, the admiration evident in Paul Seiler's face justifies and gives meaning to the film's title.
Technically, Blackwood does an acceptable job. He found and inserted many segments from Zarah Leander's films and concert footage. He also has tracked down and interviewed many people who knew Zarah Leander or were associated with her rise to stardom, including Douglas Sirk who directed two of Leander's biggest hits, TO NEW SHORES and LA HABANERA. He uses freeze frames and photographs with good effectiveness in parts. However, one annoying problem occurs in parts of the film. Blackwood shot interview footage of Zarah Leander, transferred it to videotape, and reshot it onto film as Paul Seiler watches the videotape on a television in his living room. Blackwood does this to show us Paul Seiler's reactions to the footage in order to heighten our understanding of his devotion. However, the psychological effect is obscured by the loss of resolution and color. Blackwood himself invites comparison in one or two instances when he zooms his camera into the television and then segues into the actual footage itself (thereby eliminating the videotape step). The small pallid image of Zarah Leander on the television set seems a much less likely object of obsession than her richer, fuller image on direct film. Blackwood should not have used videotape as an intermediate step.
In terms of its narrative, the documentary does a good job in portraying the life and times of a star from the past. However, the more interesting aspect of the film examines the effect she had on her fans, both past and present. The structure of the film is such that we are initially introduced to the fact that Zarah Leander had and still has a loyal following. This arouses a curiosity as who this Zarah Leander person is and why she has such a following. Only after 30 minutes or so are we shown archival footage of her films and concerts to give us an understanding of exactly who is being discussed so reverently by her fans. While portraying her decline and death, the film constantly shifts its focus back to Paul Seiler. He opens up to the camera considerably and in several very moving scenes explains his personal fondness for Zarah Leander. His homosexuality, her husky masculine features, and the loss of his mother at an early age are all discussed with such candor and simplicity that the documentary is transformed into a very personal tribute and love letter to Zarah Leander. In one particularly touching moment, Paul Seiler tells how he was unable to give Zarah Leander a birthday gift of photographs and momentos of her career because she became more distant from him as she grew older and faded from stardom. She stopped returning his calls, and he was not allowed to see her as often as before. The sadness in Paul Seiler's face as he recounts this turn of events humanizes the depth of his attachment to her and the pain of separation after her decline. While we may not share his reverence for Zarah Leander, we certainly come to understand just how deeply he loved her and why she exerted such an influence over him.
The film rates two and a half (out of four) stars for going beyond a mere historical representation of Zarah Leander's life. However, the real star is Christian Blackwood himself. His ability as a film maker is apparent in this film, and his work deserves wider recognition. The insights presented with discerning perception by Christian Blackwood into why someone would devote his life to a masculine chanteuse actress who was closely identified with the Nazi Party is the real heart of the film.
Partial Filmography of Christian Blackwood:
SPOLETO: FESTIVAL OF TWO WORLDS 1967 90 mins HARLEM THEATER 1968 90 mins SUMMER IN THE CITY 1968 90 mins SAN DOMINGO -- co-directed with Hans Jurgen Syberberg 1970 140 mins "Eliot Feld: Artistic Director" 1970 58 mins "Juilliard" 1971 52 mins "Kentucky Kith & Kin" 1972 52 mins BLACK HARVEST 1973 90 mins "Hollywood's Musical Moods" 1973 50 mins "Yesterday's Witness: A Tribute to the American Newsreel" 1974 52 mins "Living with Fear" 1974 58 mins "Rock: USA" 1976 43 mins "To Be a Man" 1977 58 mins "Roger Corman: Hollywood's Wild Angel" 1978 58 mins "Cousins" 1979 58 mins "Memoirs of a Movie Palace" 1980 45 mins "Tapdancin'" 1980 58 mins ALL BY MYSELF 1982 83 mins CHARLES AZNAVOUR: BREAKING AMERICA 1983 83 mins OBSERVATIONS UNDER THE VOLCANO 1984 83 mins MY LIFE FOR ZARAH LEANDER 1985 83 mins PRIVATE CONVERSATIONS: ON THE SET OF "DEATH OF A SALESMAN" 1985 82 mins NIK AND MURRAY 1986 82 mins
Christian Blackwood's films have been shown at numerous film festivals and on international television, winning many awards along the way. His feature film SAN DOMINGO, adapted from a novel by Kleist, won the Bundesfilmpreis for 1970 (the German Oscar award equivalent). He has also made several commercials for television and cinema as well as short films that are not listed above.
Manavendra K. Thakur {rutgers,decvax!genrad,ihnp4}!mit-eddie!thakur<EMAIL_ADDRESS><EMAIL_ADDRESS>The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


CellConfigType
public protocol CellConfigType : CollectionItemConfigType, TableItemConfigType
A type that provides the information required by FunctionalTableData
to generate cells.
The key
property should be a unique String for the section that the item is contained in. It should also be representative of the item and not just a random value or UUID. This is because on an update pass the key
is used to determine if an item has been added, moved, or removed from the data set. Using a stable value means that this can correctly be determined.
The isEqual
function is used to determine if two CellConfigType’s have matching keys and they represent the same data. This allows the system to update the views state directly when something has changed instead of forcing a reload of the entire cell all the time.
When two items have matching key
values but the isEqual
call between old and new returns false the update
function is called. It is the responsibility of this function to update the cell, and any subviews of the cell, to reflect the state.
-
Unique identifier for the cell.
Declaration
Swift
var key: String { get }
-
Indicates all the possible actions a cell can perform. See
CellActions
for more information.Declaration
Swift
var actions: CellActions { get }
-
Update the view state of a
UITableViewCell
. It is up to implementors of the protocol to determine what this means.Declaration
Swift
func update(cell: UITableViewCell, in tableView: UITableView)
Parameters
cell
A cell view that was dequeued from the
UITableView
.tableView
The
UITableView
object holding this cell. -
Update the view state of a
UICollectionViewCell
. It is up to implementors of the protocol to determine what this means.Declaration
Swift
func update(cell: UICollectionViewCell, in collectionView: UICollectionView)
Parameters
cell
A cell view that was dequeued from the
UICollectionView
.collectionView
The
UICollectionView
object holding this cell. -
Compares two cells for equality. Cells will be considered equal if they are of the same type and their states also compare equal.
Cell equality is used during rendering to determine when an existing cell’s view needs to be updated with new data.
Declaration
Swift
func isEqual(_ other: CellConfigType) -> Bool
Parameters
other
the value to compare against.
Return Value
true
when both values are the same,false
otherwise.


This is a demo of video-markers plugin for videojs. This demo shows how we can block video seeking only when certain conditions are met.


You must declare the "browsingData" permission in the extension manifest to use this API.
{ "name": "My extension", ... "permissions": [ "browsingData", ], ... }
The simplest use-case for this API is a a time-based mechanism for clearing a
user's browsing data. Your code should provide a timestamp which indicates the
historical date after which the user's browsing data should be removed. This
timestamp is formatted as the number of milliseconds since the Unix epoch
(which can be retrieved from a JavaScript Date
object via the
getTime
method).
For example, to clear all of a user's browsing data from the last week, you might write code as follows:
var callback = function () { // Do something clever here once data has been removed. }; var millisecondsPerWeek = 1000 * 60 * 60 * 24 * 7; var oneWeekAgo = (new Date()).getTime() - millisecondsPerWeek; chrome.browsingData.remove({ "since": oneWeekAgo }, { "appcache": true, "cache": true, "cacheStorage": true, "cookies": true, "downloads": true, "fileSystems": true, "formData": true, "history": true, "indexedDB": true, "localStorage": true, "pluginData": true, "passwords": true, "serviceWorkers": true, "webSQL": true }, callback);
The chrome.browsingData.remove
method allows you to remove
various types of browsing data with a single call, and will be much faster
than calling multiple more specific methods. If, however, you only want to
clear one specific type of browsing data (cookies, for example), the more
granular methods offer a readable alternative to a call filled with JSON.
var callback = function () { // Do something clever here once data has been removed. }; var millisecondsPerWeek = 1000 * 60 * 60 * 24 * 7; var oneWeekAgo = (new Date()).getTime() - millisecondsPerWeek; chrome.browsingData.removeCookies({ "since": oneWeekAgo }, callback);
If the user is syncing their data, chrome.browsingData.remove
may
automatically rebuild the cookie for the Sync account after clearing it. This
is to ensure that Sync can continue working, so that the data can be
eventually deleted on the server. However the more specific
chrome.browsingData.removeCookies
can be used to clear the cookie
for the Sync account, and Sync will be paused in this case.
Important: Removing browsing data involves a good deal of heavy lifting in the background, and can take tens of seconds to complete, depending on a user's profile. You should use the callback mechanism to keep your users up to date on the removal's status.
To remove data for a specific origin or to exclude a set of origins from
deletion, you can use the RemovalOptions.origins
and
RemovalOptions.excludeOrigins
parameters. They can only be applied
to cookies, cache, and storage (CacheStorage, FileSystems, IndexedDB,
LocalStorage, PluginData, ServiceWorkers, and WebSQL).
chrome.browsingData.remove({ "origins": ["https://www.example.com"] }, { "cacheStorage": true, "cookies": true, "fileSystems": true, "indexedDB": true, "localStorage": true, "pluginData": true, "serviceWorkers": true, "webSQL": true }, callback);
Important: As cookies are scoped more broadly than other
types of storage, deleting cookies for an origin will delete all cookies of
the registrable domain. For example, deleting data for
https://www.example.com
will delete cookies with a domain of
.example.com
as well.
Adding an originTypes
property to the API's options object allows
you to specify which types of origins ought to be effected. Currently, origins
are divided into three categories:
unprotectedWeb
covers the general case of websites that users
visit without taking any special action. If you don't specify an
originTypes
, the API defaults to removing data from unprotected
web origins.
protectedWeb
covers those web origins that have been installed
as hosted applications. Installing
Angry Birds, for example, protects the origin
http://chrome.angrybirds.com
, and removes it from the
unprotectedWeb
category. Please do be careful when triggering
deletion of data for these origins: make sure your users know what they're
getting, as this will irrevocably remove their game data. No one wants to
knock tiny pig houses over more often than necessary.
extension
covers origins under the
chrome-extensions:
scheme. Removing extension data is, again,
something you should be very careful about.
We could adjust the previous example to remove only data from protected websites as follows:
var callback = function () { // Do something clever here once data has been removed. }; var millisecondsPerWeek = 1000 * 60 * 60 * 24 * 7; var oneWeekAgo = (new Date()).getTime() - millisecondsPerWeek; chrome.browsingData.remove({ "since": oneWeekAgo, "originTypes": { "protectedWeb": true } }, { "appcache": true, "cache": true, "cacheStorage": true, "cookies": true, "downloads": true, "fileSystems": true, "formData": true, "history": true, "indexedDB": true, "localStorage": true, "serverBoundCertificates": true, "pluginData": true, "passwords": true, "serviceWorkers": true, "webSQL": true }, callback);
Seriously: Be careful with protectedWeb
and
extension
. These are destructive operations that your users
will write angry email about if they're not well-informed about what to
expect when your extension removes data on their behalf.
Samples for the browsingData
API are available
on the samples page.


Return to Shopping Cart
Checkout Summary
Item ID
Product ID
Description
In Stock?
Quantity
List Price
Total Cost
OK


College Events
Stay updated with organizations, events and UCF Announcements.
Dashboard
Organizations
Events
About Us
Sign in


We are certified by Google trusted agency to cover local business and to take your Business into Google’s high standards cutting edge and help your business to be listed into Google’s listing to stand out from a sea of competition in the search engine.
Street View Trusted is hosted on Google Maps, however it can be accesses through a number of Google products.
To become a world-class imaging solution and online branding company that support clients of diverse verticals to achieve their business objectives and exceed the expectations of clients with commitment, quality and excellent service
Quality First: We ensure to provide all our services and solutions with utmost care on quality and effectiveness of service delivery.Integrity: We follow a transparent and client-friendly approach in offering support and assistance
Give me a message


{% extends "malepy/user_base.html" %}
{% block article %}
MOSS Reports
| Course | Assignment | Created | Plagiarism | {% for report in reports %} {% if report.plagiarism %}|
|---|---|---|---|---|
| {{ report.assignment.course.name }}({{ report.assignment.course.year }}) | {{ report.assignment.name_en }} | {{ report.created| date:"d-M-Y @ H:i" }}h | {% if report.plagiarism %}Yes | {% else %}No | {% endif %} {% endfor %}


Choose items
Name
Price
Amazon.com Gift Card in a Black Gift Box
Color: Black
HKD $150
Amazon.com Gift Card in a Greeting Card
Color: Black
HKD $70
Amazon.com Gift Card in a Birthday Cupcake Tin
Color: Blue
HKD $150
Prev
1
Next
Shopping Cart
Empty
Check Out


Applies To
What to Check For
Verify that session IDs are changed during login.
Why
Change session IDs during login to make sure that the session state corresponds to the authenticated user.
How to Check
To verify that session IDs are changed during login:
- Find login functionality. Find the code that is responsible for authentication.
- Verify that session IDs are changed during login. Review code responsible for logging in to make sure that code exists that clears the existing session state and creates a new session ID.
How to Fix
To change session IDs during login:
- Find login functionality. Find the code that is responsible for authentication.
- Change session IDs during login. Add code that invalidates the current session ID and creates a new one.


Hi!
I'm a computer science student at DISI UniTn.
My interests are low level programming, embedded systems, FPGAs and everything that is hardware related.
Currently I'm a developer at Eagle Racing Team working on the Battery Management System for our second and new elctric car.
I love vintage and clicky keybaords (❤⌨ )
If you have any question about me or else, just send an e-mail.


| Date | Name | Description | Duration |
|---|---|---|---|
| 25/06/2002 08:05:03 | design templates | It would be useful to provide the user with a simpler mechanism for user defined reports than having to write the whole script. Add templates <!CTA ... !> to sandwich the info For Each x in collection Next should be adequate also provide a way to use templates in scripts  |
3  |
| 27/06/2002 09:08:48 | Document Templates | Add the templates to the documentation also add the new weightingInstances property on node, links and instance which is very handy when templating and fulfilTemplate and fulfilThisTemplate functions on cdiface for using templates with scripts.  |
4  |
| 26/06/2002 08:06:59 | Code Templates | build a simple tokeniser and interpreter for the templates. nested for implemented using a stack (only one var to track per loop block)  |
4  |
| 26/06/2002 13:08:07 | test templates | build some test template reports  | 3  |
| ID | Name | Raised Date | Closed Date | Description | Resolution |
|---|---|---|---|---|---|
| 298 | Default Entity Names should include the id so that they are unique | 28/06/2002 10:20:21 | 01/07/2002 11:30:21 | Default Entity Names should include the id so that they are unique  |   |
| 295 | treebrowser changed/save changes loop | 27/06/2002 11:30:14 | 27/06/2002 14:11:14 | when an item in the edit pane of the treebrowser changes, and the tree is clicked on then the system correctly prompts for "dirty - save?" if yes is clicked then the item is saved, but the system prompts again.  |   |
| ID | Name | Raised Date | Status | Criticality | Description |
|---|---|---|---|---|---|
| 299 | New Entity does not update the entity list | 28/06/2002 10:30:58 | OPEN | MEDIUM | in the tree browser when an entity is selected and the user creates a new entity then the entity is shown in the tree but not in the list  |
| 208 | entity create needs saved twice | 30/05/2002 16:24:02 | OPEN | MEDIUM | when creating an entity, and saving it. the save is made but the form brings up the save button once again. the second save commits and does not ask for another save this is a sporadic problem and may be due to an oversensitive keyboard setting on the laptop?  |
| 288 | Updating a hierarchy branch name does not reflect in tree browser | 21/06/2002 12:56:16 | OPEN | MEDIUM | Updating the name of an entity when it is a hierarchy branch (from the hierarchy browser) does not update the model browser tree pane.  |
| 275 | time not always shown on date weighting | 19/06/2002 11:45:59 | OPEN | LOW | date is not always shown when a date weighting is selected - workaround - click the other tabs a few times  |
| 133 | The hierarchy browser tree refreshes too much on drag | 25/04/2002 17:54:37 | OPEN | LOW | this can be disconcerting when dragging, perhaps the timer is not long enough?  |
| 302 | node style font change does not apply on its own | 28/07/2002 10:30:21 | OPEN | LOW | in order to effect a font change, the colour has to be changed as well, just changing the node style does not affect a change  |
| 300 | node style caption does not reflect selected item | 28/06/2002 10:30:00 | OPEN | LOW | node style caption does not reflect selected item the caption on the dialog should say link style if selected a link and node/link style if on both  |
| 134 | the hierarchy browser hierarchy should maintain expansion | 25/04/2002 17:55:54 | OPEN | LOW | during restructuring, the hierarchy should leave expanded the items which are expanded  |
| 62 | icons on buttons are not transparent | 17/04/2002 | OPEN | LOW | need to turn the .ico into .bmp and setup the mask property  |
| 49 | popup menus use mouse co-ords | 19/04/2002 14:31:35 | OPEN | LOW | this isn't particularly good when we are using the insert keys   |
| 303 | create new node should use style on the node style dialog | 01/07/2002 10:30:02 | OPEN | LOW | create new node should use style on the node style dialog  |
| 301 | node style dialog buttons should have tooltips | 28/06/2002 10:30:46 | OPEN | LOW |   |
| ID | Name | Raised Date | Status | Raised By | Description |
|---|


Before Change
ditException
Raised if `dist` is not a joint distribution.
if dist.is_joint():
if rvs is None:
// Set to entropy of entire distribution
rvs = [ [i] for i in range(dist.outcome_length()) ]
rv_names = False
if crvs is None:
crvs = []
else:
msg = "The coinformation is applicable to joint distributions."
raise ditException(msg)
def entropy(rvs, dist=dist, crvs=crvs, rv_names=rv_names):
return H(dist, set().union(*rvs), crvs, rv_names)
I = sum( (-1)**(len(Xs)+1) * entropy(Xs) for Xs in powerset(rvs) )
After Change
ditException
Raised if `dist` is not a joint distribution.
rvs, crvs, rv_names = normalize_rvs(dist, rvs, crvs, rv_names)
def entropy(rvs, dist=dist, crvs=crvs, rv_names=rv_names):
return H(dist, set().union(*rvs), crvs, rv_names)


Offshore Wind Energy
Offshore wind energy is a clean and renewable energy obtained by taking advantage of the force of the wind that is produced on the high seas, where it reaches a higher and more constant speed than on land due to the absence of barriers. In order to make the most of this resource, mega-structures are installed that are seated on the seabed and equipped with the latest technical innovations. Offshore wind power provided 0.3% of global electricity supply in 2018, but the market has grown by almost 30% per year since 2010, second only to solar.
The biggest challenge of our days is the transition to a clean energy
In 2017, 45% of the energy needed in UE it was produced in the European Union the rest of 55% it was imported from other countries. In 2017 two thirds of imported energy in European Union was petroleum followed by gas (26%) and fossil fuels (8%) “The stability of the EU’s energy supply may be threatened if a high proportion of imports are concentrated among relatively few external partners. In 2017, almost two thirds of the extra-EU's crude oil imports came from Russia (30 %), Norway (11 %), Iraq (8 %), Kazakhstan and Saudi Arabia (both 7 %). A similar analysis shows that more than three quarters of the EU's imports of natural gas came from Russia (40 %), Norway (26 %) and Algeria (11 %), while almost three quarters of solid fuel (mostly coal) imports originated from Russia (39 %), Colombia and the United States (17 % each). Among the EU states more than 80 % of energy imports are petroleum products in Cyprus, Malta, Greece, Sweden and Romania and more than a third is gas in Hungary, Austria, Italy and Germany. More than 15 % of energy imports are solid fuels in Slovakia.
Wind power is the most efficient technology to produce energy in a safe and environmentally sustainable manner: it has zero emissions, local, inexhaustible, competitive and it creates wealth and jobs.
Our Goal is to create a better Future
We are a group of people pationate about renewable industry and we set a goal! To create a tool that people or Goverments will be able to use for the benefit of this planet. The most important reason we focused on Wind Energy is because it is practically everywhere on the planet, which contributes to reducing energy imports and to creating wealth and local employment. Producing electricity through wind energy and its efficient use contributes to sustainable development.
In 2018 Europe connected 409 new offshore wind turbines to the grid across 18 projects. This brought 2,649 MW of net additional capacity. Europe now has a total installed offshore wind capacity of 18,499 MW. This corresponds to 4,543 grid-connected wind turbines across 11 countries. Separately, twelve new offshore wind projects reached Final Investment Decision (FID) in 2018. Investments in new assets amounted to €10.3bn. This financed 4.2 GW of additional capacity, which will come on line in the next couple of years.
Master's degree in GeoInformatics at Aalborg University
Group 2


| option | type | default | description |
|---|---|---|---|
| size | string | large | must be "large" or "small". makes the color picker 10x7 or 4x3 respectively |
| onSelect | function | Prototype.emptyFunction | gets called when the user selects a color |
| option | type | default | description |
|---|---|---|---|
| onSelect | function | Prototype.emptyFunction | gets called when the user selects a date |
| onCancel | function | Prototype.emptyFunction | gets called when the user cancels the date picker |
| showCancel | boolean | false | toggles display of the date picker |
| month | int | new Date().getMonth() + 1 | month to start the date picker at. month is 1 based (e.g. jan == 1) if no month is passed today's month is selected. must be passed with year. |
| year | int | new Date().getYear() + 1900 | year to start the date picker at. if no year is passed today's year is selected. must be passed with month. |
| dateString | string | null | sets the selected date with the Date that is returned from the method Date.parse() |
| selectedDate | object | {day:null, month:null, year:null} | Mostly used internally but feel free to pass in an object with attributes for day, month and year. day, month and year are all 1 based and follow the same format as the above options. |
| option | type | default | description |
|---|---|---|---|
| beforeEachRow | function | Prototype.emptyFunction | gets called before each row |
| afterEachRow | function | Prototype.emptyFunction | gets called after each row |
| beforeHeaderRow | function | Prototype.emptyFunction | gets called before header row |
| afterHeaderRow | function | Prototype.emptyFunction | gets called after header row |
| beforeFooterRow | function | Prototype.emptyFunction | gets called before footer row |
| afterFooterRow | function | Prototype.emptyFunction | gets called after footer row |
| option | type | default | description |
|---|---|---|---|
| data | json | null | this is a mandatory option if you are using the data grid as a widget. It tells the data grid what data to display. |
| option | type | default | description |
|---|---|---|---|
| onSelect | function | Prototype.emptyFunction | gets called when the user selects a rating |
| selected | integer | null | sets the original |
| option | type | default | description |
|---|---|---|---|
| offsetLeft | integer | 0 | the number of pixels the tooltip is moved left after the position is calculated |
| offsetTop | integer | 0 | the number of pixels the tooltip is moved down after the position is calculated |
| direction | string | below | the direction the popup appears relative to the handle. Currently supports (below, right). |
| tooltip | string or DOM element | null | This is the actual element that gets popped up. |
| option | type | default | description |
|---|---|---|---|
| tooltipText | string | null | used for creating simple tooltips, if you specify this and tooltip as options this will overwrite the tooltip option. If you do not specify this or tooltip the widget will automatically bind the next DOM element as the tool tip |
| option | type | default | description |
|---|---|---|---|
| offsetLeft | integer | 0 | the number of pixels the tooltip is moved left after the position is calculated |
| offsetTop | integer | 0 | the number of pixels the tooltip is moved down after the position is calculated |
| direction | string | below | the direction the popup appears relative to the handle. Currently supports (below, right). |
| tooltip | string or DOM element | null | This is the actual element that gets popped up. |
| toggle | boolean | true | If this is set to true clicking on the handle once displace the tooltip click again closes it. |
| option | type | default | description |
|---|---|---|---|
| tooltipText | string | null | used for creating simple tooltips, if you specify this and tooltip as options this will overwrite the tooltip option. If you do not specify this or tooltip the widget will automatically bind the next DOM element as the tool tip |


LOCKED
This channel website is not available on your current television internet service plan. Please upgrade to a premium package to regain access.
Without Net Neutrality, this could be our future.
Click here to learn more about Net Neutrality.
Click here to voice your opinion to your government.
Click here to continue to your requested site.


 This is going to become a problem.
If you're ever going to return to your own time, you need to understand how this device on your wrist works. You have a little while before you reach your next destination, and with a bit of trial and error, you manage to pull up a programming manual on the device's tiny screen.
According to the manual, the device has four registers (numbered 0
through
3
) that can be manipulated by instructions containing
one of 16 opcodes. The registers start with the value 0
.
Every instruction consists of four values: an opcode, two inputs (named A
and B
), and an output
(named C
), in that order. The opcode specifies the behavior of the instruction and how the inputs are interpreted. The output, C
,
is always treated as a register.
In the opcode descriptions below, if something says "value A
", it means to take the number given as A
literally. (This is also called an "immediate" value.) If something says "register A
", it means to use the number given as
A
to read from (or write to) the register with that number. So, if the opcode addi
adds register A
and
value B
, storing the result in register C
, and the instruction addi 0 7 3
is encountered, it would add
7
to the value contained by register 0
and store the sum in register 3
, never modifying registers 0
,
1
, or 2
in the process.
Many opcodes are similar except for how they interpret their arguments. The opcodes fall into seven general categories:
Addition:
addr
(add register) stores into registerC
the result of adding registerA
and registerB
.addi
(add immediate) stores into registerC
the result of adding registerA
and valueB
.
Multiplication:
mulr
(multiply register) stores into registerC
the result of multiplying registerA
and registerB
.muli
(multiply immediate) stores into registerC
the result of multiplying registerA
and valueB
.
banr
(bitwise AND register) stores into registerC
the result of the bitwise AND of registerA
and registerB
.bani
(bitwise AND immediate) stores into registerC
the result of the bitwise AND of registerA
and valueB
.
borr
(bitwise OR register) stores into registerC
the result of the bitwise OR of registerA
and registerB
.bori
(bitwise OR immediate) stores into registerC
the result of the bitwise OR of registerA
and valueB
.
Assignment:
setr
(set register) copies the contents of registerA
into registerC
. (InputB
is ignored.)seti
(set immediate) stores valueA
into registerC
. (InputB
is ignored.)
Greater-than testing:
gtir
(greater-than immediate/register) sets registerC
to1
if valueA
is greater than registerB
. Otherwise, registerC
is set to0
.gtri
(greater-than register/immediate) sets registerC
to1
if registerA
is greater than valueB
. Otherwise, registerC
is set to0
.gtrr
(greater-than register/register) sets registerC
to1
if registerA
is greater than registerB
. Otherwise, registerC
is set to0
.
Equality testing:
eqir
(equal immediate/register) sets registerC
to1
if valueA
is equal to registerB
. Otherwise, registerC
is set to0
.eqri
(equal register/immediate) sets registerC
to1
if registerA
is equal to valueB
. Otherwise, registerC
is set to0
.eqrr
(equal register/register) sets registerC
to1
if registerA
is equal to registerB
. Otherwise, registerC
is set to0
.
Unfortunately, while the manual gives the name of each opcode, it doesn't seem to indicate the number. However, you can monitor the CPU
to see the contents of the registers before and after instructions are executed to try to work them out. Each opcode has a number from 0
through 15
, but the manual doesn't say which is which. For example, suppose you capture the following sample:
Before: [3, 2, 1, 1]
9 2 1 2
After: [3, 2, 2, 1]
This sample shows the effect of the instruction 9 2 1 2
on the registers. Before the instruction is executed, register 0
has
value 3
, register 1
has value 2
, and registers 2
and 3
have value 1
. After
the instruction is executed, register 2
's value becomes 2
.
The instruction itself, 9 2 1 2
, means that opcode 9
was executed with A=2
, B=1
, and C=2
.
Opcode 9
could be any of the 16 opcodes listed above, but only three of them behave in a way that would cause the result shown in the sample:
- Opcode
9
could bemulr
: register2
(which has a value of1
) times register1
(which has a value of2
) produces2
, which matches the value stored in the output register, register2
. - Opcode
9
could beaddi
: register2
(which has a value of1
) plus value1
produces2
, which matches the value stored in the output register, register2
. - Opcode
9
could beseti
: value2
matches the value stored in the output register, register2
; the number given forB
is irrelevant.
None of the other opcodes produce the result captured in the sample. Because of this, the sample above behaves like three opcodes.
You collect many of these samples (the first section of your puzzle input). The manual also includes a small test program (the second section of your puzzle input) - you can ignore it for now.
Ignoring the opcode numbers, how many samples in your puzzle input behave like three or more opcodes?


{% extends "base.html" %}
{% block maintitle %}
Gallery
{% endblock maintitle %}
{% block subtitle %}
Oppia
{% endblock subtitle %}
{% block navbar_breadcrumb %}
{% endblock navbar_breadcrumb %}
{% block local_top_nav_options %}
Oops, it looks like your search didn't match any explorations.
{% if not has_fully_registered %}
Would you like to create one?
{% else %}
Would you like to create one?
{% endif %}


---
layout: post
title: Mr Roboto - 8 Gb of fun!
date: '2013-07-29T20:25:00.001-04:00'
author: Bob Sica
tags:
- tech
- USB
- robot
modified_time: '2013-08-01T16:25:01.868-04:00'
blogger_id: tag:blogger.com,1999:blog-4599947215754335931.post-8490618913243293145
blogger_orig_url: http://blog.bobsica.com/2013/07/mr-roboto-8-gb-of-fun.html
---
Thanks to Cheyenne for a belated but wonderful birthday present!


ActiveRecord::Base
Account holders able to access all standard filebucket functionality.
Bypass the admin activation if the user has been invited to join.
# File app/models/user.rb, line 54 def activate_if_invited invited_user = Invite.find_by_invited_user_email(self.email) if ! invited_user.nil? invited_user.update_attribute(:invited_user_id, self.id) self.account_active = 1 self.save! end end
Generated with the Darkfish Rdoc Generator 2.


Preparation time
less than 30 mins
Cooking time
1 to 2 hours
Serves
Serves about 20
Bobotie is a kind of fruity, herby meatloaf with a curried custard topping, of Cape Malay origin. Sounds odd but tastes great! All southern Africans have their own recipe for this; ours is a classical recipe but with a heap of local advice thrown in.
Preheat the oven to 180C/350F/Gas 4.
Soak the tamarind pod in the wine to allow it to soften and dissolve slightly.
Place the beef into a clean bowl along with the following ten ingredients from the ingredients list. Knead the meat and spices together thoroughly - don't be shy, get stuck in.
Add the tamarind and red wine mixture, then add the cream, 125g/4oz butter. Season to taste with salt and pepper. Roll the bay leaves up and 'plant' them like seedlings in the meatloaf.
Butter the sides and bottom of an earthenware pot large enough to hold the meat with plenty of room to spare. Sprinkle the inside with the cumin seeds. Place the meatloaf into the preheated oven for about one hour, until slightly risen and cooked through.
For the custard topping, whisk together the milk and the eggs. Add the curry powder, salt to taste and whisk again.
Remove the meatloaf from the oven and carefully pour the custard mixture over the top. Return it to the oven and bake until the custard topping has set and cooked to a golden brown colour. You can finish it off with a blowtorch if it looks a bit anaemic. Finish with a flourish of freshly grated nutmeg.


Copyright (c) 2006-2017 DMDirc Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
DMDirc is a new cross platform IRC client written in java, it is being developed under the MIT licence by Chris 'MD87' Smith, Greg 'Greboid' Holmes and Shane 'Dataforce' Mc Cormack.DMDirc was started to address the lack of a good IRC client for Linux, it can however be run on any java capable platform, including OS X, Windows, BSD and (Open)Solaris. While there are plenty of reasonable clients, most are lacking in one respect or another. We hope that DMDirc will fill this gap.


{% extends "home/base.html" %}
{% load static %}
{% block addon_css %}
{% endblock %}
{% block content %}
Please modify your alignment query. You have chosen too many proteins/segments for our server to handle. Please make a query with less than 120.000 total residues (Current query has {{proteins}} proteins with total of {{residues}} residues)
{% endblock %}


GUMSOL
- benzocaine and zinc chloride spray
Kramer Novis
Disclaimer: Most OTC drugs are not reviewed and approved by FDA, however they may be marketed if they comply with applicable regulations and policies. FDA has not evaluated whether this product complies.
Active Ingredients (in 30 mL) Purpose
Benzocaine 5% ............................................. Anesthetic
Zinc Chloride 0.1% ....................................... Astringent
Do not exceed recommended dosage. Avoid contact with eyes. Severe or persistent sore throat accompanied by high fever, headache, nausea, and vomiting may be serious. Consult physician promptly.
Keep out of reach of children. If swallowed, get medical help or contact a Poison Control Center right away.
Dry affected area with absorbent cotton. Apply with cotton applicator or spray.
Adults and children 12 years or over:
Children under 12 years of age:
Children under 2 years of age:
Phenylketonurics: Contains phenylalanine 2.5 mg/mL
Store at controlled room temperature 15-30°C (59-86°F).
Tamper Evident Feature: Do not use if imprinted foil seal over bottle opening is torn, broken, or missing.
|
GUMSOL
benzocaine, zinc chloride spray | ||||||||||||||||||||
| ||||||||||||||||||||
| ||||||||||||||||||||
| ||||||||||||||||||||
| ||||||||||||||||||||
|
| Labeler - Kramer Novis (090158395) |


Heading
Cool things that extend heading above.
more...
Things that makes us cool:
Fast Delivery
Robust Delivery
Punctuality
Awesome code-fu
Quote of the Day


--- title: Baseline 3D Pose Estimation in PyTorch keywords: fastai sidebar: home_sidebar summary: "This repo is used as my bachelor thesis (Gunadarma University)" ---
This repo is only for educational purpose.
Paper : arxiv.
Repos : original | pytorch
pip install baseline_3d_pose
in progress...
print('hello bro')
hello bro


HTML microdata [[!MICRODATA]] is an extension to HTML used to embed machine-readable data into HTML documents. Whereas the microdata specification describes a means of markup, the output format is JSON. This specification describes processing rules that may be used to extract RDF [[!RDF11-CONCEPTS]] from an HTML document containing microdata.
This document is an experimental work in progress. The concepts described herein are intended to provide guidance for a possible future Working Group chartered to provide a Recommendation for this transformation. As a consequence, implementers of this specification, either producers or consumers, should note that it may change prior to any possible publication as a Recommendation.
This Working Draft is an update of the W3C Interest Group Note, published in October 2012. This update simplifies processing using the following mechanisms:
md:item
RDF Collection to reconstruct the order that items appear in the DOM. This has also proven to
not be useful and has been dropped.
(see issue 6)@content
attribute
of the meta
element.
(see issue 7)@value
attribute
of the data
or meter
elements. If this value has
numeric form, it will produce a datatyped literal using the appropriate datatype
from [[XMLSCHEMA11-2]]
(see issue 8
and issue 9)propertyURI
registry
setting. This setting could previously have taken either the vocabulary
or
contextual
settings. As contextual
was never used, and usage
in the wild favors the vocabulary
setting, support for contextual
has been eliminated, and consequently support for the propertyURI
element
within the registry.
This issue remains open pending community review; specifically, anyone depending on this
feature should provide feedback as requested below.
(see issue 10)multipleValues
registry setting were set
to list
. Although the previous registry did have such a setting for some
schema.org values, this is not honored by most search engines, and so has been dropped,
and consequently support for the multipeValues
element with the registry.
This issue remains open pending community review; specifically, anyone depending on this
feature should provide feedback as requested below.
(see issue 10)vocab_expansion
option. Support for Vocabulary Expansion has been substantially
simplified, and is no longer under control of an option.
This issue remains open pending community review; specifically, anyone depending on this
feature should provide feedback as requested below.
(see issue 10)The intention is to publish this draft as a new version of the Interest Group Note after gathering and incorporating community input.
This document describes a means of transforming HTML containing microdata into RDF. HTML Microdata [[!MICRODATA]] is an extension to HTML used to embed machine-readable data to HTML documents. This specification describes transformation directly to RDF [[RDF11-CONCEPTS]].
There are a variety of ways in which a mapping from microdata to RDF might be configured to give a result that is closer to the required result for a particular vocabulary. This specification defines terms that can be used as hooks for vocabulary-specific behavior, which could be defined within a registry or on an implementation-defined basis.
For background on the trade-offs between these options, see http://www.w3.org/wiki/Mapping_Microdata_to_RDF and GitHub Issues.
Microdata [[!MICRODATA]] is a way of embedding data in HTML documents using attributes. The HTML DOM is extended to provide an API for accessing microdata information, and the microdata specification defines how to generate a JSON representation from microdata markup.
Mapping microdata to RDF enables consumers to merge data expressed in other RDF-based formats with microdata. It facilitates the use of RDF vocabularies within microdata, and enables microdata to be used with the full RDF toolchain. Some use cases for this mapping are described in Section 1.2 below.
Microdata's data model does not align neatly with RDF.
http://example.org/Cat
can have
both the property color
and the property http://example.org/color
,
and these properties are semantically distinct under microdata. In
RDF, all properties have IRIs.@lang
attributes could
be used to provide datatype and language information for RDF data, this
would be contrary to the microdata specification.Thus, in some places the needs of RDF consumers violate requirements of the microdata specification. This specification highlights where such violations occur and the reasons for them.
This specification allows for vocabulary-specific rules that affect the generation of property URIs and value serializations. This is facilitated by a registry that associates URIs with specific rules based on matching itemtype values against registered URI prefixes do determine a vocabulary and potentially vocabulary-specific processing rules.
This specification also assumes that consumers of RDF generated from microdata may have to process the results in order to, for example, assign appropriate datatypes to property values.
During the period of the task force, a number of use cases were put forth for the use of microdata in generating RDF:
rdf:List
values; when they take
multiple values they are unordered. The rdfs:range
of a GoodRelations
property indicates the datatype of the expected value, and GoodRelations
processors will expect values to be cast to that type. Language
information from the HTML needs to be captured as it is common that
multiple values will be used to specify the same information in different
languages.http://schema.org/musicGroupMember
, and an author might express more detail through an ad-hoc
sub-property musicGroupMember/leadVocalist, having the URI
http://schema.org/musicGroupMember/leadVocalist
.Decisions or open issues in the specification are tracked on the GitHub Issue Tracker. These include the following:
Experimental support itemprop-reverse. This attribute is not part of [[MICRODATA]] and is included as an experimental feature. Specific feedback from the community is requested. Based on addoption, the attribute may be considered for inclusion in forthcoming versions of [[MICRODATA]] and this note.
The purpose of this specification is to provide input to a future working group that can make decisions about the need for a registry and the details of processing. Among the options investigated by the Task Force are the following:
http://www.w3.org/ns/md#item
mapping at all.
rdf:Seq
, or place all values,
whether or not multiple, into some form of collection.
The microdata specification [[!MICRODATA]] defines a number of attributes and the way in which those attributes are to be interpreted. The microdata DOM API provides methods and attributes for retrieving microdata from the HTML DOM.
For reference, attributes used for specifying and retrieving HTML microdata are referenced here:
element.itemType
on the element.
The item type is also used to resolve non-URL names to absolute URLs.
Available through the
Microdata DOM API as
element.itemType
.
(See itemtype
in [[!MICRODATA]]).
In RDF, it is common for people to shorten vocabulary terms via abbreviated URIs that use a 'prefix' and a 'reference'. throughout this document assume that the following vocabulary prefixes have been defined:
| dc: | http://purl.org/dc/terms/ |
| md: | http://www.w3.org/ns/md# |
| rdf: | http://www.w3.org/1999/02/22-rdf-syntax-ns# |
| rdf: | http://www.w3.org/1999/02/22-rdf-syntax-ns# |
| rdfa: | http://www.w3.org/ns/rdfa# |
| xsd: | http://www.w3.org/2001/XMLSchema# |
In a perfect world, all processors would be able to generate the same output for a given input without regards to the requirements of a particular vocabulary. However, microdata doesn't provide sufficient syntactic help in making these decisions. Different vocabularies have different needs.
The registry is located at the namespace defined for microdata: http://www.w3.org/ns/md
in
a variety of formats. Under control of a runtime option, a processor should use
another provided by reference, to affect processing.
The registry associates a URI prefix with one or more key-value pairs denoting processor behavior. A hypothetical JSON representation of such a registry might be the following:
This structure associates mappings for two URIs: http://schema.org/
and
http://microformats.org/profile/hcard
. Items having an item type with a URI prefix from this registry
use the the rules described for that prefix within the scope of that
item type. For http://schema.org/
, this mapping currently defines a single property: additionalType
with a value to indicate specific behavior. It also allows overrides
on a per-property basis; the item properties
key associates an individual name
with overrides for default behavior.
The interpretation of these
rules is defined in the following sections. If an item has no current type or the
registry contains no URI prefix matching current type, a conforming
processor MUST use the default values defined for these rules.
For names which are not absolute URLs, this section defines the algorithm for generating an absolute URL given an evaluation context including a current type and current vocabulary.
The procedure for generating property URIs is defined in Generate Predicate URI.
The URI generation scheme appends names that are not absolute URLs to the URI prefix. When generating property URIs, if the URI prefix does not end with a '/' or '#', a '#' is appended to the URI prefix. (See Step 4 in Generate Predicate URI.)
URI creation uses a base URL with query parameters to indicate the in-scope type and name list. Consider the following example:
Given the URI prefix http://microformats.org/profile/hcard
, this
would generate http://microformats.org/profile/hcard#n
and
http://microformats.org/profile/hcard#given-name
. Note that the '#' is automatically
added as a separator.
Looking at another example:
Given the URI prefix http://schema.org/
,
this would generate http://schema.org/name
. Note that if the itemtype
were http://schema.org/Person/Teacher
, this would generate the same property URI.
If the registry contains no match for current type implementations MUST act as if there is a URI prefix made from the first itemtype value by stripping either the fragment content or last path segment, if the value has no fragment (See [[!RFC3986]]).
The vocabulary URI prefix is made from the first itemtype value by stripping either the fragment content or last path segment, if the value has no fragment (See [[!RFC3986]]).
Deconstructing the itemtype URL to create or identify a vocabulary URI is a violation of the microdata specification which is necessary to support the use of existing vocabularies designed for use with RDF, and shared or inherited properties within all vocabularies.
In this example, assuming no matching entry in the registry,
the URI prefix is constructed by removing the
last path segment, leaving the URI
http://example.org/
. The resulting property URI would be
http://example.org/title
.
If there is no in-scope itemtype, property URIs are generated using the base URI of the document and the name as a fragment Consider the following example:
If the document is located at http://example/author
,
the name bar generates the URI
http://example/author#bar
.
However, the included name baz is included in untyped item.
The inherited property URI is used to create a new property URI:
http://example/author#baz
.
This scheme is compatible with the needs of other RDF serialization formats such as RDF/XML [[RDF-SYNTAX-GRAMMAR]], which rely on QNames for expressing properties. For example, the generated property URIs can be split as follows:
In microdata, all values are strings. In RDF, values may be resources or may be typed with an appropriate datatype.
In some cases, the type of a microdata value can be determined from the element on which it is specified. In particular:
time
element provides dates, times and durationsdata
and meter
elements provides doubles and integersMicrodata requires that all values of itemtype come from the same vocabulary. This is required as itemprop values are resolved relative to that vocabulary. However, it is often useful to define an item to have types from multiple different vocabularies.
Vocabulary expansion uses simple rules to generate additional triples based on
rules and property relationships described in the registry.
Within the registry, a property definition may have either equivalentProperty
or subPropertyOf
keys having a IRI value (or array of IRI values)
of the associated property. Such an
entry causes the processor to generate triples associating the source
property IRI with the target property IRI using either
rdf:subPropertyOf
or
owl:equivalentProperty
predicates.
For example, the registry definition for the additionalType property
within schema.org, defines additionalType to have an rdfs:subPropertyOf
relationship with rdf:type
.
The previous example, indicates a registry rule, which causes the processor to emit
an extra triple when first seeing the additionalProperty
itemprop:
After performing vocabulary expansion, an additional rdf:type
triple is generated:
The owl:equivalentProperty
rule is more powerfull than rdfs:subPropertyOf
,
in that if any equivalent property matches, then the source property would also cause a triple to be generated.
For example, if the registry stated that name
was equivalent to rdfs:label
,
than any use of name
in a itemprop would cause a triple using
rdfs:label
to be emitted, as with rdfs:subPropertyOf
. However, logically,
any use of label
where the current voabulary were rdfs:
could also cause
a triple using schema:name
to be emitted. To simplify processing, this specification
requires that all values of a owl:equivalentProperty
registry entry have their
own rules with those values as keys within the property
section of their respective
vocabularies.
The external registry may be controlled by the
registry
option passed to the microdata processor. If specified, the registry
must be loaded from the location indicated as the option value, Otherwise,
the processor MUST load the default registry from http://www.w3.org/ns/md
.
Setting registry
is performed in a processor-specific way.
When accessed as a web service using HTTP GET, POST or similar action, processors SHOULD use registry
query parameter. Acceptable values for registry
is a URI-encoded URL.
Web service processors SHOULD return the resulting RDF graph using a requested format specified by
HTTP Content Negotiation for an acceptable content type. Web service processors MUST support [[!N-TRIPLES]].
Transformation of Microdata to RDF makes use of general processing rules described in [[!MICRODATA]] for the treatment of items.
document.getItems
method.
element.properties
attribute.
a
, area
, audio
,
embed
, iframe
, img
, link
, object
,
source
, track
or video
)
element.itemValue
.
(See relevant attribute descriptions in [[!HTML5]]).
meter
or data
element.
element.itemValue
.
http://www.w3.org/2001/XMLSchema#integer
.
http://www.w3.org/2001/XMLSchema#double
.
meta
element with a @content
attribute.
@content
attribute
with language information set from the
language
of the property element.
Otherwise, the value is a simple literal created from the value of the @content
attribute.
time
element.
element.itemValue
.
http://www.w3.org/2001/XMLSchema#date
.
http://www.w3.org/2001/XMLSchema#time
.
http://www.w3.org/2001/XMLSchema#dateTime
.
http://www.w3.org/2001/XMLSchema#gYearMonth
.
http://www.w3.org/2001/XMLSchema#gYear
.
http://www.w3.org/2001/XMLSchema#duration
.
The HTML valid yearless date string is similar to xsd:gMonthDay, but the lexical forms differ, so it is not included in this conversion.
See
The time
element
in [[!HTML5]].
See
The lang
and xml:lang
attributes
in [[!HTML5]] for determining the language of a node.
document.getItems
.
(See top-level microdata item in [[!MICRODATA]]).
The HTML5/microdata content model for @href
, @src
,
@data
, itemtype and itemprop and itemid is that of
a URL, not a URI or IRI.
A proposed mechanism for specifying the range of property values to be URI reference or IRI could
allow these to be specified as subject or object using a @content
attribute.
A HTML document containing microdata MAY be converted to any other RDF-compatible document format using the algorithm specified in this section.
A conforming microdata processor implementing RDF conversion MUST implement a processing algorithm that results in the equivalent triples to those that the following algorithm generates:
When the user agent is to Generate triples for an item item, given evaluation context, it must run the following steps:
This algorithm has undergone substantial change from the original microdata specification [[!MICRODATA]].
element.itemType
of the element defining the item.
http://www.w3.org/1999/02/22-rdf-syntax-ns#type
element.itemType
of the element defining the item.
subPropertyOf
or
equivalentProperty
, for each such value equiv, generate the following triple:
Predicate URI generation makes use of current type and current vocabulary from an evaluation context context along with name.
http://example.org/doc
and an itemprop
of 'title', a URI will be constructed to be
http://example.org/doc#title
.
The WebSchemas community has
proposed the use of a new Microdata attribute:
itemprop-reverse. Although not present in [[MICRODATA]] at this
time, the attribute can be very useful in many markup examples where items
are related using the reverse of a common property; this saves creating new properties
which exist solely for the purpose of describing such reverse relationships. Evidence
for the utility of such a feature can be seen in the
RDFa @rev
attribute [[RDFA-CORE]]
and the JSON-LD @reverse
property [[JSON-LD]].
See issue 5 for further reference.
This feature adds the following attribute:
The Algorithm is extended accordingly:
The Triples generation algorithm is extended with the following step to take place immediately after Step 9:
Simple use of itemprop-reverse:
Results in the following Turtle:
A test suite [[MICRODATA-RDF-TESTS]] under development to help processor developers verify conformance to this specification.
The microdata example below expresses book information as an FRBR Work item.
Assuming that registry contains a an entry for http://purl.org/vocab/frbr/core#
this is equivalent to the following Turtle:
The following snippet of HTML has microdata for two people with the same address. This illustrates two items referencing a third item, and how only a single RDF resource definition is created for that third item.
Assuming that registry contains a an entry for http://microformats.org/profile/hcard
it generates these triples expressed in Turtle:
The following snippet of HTML has microdata for a playlist
and illustrates the use of the schema:additionalType
property to relate recordings to the Music Ontology:
Assuming that registry contains a an entry for http://schema.org/
it generates these triples expressed in Turtle:
The following is the default registry in JSON format, as of the time of publication.
{ "http://schema.org/": { "properties": { "additionalType": {"subPropertyOf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"} } }, "http://microformats.org/profile/hcard": {} }
Thanks to Richard Cyganiak for property URI and vocabulary terminology and the general excellent consideration of practical problems in generating RDF from microdata.


lux miranda
Home
Publications
Recipes
Contact
CV
The two types of society: computationally revealing recurrent social formations and their evolutionary trajectories
Posted in
on May 13, 2020
← Older
Newer →
Find me elsewhere
Google Scholar
@LuminantLux
GitHub
ORCiD