NooBaa performance may vary from one environment to another.
In some cases, specific applications require faster performance which can be easily addressed by scaling S3 endpoints.
The S3 endpoint is a service that every NooBaa core provides by default, and it handles all the heavy lifting data digestion in NooBaa. The endpoint service handles the data chunking, deduplication, compression, and encryption and accept data placement instructions from NooBaa core.
NooBaa daemon can provide two type of services:
- Storage service - enabled by default
- S3 endpoint service - disabled by default.
Deploying S3 endpoint actually consists of:
- Deploying NooBaa daemon as close as possible to the application
- Enable S3 endpoint
- Open the firewall for inbound TCP ports 80 and 443.
NooBaa daemon can be deployed on any Linux or Windows server with more than 15GB free storage, and can be done from the main screen, by clicking on the
Install Nodes button
Follow the wizard instructions, copy the one-liner and run it on the server.
If you didn't connect your application already, let's move to the next step - Connect your application
Please note that you can use the server IP address as the endpoint, using the same access key and secret key.
Have questions? please email support@noobaa.com


|
| Local Properties | ||
| Managed Object Types | Data Object Types | All Properties | All Methods |
Files can either be new files, in which case the "create" flag will be true, or updates to existing files in VI. The latter is used to support the OVF parentRef mechanism for Disks.
Properties
| Name | Type | Description |
|---|---|---|
| chunkSize* | xsd:long |
The chunksize as specified by the OVF specification.
If this attribute is set, the "path" attribute is a prefix to
each chunk of the complete file.
For example, if chunksize is<PHONE_NUMBER> bytes, the actual files
might be:
myfile.000000000<PHONE_NUMBER> bytes)
myfile.000000001<PHONE_NUMBER> bytes)
myfile.000000002<PHONE_NUMBER> bytes)
|
| cimType | xsd:int |
The CIM type of the device for which this file provides
backing.
For example, the value 17 means "Disk drive".
|
| compressionMethod* | xsd:string |
The compression method as specified by the OVF
specification (for example "gzip" or "bzip2").
|
| create | xsd:boolean |
True if the item is not expected to exist in the infrastructure
and should therefore be created by the caller (for example using HTTP PUT).
|
| deviceId | xsd:string |
Uniquely identifies the device (disk, CD-ROM etc.) within the entity hierarchy.
When ResourcePool.importVApp is
called to create the VirtualMachines and VirtualApps, it returns a map,
device ID -> URL, of where to upload the backing files.
|
| path | xsd:string |
The path of the item to upload, relative to the path of the OVF descriptor.
|
| size* | xsd:long |
The complete size of the file, if it is specified in the
OVF descriptor.
|
| Properties inherited from DynamicData | ||
| None |
| Top of page | Local Properties | ||
| Managed Object Types | Data Object Types | All Properties | All Methods |


WITNESS LIST Natural Resources Committee February 19, 1997-3:00P HB 338 For: Brown, Tim (Franklin Co. Water Dist) Ramsay, Tom (Representative) Withers, Ed C. (Franklin Co. Water Dist) Drought Response Management On: Hamilton, Janet C. (Champion International) Knowles, Tommy (TWDB) Kramer, Ken (Sierra Club) Personett, Mike (TWDB) Stansell, Wade (TX Utilities/ AECT) Williams, C.E. (Panhandle Gr.Wat.Con.D.) Edwards Aquifer Authority On: Buckner, Luana (Edwards Aquifer Auth.) Ellis, Gregory M. (Edwards Aquifer Auth.) Keith, Bob (Edwards Aquifer Auth.) Labatt, Weir (Edwards Aquifer Auth.) Rimkus, Maurice (himself)


By Lars Lindahl (c) 2000 Lars Lindahl
Lars Attacks! http://www.angelfire.com/ny3/larsattacks
"Scream 2" (1997)
Directed by Wes Craven Written by Kevin Williamson
Starring Neve Campbell, Courtney Cox, David Arquette, Jamie Kennedy, Liev Scheiber, Elise Neal, Jerry O'Connell, Laurie Metcalf, Jada Pinket, Omar Epps, Timothy Olyphant, Duane Martin, Sarah Michelle Gellar, Rebecca Gayheart, Portia de Rossi, Joshua Jackson, David Warner, Lewis Arquette, Heather Graham, Luke Wilson, and Kevin Williamson.
Grade: **1/2 (out of four)
Similar to the release of Scream, I was skeptical about how good this movie would turn out. As this sequel so blatantly proves through its horror - buff college students, sequels are never better than the original. In fact, they could not only be terrible, but they could also make a viewer doubtful of how good the first one was. Scream 2 is certainly not better than Scream because it lacks the perfect setting from the original. The teenagers living in your traditional suburban neighborhood who attend your classic chaotic house parties is a horror movie's dream setting. In Scream 2, the surviving kids from the first one have grown up and now are attending a larger college. However, they are still being attacked by a mysterious murderer in a "ghost face" mask. The question is: who is the killer? Most of the characters have matured and now share a stronger connection with adults living in the same town as them. The maturity is what Scream 2 should have avoided. The fact that the kids were nothing but "stoned dudes" in the first film made it so funny. The only real contact the kids had to the adult world in Scream, besides the cops, was their authoritative principal (the ubiquitous Henry Winkler) who didn't really care about any of his students' safety.  This is something we've seen many times before at the theaters and can now laugh at how embarrassingly bad it is in this parody of a horror movie. In Scream 2, the only real adult introduced, besides cops and reporters, is main character Sydney's drama teacher (David Warner). They share a few pointless bonding scenes together that show that these once no good kids are now respectable young adults. Who wants respectable young adults to be your main characters? Not me.
Now that the kids have grown up and hold more responsibilities, the jokes just aren't as funny as the original. The only amusing sections are when Randy (Jamie Kennedy) recites the rules of a sequel; there are more deaths, they are bloodier, and anyone can be a suspect, and even these parts seem tacked on and unnecessary to the plot. I thought screenwriter Kevin Williamson could have added more lines about how black characters never survive in the sequel. He had the perfect opportunity with a cameraman (Duane Martin who shines in every scene that he is in) but unfortunately is underused. The fact that the sequel has a lot more violence could have diminished its script from completely shining. Williamson has the potential of a witty screenwriter but whenever he seemed to launch a grand punch line, an outburst of violence suddenly interrupted his train of thought. When thought over a number of times, it could be possible that Williamson made a dissatisfactory script on purpose to prove that sequels are always worse. Intentionally bad or not, the script is still overwhelmingly disappointing.
Wes Craven still makes Scream 2 a pleasing attempt. The violence that he uses may hurt the script, but it is still incredibly intense, particularly a scene involving a police car crash. The film never drags on, its quick pace, very similar to that of Scream, never hits a bump in the road allowing for edge-of-your-seat action throughout.
Scream 2 is a decent film placed at the middle of the Scream trilogy. Those looking for mindless violence will find it, however those looking for a clever script like the first one, may be let down.
Grade: **1/2 (out of four)
Lars Attacks! http://www.angelfire.com/ny3/larsattacks
by Lars Lindahl (c) 2000 Lars Lindahl
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


Project
Project.__init__
__init__(input_dir: str, main_file: str, app_name: str = None) → None
TODO
Args:
input_dir
(str): Directory where your source files are. main_file
(str): Path to entry point, e.g. main.py
app_name
(str, optional): App's name. If None
then project's directory name will be used. Defaults to None
. Project.build
build(
python_version: str,
pydist_dir: str = 'pydist',
requirements_file: str = 'requirements.txt',
extra_pip_install_args: Iterable[str] = (),
build_dir: str = None,
source_dir: str = None,
show_console: bool = False,
exe_name: str = None,
icon_file: Optional[str, pathlib.Path] = None
) → None
TODO
Args:
python_version
(str): Embedded python version requirements_file
(str, optional): Path to requirements.txt
file. Defaults to "requirements.txt"
. extra_pip_install_args
(Iterable[str], optional): Arguments to be appended to the pip install
command during installation of requirements. Defaults to ()
. build_dir
(str, optional): Directory to place build to. If None
then app_name
attribute will be used. Defaults to None
. pydist_dir
(str, optional): Subdirectory where to place Python embedde interpreter. Defaults to "pydist"
. source_dir
(str, optional): Subdirectory where to place source code. If None
then app_nam
attribute will be used. Defaults to None
. show_console
(bool, optional): Show console window or not. Defaults to False
. exe_name
(str, optional): Name of .exe
file. If None
then name will be the same as main_file
. Defaults to None
. icon_file
(Union[str, Path, None], optional): Path to icon file. Defaults to None
. Raises:
ValueError
: If wrong Python version provided. Project.make_dist
make_dist(file_name: str = None, delete_build_dir: bool = False) → Path
This file was automatically generated via lazydocs.


| AF_ASSERT_0 |
341 (0x155) |
An assert happened |
| file |
Fw::LogStringArg& |
80 |
The source file of the assert |
| line |
U32 |
|
Line number of the assert |
| AF_ASSERT_1 |
342 (0x156) |
An assert happened |
| file |
Fw::LogStringArg& |
80 |
The source file of the assert |
| line |
U32 |
|
Line number of the assert |
| arg1 |
U32 |
|
First assert argument |
| AF_ASSERT_2 |
343 (0x157) |
An assert happened |
| file |
Fw::LogStringArg& |
80 |
The source file of the assert |
| line |
U32 |
|
Line number of the assert |
| arg1 |
U32 |
|
First assert argument |
| arg2 |
U32 |
|
Second assert argument |
| AF_ASSERT_3 |
344 (0x158) |
An assert happened |
| file |
Fw::LogStringArg& |
80 |
The source file of the assert |
| line |
U32 |
|
Line number of the assert |
| arg1 |
U32 |
|
First assert argument |
| arg2 |
U32 |
|
Second assert argument |
| arg3 |
U32 |
|
Third assert argument |
| AF_ASSERT_4 |
345 (0x159) |
An assert happened |
| file |
Fw::LogStringArg& |
80 |
The source file of the assert |
| line |
U32 |
|
Line number of the assert |
| arg1 |
U32 |
|
First assert argument |
| arg2 |
U32 |
|
Second assert argument |
| arg3 |
U32 |
|
Third assert argument |
| arg4 |
U32 |
|
Fourth assert argument |
| AF_ASSERT_5 |
346 (0x15a) |
An assert happened |
| file |
Fw::LogStringArg& |
80 |
The source file of the assert |
| line |
U32 |
|
Line number of the assert |
| arg1 |
U32 |
|
First assert argument |
| arg2 |
U32 |
|
Second assert argument |
| arg3 |
U32 |
|
Third assert argument |
| arg4 |
U32 |
|
Fourth assert argument |
| arg5 |
U32 |
|
Fifth assert argument |
| AF_ASSERT_6 |
347 (0x15b) |
An assert happened |
| file |
Fw::LogStringArg& |
80 |
The source file of the assert |
| line |
U32 |
|
Line number of the assert |
| arg1 |
U32 |
|
First assert argument |
| arg2 |
U32 |
|
Second assert argument |
| arg3 |
U32 |
|
Third assert argument |
| arg4 |
U32 |
|
Fourth assert argument |
| arg5 |
U32 |
|
Fifth assert argument |
| arg6 |
U32 |
|
Sixth assert argument |
| AF_UNEXPECTED_ASSERT |
348 (0x15c) |
An unexpected assert happened |
| file |
Fw::LogStringArg& |
80 |
The source file of the assert |
| line |
U32 |
|
Line number of the assert |
| numArgs |
U32 |
|
Number of unexpected arguments |


Discovery adapter settings
Ping settings
Ping timeout[ms]:
Ping block:
Ping own IP (e.g. for docker usage):
Ping own Netmask (e.g. for docker usage):
UPnP settings
UPnP timeout[ms]:


Museum for Comics
Since 2015, the Museum of Comics and the Language Arts in Schwarzenbach has explored all aspects of the art of the comic. It pays tribute in particular to long-standing German translator of the Mickey Mouse comic books, Erika
Sports
See the latest in sports from across the world
Economy
Find out the latest information on stocks and finances
Politics
City, State and Country-wide politics covered here
World
The latest breaking news from across the world
Deutsch kompakt
26.04.-07.05.2021 / 10.05.2021
Deutsch kompakt for young people
You don't have any plans for the holidays and you want to learn
German with young people from other schools in Pune? If you are
between 14 and 17 years old, then we have something for you: Our
2-week German Compact course for young people! Learn German or
improve your German skills, supported by highly qualified
teachers. And best of all: even if you are sitting at home in
front of your laptop, you can get to know Germany and the German
culture through exciting online activities.
#nachhaltig #Mode #Einkaufen #Müll #Energie
26.04.-07.05.2021 / 10.05.2021
Deutsch kompakt for young people
What is the significance of fashion consumption? How can you really save energy? What does regional shopping mean? Videos, online games, digital projects and exciting tasks on sustainable topics await you in our 4 online workshops. How can you live sustainably and ... is sustainability more than just environmental protection? We will explore this actively and creatively together!


JS9 ChangeLog
Security updates, etc.
- update emscripten to v3.1.40 20230531
- update socket.io to v4.6.2 to close security vulnerability 20230531
- update emscripten to v3.1.27 20221204
- update socket.io to v4.5.4 to close security vulnerability 20221203
- update npm modules uuid, minimist 20221203
- js9Electron.js: hack around breaking changes in v20 20221203
Public Release 3.8 (June 21, 2022)
- fix bug preventing flip, rotate, rot90 from working in Load() opts
- update emscripten to v3.1.13
- update socket.io to v4.5.1
- update astroem/cfitsio library to v4.1.0
Public Release 3.7 (May 16, 2022)
- add color change option to shape layers plugin
- ?renamedisplay=[old:]new will rename a display when loading the web page
- add experimental support for getting remote FITS URLs via CGI-based proxy
- add cgi proxy support to 'load remote ...' dialog box
- drag/drop url will try cgi proxy if proxy server is not available
- js9.js: private sockopts to JS9.socketioOpts to support user configuration
- js9Helper: helperOpts to socketioOpts, use Object.assign to merge obj prefs
- make cubecol's id more akin to a filename (i.e., without parens)
- remove gz:: and bz:: from saved virtual filename
- evcube: generated cube file cannot be a gzip'ed file (re: cfitsio)
- when saving a section, use the real section instead of recalculating it
- fix bug changing position of a selected region after pan/zoom/flip
- fix regions bug where stack order (send to back) was reset after pan/zoom
- fix bug changing position of a selected region after pan/zoom/flip
- fix bugs in handling text children of grouped regions
- fix bug when saving one slice of a cube, naxis was not always set to 2
- astroem: rearrange a few source files
- add Quit() public access routine (Desktop app only)
- es6: use for( key of Object.keys(opts) ){ ... where possible
- es6: change a few functions to arrow functions
- update astroem/post.js to es6 to match emscripten v3.1.x
- update emscripten to v3.1.10
- update socket.io to v4.5.0
- update fabric.js to v5.2.1
Patch Release 3.6.2 (January 3, 2022)
- add experimental support for converting event tables to 3D cubes
- add Counts in Each Cube Slice analysis task for files with NAXIS == 3
- optimize psList search for js9 helper
- add UI to change val/pos display color
- region editor: fix annulus edit (width, dashes not always processed)
- improve smoke tests
- update emscripten to v3.0.0
- update socket.io to v4.4.0
- update fabric.js to v4.6.0
- update open to v8.4.0
Patch Release 3.6.1 (August 16, 2021)
- fix various problems with placement of panner rectangle
- edit annuli: don't multiply by scale factor when generating circles
- update astroem/cfitsio library to v4.0.0
Public Release 3.6 (July 30, 2021)
- globalOpts.arrowIncrement: parameterize increment used by arrow keys
- selectShapes: if selecting a single shape, don't make a group selection
- add support for fabricOpts in js9prefs.js
- fix display of rotated non-square image in a non-square display
- fix bug that allowed arrow keys to move locked regions
- fix regression when adding/removing polygon points
- improve support for proxying js9 helper through a web server
- change the size of annulus region annuli graphically (meta-click to edit)
- change annulus defaults from 2 rings (0->15,15->30) to 1 ring (15->30)
- globalOpts.editRegions controls GUI region editing (def: true)
- fix magnifier jitter when moving a region with the arrow keys
- changeShapes: fix v3.4 regression that sometimes changed annuli incorrectly
- rearrange npm modules by uninstalling and installing socket.io
- clean up emscripten init in preparation for worker-based experiments
- update open to v8.2.1
- update fabric.js to v4.5.1
- update socket.io to v4.1.2
- update emscripten to v2.0.26
Public Release 3.5 (June 1, 2021)
- remove the long-deprecated fits2png code
- fix bug in js9helper sometimes preventing fits2fits size check
- add support for displaying the actual png/jpeg image ("overlay" param)
- add overlay parameter to preferences plugin
- add reset to image filter plugin (overlays can't reset via contrast/bias)
- optimize static colormap cell lookup using binary search
- fix bug in JS9.eventToCharStr assigning 46 to delete instead of a dot
- js9prefs.js: add support for a config object to allow merging obj prefs
- update emscripten to v2.0.23
Public Release 3.4 (May 5, 2021)
- maintain selection when switching between images, panning/zooming images
- ensure infobox displays correctly formatted val string
- add support for bitpix == 64 FITS data
- reg2wcsstr should not perform size calculation, use "cdelt" instead
- changing a region now shows immediately in the magnifier
- push unchangeable regions to back of fabric stack
- add 'locked' as opposite alias to 'changeable' for locking regions
- add support for 'locked' in region editor
- add support for binning tables on alt columns
- make mouseTouchZoom global instead of tied to a display
- turn off clickToFocus by default, way too many clicks (e.g. using menus)
- GetImage: don't throw if named image not available (return null instead)
- changing a region now shows immediately in the magnifier
- region editor now permits parent to change child's text
- changeShapes syncs child text color to main color (via regSyncTextColor)
- getShapes: now returns shapes in order in which they were loaded
- loadproxy: add support for ms-dos gzip files
- handle Infinity when getting scale min,max
- js9helper: change html error message to avoid 'Invalid character' error
- parameterize direction of mouse wheel zoom
- add skip factor to wheel zoom to avoid pileup
- globalOpts.mousetouchLimit limits zoom-out to size of image (def: true)
- don't display regions when GUI zooming an image with many (>500) regions
- don't display regions when GUI panning an image with many (>500) regions
- redesign region multi-selection dialog box to support groups
- add JS9.GroupRegions() and JS9.UngroupRegions() public routines
- add JS9.GroupShapes() and JS9.UngroupShapes() public routines
- add JS9.ListGroups() public routine
- add JS9.UnselectRegions() and JS9.UnselectShapes() public routines
- extend shape (region) selections to support boolean expressions (&&,||,!)
- add "onarrowkey" event for plugins, enable its use with pixel table plugin
- prefs: only save schema props (e.g. not all globalOpts when saving globals)
- fix regression in js9helper limiting size of file transfer
- remove support for fabric.js v1, it's ancient and incompatible with groups
- add deepscan.io checks when pushing to repository
- update eslint to 7.21.0 and make it happy
- update socket.io 3.1.2, then 4.0.1, remove 2.4.1 (now supported by v3+)
- update npm dependencies: uuid, rimraf, open, ps-node, table-parser
- update emscripten to v2.0.18
Patch Release 3.3.1 (December 15, 2020)
- fix old bug appending "//" to helperProtocol, even if present (breaks socket.io when saving prefs)
- add regMenuCreate property to prefs plugin, remove useless regConfigSize
Public Release 3.3 (December 14, 2020)
- listRegions: add format='regions' to parallel saveRegions output
- regions config: change color, width, pattern as colorpicker, menus change
- regions: fix regression when panning a grouped polygon or line
- js9Helper: fix regression in uploading FITS files
- fix bug to re-establish focus on js9 display after clipboard copy
- js9worker: worker socketio connection can now be restarted automatically
- update emscripten to v2.0.10
- add support for socket.io v3.0.3, while maintaining support for v2
- update fabric.js to v4.2.0
Public Release 3.2 (November 6, 2020, a day of hope)
- add js9 shell scripting and desktop hostfs smoke tests
- add checks on filename and id to guard against xss attack
- add js9msg script to send messages using wget or curl (node not required)
- js9 script will now use faster js9msg script, if appropriate
- make JS9's returned data consistent between js9Msg.js, js9Helper.js httpd
- allow --with-cfitsio (without a dir arg) if lib is in a system dir
- desktop: add dialog box for exported script
- desktop: in script, look for webpage in current dir, then in install dir
- desktop: pass resize info if specified width or height is <= 0
- desktop: save cmdline opts on close (use same width, height next time)
- fix problems passing very large FITS headers (> approx. 1Mb) to initwcs()
- fix regression in desktop when using default web page
- fix regression in mouseup cb: updateShapes mode is "update", not "mouseup"
- various changes to generate Linux desktop app as well as macOS app
- js9Electron.js: add support for js9Electron.json file
- add support for editing cmd line opts in preferences plugin
- refactor desktop app to support editing cmd line opts
- modify js/FileSaver.js so that Jupyter notebooks put saveAs() on window
- update FileSaver.js to 2.0.4
- update emscripten to 2.0.5
Public Release 3.1 (September 8, 2020)
- regions menu: list, remove act on selected or all regions
- edit menu: edit, copy act on selected or all regions
- add GUI inputs to configure style (color, strokewidth, stroke pattern)
- add selection criteria input to multi-selection dialog
- add SelectShapes() and SelectRegions() public routines
- console plugin can now execute public routines
- add ability to turn off auto-create of regions from the Regions menu
- 'a' key creates a region using the last one selected from Regions menu
- set globalOpts.regionsToClipboard to false (breaks copy selected support)
- display (screen) coords can be specified prefixing 'd' to x, y
- display coords can be preserved by specifying preservedcoords property
- view menu option to show display coords in val/pos string in image sys
- add JS9.DisplayNextImage() public access routine
- add 'sticky' property to regions (no change on pan, zoom, rotate, flip)
- refactor dataminmax, mkColorData to avoid Chrome multi-sec delays in for loops
- add support for rotating to North Is Up in current wcssys in SetRotate("northisup")
- add north is up rotation to Zoom menu and zoomcontrols dialog
- rotate/flip panner image as displayed image rotates/flips
- N/E marker now tracks current wcssys, not file's wcssys
- JS9.SetFlip(), JS9.SetRot90() use transform instead of changing image data
- add JS9.SetRotation(), JS9.GetRotation() to rotate image by arbitrary angle
- add JS9.ChangeRegionTags() public routine to add/remove region tags
- reorganize github site (new build directory, src in src, demos in demos)
- make install does not load demos, use make install-demos explicitly
- remove deprecated fitsy code from top level
- add JS9.ListRegions(), JS9.EditRegions() public routines
- regions menu: options to save regions using different wcs, also save csv
- separate: add ability to use a CSS Grid instead of light windows
- sync: add GUI for plugin and change menu GUI to match
- desktop: add searchbar to analysis light windows (ctl-f or cmd-f)
- inline voyager images (remove dax versions from js9inline.js)
- JS9Titlebar plugin adds image id to title (uses globalOpts.updateTitlebar)
- add onregionsmove callback to Magnifier plugin (if intensivePlugins)
- add CopyShapes() to copy shape layers to another image (cf CopyRegions)
- add CopyParams() routine to copy params from one image to another
- add ColorControls plugin to color menu
- rgb mode is now associated with each display separately (not global)
- move rgb info when moving images between displays
- resort preloaded files into their original order
- update node minimist package to avoid prototype pollution bug
- don't use centered scaling for line and box regions
- add length/angle options to line configuration dialog box
- add statusbar plugin
- globalOpts.menuPosition to set menu position (def: below the menu button)
- add sum/avg option to binning plugin
- add support for fractional binning
- add GetOpacity(), SetOpacity()
- add support for opacity floor: an opacity assigned if pixval <= floorval
- extend opacity in menu to include floor opacity support
- sync images: sync all images to facilitate blinking
- sync images: add syncwcs option to force sync using image coords
- desktop: options can now be passed via --switches (e.g., --scale log)
- Load: add ra,dec, px,py, wcs properties to support panning
- Load: regions property can load a region file or add a region
- syncImages: add rot90, flip, and sync blended images
- CloseDisplay now takes an optional regexp of images to close
- add source, destination in/out/over/atop methods to blend plugin
- static colormaps: specify color/opacity and pixel range
- expand MaskImage to support "overlay" as well as "mask" of image data
- add MaskImage() routine to allow one image to mask another
- remove experimental LoadAuxFile() (too fragile, subsumed elsewhere)
- fix region parser to check for exclude regions
- fix bug when sortable GUI changed the image stack with multiple displays
- fix annulus radii text box in regions config
- update uuid and rimraf modules for js9Helper
- update jquery to v3.5.0
- update emscripten to v1.40.1
- update fabric.js to v3.6.3 and enable strokeUniform
- update cfitsio to v3.48 (via astroem repository)
- update ResizeSensor to v1.2.2
Public Release 3.0 (January 6, 2020)
- improve menu placement for Jupyter support
- replace image filter menu with plugin that supports parameter adjustments
- just redisplay already-loaded slices
- added PanZoom controls to Zoom menu, containing "pan to" support
- wcs menu: don't show wcs options if image has no wcs
- add Google's new turbo colormap
- add analysis plot configuration dialog box to set data range and scale
- improve panner to show display area (not image area)
- infobox: fix bug displaying image coords instead of phys if sys was image
- webworker init: avoid CORS problems when webworker is on a remote location
- add array-based x,y flip and +/- 90 degree rotation to the Zoom menu
- add JS9.SetRot90() and JS9.SetFlip() public access routines
- improve LTM/LTV support, various bug fixes
- avoid weakness in wcslib causing the wrong header length to be used
- fix error handling when called from external message
- update emscripten to v1.39.3 (required several changes to montage)
- upgrade code to use ES6
Public Release 2.5 (August 30, 2019)
- re-displaying an image now calls the onload callback
- JS9.BlendDisplay('reset') unsets blended images
- JS9.DisplayExtension('all') loads all image extensions
- JS9.ReprojectData('all') uses the current image to reproject others
- JS9.Load('foo.fits', {allext: true}) loads foo.fits, then all extensions
- add 'Display all images' button to Extensions plugin
- add support for loading all images in a multi-extension FITS file at once
- fix typo that made incorrect sections of non-rectangular images at zoom < 1
- fix bug when zooming image with a selected region
- fix bug when loading multiple annuli at once
- fix regression in DisplaySection: new ext was not added to FITS filename
Public Release 2.4 (July 15, 2019)
- fix double tap to close capability on iPhones
- fix internal regcnts tasks using annuli on iOS devices and re-enable them
- wcs grid: fix high limit display coordinates
- analysis menu: only display 3d analysis menu options for 3d images
- refactor LoadWindow so load waits for the lightwin to be fully created
- desktop app: support merging analysis tasks and loading foreign web pages
- add JS9.GetAnalysis() to return analysis task definitions
- add missing routine in internal CountsInRegions() and RadialProfile()
- add support for "All" selection of regions to include text children
- GetRegions: return text child region id
- desktop app: enabling node mounts local file system for direct FITS access
- desktop app: add security checks
- fix overly-aggressive .gitignore and add missing files
- fix typo that broke createMosaic("all")
- fix bugs in imexam plugins using a rotated line to define the image section
- fix spinner when using open local file dialog
- update emscripten to v1.38.37
- update contextMenu to v2.8.0
Public Release 2.3 (May 1, 2019)
- support for Mac app, a bit of Windows app: see github/ericmandel/js9app
- Electron desktop app: use internal colorpicker if Electron version >= 5
- add logo support
- add AlignPanZoom() public routine
- add --cmds [cmds] and --cmdfile [file] switches to js9Electron.js
- add --node switch to js9Electron.js, allowing nodeIntegration
- add JS9.globalOpts.onpreload property
- fix wcs alignment of blended images during pan and zoom operations
- fix mosaic code, which needed area mosaic file after all
- redesign Menubar to use more submenus, especially File menu
- fix bug in the supermenu sometimes not displaying the File sub-menus
- work around invalidation of emscripten heap pointers when memory increases
- add ability to change child text options via the parent shape
- add ability to push selected region to bottom of overlapping stack ('d')
- add ability to select all regions ('S' and Regions menu option)
- add SaveDir public routine (desktop app only) to set the save directory
- SavePNG,SaveJPEG: add option to save image RGB pixels instead of display
- SavePNG,SaveJPEG: add option to skip saving the layers (e.g. regions)
- shape layers (incl. regions) can now be exported in SVG format
- closing a light window that displays images now supports: close, move, ask
- add support for unconstrained panning
- dynamically select a JS9 display (supports one plugin for many displays)
- SaveColormap: allow multiple colormaps to be save at once
- add ability to change color, width, dash lines, tags of selected regions
- fix bug in "north is up" rotation: take CDELT values into account
- add direction vector to panner
- display regions in lightwin instead of on display or in infobox
- add region copyToClipboard capability (so 'p' always pastes last region)
- add ability to specify display opts in a FITS header (IMOPTS param)
- add ability to specify colormaps in a FITS header (IMCMAP param)
- add ability to create image cutouts of selected region(s)
- add ability to rename a JS9 display via JS9.RenameDisplay() api call
- ensure saved order of images after session load
- add --title and --renameid options to desktop app to rename display ids
- parameterize initial blending params
- Preload() loads .cmap files as colormaps
- colormaps: specify m colorwheel slices, from which n colormaps are assigned
- add ability to specify {display: id} param to external api calls
- add ability to unremove previously removed regions
- add ability to select regions based on the file from which they were loaded
- calling LoadRegions() twice removes previous regions loaded from the file
- add globalOpts.quietReturn to silence 'OK' messages
- Desktop (Electron.js) version: add --savedir option to skip save dialog
- JS9.Load(): globalOpts.reloadRefresh property to control reloading an image
- add 'revert' option to wcs reproject submenu
- wcs menu: each wcs system has own current units (based on initial defaults)
- fix region parser to see 'linear' as wcs, not a 'line' region
- cmaps: allow color choice via text input in fallback colorpicker
- fix memory leaks in reproject code
- LoadColormap: support file containing array of colormaps
- Infobox: for long filenames, click to see right hand side
- addColormaps now replaces a cmap with same name
- add 3D plot capabilities for data cubes in Analysis menu
- many improvements to user-defined menus
- turn on wasm in js9 Electron.js Desktop app
- menu: allow load/save of cmaps without a loaded image
- when blending, only sync zoom/pan reprojected images that are wcs aligned
- reproject: use float32 instead of float64 if datatype allows (less memory)
- reproject: correctly align images when wcs ref image is panned or zoomed
- reproject: fix memory leaks, always go back to original image
- js9 helper: increase ping timeout to avoid Chrome disconnects
- improve header generation and FITS card handling
- allow DisplaySection() to display the new section in a different display
- add colormaps plugin to create (complementary) colormaps
- fine-tune positioning: arrow keys display small crosshair cursor
- fine-tune positioning: arrow keys change magnifier display center
- regions menu: listonchange can act on "selected" (default) or "all" regions
- preferences plugin: image parameter for "all" or "selected" listonchange
- Meta (or Ctrl) now used for keyboard shortcuts displaying a light window
- edit, region menus: add option to display region configuration window
- add 'M-e' keyboard shortcut to display region configuration window
- add 'M-o' keyboard shortcut to open a local file
- add 'p' keyboard shortcut to paste regions at current mouse position
- (joining 'P' keyboard shortcut to paste regions at their own position)
- add 's' keyboard shortcut to select region that contains the mouse
- fix bug when saving/copying regions inside a rotated group
- Meta key during mouse move no longer updates internal image position
- update emscripten to v1.38.28
- update fabric.js to v2.7.0
Public Release 2.2 (October 9, 2018)
- add sync plugin: synchronize operations between two or more images
- add JS9.SyncImages() and JS9.UnsyncImages() public access routines
- SetParam(): setting a core param calls the core function
- add support for disabling colormap, pan, regions, scale, wcs, or zoom for a given image
- add Scale Clipping Limits plugin (with pixel distribution plot)
- add support for setting up a proxy from Apache to the Node.js helper
- add Separate/Gather Images plugin
- desktop app: add support for printing entire window
- desktop app: add support for saving entire window to a pdf file
- add support for loading all slices of a data cube separately into JS9
- add support for user-defined menus in the Menubar
- add support for averaging pixels when binning (def: summing)
- add support for Mac-style menubars
- add Edit menu to Menubar (copy/paste regions, positions, values)
- add JS9.DisplayCoordGrid() and associated client-side task to Analysis menu
- add JS9.CountsInRegions() and associated client-side task to Analysis menu
- add JS9.RadialProfile(), and associated client-side task to Analysis menu
- reproject will try to bin large images to avoid memory limits
- add support for wcs-based cross-hair tracking of images
- add support for displaying mosaic images
- add CreateMosaic() public routine
- remove .fz suffix in various places where it breaks things
- fix bug where binning an image was not updating the CD matrix
- update emscripten to v1.38.5
- update socket.io to v2.1.1
Public Release 2.1 (May 10, 2018)
- allow JS9.SetPan() to accept a single object with x and y properties
- allow JS9.WCSToPix() to accept a single object with ra and dec properties
- allow JS9.PixToWCS() to accept a single object with x and y properties
- add support for Toolbar plugin
- add JS9.SetParam() and JS9.GetParam() public routines
- add JS9.SetToolbar() and JS9.GetToolbar() public routines
- add JS9.SeparateDisplay() public routine to separate images in a display
- add JS9.GatherDisplay() public routine to gather images into a display
- add JS9.LoadColormap() public routine
- add JS9.LightWindow() public routine
- JS9.GetImageData() now returns display size, bin factor
- JS9.RunAnalysis() return types now include "regions" and "catalog"
- include comments and history in display of FITS header
- iOS 11.2.2,5 disable wasm: github.com/kripken/emscripten/issues/6042
- add refresh property to JS9.Load() to re-retrieve data
- add support for refreshing a file/url in JS9.RefreshImage()
- add support for displaying full image to JS9.DisplaySection()
- add 'f' (full) and 'r' (refresh) keyboard actions
- change 'r' (raise region layer) to '^' in keyboard actions
- add refresh and section commands to Console plugin (and js9 script)
- binning plugin: add button to load full image
- sessions: save/re-run dataLayer routines (e.g. reproject, rotate)
- sessions: save/restore blend mode
- sessions: save/restore wcsim from reprojection
- sessions: save/restore display parameters
- SaveSession saves either current image or all images
- ensure correct extension for Save{Session,PNG,JPEG}
- image blending: update GUI when changes are made via API
- image blending: support sizing of static div
- fix imexam routines needing integer section limits
- update emscripten to v1.37.28
- update fabric.js to v1.7.22
- update contextMenu to v2.6.3
Minor Patch Release 2.0.2 (December 15, 2017)
- add zscale, zmax to SetScale()
- improve display-based routines (separate, gather, resize, center, select)
- improve alignment of differently sized images
- allow zoom during image blending
- add menu support for closing all images
- add support for selecting a target display in a supermenu
- add support for dispersing images from one display into new displays
- add support for gathering images from multiple displays into one
- add support for new image inheriting params from current image
- fix allinone (dont use wasm)
- fix bug loading wasm file in LoadWindow('new')
Minor Patch Release 2.0.1 (September 29, 2017)
- move helper log file outside www directory
- improve fetchURL() error messages
- fix bug in load catalog menu option
- allow json opts in Load* family of routines
- fix bug in JS9.Preload by saving a copy of opts
Public Release 2.0 (September 27, 2017)
- add support for emscripten-based WebAssembly
- add support for HPX projection
- add wcs selection menu to regions config dialog
- aesthetic improvements to regions config dialog
- fix race condition in Electron startup if not codesigned
- fix binning when manually specifying parent file
- fix wcs system display in infobox
- fix bug in js9Helper.js where localhost was not upgrading to use ws
- update emscripten to v1.37.20
- update fabric.js to v1.7.19
- update socket.io to v2.0.3
- update jquery to v3.2.1
- update jquery-ui to v1.12.1
Public Release 1.12 (July 25, 2017)
- refactor astroem to use astroem repository of emscripten library byte-code
- add DisplaySection() public routine
- add ability to extract a section from images (as well as tables)
- add fits2fits configuration params for large files support
- add large file support in which large files can be handled externally
- allow infoBox to be configured via JS9.globalOpts.infoBox and preferences
- add wcs center and wcs fov display to infoBox
- add js9.app Mac desktops to run js9 script (drag/drop images onto it, etc.)
- add support for specifying URLs on js9 command line (uses proxy load)
- JS9.Preload() will now call JS9.ProxyLoad(), if required
- proxy load now turned on by default (needed for Desktop use)
- add support for drag/drop URLs onto JS9 display (uses proxy load)
- add support for uploading FITS files to a remove server
- add support for displaying bzip2 files
- add support for drag drop of region, catalogs, sessions (by file extension)
- add text, fonts, stroke options to region configuration dialog box
- add support for specifying a text region as a child of a region
- add js9-to-ds9 region conversion to js9 script (-r)
- add support for importing ds9 regions, including properties in comments
- sort overlapping regions so smallest is on top
- fix memory leaks in mef support
- add Divs plugin to show/hide in-page JS9 plugin divs
- allow shape size controls to match shape color at border, corner, or both
- use file extensions when opening local files (fits, regions, catalogs, etc)
- add keyboard action to move selected region in back of other shapes (not a default)
- JS9.RegisterPlugins() will instantiate plugins if scripts load asynchronously
- add JS9.InstantiatePlugins() public routine
- deprecate auto load of js9Prefs.son (load js9prefs.js explicitly instead)
- update emscripten to v1.37.9
- update socket.io to v1.7.3 (big change in module directory structure)
Public Release 1.11 (January 9, 2017)
- add support for displaying HEALPix files
- add initial support for memory management of internal FITS files
- add menu support for clearing FITS files from internal memory
- add support for running JS9 on the Desktop using Electron.js
- integrate Desktop Electron support into into js9 script
- add ability to load local catalogs and save catalogs to disk
- add JS9.LoadCatalog() and JS9.SaveCatalog() public routines
- add Shape Layer plugin to turn on/off layers and set the active layer
- remove list of shape layers from View menu in favor of Shape Layer plugin
- add JS9.ActiveShapeLayer() public routine
- improve onimagedisplay processing for mef, cube, imarith plugins
- fix bug in cube plugin blink support
- update fabric.js to v1.6.6
- update socket.io to v1.5.1
- update closure-compiler to v20160911
Public Release 1.10 (October 11, 2016)
- add support for full-display mode
- add support for keyboard actions and shortcuts
- add JS9.SetRGBMode(), JS9.GetRGBMode() public routines
- unclutter the position/value display
- dont update value/position if "special key" is pressed
- buttons and menu/titlebars are now beautiful and Mac-like
- buttons can be beautiful and flat (change via class specification)
- add support for copying regions to another image (JS9.CopyRegions())
- add initial support for plotly plotting library
- improvements to energyplot, evfilter, binning plugins
- add support for alternate WCS (including JS9.GetWCS, JS9.SetWCS routines)
- add JS9.LookupImage() public routine
- generalize and extend plugin callback capability
- extend range of FITS files that can be WCS-projected using Montage
- add support in the File menu for saving and loading sessions
- add JS9.LoadSession() and JS9.SaveSession() public routines
- update imexam,fitsy, archive plugins
- update fabric.js to v1.6.3
- update cfitsio to v3.39
- update socket.io to v1.4.5
Public Release 1.9 (June 8, 2016)
- add standard RGB image processing functions to the Analysis menu
- add support for gesture-based zoom (scroll wheel and pinch)
- add MouseTouch plugin to change mouse/touch actions
- image id now contains extension name or number for FITS extensions
- add support for histogram equalization scaling
- add support in js9 script for starting up a browser/web page
- add support for displaying slices of a FITS data cube
- add support for image arithmetic (between 2 images or image & constant)
- add support moving images between JS9 displays
- add support for displaying HDUs in multi-extension FITS files
- add 'magma', 'inferno', 'plasma', 'viridis' colormaps from matplotlib
- deprecate the use of funtools when building JS9; please use cfitsio
Public Release 1.8 (March 21, 2016)
- add image blending plugin to support blending operations between images
- add ability to blend images using W3C composite/blending modes
- add colorbar plugin to display colormap vs intensity information
- add blink plugin to blink images
- add line region (with support for multiple line segments)
- add raw data layers to allow manipulation of underlying raw data
- add JS9.FilterRGBImage() to support RGB image processing routines
- add JS9.GaussBlurData public routine to perform Gaussian blur on data layer
- add JS9.RawDataLayer() public routine for raw data layer manipulation
- add JS9.ShiftData() public routine to shift raw data in x and y
- add JS9.GetDisplayData(), returning data for all images in a given display
- add JS9.SaveJPEG() public routine to save image and overlays as JPEG
- add JS9.AddColormap() public routine to add a colormap to JS9
- add JS9.SaveColormap(), JS9.OpenColormapMenu() public routines
- JS9.SavePNG() public routine now saves image and graphical overlays
- add support for reprojecting images using Montage/mProjectPP
- add JS9.Reproject() public access routine
- change menu option Color->alpha (0 to 255) to Color->opacity (0.0 to 1.0)
- fix bug when interactively changing panner for non-square images
- fix bug in lut colormap, which truncated the first color
- refactor emscripten astroem package into sub-packages
- update emscripten to v1.35.0
Public Release 1.7 (January 12, 2016)
- add Jupyter/IPython support for iframes
- add keyboard focus support for Jupyter/IPython
- add timeouts to avoid back-end connect() hangs
- add support for using rgb file as the display over a data file
- default helper is "none" (for Jupyter, where js9Prefs.json is not loaded)
- add lower right handle to change width and height of display
- add View menu option to change width and height of display
- add JS9.ResizeDisplay() to change the size of a JS9 display element
- add JS9.DisplayPlugin() public routine for custom menus
- add JS9.GetFITSHeader() (as a string) public routine for custom menus
- add resize handle to display (lower right corner)
- add View menu option to change the display width and height
- add support for handling group events in shape layers (i.e. catalogs)
- add support for handling mouse events in shape layers (i.e. catalogs)
- add support for tooltips to shape layers (i.e. catalogs)
- add return values to saveFITS() and savePNG()
- add spinner while waiting
- fix OpenFileMenu() and OpenRegionMenu() when using multiple displays
- fix text region printing
- fix bug in panner box when panner image does not fill panner width
- fix region configure to "delete" only itself (not all regions)
- fix one pixel bug in WCS region conversion
- update fabric.js to v1.5.0
- update socket.io to v1.3.7
- updated jquery to v1.11.3
Public Release 1.6 (November 7, 2015)
- add support for extracting image/table sections from "parent" files
- add JS9.LoadProxy() public routine to load FITS URLs via proxy server
- add support for loading Dropbox (and other CORS enabled) shared links
- add support for loading links by proxy through the back-end server
- add SetValPos and DisplayMessage public routines
- add options to create new JS9 windows from the file menu
- add experimental support for JS9 in an iframe, using postMessage
- remove starting "_" from SUPERMENU id (not legal syntax)
- fix various iOS foibles (scrolling, double-click to close)
- fix memory leak in cfitsio RefreshImage() support
- fix bug in lut colormap limit check
- fix bug in JS9.RefreshImage() blob handler
- fix overflow bug in cfitsio bscale/bzero support
- fix bug in zscale by properly exposing emscripten methods
- update emscripten to 1.34.1
- update wcs library to 3.9.0
Public Release 1.5 (July 9, 2015)
- add support for specifying regions using Funtools/DS9 syntax
- add support for loading Funtools/DS9 region files
- add support for running the Node.js helper using https protocol
Public Release 1.4 (May 3, 2015)
- add Preferences plugin to set image and region user prefs
- add ability to save image to FITS and PNG files (limited Safari support)
- add ability to save regions to a text file
- fix bugs in Binning plugin (mainly for cfitsio, but some general bug fixes)
Public Release 1.3 (March 30, 2015)
- add cfitsio library support to JS9 (emscripten compile to javascript)
- add data-width and data-height attributes to change the size of JS9 divs
- extend tpos and js9helper to use cfitsio (or funtools)
- update tpos js9Protocol to 1.1 to include header comments in the header
- default WCS is now determined in the browser, not by the back-end server
- ensure that section info is maintained during JS9.RefreshImage()
- prevent preload from happening more than once
- fix broken File->Open menu option
- update emscripten to v1.27, add new optimizations to astroem
Public Release 1.2 (January 4, 2015)
- concurrent release of pyjs9 1.0 on github
- update socket.io to the Engine.IO-driven v1.x (specifically v1.2.1)
- add ability to reconnect to node.js server automatically if latter restarts
- add support for specifying a temp work dir for back-end analysis
- add http support to js9Helper.js so messages can be sent via GET, POST
- JS9.Load: accepts FITS files as blobs and base64-encoded strings
- JS9.RefreshImage: accepts blobs (FITS files), js arrays and typed arrays
- JS9.GetImageData(): returned data can be array or base64-encoded string
- fix bug in arguments to public api routines sent via external message
- fix bug in File List: clicking on same file multiple times now redisplays
Public Release 1.1 (November 15, 2014)
- NB: api change: added errcode to argument list of RunAnalysis() callback
- new api: AddDivs() to add JS9 displays and/or plugins to the web page
- new api: Send() sends msgs programmatically (useful for 3rd party helpers)
- add support for super-menus that can control multiple JS9 displays
- add support for onload callback when displaying FITS files
- allow xcen, ycen (in image coords), zoom to be passed in obj to JS9.Load()
- re-factor js9Helper.js: each analysis task is its own top-level msg
- allow user-defined msgs to be added to analysis tasks more easily
- ensure correct region size during RefreshImage() and table binning
- add contour plugin to default plugins in js9plugins.js
- add checks for NaN values to imexam plugins
- fix imexam plugins bug when regions are rotated and resized
- fix bug in encircled energy preventing calculation for non-integer radii
- properly handle FITS TFORM cards without a repeat value (XMM data)
- resize regions properly when tables are binned by a block factor
- ensure that datamin and datmamax are updated when a binary table is binned
- dont send image notify events to back-end during contrast/bias changes
Public Release 1.0 (September 30, 2014)
- NB: change to the Public API: id is no longer first argument. See API doc.
- infobox plugin upgraded to a tabular display
- node.js server sends unique pageid back to JS9
- JS9 menus now cover light windows (higher zindex)
- improved accuracy of polygon points for contours
- moving a polygon point now calls listRegion
- added missing commas in WCS display of polygon points
- corrected WCS for drag/drop of sections of FITS binary tables
- fixed incorrect region size when binning FITS binary tables
- fixed memory leak in astroem reg2wcs routine
- plugin divs can now set height and width using CSS
- added defensive code to remove bash functions from CGI and node calls
- updated fabric.js to 1.4.11
Release 1-epsilon (July 28, 2014)
- JS9.Load() can now load FITS files directly (rather than converting to PNG)
- added support for FITS binary tables, including binning and filtering
- added support for gzip'ed FITS files
- added support for "physical" coordinates (i.e., tied to original data file)
- changed 2D graphics subsystem from Kinetic.js to fabric.js
- added generalized shape layer support for regions, catalogs, contours, etc.
- region context menu is now a light-weight web page with many new features
- added text and point regions
- position of a pixel is now in the center of the pixel
- accelerator key changed from shift key to meta key (command on Mac, control elsewhere)
- reduced number of js9 files to load in a web page
- redesigned and flattened returned region object
- redesigned public API
- changed Public routines JS9.Pix2WCS and JS9.WCS2Pix to be 1-indexed
- added ability to group and move regions
- box rotation is now around the center of the region
- all image coordinate are now 1-indexed throughout
- fixed bug where adding a polygon pt didn't show until region was selected
- changed polygon points to an array of objects {x, y} instead of just x, y
- fixed various layout bugs in plugins
- updated emscripten to latest version
- updated flot to latest version
- updated jquery to 1.11.1
Beta Release 13 (April 6, 2014)
- added support for handling NaN values
Beta Release 12 (March 10, 2014)
- added support for browser-based analysis via plugins (JS9.RegisterPlugin)
- converted Menubar, Info, Panner, Magnifier to plugins
- initial version of imexam plugin available (in plugins directory)
- initial version of archive/catalog server plugin available
- added support for zscale (IRAF min/max algorithm for scaling)
- added support for user scale limits
- regions can now be moved off the image
- shift key disables mouse plugin callbacks
- zooming a small image will use all of the available display canvas
- added support for sub-pixel zooming
- added ability to process all keys in keypress callback
- added arrow key support for moving regions
- added fractional pixel positions for zoomed images
- fixed bug which reset pan when changing colormaps on a zoomed image
- added strict mode
- update emscripten to 1.8.2
Beta Release 11 (December 18, 2013)
- initial port to iPad
- removed notifyHelper message when mouse enters image window
- fixed tpos crash when converting really large images
- updated jquery.contextMenu.js
Beta Release 10 (December 9, 2013)
- added support for RGB composite display
- added support for reading in auxiliary files via auxFiles preference
- added support for overlaying FITS image masks
- added support so that drag and drop files can be found by local analysis
- added analOpts.dataPath to specify where to look for drag and drop files
- box regions need to rotate around upper left point to ensure consistency
- changed name of fitshelper to js9helper
- changed JS9.submitAnalysis() to JS9.SubmitAnalysis()
- changed analOpts.datadir to analOpts.dataDir
- removed wcs event processing from node and CGI helper (use browser wcs)
- js9helper not run as a server from js9Helper.js any more (scales better)
- added ability to turn off redraw when creating a large number of regions
- fixed bug in panner display for non-square images
- added work-around for Google Chrome v31 bug (regions not drawn)
Beta Release 9 (October 23, 2013)
- added support for client-based WCS using emscripten 1.5.6
- added drag and drop of FITS images (binary tables are coming)
- added support for region callbacks (executed when a region changes)
- added JS9.Regions() public routine to retrieve and modify selected regions
- added Close Image button to File menu
- reduced size of panner when created by View menu
- updated Kinetic.js to v4.7.2
- minor bug fixes (e.g., annuli strokeWidth not resizing properly)
Beta Release 8 (September 23, 2013)
- fixed security in node.js support by requiring use of wrapper scripts
- added support for CGI-based back-end helpers
- implemented automatic discovery of analysis definitions
- added timer-based management of WCS update requests
- updated socket.io to 0.9.16
- changed routine name from JS9.preloadImages() back to JS9.Preload()!
Beta Release 7 (August 19, 2013)
- fits2png: added support for "%cookie" in odir specification
- js9.js and js9Helper.js both now use js9Prefs.json for setting preferences
- fixed bug in display/manipulation of panner when image is zoomed
- added "none" as an analysis return type to support hidden analysis
- changed routine name JS9.Preload() to JS9.preloadImages()
- added clipping to region manipulation
- fixed region strokewidth problem when zooming image
- fixed magnifier and panner where multiple instances of js9 are present
- numerous changes to pass new JSLint rules
- updated jquery to 1.10.2
- updated jquery.flot to 0.8.2
- removed references to of jquery-ui in demo files (its not used)
Beta Release 6 (July 22, 2013)
- added support for panner window, including ability to zoom the panner
- added support for magnifier window, including ability to change magnification
- implemented zoom menu (zoomIn, zoomOut, zoom1, zoom2, zoom4, zoom8)
- added support for all FITS data types (silrd) in js9.js and tpos.c
- png file now contains FITS header in json format
- NB: the format of the PNG representation file has changed substantially!
- raw arrays now implemented as a typed array, using DataView to unpack it
- updated Kinetic.js to v4.5.4 (multiple changes required to code)
Beta Release 5 (May 20, 2013)
- added support for dynamic creation of js9 instances (new or light window)
- added support for pre-loading images into a js9 on page load
- added support for running analysis web page buttons, forms, etc.
- added support for printing the image
- added new demo pages
- changed js9msg script name to js9
- loading javascript files is "generic" (no version numbers in filenames)
- updated Kinetic.js to v4.5.1
Beta Release 4 (April 26, 2013)
- added support for polygon regions
- added support for fixing (i.e. freezing) regions in place
- added support for container regions (constrain position of other regions)
- added support for shift key accelerator
- fixed multiple bugs in region listOnChange support
- updated Kinetic.js to v4.4.3
Beta Release 3 (April 2, 2013)
- updated Kinetic.js to v4.4.0 to fix new chrome v26.0.1410.43 (whoah!)
Beta Release 2 (April 1, 2013)
- added support for executing analysis from console window
- added support for messaging to js9 via Node-based js9Msg.js
- added ability to specify params to region creation
- added server mode and input from stdin to js9Msg.js
Beta Release 1 (February 27, 2013)
- initial beta release with support for displaying FITS images, scaling,
colormaps, external analysis, regions, wcs


Program
Title
Introduction
The Future
Interactivity
Interactivity Tomorrow
Java
Syntax
Performance
Portability
Security
Applets
Animation
Interaction
Image Map
Live Data Feed
Spreadsheet
Conclusion
Conclusion


Source Code JSON File
By Shipeng Sun, currently at Department of Geography and Environmental Science, Hunter College


First name
Thank you!
Please Fill in your first (given) name
Last name
Thanks bro!
Please fill in your last name
Username
@
City
State
Choose...
...
Zip
Agree to terms and conditions
Submit form


House GOP Lawyer’s ‘Straw Man’ Argument: Impeaching the President Over ‘8 Lines’ Is ‘Baloney’
by Matt NahamSteve Castor, who you may remember from the House Intelligence Committee phase of the impeachment inquiry, appeared before the House Judiciary Committee on Monday to present the case as to why the president should not be impeached. Castor argued during his opening statement that it would be “baloney” to impeach President Donald Trump over “eight lines” in the non-verbatim memo of Trump’s infamous July 25 phone call with Ukrainian President Volodymyr Zelensky.
It was an argument immediately called out as a combination of “straw man” and a “red herring.”
Watch Castor’s statement below:
Castor said that rather than violating his oath of office, President Trump took care to faithfully execute the laws. He echoed George Washington University Law Professor Jonathan Turley’s criticism of Democrats, about undertaking a so-called “rushed impeachment.” (Turley was one of four constitutional law experts who testified last week, and the only expert called by Republicans. The other three, called by Democrats, all said it was clear Trump committed impeachable offenses.)
“The artificial and arbitrary political deadline by which Democrats are determined to finish impeachment by Christmas leads to a rushed process and missed opportunities to obtain relevant information,” Castor said.
Castor went on to make some arguments that raised the eyebrows of numerous observers.
“Democrats didn’t even try to hold witness who defied subpoenas in contempt.”
https://twitter.com/matthewamiller/status/1204059377226919937?s=20
The implications of discrediting Michael Cohen, the president’s now-incarcerated former longtime attorney and fixer… while the president’s current personal attorney, Rudy Giuliani, is at the center of the impeachment inquiry.
The Mueller investigation was too long, and this one is too short.
Castor focused on the “process” and Democrats, not the substance of the allegations against the president.
https://twitter.com/AshaRangappa_/status/1204059002331697152?s=20
Lying about a “key point”? We know the Ukrainians knew military aid was withheld before it was publicly reported for the first time.
[Image via CSPAN screengrab]


Release Notes 0.9.x¶
0.9.14 V8 Scope¶
Added
IJavetMappable
Enhanced
JavetObjectConverter
to look up custom objects recursivelyRenamed
V8BindEnabler
toV8BindingEnabler
Renamed
V8VirtualEscapableValue
toV8Scope
and enhancedV8Scope
to support multiple values
0.9.13 V8 v9.4¶
Upgraded V8 to
v<IP_ADDRESS>
(2021-09-14)Added support to generator object
Added
hasInternalType()
andisGeneratorObject()
toIV8ValueObject
Added
isGeneratorFunction()
andisAsyncFunction()
toIV8ValueFunction
Added support to
Optional
andStream
in converters and callbacksAdded
IJavetAnonymous
creating ad-hoc annotation based callback receiverAdded
V8VirtualEscapableValue
Added
getMethodNameFromLambda
andgetMethodNameSetFromLambdas
toJavetReflectionUtils
Enabled decorating a function with both
@V8Function
and@V8Property
Enhanced
V8Flags
to accept custom flags
0.9.12 Private Properties¶
Added error code 503
Enhanced
V8Property
to support built-in symbolsAdded
V8ValueSharedArrayBuffer
Added
registerCustomObject()
andunregisterCustomObject()
toJavetObjectConverter
Added private property support to
IV8ValueObject
Fixed potential core dump issue in V8 runtime close.
Added Javadoc
0.9.11 V8 v9.3¶
Upgraded Node.js to
v14.17.6
(2021-08-31)Upgraded V8 to
v9.3.345.16
(2021-08-17)Added
unbind()
,unbindProperty()
,unbindFunction()
toIV8ValueObject
Updated
V8Runtime
to be completely thread-safeAdded
V8ValueBuiltInSymbol
Added
getOwnPropertySymbols()
toV8ValueBuiltInObject
Added
createV8ValueSymbol()
toV8Runtime
Added
symbol
toV8Property
to enable getter and setter on symbolAdded error code 407 and 805
0.9.10 Polyfill Java Interfaces¶
Added
JavetVirtualObject
Updated
JavetUniversalProxyHandler
to allow passingV8Value
Updated
JavetUniversalProxyHandler
to allow passingV8ValueFunction
as anonymous functionUpdated
JavetUniversalProxyHandler
to allow passingV8ValueObject
as anonymous objectAdded
isClosed()
toIJavetClosable
Added error code 602 and 603
0.9.9 Mac OS x86_64¶
Upgraded Node.js to
v14.17.4
(2021-07-29)Added support to Mac OS x86_64
Removed
staticClassEnabled
fromJavetProxyConverter
0.9.8 Empower the Promise¶
Added
resolve()
andreject()
toV8ValuePromise
Added
staticClassEnabled
toJavetProxyConverter
Added
construct()
toJavetUniversalProxyHandler
Added Dockerfile for Linux x86-64
Refactored document for how to build Javet
0.9.7 Proxy Converter v2¶
Added static mode to
JavetUniversalProxyHandler
Added
ownKeys()
toJavetUniversalProxyHandler
0.9.6 Proxy Converter v1¶
Added
IV8ValueProxy
andV8ValueProxy
Added
getTarget()
,getHandler()
,isRevoked()
andrevoke()
toIV8ValueProxy
Added
createV8ValueProxy()
toV8Runtime
Added
JavetUniversalProxyHandler
andJavetProxyConverter
0.9.5 V8 v9.2¶
Upgraded V8 to
v<IP_ADDRESS>
(2021-07-19)
0.9.4 Multi-process Safe¶
Added
JavetConverterConfig
Added
JavetEntityFunction
forJavetObjectConverter
Updated
JavetObjectConverter
to allow skipping functionsAdded
getPrototype()
andsetPrototype()
toIV8ValueObject
Changed the way that Javet libraries are deployed to be multi-process safe
0.9.3 Module Resolver¶
Upgraded Node.js to
v14.17.2
(2021-07-01)Added
IV8ModuleResolver
to allow intercepting module resolving callbackAdded
V8BindEnabler
to determine whether certain injection is enabled or notAdded
NodeModuleProcess#getVersion
Updated
JavetPrimitiveConverter
andJavetObjectConverter
to check recursion depth for circular structure detection
0.9.2 Anonymous Functions in Converter¶
Upgraded Node.js to
v14.17.1
(2021-06-15)Updated
JavetObjectConverter
to handle anonymous functions more efficientlyAdded
V8ValueBuiltInObject#assign
0.9.1 V8 in Classloader¶
Moved V8 to a custom classloader
Enabled
unloadLibrary()
andloadLibrary()
inV8Host
0.9.0 V8 v9.1¶
Upgraded Node.js to
v14.17.0
(2021-05-11)Upgraded V8 to
v9.1.269.28
(2021-05-10)Added
thisObjectRequired
to@V8Function
and@V8Property


Notebooks
Story: blank pages
blank pages
Title
blank pages
Collection
Comments
1) The page numbers on these pages have been scratched out (including duplicate pages of 123-125)
Story Pages
[123-178]
blank pages
1) The page numbers on these pages have been scratched out (including duplicate pages of 123-125)
[123-178]


In a lab assignment for my Critical GIS class, we used data from InsideAirBnB.com to explore the potential impacts of AirBnB in San Francisco. Some of the analyses suggest that AirBnB is taking a portion of housing off the market and that people use the website to run hotel business. To make this map, I used a combination of ESRI ArcGIS and Adobe Illustrator. This poster is designed for educational purposes for my Critical GIS class.


Typeform Survey component is a wrapper to the typeform survey embed script.
Any survey created in Typeform may be linked using this component. For Health Catalyst app developers, please contact the Customer Feedback team for the correct survey to link to within your app. The typeform survey component should be used in conjunction with application specific logic that prompts the user to take a survey at predetermined intervals (every 30 days is a good rule of thumb).
The following is recommended copy for use within the application specific modal that prompts the user to complete a survey:
Help us improve [app name]
We'd love to hear about your experience with [app name]. Please take 1-2 minutes to share your feedback and help us improve the application.
Provide Feedback
No thanks


{% extends "tutorial.html" %} {% block html5badge %} {% endblock %} {% block iscompatible %} return !!Modernizr.webgl {% endblock %} {% block head %} {% endblock %} {% block content %}
WebGL makes it possible to display amazing realtime 3D graphics in your browser but what many people don't know is that WebGL is actually a 2D API, not a 3D API. Let me explain. WebGL only cares about 2 things. Clipspace coordinates in 2D and colors. Your job as a programmer using WebGL is to provide WebGL with those 2 things. You provide 2 "shaders" to do this. A Vertex shader which provides the clipspace coordinates and a fragment shader that provides the color.
Clipspace coordinates always go from -1 to +1 no matter what size your canvas is. Here is a simple WebGL example that shows WebGL in its simplest form.
// Get A WebGL context var canvas = document.getElementById("canvas"); var gl = canvas.getContext("experimental-webgl"); // setup a GLSL program var vertexShader = createShaderFromScriptElement(gl, "2d-vertex-shader"); var fragmentShader = createShaderFromScriptElement(gl, "2d-fragment-shader"); var program = createProgram(gl, [vertexShader, fragmentShader]); gl.useProgram(program); // look up where the vertex data needs to go. var positionLocation = gl.getAttribLocation(program, "a_position"); // Create a buffer and put a single clipspace rectangle in // it (2 triangles) var buffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, buffer); gl.bufferData( gl.ARRAY_BUFFER, new Float32Array([ -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0]), gl.STATIC_DRAW); gl.enableVertexAttribArray(positionLocation); gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0); // draw gl.drawArrays(gl.TRIANGLES, 0, 6);
Here's the 2 shaders
<script id="2d-vertex-shader" type="x-shader/x-vertex"> attribute vec2 a_position; void main() { gl_Position = vec4(a_position, 0, 1); } </script> <script id="2d-fragment-shader" type="x-shader/x-fragment"> void main() { gl_FragColor = vec4(0,1,0,1); // green } </script>
This will draw a green rectangle the entire size of the canvas. Here it is
click here to open in a separate window
Not very exciting :-p
Again, clipspace coordinates always go from -1 to +1 regardless of the size of the canvas. In the case above you can see we are doing nothing but passing on our position data directly. Since the position data is already in clipspace there is no work to do. If you want 3D it's up to you to supply shaders that convert from 3D to 2D because WebGL IS A 2D API!!!
For 2D stuff you would probably rather work in pixels than clipspace so let's change the shader so we can supply rectangles in pixels and have it convert to clipspace for us. Here's the new vertex shader
<script id="2d-vertex-shader" type="x-shader/x-vertex"> attribute vec2 a_position; uniform vec2 u_resolution; void main() { // convert the rectangle from pixels to 0.0 to 1.0 vec2 zeroToOne = a_position / u_resolution; // convert from 0->1 to 0->2 vec2 zeroToTwo = zeroToOne * 2.0; // convert from 0->2 to -1->+1 (clipspace) vec2 clipSpace = zeroToTwo - 1.0; gl_Position = vec4(clipSpace, 0, 1); } </script>
Now we can change our data from clipspace to pixels
// set the resolution var resolutionLocation = gl.getUniformLocation(program, "u_resolution"); gl.uniform2f(resolutionLocation, canvas.width, canvas.height); // setup a rectangle from 10,20 to 80,30 in pixels gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 10, 20, 80, 20, 10, 30, 10, 30, 80, 20, 80, 30]), gl.STATIC_DRAW);
And here it is
click here to open in a separate window
You might notice the rectangle is near the bottom of that area. WebGL considers the bottom left corner to be 0,0. To get it to be the more traditional top left corner used for 2d graphics APIs we just flip the y coordinate.
gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);
And now our rectangle is where we expect it.
click here to open in a separate window
Let's make the code that defines a rectangle into a function so we can call it for different sized rectangles. While we're at it we'll make the color settable.
First we make the fragment shader take a color uniform input.
<script id="2d-fragment-shader" type="x-shader/x-fragment"> precision mediump float; uniform vec4 u_color; void main() { gl_FragColor = u_color; } </script>
And here's the new code that draws 50 rectangles in random places and random colors.
... var colorLocation = gl.getUniformLocation(program, "u_color"); ... // Create a buffer var buffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, buffer); gl.enableVertexAttribArray(positionLocation); gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0); // draw 50 random rectangles in random colors for (var ii = 0; ii < 50; ++ii) { // Setup a random rectangle setRectangle( gl, randomInt(300), randomInt(300), randomInt(300), randomInt(300)); // Set a random color. gl.uniform4f(colorLocation, Math.random(), Math.random(), Math.random(), 1); // Draw the rectangle. gl.drawArrays(gl.TRIANGLES, 0, 6); } } // Returns a random integer from 0 to range - 1. function randomInt(range) { return Math.floor(Math.random() * range); } // Fills the buffer with the values that define a rectangle. function setRectangle(gl, x, y, width, height) { var x1 = x; var x2 = x + width; var y1 = y; var y2 = y + height; gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ x1, y1, x2, y1, x1, y2, x1, y2, x2, y1, x2, y2]), gl.STATIC_DRAW); }
And here's the rectangles.
click here to open in a separate window
I hope you can see that WebGL is actually a pretty simple API. While it can get more complicated to do 3D that complication is added by you, the programmer, in the form of more complex shaders. The WebGL API itself is 2D and fairly simple.
<script>
tags default to having JavaScript in them. You can put no type or you can put type="javascript"
or type="text/javascript"
and the browser will interpret the contents as JavaScript. If you put anything else the browser ignores the contents of the script tag.
We can use this feature to store shaders in script tags. Even better, we can make up our own type and in our javascript look for that to decide whether to compile the shader as a vertex shader or a fragment shader.
In this case the function createShaderFromScriptElement
looks for a script with specified id
and then looks at the type
to decide what type of shader to create.
Image processing is easy in WebGL. How easy? Read below.
To draw images in WebGL we need to use textures. Similarly to the way WebGL expects clipspace coordinates when rendering instead of pixels, WebGL expects texture coordinates when reading a texture. Texture coordinates go from 0.0 to 1.0 no matter the dimensions of the texture.
Since we are only drawing a single rectangle (well, 2 triangles) we need to tell WebGL which place in the texture each point in the rectangle corresponds to. We'll pass this information from the vertex shader to the fragment shader using a special kind of variable called a 'varying'. It's called a varying because it varies. WebGL will interpolate the values we provide in the vertex shader as it draws each pixel using the fragment shader.
Using the vertex shader from the end of previous section we need to add an attribute to pass in texture coordinates and then pass those on to the fragment shader.
attribute vec2 a_texCoord; ... varying vec2 v_texCoord; void main() { ... // pass the texCoord to the fragment shader // The GPU will interpolate this value between points v_texCoord = a_texCoord; }
Then we supply a fragment shader to look up colors from the texture.
<script id="2d-fragment-shader" type="x-shader/x-fragment"> precision mediump float; // our texture uniform sampler2D u_image; // the texCoords passed in from the vertex shader. varying vec2 v_texCoord; void main() { // Look up a color from the texture. gl_FragColor = texture2D(u_image, v_texCoord); } </script>
Finally we need to load an image, create a texture and copy the image into the texture. Because we are in a browser images load asynchronously so we have to re-arrange our code a little to wait for the texture to load. Once it loads we'll draw it.
function main() { var image = new Image(); image.src = "http://someimage/on/our/server"; // MUST BE SAME DOMAIN!!! image.onload = function() { render(image); } } function render(image) { ... // all the code we had before. ... // look up where the texture coordinates need to go. var texCoordLocation = gl.getAttribLocation(program, "a_texCoord"); // provide texture coordinates for the rectangle. var texCoordBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0]), gl.STATIC_DRAW); gl.enableVertexAttribArray(texCoordLocation); gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0); // Create a texture. var texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); // Set the parameters so we can render any size image. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); // Upload the image into the texture. gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); ... }
And here's the image rendered in WebGL.
click here to open in a separate window
Not too exciting so let's manipulate that image. How about just swapping red and blue?
... gl_FragColor = texture2D(u_image, v_texCoord).bgra; ...
And now red and blue are swapped.
click here to open in a separate window
What if we want to do image processing that actually looks at other pixels? Since WebGL references textures in texture coordinates which go from 0.0 to 1.0 then we can calculate how much to move for 1 pixel with the simple math onePixel = 1.0 / textureSize
.
Here's a fragment shader that averages the left and right pixels of each pixel in the texture.
<script id="2d-fragment-shader" type="x-shader/x-fragment"> precision mediump float; // our texture uniform sampler2D u_image; uniform vec2 u_textureSize; // the texCoords passed in from the vertex shader. varying vec2 v_texCoord; void main() { // compute 1 pixel in texture coordinates. vec2 onePixel = vec2(1.0, 1.0) / u_textureSize; // average the left, middle, and right pixels. gl_FragColor = ( texture2D(u_image, v_texCoord) + texture2D(u_image, v_texCoord + vec2(onePixel.x, 0.0)) + texture2D(u_image, v_texCoord + vec2(-onePixel.x, 0.0))) / 3.0; } </script>
We then need to pass in the size of the texture from JavaScript.
... var textureSizeLocation = gl.getUniformLocation(program, "u_textureSize"); ... // set the size of the image gl.uniform2f(textureSizeLocation, image.width, image.height); ...
Compare to the un-blurred image above.
click here to open in a separate window
Now that we know how to reference other pixels let's use a convolution kernel to do a bunch of common image processing. In this case we'll use a 3x3 kernel. A convolution kernel is just a 3x3 matrix where each entry in the matrix represents how much to multiply the 8 pixels around the pixel we are rendering. We then divide the result by the weight of the kernel (the sum of all values in the kernel) or 1.0, which ever is greater. Here's a pretty good article on it. And here's another article showing some actual code if you were to write this by hand in C++.
In our case we're going to do that work in the shader so here's the new fragment shader.
<script id="2d-fragment-shader" type="x-shader/x-fragment"> precision mediump float; // our texture uniform sampler2D u_image; uniform vec2 u_textureSize; uniform float u_kernel[9]; // the texCoords passed in from the vertex shader. varying vec2 v_texCoord; void main() { vec2 onePixel = vec2(1.0, 1.0) / u_textureSize; vec4 colorSum = texture2D(u_image, v_texCoord + onePixel * vec2(-1, -1)) * u_kernel[0] + texture2D(u_image, v_texCoord + onePixel * vec2( 0, -1)) * u_kernel[1] + texture2D(u_image, v_texCoord + onePixel * vec2( 1, -1)) * u_kernel[2] + texture2D(u_image, v_texCoord + onePixel * vec2(-1, 0)) * u_kernel[3] + texture2D(u_image, v_texCoord + onePixel * vec2( 0, 0)) * u_kernel[4] + texture2D(u_image, v_texCoord + onePixel * vec2( 1, 0)) * u_kernel[5] + texture2D(u_image, v_texCoord + onePixel * vec2(-1, 1)) * u_kernel[6] + texture2D(u_image, v_texCoord + onePixel * vec2( 0, 1)) * u_kernel[7] + texture2D(u_image, v_texCoord + onePixel * vec2( 1, 1)) * u_kernel[8] ; float kernelWeight = u_kernel[0] + u_kernel[1] + u_kernel[2] + u_kernel[3] + u_kernel[4] + u_kernel[5] + u_kernel[6] + u_kernel[7] + u_kernel[8] ; if (kernelWeight <= 0.0) { kernelWeight = 1.0; } // Divide the sum by the weight but just use rgb // we'll set alpha to 1.0 gl_FragColor = vec4((colorSum / kernelWeight).rgb, 1.0); } </script>
In JavaScript we need to supply a convolution kernel.
... var kernelLocation = gl.getUniformLocation(program, "u_kernel[0]"); ... var edgeDetectKernel = [ -1, -1, -1, -1, 8, -1, -1, -1, -1 ]; gl.uniform1fv(kernelLocation, edgeDetectKernel); ...
And voila... Use the drop down list to select different kernels.
click here to open in a separate window
I hope this has convinced you image processing in WebGL is pretty simple. Next up I'll go over how to apply more than one effect to the image.
That's just a naming convention. a_ for attributes which is the data provided by buffers. u_ for uniforms which are inputs to the shaders, v_ for varyings which are values passed from a vertex shader to a fragment shader and interpolated (or varied) between the vertices for each pixel drawn.
The next most obvious question for image processing is how do apply multiple effects? Well, you could try to generate shaders on the fly. Provide a UI that lets the user select the effects he wants to use then generate a shader that does all of the effects. That might not always be possible though that technique is often used to create effects for real time graphics.
A more flexible way is to use 2 more textures and render to each texture in turn, ping ponging back and forth and applying the next effect each time.
Original Image -> [Blur] -> Texture 1 Texture 1 -> [Sharpen] -> Texture 2 Texture 2 -> [Edge Detect] -> Texture 1 Texture 1 -> [Blur] -> Texture 2 Texture 2 -> [Normal] -> Canvas
To do this we need to create framebuffers. In WebGL and OpenGL, a Framebuffer is actually a poor name. A WebGL/OpenGL Framebuffer is really just a collection of state and not actually a buffer of any kind. But, by attaching a texture to a framebuffer we can render into that texture.
First let's turn the old texture creation code into a function
function createAndSetupTexture(gl) { var texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); // Set up texture so we can render any size image and so we are // working with pixels. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); return texture; } // Create a texture and put the image in it. var originalImageTexture = createAndSetupTexture(gl); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
And now let's use that function to make 2 more textures and attach them to 2 framebuffers.
// create 2 textures and attach them to framebuffers. var textures = []; var framebuffers = []; for (var ii = 0; ii < 2; ++ii) { var texture = createAndSetupTexture(gl); textures.push(texture); // make the texture the same size as the image gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, image.width, image.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); // Create a framebuffer var fbo = gl.createFramebuffer(); framebuffers.push(fbo); gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); // Attach a texture to it. gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); }
Now let's make a set of kernels and then a list of them to apply.
// Define several convolution kernels var kernels = { normal: [ 0, 0, 0, 0, 1, 0, 0, 0, 0 ], gaussianBlur: [ 0.045, 0.122, 0.045, 0.122, 0.332, 0.122, 0.045, 0.122, 0.045 ], unsharpen: [ -1, -1, -1, -1, 9, -1, -1, -1, -1 ], emboss: [ -2, -1, 0, -1, 1, 1, 0, 1, 2 ] }; // List of effects to apply. var effectsToApply = [ "gaussianBlur", "emboss", "gaussianBlur", "unsharpen" ];
And finally let's apply each one, ping ponging which texture we are rendering too
// start with the original image gl.bindTexture(gl.TEXTURE_2D, originalImageTexture); // don't y flip images while drawing to the textures gl.uniform1f(flipYLocation, 1); // loop through each effect we want to apply. for (var ii = 0; ii < effectsToApply.length; ++ii) { // Setup to draw into one of the framebuffers. setFramebuffer(framebuffers[ii % 2], image.width, image.height); drawWithKernel(effectsToApply[ii]); // for the next draw, use the texture we just rendered to. gl.bindTexture(gl.TEXTURE_2D, textures[ii % 2]); } // finally draw the result to the canvas. gl.uniform1f(flipYLocation, -1); // need to y flip for canvas setFramebuffer(null, canvas.width, canvas.height); drawWithKernel("normal"); function setFramebuffer(fbo, width, height) { // make this the framebuffer we are rendering to. gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); // Tell the shader the resolution of the framebuffer. gl.uniform2f(resolutionLocation, width, height); // Tell webgl the viewport setting needed for framebuffer. gl.viewport(0, 0, width, height); } function drawWithKernel(name) { // set the kernel gl.uniform1fv(kernelLocation, kernels[name]); // Draw the rectangle. gl.drawArrays(gl.TRIANGLES, 0, 6); }
Here's a working version with a slightly more flexible UI. Check the effects to turn them on. Drag the effects to reorder how they are applied.
click here to open in a separate window
Some things I should go over.
Calling gl.bindFramebuffer
with null
tells WebGL you want to render to the canvas instead of to one of your framebuffers.
WebGL has to convert from clipspace back into pixels. It does this based on the settings of gl.viewport
. The settings of gl.viewport
default to the size of the canvas when we initialize WebGL. Since the framebuffers we are rendering into are a different size then the canvas we need to set the viewport appropriately.
Finally in the WebGL fundamentals examples we flipped the Y coordinate when rendering because WebGL displays the canvas with 0,0 being the bottom left corner instead of the more traditional for 2D top left. That's not needed when rendering to a framebuffer. Because the framebuffer is never displayed, which part is top and bottom is irrelevant. All that matters is that pixel 0,0 in the framebuffer corresponds to 0,0 in our calculations. To deal with this I made it possible to set whether to flip or not by adding one more input into the shader.
<script id="2d-vertex-shader" type="x-shader/x-vertex"> ... uniform float u_flipY; ... void main() { ... gl_Position = vec4(clipSpace * vec2(1, u_flipY), 0, 1); ... } </script>
And then we can set it when we render with
... var flipYLocation = gl.getUniformLocation(program, "u_flipY"); ... // don't flip gl.uniform1f(flipYLocation, 1); ... // flip gl.uniform1f(flipYLocation, -1);
I kept this example simple by using single GLSL program that can achieve multiple effects. If you wanted to do full on image processing you'd probably need many GLSL programs. A program for hue, saturation and luminance adjustment. Another for brightness and contrast. One for inverting, another for adjusting levels, etc. You'd need to change the code to switch GLSL programs and update the parameters for that particular program. I'd considered writing that example but it's an exercise best left to the reader because multiple GLSL programs each with their own parameter needs probably means some major refactoring to keep it all from becoming a big mess of spaghetti.
I hope this and the preceding examples have made WebGL seem a little more approachable and I hope starting with 2D helps make WebGL a little easier to understand. If I find the time I'll try to write a few more articles about how to do 3D as well as more details on what WebGL is really doing under the hood.
I've noticed some OpenGL developers having issues with how WebGL treats alpha in the backbuffer (ie, the canvas), so I thought it might be good to go over some of the differences between WebGL and OpenGL related to alpha.
The biggest difference between OpenGL and WebGL is that OpenGL renders to a backbuffer that is not composited with anything so, or effectively not composited with anything by the OS's window manager, so it doesn't matter what your alpha is.
WebGL is composited by the browser with the web page and the default is to use pre-multiplied alpha the same as .png <img> tags with transparency and 2d canvas tags.
WebGL has several ways to make this more like OpenGL.
gl = canvas.getContext("experimental-webgl", {premultipliedAlpha: false});
The default is true.
Of course the result will still be composited over page with whatever background color ends up being under the canvas (the canvas's background color, the canvas's container background color, the page's background color, the stuff behind the canvas if the canvas has a z-index > 0, etc....) in other words, the color CSS defines for that area of the webpage.
I really good way to find if you have any alpha problems is to set the canvas's background to a bright color like red. You'll immediately see what is happening.
<canvas style="background: red;"></canvas>
You could also set it to black which will hide any alpha issues you have.
gl = canvas.getContext("experimental-webgl", {alpha: false});
This will make it act more like OpenGL since the backbuffer will only have RGB. This is probably the best option because a good browser could see that you have no alpha and actually optimize the way WebGL is composited. Of course that also means it actually won't have alpha in the backbuffer so if you are using alpha in the backbuffer for some purpose that might not work for you. Few apps that I know of use alpha in the backbuffer. I think arguably this should have been the default.
.. renderScene(); .. // Set the backbuffer's alpha to 1.0 gl.clearColor(1, 1, 1, 1); gl.colorMask(false, false, false, true); gl.clear(gl.COLOR_BUFFER_BIT);
Clearing is generally very fast as there is a special case for it in most hardware. I did this in most of my demos. If I was smart I'd switch to method #2 above. Maybe I'll do that right after I post this. It seems like most WebGL libraries should default to this method. Those few developers that are actually using alpha for compositing effects can ask for it. The rest will just get the best perf and the least surprises.
// At init time. Clear the back buffer. gl.clearColor(1,1,1,1); gl.clear(gl.COLOR_BUFFER_BIT); // Turn off rendering to alpha gl.colorMask(true, true, true, false);
Of course if you are rendering to your own framebuffers you may need to turn rendering to alpha back on and then turn it off again when you switch to rendering to the canvas.
Also, if you are loading PNG files with alpha into textures, the default is that their alpha is pre-multiplied which is generally NOT the way most games do things. If you want to prevent that behavior you need to tell WebGL with
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
Almost all OpenGL apps I've writing or worked on use
gl.blendFunc(gl.SRC_ALPHA, gl_ONE_MINUS_SRC_ALPHA);
That works for non pre-multiplied alpha textures.
If you actually want to work with pre-multiplied alpha textures then you probably want
gl.blendFunc(gl.ONE, gl_ONE_MINUS_SRC_ALPHA);
Those are the methods I'm aware of. If you know of more please post them below.
{% endblock %}


DukeCon Versions
This service contains the following
DukeCon
components:
HTML5 Client Version
Server Version


|
|
def | __init__ |
| |
|
def | topic |
| |
|
def | set_topic |
| |
|
def | clear_topic |
| |
|
def | has_topic |
| |
|
def | sub_id |
| |
|
def | set_sub_id |
| |
|
def | clear_sub_id |
| |
|
def | has_sub_id |
| |
|
def | lease_duration_sec |
| |
|
def | set_lease_duration_sec |
| |
|
def | clear_lease_duration_sec |
| |
|
def | has_lease_duration_sec |
| |
|
def | vanilla_query |
| |
|
def | set_vanilla_query |
| |
|
def | clear_vanilla_query |
| |
|
def | has_vanilla_query |
| |
|
def | schema_entry_size |
| |
|
def | schema_entry_list |
| |
|
def | schema_entry |
| |
|
def | mutable_schema_entry |
| |
|
def | add_schema_entry |
| |
|
def | clear_schema_entry |
| |
|
def | MergeFrom |
| |
|
def | Equals |
| |
|
def | IsInitialized |
| |
|
def | ByteSize |
| |
|
def | ByteSizePartial |
| |
|
def | Clear |
| |
|
def | OutputUnchecked |
| |
|
def | OutputPartial |
| |
|
def | TryMerge |
| |
|
def | __str__ |
| |
|
|
| schema_entry_ |
| |
|
| has_topic_ |
| |
|
| topic_ |
| |
|
| has_sub_id_ |
| |
|
| sub_id_ |
| |
|
| has_lease_duration_sec_ |
| |
|
| lease_duration_sec_ |
| |
|
| has_vanilla_query_ |
| |
|
| vanilla_query_ |
| |
|
|
int | has_topic_ = 0 |
| |
|
string | topic_ = "" |
| |
|
int | has_sub_id_ = 0 |
| |
|
string | sub_id_ = "" |
| |
|
int | has_lease_duration_sec_ = 0 |
| |
|
float | lease_duration_sec_ = 0.0 |
| |
|
int | has_vanilla_query_ = 0 |
| |
|
string | vanilla_query_ = "" |
| |
|
int | ktopic = 1 |
| |
|
int | ksub_id = 2 |
| |
|
int | klease_duration_sec = 3 |
| |
|
int | kvanilla_query = 4 |
| |
|
int | kschema_entry = 5 |
| |
The documentation for this class was generated from the following file:
- code/googleappengine-read-only/python/google/appengine/api/prospective_search/prospective_search_pb.py


I recently had a discussion with other science teachers about the role of writing in our classrooms. The discussion that ultimately emerged revolved around the idea that science shouldn’t be teaching students the writing process…that is the English teacher’s job.
I highly respect the opinions and views of my colleagues, but this belief blew my mind. Perhaps I’m naïve (second year teacher) or an idealist, but I don’t see how we can “teach” writing without teaching (or at least reinforcing) the process as we go. To me, this is the same as saying “Meet me at my house, but I want you to get directions from someone else.”
The problem with writing (or rather learning how to write) is that it is quarantined to the English classes.
I do agree that the bulk of writing is learned and practiced in the English class. But, if we’re trying to teach the whole student, why are we ignoring their other learning? Schools are always pushing teachers to make cross-content connections with kids and writing should be one of the easiest ways to do so. There are a multitude of tools teachers (not just English/Language Arts) can use to help students become better writers.
One in particular I like is the 6 +1 Traits of Writing, written by Ruth Culham. I had a college professor use this book in a class called “Reading and Writing Across Curriculum” and I instantly fell in love with the model.
Ms. Culham’s premise is that writing is not a static process and that all writing can be broken down into 6 [+1] traits that are easily taught, improved, and assessed. The traits cover “Ideas” to “Sentence Fluency” to “Voice,” and the teacher has students focus on one trait at a time until students have developed that writing skill and they are ready to add another layer. The book includes rubrics that help us assess their writing in quick, effective manner and students can get meaningful feedback on their work. Do note, that this is not a summative process…this is formative and should be used to build their writing skills.
In science, we like to “focus on the content” rather than the actual writing and I am challenged by teachers to show how I effectively teach writing without sacrificing content. Well, I use 6 +1 in AP Chemistry all the time because readers want clear, concise answers to questions and this is an easy way to improve student word choice, organization, and ideas while still communicating the content. In General Chemistry, I can tell students to focus on the idea of the paper (how chemistry has changed over time) or the voice (passive voice of a lab report vs active voice of a persuasive essay). Again, the content is there and at the same time (with minimal “extra” work) I can require them to improve their writing in an applicable and meaningful way.
We can teach students to use good writing habits while assessing the content. If we are teaching students to make connections between content, we should be modeling that with our teaching and our assignments.
Written on May 2nd , 2011 by Brian Bennett Categorized in: All
Leave a comment


idempotency laws for sets,
1071
implicit summation notation,
648
incidence matrix
and difference constraints,
603
of a directed graph,
403 pr.,
531 ex.
of an undirected graph,
403 pr.
increasing a key in a max-heap,
139–140
incremental design method,
27
for finding the convex hull,
948
indentation in pseudocode,
19
independence
of random variables,
1107
of subproblems in dynamic programming,
343–344
independent family of subsets,
393
indicator random variable,
94–98
in analysis of expected height of a randomly built binary search tree,
265–267
in analysis of inserting into a treap,
296 pr.
in analysis of streaks,
113–114
in analysis of the birthday paradox,
108–109
in approximation algorithm for MAX-3-CNF satisfiability,
1040
in bounding the right tail of the binomial distribution,
1122–1123
in bucket sort analysis,
175–177
in hiring-problem analysis,
97–98
in randomized selection analysis,
187–189,
189 ex.
in universal-hashing analysis,
233–234
inequality constraint,
778
and equality constraints,
780
infeasible linear program,
778
infinity, arithmetic with,
587
INITIALIZE-SINGLE-SOURCE,
585
input
to a combinational circuit,
988
insertion
into binary search trees,
261
into chained hash tables,
226
into
d-ary heaps,
143 pr.
into direct-address tables,
222
into open-address hash tables,
237–238
into order-statistic trees,
306–307
into sweep-line statuses,
942
into 2-3-4 heaps,
473 pr.
into Young tableaus,
143 pr.
compared to merge sort,
13 ex.
compared to quicksort,
153 ex.
decision tree for,
166 fig.
sorting-network implementation of,
708 ex.
using binary search,
37 ex.
instructions of the RAM model,
21
integer linear-programming problem,
777,
819 pr.,
1017 ex.
integral, to approximate summations,
1067
interpolation by a cubic spline,
767 pr.
interpolation by a polynomial,
825,
830 ex.
at complex roots of unity,
836–837
intersection
determining, for a set of line segments,
940–947
determining, for two line segments,
936–938
of languages,
976 of sets (
∩),
1071
interval-graph coloring problem,
379 ex.
inverse
of a bijective function,
1079
of a matrix from an LUP decomposition,
755–756
multiplicative, modulo
n,
871
iterated logarithm function,
55–56


Dynamic addition and deletion of Overlays control
Remove Hillshade Overlay
Remove Fire Overlay
Remove Emergency Rooms Overlay
Add Hillshade Overlay
Add Fire Overlay
Add Emergency Rooms Overlay


Even though we're located 100 miles away from the nearest island, but you would never know based on the luxurious accomedations we provide


System Exclusive (SysEx): General Facts
SysEx events are defined by a sequence of bytes in hexadecimal denotation. The first byte is the status byte
0xf0, the last is the byte 0xf7. Because most SysEx events are manufacturer specific, HP MIDIFILE
handles the SysEx by its sequence of bytes only.
In the internal representation is the second byte the number of the following bytes. This
number is omitted in the documentations most. So does HP MIDIFILE. We are confrontated
with the sequence without length. For example: Do not use the "GM On" SysEx with its
length byte {0xf0,0x05,0x7e,0x7f,0x09,0x01,0xf7}; use {0xf0,0x7e,0x7f,0x09,0x01,0xf7} instead.