Version history¶
German Version of this document.
You find the milestones at: https://github.com/mapbender/mapbender/milestones
Version <IP_ADDRESS>¶
Release Datum: 27.07.2017
Bugfixes:
- Regression: Fixed coordinate order at requests to a WMS 1.3.0. Coordinate reference systems with reversed axis-orientation are supported by map, print and export. (#529)
- Regression: Fixed ScaleHint for WMS services. Some WMS services that defined a Scale in their Capabilities couldn’t be put into an application. (#584)
Version <IP_ADDRESS>¶
Release date: 20.07.2017
Bugfixes:
- Search Router: Error with OpenLayers fixed (#543)
- Search Router: Auto Close after Click in mobile application (#548)
- Coordinate order (axis order) on requests to WMS 1.3.0 fixed (#529)
- Print: Rendering of points and labels on high-resolution Print (#573, #574, #492)
- Saving of WMC in WMC editor dialog (#577)
- ScaleHint for sub-layers of 1:1 fixed (#565)
- Widen the Title-Columns on Layerset-Instances (#559)
- Command to update the image-path in existing map-elements (#530)
- Translation of Print-button in FeatureInfo dialog (#552)
- Change of default-value of “immediate” in measure-tools (#538)
- SRS: Update of definitions (#550, #562) and update of YAML standard applications (#561)
- Update documentation for handling of translations.
Additional update steps:
(1) Update of EPSG-Codes
Execute again the command app/console doctrine:fixtures:load --fixtures=mapbender/src/Mapbender/CoreBundle/DataFixtures/ORM/Epsg/ --append
. Two new coordinate-systems are added to the Mapbender database-table mb_core_srs
: EPSG:4839|ETRS89 / LCC Germany (N-E) and EPSG:5243|ETRS89 / LCC Germany (E-N)).
(2) Update of parameters im Map-Control
Execute the command app/console mapbender:upgrade:database
, to update the OL-imagePath Parameter from bundles/mapbendercore/mapquery/lib/openlayers/img
to components/mapquery/lib/openlayers/img
. This is necessary if you use the POI-Elements or call Mapbender with the poi-parameter and see no bubble-icon for the poi. Example: https://demo.mapbender3.org/application/mapbender_user?poi[point]=366164%2C5623183&poi[scale]=25000&poi[label]=Please+take+a+look+at+this+POI%3A
Version <IP_ADDRESS>¶
Release date: 24.05.2017
Bugfixes:
- Print map showed wrong scale in map-display.
- Specific WMS could not be printed due to HTTP response image/png; charset-iso....
- Backend: FOM dialogues with many entries made checkboxes unusable.
- config.php back in mapbender-starter.
- Update bin/composer build command for building Mapbender.
- Style-Fix for administrations-dialog of Basesource-switcher.
- Add WmcEditor Default Parameters for width and height.
- Update landing-page of this documentation.
- Some minor styling changes in backend.
- Some cleanup.
Version <IP_ADDRESS>¶
Release date: 05.05.2017
Architecture:
- System Requirement PHP: 5.5.4 or higher.
- Support of PHP 7.
- Mapbender, FOM and OWSProxy excluded into Modules. They are now bind in composer.json
- Documentation is part of the composer.
- Adjustments of the ElementGenerator
- Determining of user-roles
- Composer entries with https
- Adjustments of Controllers and Bundles.
- Doctrine generate commands are marked deprecated
- Doctrine assets:dump command is marked deprecated
- Update of the JOII library
- Introduction of symblinks to the different binaries in the bin directory of mapbender-starter
- Composer shipped in application/bin directory
- Check in the Composer-installation, if the SASS Compiler Binaries are executable. If not, they are set executable.
- New Composer commands for documentation: Generate API documentation only: bin/composer gen-api-docs
- New Composer commands for documentation: Generate User-documentation only: bin/composer gen-user-docs
- Use of own forks of open-sans, joii, compass-mixins and codemirror libraries.
Bugfixes und Features:
- Measuring shows the coordinates directly, by moving the mouse the calculated lengths of the segment are displayed live.
- New measuring results are shown on Top. The current result is visible at first place and you don’t need to scroll.
- The login-dialog (registration, forgotten password) is optimized for mobile devices to achieve a better workflow to secured mobile applications.
- New added layerset instances are now per default not marked as base-source.
- The Copyright element popup can be defined with a height and a width.
- Deleting a layerset led in some cases to a corrupt map element and a wrong layertree.
- Adjustments and Simplification of the general style of the FullScreenTemplate
- Introduction of the check of the CSS statements in a application
- Fix in the delay when switching layers.
- Fix in GetMap request if the layer order was changed manually in the TOC.
- Fix for WMS support 1.3.0
- Fix for secured WMS services on GetMap, GetFeatureInfo, Print, Export and Legend.
- Fix for secured WMS services where the username or password included a hash-character.
- Fixes for the WMS parameter Exception Format for the GetMap and GetFeatureInfo Request (Github-Issue 400)
- Fixes of Layer-Styles for GetMap und GetFeatureInfo request
- Default Tile Size for the Map set to 512 (was 256)
- WMS Keyword limit (was: 255 characters) is changed. The column-type is now “text”. The command app/console doctrine:schema:update is necessary to update the Mapbender database of a previous version.
- Fix when importing YAML based applications and creating duplicate WMS data-sources.
- Fix on minimal and maximal scale hint on WMS services.
- Print: Color can be set for variable texts.
- Print: Printout of the legend, if the service is built in with the proxy.
- Print: Services registered with PNG8 could not be printed or exported in some cases. The types image/png8 and image/png mode=24bit is not supported.
- Print: In some cases, the legend wasn’t printed if OWSProxy was activated
- BaseSourceSwitcher: Duplicate request on WMS which was not visible and where the BaseSourceSwitcher was used as a menu.
- Unneccessary requests on specifc WMS configurations with scale.
- Saving of YML applications in application/app/config/applications: mapbender_mobile.yml, mapbender_user_basic.yml, mapbender_user.yml and adjustments in their referenced WMS Version
- Fixes in administration interface of the YAML editing after saving (Github-Issue 350)
- Fixes in POI-Coordinate: Transformation and SRS and the trailing digits after the comma.
- Fix of a XSS error in POI dialog
- Fix in POI dialog, if useMailto is set to false
- GPS: Error messages if no GPS signal and the dependency to Chrome-browser and https.
- GPS: Pan the map only on first position.
- User-Interface: Scrolling of a drop-down list in backend, for example the icons for the buttons, did also scroll the background.
- “Only valid” Checkbox on loading a WMS is now per default not activated anymore.
- Reformatted messages if the schemes of a WMS are not accessible when adding a WMS.
- The SearchRouter shows, if placed in the sidebar, the Search and Reset buttons.
- Internet Explorer Compatibility: Adjustments in the Zoombar..
- Internet Explorer Compatibility: Adjustments in the OverviewMap.
- MS Egde Compatibility: Trying to fix the Import Dialog (https://connect.microsoft.com/IE/feedback/details/1574105/microsoft-edge-file-upload-bug-build-10240-rtm)
- Improvement of the performance on some Windows installations through WinCachePHP and PHP Opcache (for details see Installation under Windows)
- Change in System-Requirement for Windows: For PHP, the “Non-Thread-Safe” version is needed!
- Copying of applications through users who are not root (ACL Application: owner, Users: owner, ACLs: owner, Element: owner, Groups: owner, Service Source: owner, specific applications: owner)
FOM and Security:
- Show the users who have a access on an element in an application.
- Rework of the Secure Elements dialog.
- User with the role View for services are allowed to view the Metadata and to load the services into an application.
miscellaneous
- Design and presentation of the FeatureInfo dialog if shown as Accordion. Also if shown as “not from source”.
- Drag of Popups in an application.
- WMC Editor: Adjustments in size. XSS fix.
- Fix of translations
- YAML based applications can adjust the sidebar: align (left/right), closed (true/false), width (px/em/%)
- Backend: Target field: Empty option of a Drop-Down field.
- Adjustments of WMS Scale, ScaleHint and Min/Max values when a Layerset-Instance is opened.
- Display of WMS Title in the metadata of the TOC, when the WMS was updated.
- Display of the application logo in the Configuration.
- Display Issues of Simple Search and Search Router.
- Fixes for error messages on a wrong configured Layerset-Instance.
- Print: Introduction of setasign/pdf instead of toooni/fpdf
- Print: Fix of error messages on a missing print-template
- Measuring of lines and polygons in WGS84 (EPSG:4326)
- Adjustments of display of the element ACL
- WMS Update: remove user/password from web-browser autocomplete
- Display of number of digits in coordinates-display.
- Adjustments and extending EPSG import
- fix default visibility for a layer and the scale
- remove of DataSource Monitor icon (comes in version “next”)
- Administration: Movement on the tabs with the tab-key
- Improvement of the display of the configuration interface
- Display of Source-ID in applications
- Improvements of Caching Mechanisms
- Improvements of Export and Copy mechanism.
- Improvements for the creation of new elements.
- Remove the provide ext-ldap statement in Composer. The components are released from the core. We will build in the LDAP module in version 3.0.7.
- Restructuring of DataManager and DataSource since version 1.0.2 of data-manager.
Mobile template
- General improvements of the mobile template.
- Fix handle mobile template button click if target isn’t defined
- Set mobile icon label font weight to normal
- Fix and improve mobile template button handling
- Fix register mobile application event handler “on moveend”
Digitizer
- Update Digitizer to version 1.1.
- Printing of Multipolygons.
- Objects don’t appear in the printout if they are not displayed in the Digitizer.
- MinScale restriction added
- Objects with a line-width of 0 are now not shown anymore in the printout.
- Adjustments of the Close Button: “allowCancelButton” and “allowDeleteByCancelNewGeometry”.
Form Generator:
- Adjustments: Add HTMLElement handling of service and DataStore configuration.
Dokumentation
- Introduction of the FAQ.
- Introduction of Contributing Guide for Mapbender-Starter and OWSProxy. Mapbender itself and FOM will follow. This is the main documentation for developers and contributors of Mapbender.
- The developer documentation will be maintained there and be transferred step-by-step from this user-documentation. So in the future this documentation here will be more for users and the developers have their documentation directly in the source code of the different modules.
- Better Layertree documentation
config.yml Anpassungen
DBAL-Parameter:
- default_connection: If more database entries are defined, this parameter
- persistent: Persistent connections to the database for performance reasons (Oracle)
doctrine:
dbal:
default_connection: default
connections:
default:
...
persistent: true
mapbender-starter/application/app/config/applications/
Directory where YAML-based application definition are stored. As an example the well-known applications Mapbender-User, Mapbeder-User-Basic and Mapbender-Mobile are placed here.
app/console doctrine:schema:update
$ app/console doctrine:schema:update --dump-sql
ALTER TABLE mb_core_keyword ALTER value TYPE TEXT;
ALTER TABLE mb_core_keyword ALTER value DROP DEFAULT;
Milestone <IP_ADDRESS>¶
Release date: 04.02.2016
Bugfixes:
Notable Modifications:
- Performance: The CSS, JavaScript and Translation files are now held in the Symfony Cache for the production mode. This can lead to better performance on slower machines. These cache is not used by the development-mode.
- The package eslider/sassc-binaries offers now a sassc Compiler for 32-bit Linux systems. This led to a wrong display on 32-bit Linux-Systems (http://lists.osgeo.org/pipermail/mapbender_users/2015-December/004768.html)
- Redlining: The contents of the Redlining element is visible and Redlining can now be used as a Dialog or an Element in the Sidepane. See also the documentation of the Redlining Element. The scroll bar for the Geometry-Types in the configuration dialog is now displayed correctly.
Users and security:
- Users can be switched active or inactive by an Administrator, who has at least the ACL-user-right “operator”. This can be used for users, who have self-registered but not yet activated their account. See the documentation of user-management for details.
- The text, translations and styles for the Self-Register process and the Password Reset are improved. Also the Documentation is adjusted.
Print and export image:
- The Print module can now also be used in the Sidepane.
- Print legend: The size of the legend in the print-out was scaled down to improve the quality.
- Print-templates: The default print-templates have changed. The padding of the dynamic texts to their border and their justification were improved.
- Print: The Print configuration messed up mandatory (required: true) and optional fields (required: false), if they were used in combination. Optional fields were partly shown as mandatory (Github #380).
- In some cases Mapbender printed the legend of all WMS-layers, even if the layer was not set active (seen in Mapbender_Users WMS).
- Export Image: Transparency of tiled and non-tiled services is supported in Export Image.
Copy and import:
- Copying an application under SQLite and MySQL: There was en error that applications could not be copied if the database was SQLite or MySQL.
- Errors at the import of application as JSON on MySQL (elements lose their target) was fixed.
Individual Elements:
- WMC and thematic layertree: If a WMC is loaded and Keep Sources is set to “no”, the thematic layers are now also removed from the layertree.
- WMS-URL parameter and legend: If a service was loaded with the wms_url parameter, the complete legend was shown. This behaviour is fixed.
- Note: WMS services exists, which define a legend in the root-layer element. According to the WMS-specification, this legend will be inherited by sub-layers who itself haven’t defined a legend (for example if they only contain the annotations). The effect is similar in MB3 but the cause is different, so that in these cases a change in the WMS capabilities is needed (define a static legend image for these layers).
- Thematic Layer: Fix in switching layers on and off which are in their own Layerset but not displayed as a thematic layer.
- Coordinate display: The coordinate-element display doesn’t show “null” as prefix or separator anymore, although the field was defined as empty. The element has get a fixed with so that the layout in the footer region is more sable. The value can be changed (see the chapter CSS-customizing of the element).
- SearchRouter: The content of the result uses the whole space of the dialog and fits itself to changes of the size. In the sidebar the whole height is used. The search router can be configured with a width and a height.
- ScaleSelector: The width of the element can be customized with a CSS-Statement and is no more set to 155 pixel.
- If all layer in a layerset-instance are set to visible=off they were not visible in the layertree and the legend. This is fixed.
- Improvements in the styling of the POI dialog if “usemailto” is set to false.
- Layertree: Titles are now shown per default with a length of 40. The default value has been changed. You can set the parameter Titlemaxlength in the configuration dialog.
- GPS: Improvements in the GPS handling.
General changes:
- Changing the Base Data, the Layout, the Layerset, the CSS and the Security of an application does not change the tab anymore and doesn’t jump back to the base data tab.
- General improvements of the Digitizer version 1.0. Version 1.1 is compatible with Mapbender <IP_ADDRESS>.
- Github files: Small clean up actions in the Github repository to improve the automatic build-processes.
- Transparency of services: Services with a transparency refreshed with a poor effect, caused by the “transitionEffect” in OpenLayers. The effect was removed.
- Group filter: The security configuration dialog got improvements at the selection of Groups, if the Groups had the same name but a different suffix.
- TileSize Parameter in the map configuration was not set in some cases.
- Display of symbols in Internet Explorer 11 and MS Edge 25 (also an error in MS Edge 20).
- mapbender.yml: At the initial import of the mapbender.yml the values of GetFeatureInfo are now set to text/html. The mapbender.yml can now customized with Redlining.
Change of the Mapbender domains:
- We have switched the URL www.mapbender.org to the Mapbender3 page. In future, the Mapbender3 page is also available via www.mapbender.org and www.mapbender3.org. Mapbender2 is now available at www.mapbender2.org
- http://www.mapbender.org: Mapbender3,
- http://www.mapbender3.org: Mapbender3,
- http://www.mapbender2.org: Mapbender2.
Known Issues:
- The Sketch Tool doesn’t work correctly and will be built into the Redlining Tool.
- Share map doesn’t work for Facebook, Twitter und Google+.
Milestone <IP_ADDRESS>¶
Release Datum: 27.10.2015
Bugfixes:
- Copy applications: User-Rights and groups are copied. The user who copied the application becomes owner of the copied application.
- FOM: Changes in behaviour of wrong logins and user locking. It is only shown that the login failed, independent if the user exists or not.
- Fixed error message when creating a user with a too short password.
- Print: Fix of replace pattern.
- Print: Fix if a wrong configured WMS has special characters (%26) in the legend URL.
- Image export in Firefox.
- WMC Loader: Loading WMC and Behaviour of BaseSources.
- BaseSourceSwitcher: Tiles of a not visible service are not pre-fetched.
- BaseSourceSwitcher: If a group is defined, only one theme is switched on.
- SearchRouter: Fix of quotes for table-names.
- Copy applications: Fix of the search in the copied application.
- Simple Search: Catch the return key.
- FeatureInfo: Add WMS functionality and WMS Loader.
- Icon Polygon is visible in the toolbar of applications.
- Icons, which are not based on FontAwesome also work in the mobile application.
- Administration of the map element: The view of the configuration dialog in the backend starts on top.
- Administration data source: No form data auto-complete from the browser for username and password.
- Mobile application: Design in Firefox for Android.
- Update 3.0.4.x: FeatureInfo autoopen=true is kept.
- Doku: FOM UserBundle translation and additional information for failed user logins.
- Doku: URL parameter scale in map element.
- Doku: WMC Loader and KeepSources.
Changes in config.yml:
The following changes are optional parameters for the behaviour of the login (see also the chapter in the FOM bundle for details):
fom_user: # Allow to create user log table on the fly if the table doesn't exits. # Default: true auto_create_log_table: true # Time between to check login tries login_check_log_time: "-5 minutes" # Login attemps before delay starts login_attempts_before_delay: 3 # Login delay after all attemps are failed login_delay_after_fail: 2 # Seconds
Milestone <IP_ADDRESS>¶
Release Datum: 26.08.2015
New functions: in the Map element and in the Print client:
- Map: OpenLayers TileSize: You can set the tile-size for the map. Default: 256x256.
- Map: Delay before Tiles: For WMS-T, for example with temporal parameters (in future)
- Print: Show coordinates in PDF print
- Print: get print scale depending on map-scale
- Print: print legend_default_behaviour
- Print: add print templates with the + symbol
- Print: user-defined logo and text
Bugfixes:
- Layertree: loading symbol and exclamation mark symbol.
- Layertree: zoom Symbol not for layers without a BBOX information
- WMS Reload: FeatureInfo
- WMS Reload: some WMS couldn’t be reloaded.
- Export/Import of application and miscellaneous bugfixes
- WMC-Editor and WMC-Load fixes.
- WMC from a Mapbender <IP_ADDRESS> application
- Tile buffer and BBOX buffer fixes
- FeatureInfo: Fixes in design and when shown as an Accordion Panel
- FeatureInfo: Print
- Wrong Jquery-UI link in layerset instance
- Save Layerset and Save Layout leaves you on the page
- Classic Template: SCSS corrections
- Mobile Template: Bootstrap message hides close button
- Mobile Template: close SearchRouter window
- Mobile Template: Mozilla Firefox Fixes on layout
- Backend: Layerset Filter and +-Buttons doesn’t hide everything anymore
- composer.json upgrade version of Digitizer to 1.0.*
- Documentation of the JS-UI Generator (Form-Generator): https://github.com/eSlider/vis-ui.js
- Restructured Installations-Dokumentation and some changes (php-pear, assets-Verzeichnis, init:acl, openssl).
- Better documentation of the Mapbender3 Templates
- Better documentation of the Quickstart
Known Issues:
- After copying an application from Mapbender 3.0.4.x you have to set the layerset in the map/overview element. Please save the map and overview element beforehand.
- Regional Template removed
Milestone <IP_ADDRESS>¶
Release Date: 01.07.2015
For details have a look at: https://github.com/mapbender/mapbender-starter/blob/develop/CHANGELOG.md
- WMS reload: WMS sources can now be reloaded if the structure has changed.
- Digitizer: The digitizer allows the editing of geometries and their attributes. Right now it needs access to the database where the editable tables are. The definition of the digitizer is done in YAML syntax. To provide an usable interface for the attributes, you can declare the form in your configuration file. The form supports different input fields (textboxes, checkboxes, date-pickers, and so on..), validation, tabs and it uses Bootstrap.
- Print with legend: The print element supports the print-out of the legend on a seperate page. This can be set with a checkbox.
- Configurable layertree: The layertree supports the usage of more than one layerset. You have to adjust the map element to define which layersets should be shown and the layertree element itself. The usage is documented on the Layertree page.
- Improved FeatureInfo dialog: You can set a) the width and height of the FeatureInfo dialog, b) if the dialog should show the original format of the WMS and c) if it should only open if a valid entry is found (otherwise a messagebox is displayed). See the documentation of the FeatureInfo Dialog.
- Mobile template: A new modern mobile template is provided.
- SASS Compiler: Architectual changes are made at the SASS compiler which leads to a more performant interface.
- Vendor Specific Parameters: A WMS layer instance supports the definition of Vendor Specific Parameters that are added to the WMS request. You can define hard coded values or the user or group information of the logged-in user. See the documentation of Vendor Specific Parameters for details.
- Expanded functionality of HTML elements with a form-builder: This approach is used in the Digitizer to provide the forms for attribute editing.
- New button colletion: The new buttons are based on a new font, the old buttons are available under the “FontAwesome” name.
- Starting mapbender with URL parameters: Mapbender3 can be started with URL parameters. See the documentation of URL parameters.
- New translations for Portuguese and Russian.
- Symfony updated to 2.3.30.
Changes in config.yml:
Changes in a dbal connection:
- logging: false: This options sets, that all SQL statements are not logged. Further information can be found here: http://www.loremipsum.at/blog/doctrine-2-sql-profiler-in-debugleiste/
- profiling: false: This option handles the profiling of SQL statements. This option can be switched off in production environments.
If possible the options should be set this way, so that they are only active in debug mode:
logging: "%kernel.debug%" profiling: "%kernel.debug%"
Known Issues
- After copying an application from Mapbender 3.0.4.x you have to set the layerset in the map/overview element.
Milestone <IP_ADDRESS>¶
Release Datum: 23-01-2015
For details have a look at: https://github.com/mapbender/mapbender-starter/blob/develop/CHANGELOG.md
- option ‘removelayer’ added into layertree menu
- parameter ‘layerRemove’ removed from layertree configuration
- container accordion structure changed
- import / export from applications added (without acls)
- display layer metadata
- Frontend: Sidepane Accordeon Legend is displayed without horizontal Scrollbar
- Backend: WMS Instanz configuration - contextmenu for layers shows wrong ID (only instance ID)
- Frontend: Legend - displays WMS Information although the checkbox Show
- Frontend: Layertree - contextmenu zoomlayer does not use the layer extent
- Backend: Add Source with user/password - informations is added to field originUrl not to fields user and password
- app/console mapbender:generate:element fixed errors
- bug visiblelayers fixed
- WMS with authentication saves in table mb_wms_wmssource username and password
- no metadata for applications coming from mapbender.yml definition (no entry in context menu)
- copy an application via button on application fixed
- print template resize northarrow, overview added
- improved screenshot for application handling
- https://github.com/mapbender/mapbender/milestones/<IP_ADDRESS>
Milestone <IP_ADDRESS>¶
release date: 12-09-2014
For details have a look at https://github.com/mapbender/mapbender-starter/blob/develop/CHANGELOG.md
- Switched to MIT license
- Symfony Update 2.3 LTS
- OpenLayers 2.13 with additional patches
- Switch Services (BaseSourceSwitcher) with menu
- added generic HTML element
- added custom CSS editor for applications
- added accordion container for SidePane
- added screenshot management to application editing
- import/export of applications/sources
- spanish translation
Milestone 3.0.3¶
release date: 17-03-2014
For details have a look at: https://github.com/mapbender/mapbender/issues?milestone=8
- Enhancements for Search-Router für SQL-Suchen (Selectboxes, Distinct)
- WMC Editor and Loader
- WMSLoader Enhancement add WMS via link
- i18n - Internationalisation (english / german)
- Sketch to draw temporary objects
- POI - Meetingpoint
- Imageexport to generate png or jpg
- Change WMS Collection via button (BaselayerSwitcher)
- Print with overview
- Sidepane with different elements (chnage via button)
- Layertree context menue to change opacity and to zoom to layer
- Open application with parameters (f.e. position)
- ACL for elements
- Added function for validate WMS GetCapabilities documents
Milestone 3.0.2¶
release date: 27-11-2013
For details have a look at https://github.com/mapbender/mapbender/issues?milestone=6
- SearchRouter
- WMC Editor and Loader
- WMSLoader enhancement to load a WMS from a link
Milestone 3.0.1¶
release date: 06-09-2013
For details have a look at https://github.com/mapbender/mapbender/issues?milestone=5
- Kopieren einer Anwendung mit Diensten
- Popup - draggable
- PrintClient Erweiterung Druck EPSG 4326, neue Drucklayouts, Druck A4-A0
- Catch login failures to avoid brute force login attempts
- Bug fixes
Milestone <IP_ADDRESS>¶
Bugfix-Release Date: 19-07-2013
For details have a look at: https://github.com/mapbender/mapbender/issues?milestone=4
Milestone <IP_ADDRESS>¶
Bugfix-Release Date: 07-06-2013
For details have a look at: https://github.com/mapbender/mapbender/issues?milestone=3
Milestone <IP_ADDRESS>¶
release date: 29-05-2013
For details have a look at https://github.com/mapbender/mapbender/issues?milestone=1
- Administration Backend for Service, Application, User/Group and security administration
- Backend-/Frontend Design
- Security
- User/Group Administration
- WMS Administration
- Map
- Layertree
- Legend
- Overview Map
- Navigation Toolbar (Zoombar)
- Feature Info
- Coordinates Display
- Copyright
- Line/Area Ruler
- Scale Selector
- ScaleBar
- Spatial Reference System Selector
- GPS-Position
- Add WMS to application
- Documentation at http://doc.mapbender3.org


cellular automata stroke studies
The 2d worlds of those cellular automatas are long and thin. Neighbours external to the world are considered dead ones. The worlds are initialized with a randomly chosen cells only in the central row (80% density). Rulesets from wikipedia.
I have to say: i love the infective growth of cellular automatas, i’m gonna surely explore as much rulesets as i can.


|
ActionComponents
04.05.00
Customizable UI and time-saving tools for Android development with Xamarin and Visual Studio.
|
Defines the appearance of a ActionComponents.ACNavBarButton More...
Public Member Functions | |
| ACNavBarButtonAppearance () | |
| Initializes a new instance of the ActionComponents.ACNavBarButtonAppearance class. More... | |
| ACNavBarButtonAppearance (Color background, Color border, int image, float alpha) | |
| Initializes a new instance of the ActionComponents.ACNavBarButtonAppearance class. More... | |
| ACNavBarButtonAppearance (ACNavBarButtonAppearance appearance) | |
| Initializes a new instance of the ActionComponents.ACNavBarButtonAppearance class. More... | |
| void | Clone (ACNavBarButtonAppearance appearance) |
| Clones the values from the passed ActionComponents.ACNavBarButtonAppearance into this one More... | |
Properties | |
| Color | background [get, set] |
| Gets or sets the background color More... | |
| Color | border [get, set] |
| Gets or sets the border color More... | |
| int | image [get, set] |
| Gets or sets the image displayed on the button More... | |
| float | alpha [get, set] |
| Gets or sets the alpha that the image is displayed at More... | |
Defines the appearance of a ActionComponents.ACNavBarButton
Changes to the default ActionComponents.ACNavBarButtonAppearances in the parent ActionComponents.ACNavBar and and ActionComponents.ACNavBarButtonCollections will cascade down to lower levels.
| ActionComponents.ACNavBarButtonAppearance.ACNavBarButtonAppearance | ( | ) |
Initializes a new instance of the ActionComponents.ACNavBarButtonAppearance class.
| ActionComponents.ACNavBarButtonAppearance.ACNavBarButtonAppearance | ( | Color | background, |
| Color | border, | ||
| int | image, | ||
| float | alpha | ||
| ) |
Initializes a new instance of the ActionComponents.ACNavBarButtonAppearance class.
| background | The background color |
| border | The border color |
| image | An image for the apperance state |
| alpha | The alpha setting for the state |
| ActionComponents.ACNavBarButtonAppearance.ACNavBarButtonAppearance | ( | ACNavBarButtonAppearance | appearance | ) |
Initializes a new instance of the ActionComponents.ACNavBarButtonAppearance class.
| appearance | The source appearance to clone this appearance from |
| void ActionComponents.ACNavBarButtonAppearance.Clone | ( | ACNavBarButtonAppearance | appearance | ) |
Clones the values from the passed ActionComponents.ACNavBarButtonAppearance into this one
| appearance | The Appearance to clone |
|
getset |
Gets or sets the alpha that the image is displayed at
The alpha.
|
getset |
Gets or sets the background color
The background color
|
getset |
Gets or sets the border color
The border color
|
getset |
Gets or sets the image displayed on the button
The image


Warcraft II game engine uses this format for map files. External maps can be edited by official Warcraft II map editor and saved in .pud files. Maps supplied with the game (i.e. single player campaign) follow the same format, but are instead embedded inside the game container files.
There are two major versions: 0x11 (original one) and 0x13 (roughly corresponds to v1.33 of the game engine, although some of the features got limited support in v1.3).
File consists of a sequence of typed sections.
This page hosts a formal specification of Warcraft II map files using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.
meta:
id: warcraft_2_pud
title: Warcraft II map files
application: Warcraft II engine
file-extension: pud
xref:
justsolve: Warcraft_II_PUD
wikidata: Q28009492
license: CC0-1.0
ks-version: 0.6
endian: le
doc: |
Warcraft II game engine uses this format for map files. External
maps can be edited by official Warcraft II map editor and saved in
.pud files. Maps supplied with the game (i.e. single player
campaign) follow the same format, but are instead embedded inside
the game container files.
There are two major versions: 0x11 (original one) and 0x13 (roughly
corresponds to v1.33 of the game engine, although some of the
features got limited support in v1.3).
File consists of a sequence of typed sections.
doc-ref: http://cade.datamax.bg/war2x/pudspec.html
seq:
- id: sections
type: section
repeat: eos
types:
section:
seq:
- id: name
type: str
size: 4
encoding: ASCII
- id: size
type: u4
- id: body
size: size
type:
switch-on: name
cases:
'"TYPE"': section_type
'"VER "': section_ver
#'"DESC"': section_desc
'"OWNR"': section_ownr
'"ERA "': section_era
'"ERAX"': section_era
'"DIM "': section_dim
'"SGLD"': section_starting_resource
'"SLBR"': section_starting_resource
'"SOIL"': section_starting_resource
'"UNIT"': section_unit
section_type:
doc: |
Section that confirms that this file is a "map file" by certain
magic string and supplies a tag that could be used in
multiplayer to check that all player use the same version of the
map.
seq:
- id: magic
contents: ["WAR2 MAP", 0, 0]
- id: unused
size: 2
doc: unused (always set to $0a and $ff by editor, but can be anything for the game)
- id: id_tag
type: u4
doc: id tag (for consistency check in multiplayer)
section_ver:
doc: Section that specifies format version.
seq:
- id: version
type: u2
section_ownr:
doc: Section that specifies who controls each player.
seq:
- id: controller_by_player
type: u1
enum: controller
repeat: eos
section_era:
doc: Section that specifies terrain type for this map.
seq:
- id: terrain
type: u2
enum: terrain_type
section_dim:
seq:
- id: x
type: u2
- id: y
type: u2
section_starting_resource:
seq:
- id: resources_by_player
type: u2
repeat: eos
section_unit:
seq:
- id: units
type: unit
repeat: eos
unit:
seq:
- id: x
type: u2
- id: y
type: u2
- id: u_type
type: u1
enum: unit_type
- id: owner
type: u1
- id: options
type: u2
doc: if gold mine or oil well, contains 2500 * this, otherwise 0 passive 1 active
instances:
resource:
value: options * 2500
if: >
u_type == unit_type::gold_mine or
u_type == unit_type::human_oil_well or
u_type == unit_type::orc_oil_well or
u_type == unit_type::oil_patch
enums:
controller:
# official values
0x02: passive_computer
0x03: nobody
0x04: computer4
0x05: human
0x06: rescue_passive
0x07: rescue_active
# also supported by game engine
0x01: computer1
# everything else is "passive_computer"
terrain_type:
0x00: forest
0x01: winter
0x02: wasteland
0x03: swamp
unit_type:
0x00: infantry
0x01: grunt
0x02: peasant
0x03: peon
0x04: ballista
0x05: catapult
0x06: knight
0x07: ogre
0x08: archer
0x09: axethrower
0x0a: mage
0x0b: death_knight
0x0c: paladin
0x0d: ogre_mage
0x0e: dwarves
0x0f: goblin_sapper
0x10: attack_peasant
0x11: attack_peon
0x12: ranger
0x13: berserker
0x14: alleria
0x15: teron_gorefiend
0x16: kurdan_and_sky_ree
0x17: dentarg
0x18: khadgar
0x19: grom_hellscream
0x1a: human_tanker
0x1b: orc_tanker
0x1c: human_transport
0x1d: orc_transport
0x1e: elven_destroyer
0x1f: troll_destroyer
0x20: battleship
0x21: juggernaught
0x23: deathwing
0x26: gnomish_submarine
0x27: giant_turtle
0x28: gnomish_flying_machine
0x29: goblin_zepplin
0x2a: gryphon_rider
0x2b: dragon
0x2c: turalyon
0x2d: eye_of_kilrogg
0x2e: danath
0x2f: khorgath_bladefist
0x31: cho_gall
0x32: lothar
0x33: gul_dan
0x34: uther_lightbringer
0x35: zuljin
0x37: skeleton
0x38: daemon
0x39: critter
0x3a: farm
0x3b: pig_farm
0x3c: human_barracks
0x3d: orc_barracks
0x3e: church
0x3f: altar_of_storms
0x40: human_scout_tower
0x41: orc_scout_tower
0x42: stables
0x43: ogre_mound
0x44: gnomish_inventor
0x45: goblin_alchemist
0x46: gryphon_aviary
0x47: dragon_roost
0x48: human_shipyard
0x49: orc_shipyard
0x4a: town_hall
0x4b: great_hall
0x4c: elven_lumber_mill
0x4d: troll_lumber_mill
0x4e: human_foundry
0x4f: orc_foundry
0x50: mage_tower
0x51: temple_of_the_damned
0x52: human_blacksmith
0x53: orc_blacksmith
0x54: human_refinery
0x55: orc_refinery
0x56: human_oil_well
0x57: orc_oil_well
0x58: keep
0x59: stronghold
0x5a: castle
0x5b: fortress
0x5c: gold_mine
0x5d: oil_patch
0x5e: human_start
0x5f: orc_start
0x60: human_guard_tower
0x61: orc_guard_tower
0x62: human_cannon_tower
0x63: orc_cannon_tower
0x64: circle_of_power
0x65: dark_portal
0x66: runestone
0x67: human_wall
0x68: orc_wall


Getting Suffolk's festive spirit into full swing, these stunning pictures show Bury St Edmunds Christmas Fayre transforming the town into a winter wonderland.
Thousands are predicted to take to the streets in the town centre over the next four days to enjoy the market's treats, making it one of the biggest Christmas fayres in the country.

A police officer enjoying the market said on Twitter: "Just had a cheeky foot patrol around the Bury St Edmunds Christmas Fayre - lovely to see the lights and smell the food on offer! Amazing! Such an amazing town and I've spoken to some wonderful people."
Incredible fireworks saw the night's sky erupt in colour on its opening yesterday, while Saturday is expected to be the busiest day yet.
These pictures taken by photographer Jon Williams show the magic is here to stay.


MIDI Scripter (v0.5.0) ReadmeMIDI Scripter (v0.5.0) Readme
Copyright © 2005 Emanuel Borsboom
Thanks to Philip Bennefall for the idea.
Home Page: http://www.epiphyte.ca/code/midi_scripter.html
Table of ContentsTable of Contents
OverviewOverview
This program generates a MIDI file from simple commands in text files. It was specifically created for someone who is visually impaired, so it is intended to be accessible to anyone.
Requirements and SetupRequirements and Setup
The first thing to do is unzip the distribution you downloaded (whether binary or source). Then, follow the platform-specific instructions below.
Windows
The easiest way to setup the program on Windows requires no installation at all. If you downloaded the win32 binary zip file, just unzip it and you're done.
If for some reason you don't want to use the binary, you must install the Ruby interpreter and the wxRuby library. The easiest way to do that is to use the "One-Click Ruby Installer" at http://rubyforge.org/frs/download.php/2407/ruby182-14.exe, and then the "wxRuby One Click Installer" at http://rubyforge.org/frs/download.php/1984/wxruby-0.6.0-mswin.exe.
Other
This program should run on any platform that supports Ruby and wxWidgets (and will run in command-line mode without wxWidgets). It has been tested with Ruby 1.8.2, wxWidgets 2.4.2, and wxRuby 0.6.0. First, you must install Ruby, which you can download from http://ruby-lang.org/. Then, install wxRuby, which you can download from http://wxruby.rubyforge.org/. wxRuby requires wxWidgets, which is available at http://wxwidgets.org/.
UsageUsage
To start the program on Windows (if you are using the win32 binary package), simply run MidiScripter.exe
(for example, by double clicking on it in Windows Explorer).
Otherwise, run MidiScripter.rb
. For example, type "ruby MidiScipter.rb
" on the command-line.
Once it's running, it's a snap to use - just select your input file, then your output file, and then click "Generate MIDI File". If you want to listen to the MIDI file immediately after generating it, click "Generate and Play" instead. Note that while the MIDI player is running, MIDI Scripter will be unresponsive until you exit it.
For playing the MIDI file to work, you must have your MIDI player configured correctly. The default should work if you are running Windows and have Windows Media Player installed.
You can also specify the input and output files on the command-line, in which case the GUI is skipped (and wxRuby is not required). For example:
ruby MidiScripter.rb example.song example.mid
By default, the input files are run in safe mode, which prevents them from accessing your system. If you want the input file to be able to access your system, you can run the program in unsafe mode by adding the --unsafe
command-line argument. For example:
ruby MidiScripter.rb --unsafe
or
ruby MidiScripter.rb --unsafe example.song example.mid
Warning: this will allow the input file to do things like erase your hard drive or send e-mails, so only use it for songs from people you trust!
Input Song File FormatInput Song File Format
Each input song file is, in fact, a Ruby (www.ruby-lang.org) program. It is interpreted in an environment that has a bunch of simple commands defined for generating a MIDI sequence. The input is divided into tracks. Each track has an independent timeline. Most commands affect only the current track, but there are some commands that affect all tracks. Each track is normally stored in a separate file, and the main input file specifies where to load them. Comments are started with #
and continue until the end of the line. You may use any valid Ruby expression in the file. Commands are case sensitive!
Basic Commands
tempo bpm
Specifies the tempo in beats per minute (BPM). The default is 120. This is a global value (it affects all tracks).
load_track "filename"
Load a track from the given filename. The track's timeline begins at the time that load_track occurrs. May be nested. The filename can be absolute, or relative to the current file.
load_track "filename", Channel => channel
Load a track from the given filename and sets the default channel.
channel channel-number
The MIDI channel to use for MIDI events. Each instrument should be on its own channel, but multiple tracks may use the same channel Channel 1 is the first channel. Note: Channel 10 is reserved for the drum track. You should use the constant
Drum_Channel
in place of the number 10.program program-number
Set the MIDI program (patch) number controller. Use this to set the instrument on the channel. Value between 0 and 127. See the General MIDI program numbers table below for a list of pre-defined constants that you can use.
volume volume
Specifies the channel's volume. Value may be between 0 and 127.
velocity velocity
Specifies the default note velocity (how hard the note is hit, so how loud it is). Value may be between 1 and 127.
transpose semitones
Transposes subsequent notes by the specified number of semitones. You can use, for example,
transpose F3-C3
, to transpose everything up 5 semitones (the difference between F3 and C3). A value of 0 means no transpose.pan pan
Sets the pan position of the channel. Number between 0 and 127. 0=left, 127=right, 64=center
reverb reverb
Sets the reverb of the channel. Number between 0 and 127. 0=no reverb, 127=maximum reverb
chorus chorus
Sets the chrous of the channel. Number between 0 and 127. 0=no chorus, 127=maximum chorus
note note, length
Plays a note.
note
is a MIDI note number. You should use constants likeC4
(middle-C),Bf3
(B-flat an octave below middle-C), orCs5
(C-sharp an octave above middle-C) for this. These constants range fromAf0
toGs7
.length
is the duration in number of beats. This can be specified as a number (where 1.0 is one beat), or using one of the constants in the lengths table below. The next command will take affect after the note has completed.note [note, note, ..., note], length
Plays multiple notes at the same time.
note note, length, Velocity => velocity
note [note, note, ..., note], length, Velocity => velocity
Plays note(s) and over-rides the default velocity.
drum note
Plays a drum note. This should only be used on channel 10. See the General MIDI drum notes table below for a list of pre-defined constants that you can use. The next command takes affect at the same time as the drum.
drum note, Length => length
Some drum instruments work like other instruments and can have a duration, and this version of the command allows you to specify it. The next command takes affect after the drum note has completed.
drum note, Velocity => velocity
drum note, Length => length, Velocity => velocity
Plays a drum note and over-rides the default velocity.
rest length
Rest for the specified duration. This does nothing, but the next command will take affect after the duration.
Advanced Commands
note_on note
note_on [note, note, ..., note]
note_on note, Velocity => velocity
note_on [note, note, ..., note], Velocity => velocity
Start note(s). The note(s) will play until the a note_off command with the same note number is encountered. This has no duration, so the next command take affect immediately.
note_off note
note_off [note, note, ..., note]
note_off note, Velocity => velocity
note_off [note, note, ..., note], Velocity => velocity
End note(s).
bank bank-number
bank bank-number, fine-bank-number
Set the bank number, to access more programs/drums.
start_porta speed do ... end
Portamento effect. The commands between
do
andend
are played with portamento. The only commands that may appear within arenote
andspeed
.speed
changes the speed of the portamento affect. The speed is specified in number of semitones per beat.Note: This portamento is implemented using the pitch wheel control. In order for it to sound correct, your MIDI device must support the pitch wheel bend range registered parameter (most do, but if it doesn't, it won't sound right). This does not use the MIDI portamento effect, because it works on so few devices.
pitch amount
Sets the pitch wheel control. The amount is a floating point value between -1.0 and +1.0. By default, -1.0 means pitch is adjusted down two semitones, +1.0 means the pitch is adjusted up two semitones, and 0 means there is no adjustment. The range can be changed using the
pitch_range
command.pitch_range range
Sets the range of the pitch wheel in semitones.
pitch_bend start-amount end-amount length
Sweeps the pitch wheel from start-amount to end-amount, taking length beats to do so.
rewind length
Rewinds the time line. The opposite of rest. Specified in beats.
time time
Sets the track's timeline to an absolute time value from the beginning of the song. Specified in beats. 0.0 is the beginning of the song.
start_track do ... end
Start a track without loading a file. The track is everything between the
do
and the followingend
. May be nested. The track's timeline begins where thestart_track
occurrs.start_track Channel => channel do ... end
Start a track, specifying the default channel it will use.
disable_midi_tracks
enable_midi_tracks
Disable or enable whether subsequent tracks will have their own MIDI sequence tracks.
event event
Add a Midilib event object to the track. See http://midilib.rubyforge.org/ for the events, and http://www.borg.com/~jglatt/tech/midispec.htm for explanation of their meaning. The delta_time of the event is ignored, and the timeline of the track is used instead. Use the event_channel function to get the channel number to use in the event.
control_event event
Add a Midilib event object to the control track.
ConstantsConstants
General MIDI Program Numbers
#PIANO Acoustic_Grand = 0 Bright_Acoustic = 1 Electric_Grand = 2 Honky_Tonk = 3 Electric_Piano_1 = 4 Electric_Piano_2 = 5 Harpsichord = 6 Clavinet = 7 #CHROMATIC PERCUSSION Celesta = 8 Glockenspiel = 9 Music_Box = 10 Vibraphone = 11 Marimba = 12 Xylophone = 13 Tubular_Bells = 14 Dulcimer = 15 #ORGAN Drawbar_Organ = 16 Percussive_Organ = 17 Rock_Organ = 18 Church_Organ = 19 Reed_Organ = 20 Accoridan = 21 Harmonica = 22 Tango_Accordian = 23 #GUITAR Nylon_String_Guitar = 24 Steel_String_Guitar = 25 Electric_Jazz_Guitar = 26 Electric_Clean_Guitar = 27 Electric_Muted_Guitar = 28 Overdriven_Guitar = 29 Distortion_Guitar = 30 Guitar_Harmonics = 31 #BASS Acoustic_Bass = 32 Electric_Bass_Finger = 33 Electric_Bass_Pick = 34 Fretless_Bass = 35 Slap_Bass_1 = 36 Slap_Bass_2 = 37 Synth_Bass_1 = 38 Synth_Bass_2 = 39 #SOLO_STRINGS Violin = 40 Viola = 41 Cello = 42 Contrabass = 43 Tremolo_Strings = 44 Pizzicato_Strings = 45 Orchestral_Strings = 46 Timpani = 47 #ENSEMBLE String_Ensemble_1 = 48 String_Ensemble_2 = 49 SynthStrings_1 = 50 SynthStrings_2 = 51 Choir_Aahs = 52 Voice_Oohs = 53 Synth_Voice = 54 Orchestra_Hit = 55 #BRASS Trumpet = 56 Trombone = 57 Tuba = 58 Muted_Trumpet = 59 French_Horn = 60 Brass_Section = 61 SynthBrass_1 = 62 SynthBrass_2 = 63 #REED Soprano_Sax = 64 Alto_Sax = 65 Tenor_Sax = 66 Baritone_Sax = 67 Oboe = 68 English_Horn = 69 Bassoon = 70 Clarinet = 71 #PIPE Piccolo = 72 Flute = 73 Recorder = 74 Pan_Flute = 75 Blown_Bottle = 76 Skakuhachi = 77 Whistle = 78 Ocarina = 79 #SYNTH_LEAD Lead_1= 80 Lead_2 = 81 Lead_3 = 82 Lead_4 = 83 Lead_5 = 84 Lead_6 = 85 Lead_7 = 86 Lead_8 = 87 #SYNTH_PAD Pad_1 = 88 Pad_2 = 89 Pad_3 = 90 Pad_4 = 91 Pad_5 = 92 Pad_6 = 93 Pad_7 = 94 Pad_8 = 95 #SYNTH_EFFECTS FX_1 = 96 FX_2 = 97 FX_3 = 98 FX_4 = 99 FX_5 = 100 FX_6 = 101 FX_7 = 102 FX_8 = 103 #ETHNIC Sitar = 104 Banjo = 105 Shamisen = 106 Koto = 107 Kalimba = 108 Bagpipe = 109 Fiddle = 110 Shanai = 111 #PERCUSSIVE Tinkle_Bell = 112 Agogo = 113 Steel_Drums = 114 Woodblock = 115 Taiko_Drum = 116 Melodic_Tom = 117 Synth_Drum = 118 Reverse_Cymbal = 119 #SOUND_EFFECTS Guitar_Fret_Noise = 120 Breath_Noise = 121 Seashore = 122 Bird_Tweet = 123 Telephone_Ring = 124 Helicopter = 125 Applause = 126 Gunshot = 127
General MIDI Drum Notes
Acoustic_Bass_Drum = 35 Bass_Drum_1 = 36 Side_Stick = 37 Acoustic_Snare = 38 Hand_Clap = 39 Electric_Snare = 40 Low_Floor_Tom = 41 Closed_Hi_Hat = 42 High_Floor_Tom = 43 Pedal_Hi_Hat = 44 Low_Tom = 45 Open_Hi_Hat = 46 Low_Mid_Tom = 47 Hi_Mid_Tom = 48 Crash_Cymbal_1 = 49 High_Tom = 50 Ride_Cymbal_1 = 51 Chinese_Cymbal = 52 Ride_Bell = 53 Tambourine = 54 Splash_Cymbal = 55 Cowbell = 56 Crash_Cymbal_2 = 57 Vibraslap = 58 Ride_Cymbal_2 = 59 Hi_Bongo = 60 Low_Bongo = 61 Mute_Hi_Conga = 62 Open_Hi_Conga = 63 Low_Conga = 64 High_Timbale = 65 Low_Timbale = 66 High_Agogo = 67 Low_Agogo = 68 Cabasa = 69 Maracas = 70 Short_Whistle = 71 Long_Whistle = 72 Short_Guiro = 73 Long_Guiro = 74 Claves = 75 Hi_Wood_Block = 76 Low_Wood_Block = 77 Mute_Cuica = 78 Open_Cuica = 79 Mute_Triangle = 80 Open_Triangle = 81
Lengths
Whole Half Quarter Eighth Sixteenth Thirtysecond Sixtyfourth Dotted_Whole Dotted_Half Dotted_Quarter Dotted_Eighth Dotted_Sixteenth Dotted_Thirtysecond Dotted_Sixtyfourth Whole_Triplet Half_Triplet Quarter_Triplet Eighth_Triplet Sixteenth_Triplet Thirtysecond_Triplet Sixtyfourth_Triplet Dotted_Whole_Triplet Dotted_Half_Triplet Dotted_Quarter_Triplet Dotted_Eighth_Triplet Dotted_Sixteenth_Triplet Dotted_Thirtysecond_Triplet Dotted_Sixtyfourth_Triplet
ExamplesExamples
See the file example.song, and the files which it loads: melody.track, chords.track, and drums.track.
LicenseLicense
Copyright © 2005 Emanuel Borsboom
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


Toggle navigation
Home
(current)
About
Semester
Semester 1
Object Oriented Programming Score
Components
Total Points
You Scored
Written Exam 1
Written Exam 2
Written Exam 3
Comprehensive final exam
Weekly Labs
3 Lab Exams
Misselaneous
Total
Percentage %
Calculate Score
-------------------------------------------------------------------------------------


Welcome to the first ever quote generator application in history.
Here you can get creative and write some of the best quote that you have heard in your life time.
Write your quote below and see it pop up!
Below we can see a few quotes by some of our users
Vote for which you like best


<
Welcome to the jungle
<
Theres fewer fun and games than previously promised
<
<
Number of fun and games in the Jungle, insinuated vs. actual
<


 Now they finally can!
Exposure is an ERC20 token, backed by the security of the Ethereum Platform. Oh, the smart contract? Yeah, dunno. Feel free to audit it then give us the report for 10,000 Exposure. If we think you're credible and stuff.
Exposure operates without trusted third parties. Your money, your choices. Until you give it to us. Then it's our money, our choices.
We all know that Exposure is worth absolutely nothing, but if you want to buy it from us right now it costs
Think of the Exposure!
Creative professionals are very consistently asked to do things "For the Exposure", which historically has been code for "For free". But now there's a better way. Now we can ask, "Oh yeah? How much Exposure exactly?" and link to this website.
Here's the tiny shareable version of yesterday's comic.
Posted by The Oatmeal on Friday, 30 October 2015
Earn Exposure by giving us exposure. Help this project by blogging about us, or posting about us on your social media account(s) then submit your claim for Exposure here.
Metamask is the recommended way to purchase and manage your Exposure if you're new to cryptocurrency, Ethereum or ERC20 tokens.
My Ether Wallet will let you manage exposure that's stored on your hardware wallet, such as a Ledger Nano S, or a Trezor. If you're comfortable with Ethereum / ERC20 tokens, we recommend this method.
 We are not a bank and will not be able to help you recover your lost Exposure.
Token Contract Address: 0xf79C2cc623c9317725712cF1b1b980464507a70A
Token Symbol: EXPO
Decimals of Precision: 18


#include "copyright.h"
#include "utility.h"
#include "translationtable.h"
#include "disk.h"
#include "stats.h"
Go to the source code of this file.
Classes | |
| class | Instruction |
| Defines an instruction. More... | |
| class | Machine |
| Defines the simulated execution hardware. More... | |
Defines | |
| #define | StackReg 29 |
| #define | RetAddrReg 31 |
| #define | NumGPRegs 32 |
| #define | HiReg 32 |
| #define | LoReg 33 |
| #define | PCReg 34 |
| #define | NextPCReg 35 |
| #define | PrevPCReg 36 |
| #define | LoadReg 37 |
| #define | LoadValueReg 38 |
| #define | BadVAddrReg 39 |
| #define | NumIntRegs 40 |
| #define | NumFPRegs 32 |
Enumerations | |
| enum | ExceptionType { NoException, SyscallException, ReadOnlyException, BusErrorException, AddressErrorException, OverflowException, IllegalInstrException, NumExceptionTypes } |
Functions | |
| void | ExceptionHandler (ExceptionType which, int vaddr) |
| unsigned int | WordToHost (unsigned int word) |
| unsigned short | ShortToHost (unsigned short shortword) |
| unsigned int | WordToMachine (unsigned int word) |
| unsigned short | ShortToMachine (unsigned short shortword) |
User programs are loaded into "mainMemory"; to Nachos, this looks just like an array of bytes. Of course, the Nachos kernel is in memory too -- but as in most machines these days, the kernel is loaded into a separate memory region from user programs, and accesses to kernel memory are not translated or paged.
In Nachos, user programs are executed one instruction at a time, by the MIPS simulator. Each memory reference is translated, checked for errors, etc.
DO NOT CHANGE -- part of the machine emulation
Copyright (c) 1992-1993 The Regents of the University of California. All rights reserved. See copyright.h for copyright notice and limitation of liability and disclaimer of warranty provisions.
|
|
The failing virtual address on an exception.
|
|
|
Double register to hold multiply result.
|
|
|
The register target of a delayed load.
|
|
|
The value to be loaded by a delayed load.
|
|
|
|
|
|
Next program counter (for branch delay).
|
|
|
Number of floating point registers.
|
|
|
32 general purpose registers on MIPS
|
|
|
Number of integer registers.
|
|
|
Current program counter.
|
|
|
Previous program counter (for debugging).
|
|
|
Holds return address for procedure calls.
|
|
|
User's stack pointer.
|
|
|
|
Entry point into Nachos to handle user system calls and exceptions. Entry point into the Nachos kernel. Called when a user program is executing, and either does a syscall, or generates an addressing or arithmetic exception. For system calls, the calling convention is the following:
The result of the system call, if any, must be put back into r2.
|
|
|
|
|
|
|
|
|
|
|
|
|


Company profile - Canadian Company Capabilities
Third-Party Information Liability Disclaimer
Some of the information on this Web page has been provided by external sources. The Government of Canada is not responsible for the accuracy, reliability or currency of the information supplied by external sources. Users wishing to rely upon this information should consult directly with the source of the information. Content provided by external sources is not subject to official languages, privacy and accessibility requirements.
Elaine Beauty Products Inc.
Legal Name:
Elaine Beauty Products Inc.
Operating Name:
Aqua+ Skincare
Mailing Address:
700-1816 Crowchild Trail NWCALGARY, Alberta
T2M 3Y7
Location Address:
700-1816 Crowchild Trail NWCALGARY, Alberta
T2M 3Y7
Tel.:<PHONE_NUMBER>
Tel.:<PHONE_NUMBER>
Fax:
Logo
Company Profile
AQUA+’s story begins in the early 2000. We believe in providing the best skin care products possible by combining nature’s timeless treasure ingredients with the latest skin care formulations. We at AQUA+ Skincare are proud to offer you products that has been made to offer your skin a healing natural touch. AQUA+ skincare is unique and effective. You can feel the difference that nature and science make in our products.
Come and join us in this exciting journey with AQUA+’s Anti-Pollution Skincare line. Through this website you can find out everything you need to know about us. If there is something we are missing, feel free to contact us. We are always happy to hear from you.
Full profile
Full profile
Contact information
Company description
Product / Service / Licensing
Finding the best natural moisturizer for your face that also protects it from the effects of the harsh environment can seem like an insurmountable task. The hectic schedule of today’s modern woman in our fast-paced world often leads to the absence of a proper health and beauty regimen. It seems as though we’re always struggling to catch up with the latest technology or make the next deadline, so indulging in a long, drawn out skin care regimen is simply unrealistic. You may have searched for suitable products and routines but it is difficult not to be stumped by the endless selection out there today, all of them boasting similar benefits. Your search ends here.
Scientifically Proven to Nourish and Protect your Skin
Aqua+ Skincare understands that you rise to the challenge of each and every day face-first, and that's why we've put in the time to boil simple, efficient skin care down to a science! Offering a solution to nourish and protect your inner diva without all the fuss.
When you apply Aqua+ Anti-Pollution Cream, you are opting for next-level skin protection. What is it that makes our face cream better than all other natural face moisturizers on the market? The answer is simple science, tried and true. Your skin is naturally shielded against pollution stresses, but over the years this built-in barrier can become weak, exposing you to harsh chemicals, fumes, and pollutants that are near impossible to avoid. With our all-natural face moisturizer's Glycofilm Pollustop protective shield, you can see and feel the results!
Fight Harmful Pollutants with One Simple Step
Leading a busy life with consistent exposure to UV, atmospheric, and domestic pollutants doesn't have to mean tired, neglected, or damaged skin that is prone to premature aging. Younger and better looking skin never goes out of style, and when you've got it, people not only notice, they remember. Nothing leaves a better lasting impression than the results you'll get with Aqua+ Skincare Anti-Pollution Cream. Remaining refreshed, radiant and protected is really not as hard as you think. It's simply a matter of using one of the best natural moisturizers for the modern world we live in.
Results that Show, Benefits that Last
Make better use of your time, and your skin will thank you. This 100% natural face moisturizer and anti-pollution cream with anti-aging benefits is at your fingertips! Our deluxe revolutionary products contain Aloe Vera juice and antioxidants from olive leaf extract which helps protect the skin from accelerated aging caused by sunlight and pollution. They are also BPA and perfume free. So seize your face-first day and make it work for you! A natural moisturizer that starts working instantly to firm up your skin and counteract the effects of pollution and modern life is a rare find. With deep nourishment, hydration, and anti-oxidizing properties in a face cream, you can take on the modern world with grace and finesse. With continued use, benefits are long-lasting and genuinely good for your face...and your confidence.
Third-Party Information Liability Disclaimer
Some of the information on this Web page has been provided by external sources. The Government of Canada is not responsible for the accuracy, reliability or currency of the information supplied by external sources. Users wishing to rely upon this information should consult directly with the source of the information. Content provided by external sources is not subject to official languages, privacy and accessibility requirements.
Contacts
Contact information
Description
Company description
Products, services and licensing
Product / Service / Licensing
Finding the best natural moisturizer for your face that also protects it from the effects of the harsh environment can seem like an insurmountable task. The hectic schedule of today’s modern woman in our fast-paced world often leads to the absence of a proper health and beauty regimen. It seems as though we’re always struggling to catch up with the latest technology or make the next deadline, so indulging in a long, drawn out skin care regimen is simply unrealistic. You may have searched for suitable products and routines but it is difficult not to be stumped by the endless selection out there today, all of them boasting similar benefits. Your search ends here.
Scientifically Proven to Nourish and Protect your Skin
Aqua+ Skincare understands that you rise to the challenge of each and every day face-first, and that's why we've put in the time to boil simple, efficient skin care down to a science! Offering a solution to nourish and protect your inner diva without all the fuss.
When you apply Aqua+ Anti-Pollution Cream, you are opting for next-level skin protection. What is it that makes our face cream better than all other natural face moisturizers on the market? The answer is simple science, tried and true. Your skin is naturally shielded against pollution stresses, but over the years this built-in barrier can become weak, exposing you to harsh chemicals, fumes, and pollutants that are near impossible to avoid. With our all-natural face moisturizer's Glycofilm Pollustop protective shield, you can see and feel the results!
Fight Harmful Pollutants with One Simple Step
Leading a busy life with consistent exposure to UV, atmospheric, and domestic pollutants doesn't have to mean tired, neglected, or damaged skin that is prone to premature aging. Younger and better looking skin never goes out of style, and when you've got it, people not only notice, they remember. Nothing leaves a better lasting impression than the results you'll get with Aqua+ Skincare Anti-Pollution Cream. Remaining refreshed, radiant and protected is really not as hard as you think. It's simply a matter of using one of the best natural moisturizers for the modern world we live in.
Results that Show, Benefits that Last
Make better use of your time, and your skin will thank you. This 100% natural face moisturizer and anti-pollution cream with anti-aging benefits is at your fingertips! Our deluxe revolutionary products contain Aloe Vera juice and antioxidants from olive leaf extract which helps protect the skin from accelerated aging caused by sunlight and pollution. They are also BPA and perfume free. So seize your face-first day and make it work for you! A natural moisturizer that starts working instantly to firm up your skin and counteract the effects of pollution and modern life is a rare find. With deep nourishment, hydration, and anti-oxidizing properties in a face cream, you can take on the modern world with grace and finesse. With continued use, benefits are long-lasting and genuinely good for your face...and your confidence.


Something went wrong on our end.
Please try again or come back in a little while if the problem persists.
That is taking longer than expected.
Please double check your internet connection or try again later.
There seem to be some network issues.
Please double check your internet connection and try again.
We could not find the page you are looking for.
You may have mistyped the address.
Something went wrong.
Please try again or come back in a little while if the problem persists.


PyVIF report
Python Virus Integration Finder is a tool that detects virus integration site using capture sequencing with Pacbio.
Quality Control
Basic Metrics
Each index correspond to number of subreads that maps:
- On target: on viruses and control genes.
- On virus: on viruses.
- On control: on control genes. (Optional)
- Only virus: only on viruses.
- Breakpoint virus: on human and viruses
| Count | Percent | {% for key, values in pyvif_qc["basic_metrics"].items() %}
|---|---|
| {{key}} | {% for value in values %}{{value}} | {% endfor %}
The plot shows the subread length distribution.
Number of pass means the number of subreads generated by one well (ZMW). The plot shows the number of subreads generated by each well.
{% if pyvif_qc["pass_number"] %} {% endif %}


This package provides various auxiliary classes for the Elis platform. It includes tools for iterating over various collections, e.g. over energy sample sets. @since 1.0


Directory Structure
Everything is distributed among these directories: - src/soter - Soter sources - src/themis - Themis sources - src/wrappers - high level languages wrappers for Themis - tests - tests - docs - that's what you're reading now - docs/examples - Examples of Themis usage
Crypto engine dependency
All files in Soter root directory src/soter are engine independent. Files dependent on cryptography engine sources are placed in corresponding subfolder of Soter (now only openssl for LibreSSL/OpenSSL cryptographic engine).
Crypto engine is selected on build phase of Themis by setting ENGINE variable in Makefile. (now only libressl or openssl values are supported).
To add support of new engine to Themis: - write engine wrapper with Soter interface (see src/soter/soter.h) - put it in engine subfolder in soter root directory - add to makefile, engine selecting block:
ifeq ($(ENGINE),engine)
CRYPTO_ENGINE_DEF = #engine defines if needed
CRYPTO_ENGINE_PATH=#engine files path name


Toggle navigation
IMGS
About
Contact
Sign Up
Login
Vintage Cars
A collection of vintage car pictures


Loading...
Loading...
New Project
Import File
Restore Last
Published:
Your Projects:
Login
Import File
Import
Cancel


Java Programming for beginners.
Learn how to write top notch java code like the pros do using the well tested programming patterns and get hired by the fortune 500.
Learning out comes:
- You will Learn Java the MODERN WAY - Step By Step - With 200 HANDS-ON Code Examples
- You will Understand the BEST PRACTICES in Writing High Quality Java Code
- You will Solve a Wide Range of Hands-on Programming EXERCISES with Java
Instructor: Gango Anan from Galisoft Coding Institute. Ratings: 4.0 **** out of 5 (100,086) 100 total hours, 520 lectures, All Levels
Last updated 2 days ago
Java for android developers.
Learn how to write top notch java code like the pros do using the well tested programming patterns and get hired by the fortune 500.
Learning out comes:
- You will Learn Java the MODERN WAY - Step By Step - With 200 HANDS-ON Code Examples
- You will Understand the BEST PRACTICES in Writing High Quality Java Code
- You will Solve a Wide Range of Hands-on Programming EXERCISES with Java
Instructor: Gango Anan from Galisoft Coding Institute. Ratings: 4.0 **** out of 5 (100,086) 100 total hours, 520 lectures, All Levels
Last updated 50 mins ago
Java regex and authentication.
Learn how to write top notch java code like the pros do using the well tested programming patterns and get hired by the fortune 500.
Learning out comes:
- You will Learn Java the MODERN WAY - Step By Step - With 200 HANDS-ON Code Examples
- You will Understand the BEST PRACTICES in Writing High Quality Java Code
- You will Solve a Wide Range of Hands-on Programming EXERCISES with Java
Instructor: Gango Anan from Galisoft Coding Institute. Ratings: 4.0 **** out of 5 (100,086) 100 total hours, 520 lectures, All Levels
Last updated 2 hours ago
Java Programming for Pros
Learn how to write top notch java code like the pros do using the well tested programming patterns and get hired by the fortune 500.
Learning out comes:
- You will Learn Java the MODERN WAY - Step By Step - With 200 HANDS-ON Code Examples
- You will Understand the BEST PRACTICES in Writing High Quality Java Code
- You will Solve a Wide Range of Hands-on Programming EXERCISES with Java
Instructor: Gango Anan from Galisoft Coding Institute. Ratings: 4.0 **** out of 5 (100,086) 100 total hours, 520 lectures, All Levels
Last updated 30 mins ago
Java lambda expressions.
Learn how to write top notch java code like the pros do using the well tested programming patterns and get hired by the fortune 500.
Learning out comes:
- You will Learn Java the MODERN WAY - Step By Step - With 200 HANDS-ON Code Examples
- You will Understand the BEST PRACTICES in Writing High Quality Java Code
- You will Solve a Wide Range of Hands-on Programming EXERCISES with Java
Instructor: Gango Anan from Galisoft Coding Institute. Ratings: 4.0 **** out of 5 (100,086) 100 total hours, 520 lectures, All Levels
Last updated 3 mins ago
Java Design Patterns.
Learn how to write top notch java code like the pros do using the well tested programming patterns and get hired by the fortune 500.
Learning out comes:
- You will Learn Java the MODERN WAY - Step By Step - With 200 HANDS-ON Code Examples
- You will Understand the BEST PRACTICES in Writing High Quality Java Code
- You will Solve a Wide Range of Hands-on Programming EXERCISES with Java
Instructor: Gango Anan from Galisoft Coding Institute. Ratings: 4.0 **** out of 5 (100,086) 100 total hours, 520 lectures, All Levels
Last updated 3 mins ago


yafs.placement
¶
This type of algorithm have two obligatory functions:
initial_allocation: invoked at the start of the simulation
run invoked according to the assigned temporal distribution.
-
class
yafs.placement.
ClusterPlacement
(name, activation_dist=None, logger=None)[source]¶ This implementation locates the services of the application in the cheapest cluster regardless of where the sources or sinks are located.
It only runs once, in the initialization.
-
get_next_activation
()¶ - Returns:
- the next time to be activated
-
run
(sim)¶ This method will be invoked during the simulation to change the assignment of the modules to the topology
- Args:
- sim (:mod: yafs.core.Sim)
-
scaleService
(scale)¶
-
-
class
yafs.placement.
EdgePlacement
(name, activation_dist=None, logger=None)[source]¶ This implementation locates the services of the application in the cheapest cluster regardless of where the sources or sinks are located.
It only runs once, in the initialization.
-
get_next_activation
()¶ - Returns:
- the next time to be activated
-
run
(sim)¶ This method will be invoked during the simulation to change the assignment of the modules to the topology
- Args:
- sim (:mod: yafs.core.Sim)
-
scaleService
(scale)¶
-
-
class
yafs.placement.
JSONPlacement
(json, **kwargs)[source]¶ -
get_next_activation
()¶ - Returns:
- the next time to be activated
-
run
(sim)¶ This method will be invoked during the simulation to change the assignment of the modules to the topology
- Args:
- sim (:mod: yafs.core.Sim)
-
scaleService
(scale)¶
-
-
class
yafs.placement.
JSONPlacementOnCloud
(json, idCloud, **kwargs)[source]¶ -
get_next_activation
()¶ - Returns:
- the next time to be activated
-
run
(sim)¶ This method will be invoked during the simulation to change the assignment of the modules to the topology
- Args:
- sim (:mod: yafs.core.Sim)
-
scaleService
(scale)¶
-
-
class
yafs.placement.
NoPlacementOfModules
(name, activation_dist=None, logger=None)[source]¶ This implementation locates the services of the application in the cheapest cluster regardless of where the sources or sinks are located.
It only runs once, in the initialization.
-
get_next_activation
()¶ - Returns:
- the next time to be activated
-
run
(sim)¶ This method will be invoked during the simulation to change the assignment of the modules to the topology
- Args:
- sim (:mod: yafs.core.Sim)
-
scaleService
(scale)¶
-
-
class
yafs.placement.
Placement
(name, activation_dist=None, logger=None)[source]¶ A placement (or allocation) algorithm controls where to locate the service modules and their replicas in the different nodes of the topology, according to load criteria, or other objectives.
Note
A class interface
- Args:
name (str): associated name
activation_dist (function): a distribution function to active the run function in execution time
- Kwargs:
- param (dict): the parameters of the activation_dist
-
initial_allocation
(sim, app_name)[source]¶ Given an ecosystem, it starts the allocation of modules in the topology.
- Args:
- sim (:mod:yafs.core.Sim) app_name (String)
Attention
override required


TerraESP
Control
Settings
Control
:
Chart
Settings
Type
Daylight Saving Time (DST)
Hostname
Sensors
Name
Valid sensor name is required.
Type
GPIO/Address
Valid GPIO is required.
Enabled
Delete
+
Actuators
Name
Valid actuator name is required.
GPIO
Type
Min
Min
Delete
+
Timers
Name
Valid timer name is required.
Actuator
On
Valid time is required.
Off
Valid time is required.
Delete
+
Thresholds
Name
Valid timer name is required.
Duration (s)
Valid duration is required.
Threshold
Valid threshold is required.
><
Actuator
Inverted
Gap (s)
Valid gap is required.
Sensor
Type
Delete
+
Save and reboot


Hi, I'm Janice. I'm a recent Yale graduate (àshe!) currently taking a gap year in Taipei.
This blog will be an inconsistently and haphazardly curated collection of photos (and maybe occasional thoughts). It will always be a work in progress. I'm not sure where this year will take me, but feel free to follow along!
Photos are shot on Sony α6000 or iPhone 6s.


001/* 002 * Licensed under the Apache License, Version 2.0 (the "License"); 003 * you may not use this file except in compliance with the License. 004 * You may obtain a copy of the License at 005 * 006 * http://www.apache.org/licenses/LICENSE-2.0 007 * 008 * Unless required by applicable law or agreed to in writing, software 009 * distributed under the License is distributed on an "AS IS" BASIS, 010 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 011 * See the License for the specific language governing permissions and 012 * limitations under the License. 013 */ 014package org.apache.commons.io.input; 015 016import static org.apache.commons.io.IOUtils.EOF; 017 018// import javax.annotation.concurrent.GuardedBy; 019import java.io.EOFException; 020import java.io.IOException; 021import java.io.InputStream; 022import java.io.InterruptedIOException; 023import java.nio.ByteBuffer; 024import java.util.Objects; 025import java.util.concurrent.ExecutorService; 026import java.util.concurrent.Executors; 027import java.util.concurrent.TimeUnit; 028import java.util.concurrent.atomic.AtomicBoolean; 029import java.util.concurrent.locks.Condition; 030import java.util.concurrent.locks.ReentrantLock; 031 032/** 033 * Implements {@link InputStream} to asynchronously read ahead from an underlying input stream when a specified amount 034 * of data has been read from the current buffer. It does so by maintaining two buffers: an active buffer and a read 035 * ahead buffer. The active buffer contains data which should be returned when a read() call is issued. The read ahead 036 * buffer is used to asynchronously read from the underlying input stream. When the current active buffer is exhausted, 037 * we flip the two buffers so that we can start reading from the read ahead buffer without being blocked by disk I/O. 038 * <p> 039 * This class was ported and adapted from Apache Spark commit 933dc6cb7b3de1d8ccaf73d124d6eb95b947ed19. 040 * </p> 041 * 042 * @since 2.9.0 043 */ 044public class ReadAheadInputStream extends InputStream { 045 046 private static final ThreadLocal<byte[]> oneByte = ThreadLocal.withInitial(() -> new byte[1]); 047 048 /** 049 * Creates a new daemon executor service. 050 * 051 * @return a new daemon executor service. 052 */ 053 private static ExecutorService newExecutorService() { 054 return Executors.newSingleThreadExecutor(ReadAheadInputStream::newThread); 055 } 056 057 /** 058 * Creates a new daemon thread. 059 * 060 * @param r the thread's runnable. 061 * @return a new daemon thread. 062 */ 063 private static Thread newThread(final Runnable r) { 064 final Thread thread = new Thread(r, "commons-io-read-ahead"); 065 thread.setDaemon(true); 066 return thread; 067 } 068 069 private final ReentrantLock stateChangeLock = new ReentrantLock(); 070 071 // @GuardedBy("stateChangeLock") 072 private ByteBuffer activeBuffer; 073 074 // @GuardedBy("stateChangeLock") 075 private ByteBuffer readAheadBuffer; 076 077 // @GuardedBy("stateChangeLock") 078 private boolean endOfStream; 079 080 // @GuardedBy("stateChangeLock") 081 // true if async read is in progress 082 private boolean readInProgress; 083 084 // @GuardedBy("stateChangeLock") 085 // true if read is aborted due to an exception in reading from underlying input stream. 086 private boolean readAborted; 087 088 // @GuardedBy("stateChangeLock") 089 private Throwable readException; 090 091 // @GuardedBy("stateChangeLock") 092 // whether the close method is called. 093 private boolean isClosed; 094 095 // @GuardedBy("stateChangeLock") 096 // true when the close method will close the underlying input stream. This is valid only if 097 // `isClosed` is true. 098 private boolean isUnderlyingInputStreamBeingClosed; 099 100 // @GuardedBy("stateChangeLock") 101 // whether there is a read ahead task running, 102 private boolean isReading; 103 104 // Whether there is a reader waiting for data. 105 private final AtomicBoolean isWaiting = new AtomicBoolean(false); 106 107 private final InputStream underlyingInputStream; 108 109 private final ExecutorService executorService; 110 111 private final boolean shutdownExecutorService; 112 113 private final Condition asyncReadComplete = stateChangeLock.newCondition(); 114 115 /** 116 * Creates an instance with the specified buffer size and read-ahead threshold 117 * 118 * @param inputStream The underlying input stream. 119 * @param bufferSizeInBytes The buffer size. 120 */ 121 public ReadAheadInputStream(final InputStream inputStream, final int bufferSizeInBytes) { 122 this(inputStream, bufferSizeInBytes, newExecutorService(), true); 123 } 124 125 /** 126 * Creates an instance with the specified buffer size and read-ahead threshold 127 * 128 * @param inputStream The underlying input stream. 129 * @param bufferSizeInBytes The buffer size. 130 * @param executorService An executor service for the read-ahead thread. 131 */ 132 public ReadAheadInputStream(final InputStream inputStream, final int bufferSizeInBytes, 133 final ExecutorService executorService) { 134 this(inputStream, bufferSizeInBytes, executorService, false); 135 } 136 137 /** 138 * Creates an instance with the specified buffer size and read-ahead threshold 139 * 140 * @param inputStream The underlying input stream. 141 * @param bufferSizeInBytes The buffer size. 142 * @param executorService An executor service for the read-ahead thread. 143 * @param shutdownExecutorService Whether or not to shutdown the given ExecutorService on close. 144 */ 145 private ReadAheadInputStream(final InputStream inputStream, final int bufferSizeInBytes, 146 final ExecutorService executorService, final boolean shutdownExecutorService) { 147 if (bufferSizeInBytes <= 0) { 148 throw new IllegalArgumentException( 149 "bufferSizeInBytes should be greater than 0, but the value is " + bufferSizeInBytes); 150 } 151 this.executorService = Objects.requireNonNull(executorService, "executorService"); 152 this.underlyingInputStream = Objects.requireNonNull(inputStream, "inputStream"); 153 this.shutdownExecutorService = shutdownExecutorService; 154 this.activeBuffer = ByteBuffer.allocate(bufferSizeInBytes); 155 this.readAheadBuffer = ByteBuffer.allocate(bufferSizeInBytes); 156 this.activeBuffer.flip(); 157 this.readAheadBuffer.flip(); 158 } 159 160 @Override 161 public int available() throws IOException { 162 stateChangeLock.lock(); 163 // Make sure we have no integer overflow. 164 try { 165 return (int) Math.min(Integer.MAX_VALUE, (long) activeBuffer.remaining() + readAheadBuffer.remaining()); 166 } finally { 167 stateChangeLock.unlock(); 168 } 169 } 170 171 private void checkReadException() throws IOException { 172 if (readAborted) { 173 if (readException instanceof IOException) { 174 throw (IOException) readException; 175 } 176 throw new IOException(readException); 177 } 178 } 179 180 @Override 181 public void close() throws IOException { 182 boolean isSafeToCloseUnderlyingInputStream = false; 183 stateChangeLock.lock(); 184 try { 185 if (isClosed) { 186 return; 187 } 188 isClosed = true; 189 if (!isReading) { 190 // Nobody is reading, so we can close the underlying input stream in this method. 191 isSafeToCloseUnderlyingInputStream = true; 192 // Flip this to make sure the read ahead task will not close the underlying input stream. 193 isUnderlyingInputStreamBeingClosed = true; 194 } 195 } finally { 196 stateChangeLock.unlock(); 197 } 198 199 if (shutdownExecutorService) { 200 try { 201 executorService.shutdownNow(); 202 executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); 203 } catch (final InterruptedException e) { 204 final InterruptedIOException iio = new InterruptedIOException(e.getMessage()); 205 iio.initCause(e); 206 throw iio; 207 } finally { 208 if (isSafeToCloseUnderlyingInputStream) { 209 underlyingInputStream.close(); 210 } 211 } 212 } 213 } 214 215 private void closeUnderlyingInputStreamIfNecessary() { 216 boolean needToCloseUnderlyingInputStream = false; 217 stateChangeLock.lock(); 218 try { 219 isReading = false; 220 if (isClosed && !isUnderlyingInputStreamBeingClosed) { 221 // close method cannot close underlyingInputStream because we were reading. 222 needToCloseUnderlyingInputStream = true; 223 } 224 } finally { 225 stateChangeLock.unlock(); 226 } 227 if (needToCloseUnderlyingInputStream) { 228 try { 229 underlyingInputStream.close(); 230 } catch (final IOException e) { 231 // TODO ? 232 } 233 } 234 } 235 236 private boolean isEndOfStream() { 237 return !activeBuffer.hasRemaining() && !readAheadBuffer.hasRemaining() && endOfStream; 238 } 239 240 @Override 241 public int read() throws IOException { 242 if (activeBuffer.hasRemaining()) { 243 // short path - just get one byte. 244 return activeBuffer.get() & 0xFF; 245 } 246 final byte[] oneByteArray = oneByte.get(); 247 return read(oneByteArray, 0, 1) == EOF ? -1 : oneByteArray[0] & 0xFF; 248 } 249 250 @Override 251 public int read(final byte[] b, final int offset, int len) throws IOException { 252 if (offset < 0 || len < 0 || len > b.length - offset) { 253 throw new IndexOutOfBoundsException(); 254 } 255 if (len == 0) { 256 return 0; 257 } 258 259 if (!activeBuffer.hasRemaining()) { 260 // No remaining in active buffer - lock and switch to write ahead buffer. 261 stateChangeLock.lock(); 262 try { 263 waitForAsyncReadComplete(); 264 if (!readAheadBuffer.hasRemaining()) { 265 // The first read. 266 readAsync(); 267 waitForAsyncReadComplete(); 268 if (isEndOfStream()) { 269 return EOF; 270 } 271 } 272 // Swap the newly read read ahead buffer in place of empty active buffer. 273 swapBuffers(); 274 // After swapping buffers, trigger another async read for read ahead buffer. 275 readAsync(); 276 } finally { 277 stateChangeLock.unlock(); 278 } 279 } 280 len = Math.min(len, activeBuffer.remaining()); 281 activeBuffer.get(b, offset, len); 282 283 return len; 284 } 285 286 /** Read data from underlyingInputStream to readAheadBuffer asynchronously. */ 287 private void readAsync() throws IOException { 288 stateChangeLock.lock(); 289 final byte[] arr; 290 try { 291 arr = readAheadBuffer.array(); 292 if (endOfStream || readInProgress) { 293 return; 294 } 295 checkReadException(); 296 readAheadBuffer.position(0); 297 readAheadBuffer.flip(); 298 readInProgress = true; 299 } finally { 300 stateChangeLock.unlock(); 301 } 302 executorService.execute(() -> { 303 stateChangeLock.lock(); 304 try { 305 if (isClosed) { 306 readInProgress = false; 307 return; 308 } 309 // Flip this so that the close method will not close the underlying input stream when we 310 // are reading. 311 isReading = true; 312 } finally { 313 stateChangeLock.unlock(); 314 } 315 316 // Please note that it is safe to release the lock and read into the read ahead buffer 317 // because either of following two conditions will hold: 318 // 319 // 1. The active buffer has data available to read so the reader will not read from the read ahead buffer. 320 // 321 // 2. This is the first time read is called or the active buffer is exhausted, in that case the reader waits 322 // for this async read to complete. 323 // 324 // So there is no race condition in both the situations. 325 int read = 0; 326 int off = 0, len = arr.length; 327 Throwable exception = null; 328 try { 329 // try to fill the read ahead buffer. 330 // if a reader is waiting, possibly return early. 331 do { 332 read = underlyingInputStream.read(arr, off, len); 333 if (read <= 0) { 334 break; 335 } 336 off += read; 337 len -= read; 338 } while (len > 0 && !isWaiting.get()); 339 } catch (final Throwable ex) { 340 exception = ex; 341 if (ex instanceof Error) { 342 // `readException` may not be reported to the user. Rethrow Error to make sure at least 343 // The user can see Error in UncaughtExceptionHandler. 344 throw (Error) ex; 345 } 346 } finally { 347 stateChangeLock.lock(); 348 try { 349 readAheadBuffer.limit(off); 350 if (read < 0 || (exception instanceof EOFException)) { 351 endOfStream = true; 352 } else if (exception != null) { 353 readAborted = true; 354 readException = exception; 355 } 356 readInProgress = false; 357 signalAsyncReadComplete(); 358 } finally { 359 stateChangeLock.unlock(); 360 } 361 closeUnderlyingInputStreamIfNecessary(); 362 } 363 }); 364 } 365 366 private void signalAsyncReadComplete() { 367 stateChangeLock.lock(); 368 try { 369 asyncReadComplete.signalAll(); 370 } finally { 371 stateChangeLock.unlock(); 372 } 373 } 374 375 @Override 376 public long skip(final long n) throws IOException { 377 if (n <= 0L) { 378 return 0L; 379 } 380 if (n <= activeBuffer.remaining()) { 381 // Only skipping from active buffer is sufficient 382 activeBuffer.position((int) n + activeBuffer.position()); 383 return n; 384 } 385 stateChangeLock.lock(); 386 long skipped; 387 try { 388 skipped = skipInternal(n); 389 } finally { 390 stateChangeLock.unlock(); 391 } 392 return skipped; 393 } 394 395 /** 396 * Internal skip function which should be called only from skip(). The assumption is that the stateChangeLock is 397 * already acquired in the caller before calling this function. 398 * 399 * @param n the number of bytes to be skipped. 400 * @return the actual number of bytes skipped. 401 */ 402 private long skipInternal(final long n) throws IOException { 403 assert stateChangeLock.isLocked(); 404 waitForAsyncReadComplete(); 405 if (isEndOfStream()) { 406 return 0; 407 } 408 if (available() >= n) { 409 // we can skip from the internal buffers 410 int toSkip = (int) n; 411 // We need to skip from both active buffer and read ahead buffer 412 toSkip -= activeBuffer.remaining(); 413 assert toSkip > 0; // skipping from activeBuffer already handled. 414 activeBuffer.position(0); 415 activeBuffer.flip(); 416 readAheadBuffer.position(toSkip + readAheadBuffer.position()); 417 swapBuffers(); 418 // Trigger async read to emptied read ahead buffer. 419 readAsync(); 420 return n; 421 } 422 final int skippedBytes = available(); 423 final long toSkip = n - skippedBytes; 424 activeBuffer.position(0); 425 activeBuffer.flip(); 426 readAheadBuffer.position(0); 427 readAheadBuffer.flip(); 428 final long skippedFromInputStream = underlyingInputStream.skip(toSkip); 429 readAsync(); 430 return skippedBytes + skippedFromInputStream; 431 } 432 433 /** 434 * Flips the active and read ahead buffer 435 */ 436 private void swapBuffers() { 437 final ByteBuffer temp = activeBuffer; 438 activeBuffer = readAheadBuffer; 439 readAheadBuffer = temp; 440 } 441 442 private void waitForAsyncReadComplete() throws IOException { 443 stateChangeLock.lock(); 444 try { 445 isWaiting.set(true); 446 // There is only one reader, and one writer, so the writer should signal only once, 447 // but a while loop checking the wake up condition is still needed to avoid spurious wakeups. 448 while (readInProgress) { 449 asyncReadComplete.await(); 450 } 451 } catch (final InterruptedException e) { 452 final InterruptedIOException iio = new InterruptedIOException(e.getMessage()); 453 iio.initCause(e); 454 throw iio; 455 } finally { 456 isWaiting.set(false); 457 stateChangeLock.unlock(); 458 } 459 checkReadException(); 460 } 461}


Back-End
- All the back-end parts are in a virtual machine named BARTPROJECT, and the computuer is named dyangbart
- Open BARTProject_DY (the SLN file) in Visual Studio and run it
- Open PI Interface Configuration Utility and run the UFL interface, using the BART API.ini file
- To check, the attributes of the stations should be updating in PI System Explorer (the asset server is DYANG6220 and database is BART)
Front-End
- Have the project folder, BART Web App, in C:/
- If it's your first time running the web app on your machine, install Node.js from https://nodejs.org/en/download/
- To start the web app, type "cd /d C:\BART Web App" into command prompt
- If it's your first time running the web app on your machine, type "npm install"
- After, type "npm start"
- Skip steps 2 and 4 if you want to run this program again
A flowchart of the backend structure is shown below:
- Using a console application, queries are sent to the BART API every few seconds to retrieve the estimated
arrival time and the number of cars and packages it in a .txt file.
- The .txt files are stored in a folder and the UFL interface scans the folder every five seconds and parses
the information to store it into PI.
- The PI Points are organized based on train and line using the Asset Framework.
- PI Web API is linked with the server to make retrieving the desired information more manageable.
A flowchart of the frontend structure, located in the BART Web App/dev folder, is shown below:
- view.component.ts is in charge of routing the web app and the about page
- about.component.ts is responsible for loading this page
- about.component.html is responsible for displaying the contents of this page
- app.component.ts is responsible for loading the web app
- app.component.html is responsible for displaying the contents of the web app
- data-query.component.ts is responsible for querying and retrieving the data in the sidebar
- table-query.component.ts is responsible for querying and retrieving the data in the table
- station-query.component.ts is responsible for querying and retrieving the station names and destinations in the server
- form.component.ts is responsible for loading and displaying the form in the sidebar
- image.component.ts is responsible for loading the images in the dashboard
- map.component.ts is responsible for querying the Google Maps API to load the map
- station.ts is responsible for declaring the station class
- boot.ts is responsible for bootstrapping
- Make the sidebar of this page clickable
- Have the web app constantly search the PI Web API for updated times
- Incorporate a notification system using PI Notifications to let the user know when to leave the office
- Use the Google Maps API to find the time requierd to get to the station
- Run the back-end console application as a service
- Make front-end an acutal application that you can install on a computer
- "Fix" the Submit button such that it can be clicked multiple times if a new station is selected
- Decrease the loading time
- Occasionally, if you select the station but don't change the destination and click submit, there is an error probably because of the asynchrous querying of the PI Web API
- Occasionally, the Google Maps display does not work


[https://www.hiig.de/events/cfp-erste-jahreskonferenz-des-platform-governance-research-network/]
Kind of submission:
Open-source work within platform development
In 2017, Facebook briefly changed the patenting retaliation rights on their React project. As one of the world’s most popular open-source project used by tens of thousands of developers and organizations (trends.builtwith.com), this revealed a particular entanglement between open-source development and platform control.
Indeed, the economic, social and cultural influences of the digital platforms have until now been investigated on the public level—that is, at which it interfaces with end-users, whether they are producers, consumers or prosumers (Gillespie 2010). As such, platforms have been understood as semi-open: they allow for a large range of defined behaviours, provided through Application Programming Interfaces (APIs). These APIs act primarily as a membrane: they specify the ways in which one can interact with the platform, creating a clear separation between the software run by the platform holder (e.g. Facebook’s Graph API, Google’s Cloud Platform or Apple’s App Store), and the user.
In parallel, open-source development has gained more and more traction as a viable alternative to traditional, closed-source models. In this paradigm, users have total visibility on the code of the application, and are able to copy, modify and (under certain conditions) redistribute it. As such, more and more private organizations adopt an open-source model for their own products (Von Hippel, Von Krogh, 2003; West, 2003). The clear separation that APIs enforce between external developers and internal developers recedes from view, as each seem to become co-creators of the same code, in a conflictual process sometimes akin to openwashing (Morozov, 2013).
This contribution analyzes open-source development on a corporate-owned project as an extension of the politics of platforms into a new domain—their creation process. From a field with inherent politics (Weber, 2000), the incursion of private companies into open source development raises questions about the entanglement of the actual making/coding of platforms and their activity as executed software. To what extent is that incursion challenging the monopoly of platform owners, or reinforcing its algorithmic governance over developers and/or users? As developers no longer program applications which interface with a platform’s API, but rather contribute to building the API itself, to what extent are platforms reconfiguring into a public-facing ecosystem?
In order to examine those questions, I propose to look at two specific cases: Facebook’s React and Google’s TensorFlow. First developed internally, these two projects have been released to the public on the GitHub platform, allowing developers to inspect, use, improve and copy the code base, and they have now become dominant forces in their sector. By examining the projects’ histories and developments, the surrounding discourses (both from within their original organizations, and from individual developers), as well as the socio-technical ecosystems that have developed around them, I intend to highlight new forms of interaction in terms of ownership, value-creation and technological path-dependency.
Platforms have historically been clearly defined in their membrane: anyone can interface, but only through their explicit, privately controlled API (Facebook’s Graph API, Google’s Cloud Platform, Apple’s App Store) that are static. However, with the rise of open-source development (even further, I’d say), and specifically the rise of GitHub/GitLab and bootcamps, there are more and more entry level people who are looking for easy frameworks to start with.
Control through co-creation?
Platforms used to control economical and cultural content, and they now control technical content in a new way (it’s not so much an ecosystem, because you can’t actually contribute to xcode)
This draws on the politics of open-source as well (just because it’s FOSS doesn’t mean it’s beautiful and perfect)
bespoke code Von Hippel, Von Krog perversion of the open-source model? weber, 2000
political agnoticism of FOSS [https://www.sciencedirect.com/science/article/abs/pii/S0959802299000107] what kind of culture does it create? openwashing
the mixing between open-source and closed-platforms through contribution to core project + making plug-ins
rq:
consequences:
case studies:
refs:
https://pubsonline.informs.org/doi/abs/10.1287/mnsc.1060.0549 https://www.tandfonline.com/doi/abs/10.1080/07421222.2018.1481636 -> continuous feedback and self-organizing


Illinois pulls away from University of Hawaii for basketball victory | Honolulu Star-Advertiser
Kofi Cockburn’s double-double helped Illinois pull away to a 66-53 basketball victory over Hawaii today in Champaign, Ill.
Cockburn, a 7-foot-1, 290-pound center, amassed 15 points and 14 rebounds to boost the Illini, who remain unbeaten in eight meetings against the Rainbow Warriors.
It was tied at 26 at the half as the ’Bows slowed the transition and kept the Illini away from the offensive glass. The ’Bows cut a 10-point deficit to 52-47 when Zigmars Raimo slipped his way in for a layup with 7:19 to play. But Illinois went on a 14-2 run to move out of reach.
Cockburn created fits for UH’s post defense, catching lobs in the paint and scoring off spins and left-handed hooks. Guard Trent Frazier kept the ’Bows from packing their man-to-man and zone defenses with drives and outside jumpers.
Raimo led the ’Bows with 16 points. UH guards Drew Buggs and Eddie Stansberry combined for 16 points on 7-for-26 shooting, including 2-for-12 from behind the arc.