src/lib/sliding-panel/sliding-panel-toggle.directive.ts
Control a sliding panels shown or hidden state. Should only be attached to elements that have a click event.
| selector | [uat-sliding-panel-toggle] |
Properties |
|
Methods |
Inputs |
HostBindings |
constructor(zone: NgZone)
|
||||||||
|
Parameters :
|
closeOnClickOutside
|
Controls whether the panel should close When clicked outside the toggle or panel or not.
Default value: |
showOnHover
|
Controls whether the panel should open on mouse over or not.
Default value: |
toggleOnClick
|
Controls whether the panel should open based on a click event or not.
Default value: |
uat-sliding-panel-toggle
|
The panel that the toggle is attached to. If this value is not set an error will be thrown during init.
Type: |
| class.uat-sliding-panel-toggle |
class.uat-sliding-panel-toggle:
|
Default value : true
|
| Private hideIfNotOver | ||||||||
hideIfNotOver(timeoutMs: number)
|
||||||||
|
We don't want to hide the panel if the mouse was moved from the toggle to the menu so this function will only be called after a timeout to determine if the mouse is still on the toggle or the panel, and only then will it hide the panel.
Parameters :
Returns :
void
|
| ngOnDestroy |
ngOnDestroy()
|
|
Returns :
void
|
| ngOnInit |
ngOnInit()
|
|
Returns :
void
|
| onClick | ||||||||
onClick(e: MouseEvent)
|
||||||||
|
Parameters :
Returns :
void
|
| onMouseEnter | ||||||||
onMouseEnter(e: MouseEvent)
|
||||||||
|
Parameters :
Returns :
void
|
| onMouseLeave | ||||||||
onMouseLeave(e: MouseEvent)
|
||||||||
|
Parameters :
Returns :
void
|
| onOutsideClick | ||||||||
onOutsideClick(e: MouseEvent)
|
||||||||
|
Parameters :
Returns :
void
|
| Private clickedNotEntered |
clickedNotEntered:
|
Default value : false
|
| Private isHovering |
isHovering:
|
Default value : false
|
| Private onPanelClicked |
onPanelClicked:
|
Type : Observable<MouseEvent>
|
| Private onPanelMouseEntered |
onPanelMouseEntered:
|
Type : Observable<MouseEvent>
|
| Private onPanelMouseLeft |
onPanelMouseLeft:
|
Type : Observable<MouseEvent>
|
| Private panelClickedSub |
panelClickedSub:
|
Type : Subscription
|
| Private panelMouseEnteredSub |
panelMouseEnteredSub:
|
Type : Subscription
|
| Private panelMouseLeftSub |
panelMouseLeftSub:
|
Type : Subscription
|
| Private panelWasClicked |
panelWasClicked:
|
Type : boolean
|
| Private panelWasEntered |
panelWasEntered:
|
Type : boolean
|
| Private panelWasLeft |
panelWasLeft:
|
Type : boolean
|
| Private toggleWasClicked |
toggleWasClicked:
|
Default value : false
|
import { Directive, Input, HostListener, HostBinding, NgZone } from '@angular/core';
import { Observable, Subscription } from 'rxjs/Rx';
import { UATSlidingPanel } from './sliding-panel.component';
/**
* Control a sliding panels shown or hidden state.
* Should only be attached to elements that have
* a click event.
*/
@Directive({
selector: '[uat-sliding-panel-toggle]',
host: {
'[class.open]':'panel.isShowing',
'[class.closed]':'!panel.isShowing',
'[class.pinned]':'panel.pinned',
'(click)':"onClick($event)",
'(mouseenter)':"onMouseEnter($event)",
'(mouseleave)':"onMouseLeave($event)",
'(document:click)':"onOutsideClick($event)",
},
exportAs:'uatSlidingPanelToggle'
})
export class UATSlidingPanelToggle {
@HostBinding('class.uat-sliding-panel-toggle') applyHostClass = true;
/**
* The panel that the toggle is attached to.
* If this value is not set an error will be thrown
* during init.
*/
@Input('uat-sliding-panel-toggle') panel: UATSlidingPanel;
/**
* Controls whether the panel should open based
* on a click event or not.
*/
@Input() toggleOnClick = false;
/**
* Controls whether the panel should open
* on mouse over or not.
*/
@Input() showOnHover = false;
/**
* Controls whether the panel should close When
* clicked outside the toggle or panel or not.
*/
@Input() closeOnClickOutside = false;
private onPanelMouseEntered : Observable<MouseEvent>;
private onPanelMouseLeft : Observable<MouseEvent>;
private onPanelClicked : Observable<MouseEvent>;
private panelMouseEnteredSub: Subscription;
private panelMouseLeftSub: Subscription;
private panelClickedSub: Subscription;
private panelWasEntered: boolean;
private panelWasLeft: boolean;
private panelWasClicked: boolean;
// tracks if the mouse is over either the toggle or
// the panel itself so that the panel does not close
// when the user is interacting with either.
private isHovering = false;
// tracks inside clicks so that the panel is not closed
// by the onOutsideClick method when the button is clicked
private toggleWasClicked = false;
// tracks when the toggle was just clicked so that the mouse
// entered event is ignored in cases where the toggles template
// is changed due to the click (swapping out templates for an
// expand and hide toggle for instance)
private clickedNotEntered = false;
constructor(private zone: NgZone) {
}
ngOnInit() {
if(!this.panel){
throw new ReferenceError('No UATSlidingPanel component supplied to ' +
'the uat-sliding-panel-toggle directive ' +
'([uat-sliding-panel-toggle]="$PanelVariable").');
}
this.onPanelMouseEntered = this.panel.mouseEnterPanel.asObservable();
this.onPanelMouseLeft = this.panel.mouseLeavePanel.asObservable();
this.onPanelClicked = this.panel.clickPanel.asObservable();
/*
* Sync with the panel's events
*/
this.panelMouseEnteredSub =
this.onPanelMouseEntered.subscribe(_=> {
this.panelWasEntered = true;
this.panelWasLeft = false;
});
this.panelMouseLeftSub =
this.onPanelMouseLeft.subscribe(_=> {
this.panelWasLeft = true;
this.panelWasEntered = false;
if(this.showOnHover) {
this.hideIfNotOver(100);
}
});
this.panelClickedSub =
this.onPanelClicked.subscribe(_=> {
this.panelWasClicked = true;
})
}
ngOnDestroy() {
/*
* Clean up panel event syncing.
*/
this.panelMouseEnteredSub.unsubscribe();
this.panelMouseLeftSub.unsubscribe();
this.panelClickedSub.unsubscribe();
}
onClick(e:MouseEvent){
this.toggleWasClicked = true;
this.clickedNotEntered = true;
/*
* A bit of hairy logic. This will
* open and close the panel if showOnHover
* is false.
*
* If showOnHover is true it follow this logic:
*
* If the menu is opened by hover but not pinned
* it will stay open and get pinned and hover
* will be ignored until it is unpinned.
*
* If the menu is pinned it will be unpinned and
* hidden. When the mouse leaves the hover
* show/hide functionality will be reenabled.
*/
if(this.showOnHover) {
if(this.panel.isShowing &&
!this.panel.pinned){
this.panel.pinned = true;
this.panel.show();
}
else{
if(this.panel.isShowing){
this.panel.pinned = false;
this.panel.hide();
}
else{
this.panel.pinned = true;
this.panel.show();
}
}
}
else{
if(this.toggleOnClick){
this.panel.toggle();
this.panel.pinned = !this.panel.pinned;
}
}
}
onOutsideClick(e: MouseEvent) {
if(this.closeOnClickOutside &&
!this.panelWasClicked &&
!this.toggleWasClicked) {
this.panel.hide();
}
if(!this.toggleWasClicked && !this.panelWasClicked) {
this.panel.pinned = false;
}
this.toggleWasClicked = false;
this.panelWasClicked = false;
}
onMouseEnter(e: MouseEvent) {
this.isHovering = true;
if(this.showOnHover && !this.clickedNotEntered) {
this.panel.show();
}
}
onMouseLeave(e: MouseEvent) {
this.isHovering = false;
if(this.showOnHover) {
this.hideIfNotOver(100);
}
this.clickedNotEntered = false;
}
/**
* We don't want to hide the panel if the mouse was moved
* from the toggle to the menu so this function will only
* be called after a timeout to determine if the
* mouse is still on the toggle or the panel, and only
* then will it hide the panel.
*/
private hideIfNotOver(timeoutMs: number) {
this.zone.run(()=>
setTimeout(_=>{
if(!this.panelWasEntered &&
!this.isHovering &&
!this.panel.pinned) {
this.panel.hide();
}
},timeoutMs));
}
}


001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019 package org.apache.shiro.web.mgt; 020 021 import org.apache.shiro.codec.Base64; 022 import org.apache.shiro.mgt.AbstractRememberMeManager; 023 import org.apache.shiro.subject.Subject; 024 import org.apache.shiro.subject.SubjectContext; 025 import org.apache.shiro.web.servlet.Cookie; 026 import org.apache.shiro.web.servlet.ShiroHttpServletRequest; 027 import org.apache.shiro.web.servlet.SimpleCookie; 028 import org.apache.shiro.web.subject.WebSubject; 029 import org.apache.shiro.web.subject.WebSubjectContext; 030 import org.apache.shiro.web.util.WebUtils; 031 import org.slf4j.Logger; 032 import org.slf4j.LoggerFactory; 033 034 import javax.servlet.ServletRequest; 035 import javax.servlet.http.HttpServletRequest; 036 import javax.servlet.http.HttpServletResponse; 037 038 039 /** 040 * Remembers a Subject's identity by saving the Subject's {@link Subject#getPrincipals() principals} to a {@link Cookie} 041 * for later retrieval. 042 *
 043 * Cookie attributes (path, domain, maxAge, etc) may be set on this class's default 044 * {@link #getCookie() cookie} attribute, which acts as a template to use to set all properties of outgoing cookies 045 * created by this implementation. 046 *
 047 * The default cookie has the following attribute values set: 048 *
 049 *
 050 * Attribute Name	 051 * Value	 052 *
 053 *
{@link Cookie#getName() name}	 054 * {@code rememberMe}	 055 *
 056 *
 057 * {@link Cookie#getPath() path}	 058 * {@code /}	 059 *
 060 *
 061 * {@link Cookie#getMaxAge() maxAge}	 062 * {@link Cookie#ONE_YEAR Cookie.ONE_YEAR}	 063 *
 064 *
 065 *
 066 * Note that because this class subclasses the {@link AbstractRememberMeManager} which already provides serialization 067 * and encryption logic, this class utilizes both for added security before setting the cookie value. 068 * 069 * @since 1.0 070 */ 071 public class CookieRememberMeManager extends AbstractRememberMeManager { 072 073 //TODO - complete JavaDoc 074 075 private static transient final Logger log = LoggerFactory.getLogger(CookieRememberMeManager.class); 076 077 /** 078 * The default name of the underlying rememberMe cookie which is {@code rememberMe}. 079 */ 080 public static final String DEFAULT_REMEMBER_ME_COOKIE_NAME = "rememberMe"; 081 082 private Cookie cookie; 083 084 /** 085 * Constructs a new {@code CookieRememberMeManager} with a default {@code rememberMe} cookie template. 086 */ 087 public CookieRememberMeManager() { 088 Cookie cookie = new SimpleCookie(DEFAULT_REMEMBER_ME_COOKIE_NAME); 089 cookie.setHttpOnly(true); 090 //One year should be long enough - most sites won't object to requiring a user to log in if they haven't visited 091 //in a year: 092 cookie.setMaxAge(Cookie.ONE_YEAR); 093 this.cookie = cookie; 094 } 095 096 /** 097 * Returns the cookie 'template' that will be used to set all attributes of outgoing rememberMe cookies created by 098 * this {@code RememberMeManager}. Outgoing cookies will match this one except for the 099 * {@link Cookie#getValue() value} attribute, which is necessarily set dynamically at runtime. 100 *
 101 * Please see the class-level JavaDoc for the default cookie's attribute values. 102 * 103 * @return the cookie 'template' that will be used to set all attributes of outgoing rememberMe cookies created by 104 * this {@code RememberMeManager}. 105 */ 106 public Cookie getCookie() { 107 return cookie; 108 } 109 110 /** 111 * Sets the cookie 'template' that will be used to set all attributes of outgoing rememberMe cookies created by 112 * this {@code RememberMeManager}. Outgoing cookies will match this one except for the 113 * {@link Cookie#getValue() value} attribute, which is necessarily set dynamically at runtime. 114 *
 115 * Please see the class-level JavaDoc for the default cookie's attribute values. 116 * 117 * @param cookie the cookie 'template' that will be used to set all attributes of outgoing rememberMe cookies created 118 * by this {@code RememberMeManager}. 119 */ 120 @SuppressWarnings({"UnusedDeclaration"}) 121 public void setCookie(Cookie cookie) { 122 this.cookie = cookie; 123 } 124 125 /** 126 * Base64-encodes the specified serialized byte array and sets that base64-encoded String as the cookie value. 127 *
 128 * The {@code subject} instance is expected to be a {@link WebSubject} instance with an HTTP Request/Response pair 129 * so an HTTP cookie can be set on the outgoing response. If it is not a {@code WebSubject} or that 130 * {@code WebSubject} does not have an HTTP Request/Response pair, this implementation does nothing. 131 * 132 * @param subject the Subject for which the identity is being serialized. 133 * @param serialized the serialized bytes to be persisted. 134 */ 135 protected void rememberSerializedIdentity(Subject subject, byte[] serialized) { 136 137 if (!WebUtils.isHttp(subject)) { 138 if (log.isDebugEnabled()) { 139 String msg = "Subject argument is not an HTTP-aware instance. This is required to obtain a servlet " + 140 "request and response in order to set the rememberMe cookie. Returning immediately and " + 141 "ignoring rememberMe operation."; 142 log.debug(msg); 143 } 144 return; 145 } 146 147 148 HttpServletRequest request = WebUtils.getHttpRequest(subject); 149 HttpServletResponse response = WebUtils.getHttpResponse(subject); 150 151 //base 64 encode it and store as a cookie: 152 String base64 = Base64.encodeToString(serialized); 153 154 Cookie template = getCookie(); //the class attribute is really a template for the outgoing cookies 155 Cookie cookie = new SimpleCookie(template); 156 cookie.setValue(base64); 157 cookie.saveTo(request, response); 158 } 159 160 private boolean isIdentityRemoved(WebSubjectContext subjectContext) { 161 ServletRequest request = subjectContext.resolveServletRequest(); 162 if (request != null) { 163 Boolean removed = (Boolean) request.getAttribute(ShiroHttpServletRequest.IDENTITY_REMOVED_KEY); 164 return removed != null && removed; 165 } 166 return false; 167 } 168 169 170 /** 171 * Returns a previously serialized identity byte array or {@code null} if the byte array could not be acquired. 172 * This implementation retrieves an HTTP cookie, Base64-decodes the cookie value, and returns the resulting byte 173 * array. 174 *
 175 * The {@code SubjectContext} instance is expected to be a {@link WebSubjectContext} instance with an HTTP 176 * Request/Response pair so an HTTP cookie can be retrieved from the incoming request. If it is not a 177 * {@code WebSubjectContext} or that {@code WebSubjectContext} does not have an HTTP Request/Response pair, this 178 * implementation returns {@code null}. 179 * 180 * @param subjectContext the contextual data, usually provided by a {@link Subject.Builder} implementation, that 181 * is being used to construct a {@link Subject} instance. To be used to assist with data 182 * lookup. 183 * @return a previously serialized identity byte array or {@code null} if the byte array could not be acquired. 184 */ 185 protected byte[] getRememberedSerializedIdentity(SubjectContext subjectContext) { 186 187 if (!WebUtils.isHttp(subjectContext)) { 188 if (log.isDebugEnabled()) { 189 String msg = "SubjectContext argument is not an HTTP-aware instance. This is required to obtain a " + 190 "servlet request and response in order to retrieve the rememberMe cookie. Returning " + 191 "immediately and ignoring rememberMe operation."; 192 log.debug(msg); 193 } 194 return null; 195 } 196 197 WebSubjectContext wsc = (WebSubjectContext) subjectContext; 198 if (isIdentityRemoved(wsc)) { 199 return null; 200 } 201 202 HttpServletRequest request = WebUtils.getHttpRequest(wsc); 203 HttpServletResponse response = WebUtils.getHttpResponse(wsc); 204 205 String base64 = getCookie().readValue(request, response); 206 // Browsers do not always remove cookies immediately (SHIRO-183) 207 // ignore cookies that are scheduled for removal 208 if (Cookie.DELETED_COOKIE_VALUE.equals(base64)) return null; 209 210 if (base64 != null) { 211 base64 = ensurePadding(base64); 212 if (log.isTraceEnabled()) { 213 log.trace("Acquired Base64 encoded identity [" + base64 + "]"); 214 } 215 byte[] decoded = Base64.decode(base64); 216 if (log.isTraceEnabled()) { 217 log.trace("Base64 decoded byte array length: " + (decoded != null ? decoded.length : 0) + " bytes."); 218 } 219 return decoded; 220 } else { 221 //no cookie set - new site visitor? 222 return null; 223 } 224 } 225 226 /** 227 * Sometimes a user agent will send the rememberMe cookie value without padding, 228 * most likely because {@code =} is a separator in the cookie header. 229 *
 230 * Contributed by Luis Arias. Thanks Luis! 231 * 232 * @param base64 the base64 encoded String that may need to be padded 233 * @return the base64 String padded if necessary. 234 */ 235 private String ensurePadding(String base64) { 236 int length = base64.length(); 237 if (length % 4 != 0) { 238 StringBuilder sb = new StringBuilder(base64); 239 for (int i = 0; i < length % 4; ++i) { 240 sb.append('='); 241 } 242 base64 = sb.toString(); 243 } 244 return base64; 245 } 246 247 /** 248 * Removes the 'rememberMe' cookie from the associated {@link WebSubject}'s request/response pair. 249 *
 250 * The {@code subject} instance is expected to be a {@link WebSubject} instance with an HTTP Request/Response pair. 251 * If it is not a {@code WebSubject} or that {@code WebSubject} does not have an HTTP Request/Response pair, this 252 * implementation does nothing. 253 * 254 * @param subject the subject instance for which identity data should be forgotten from the underlying persistence 255 */ 256 protected void forgetIdentity(Subject subject) { 257 if (WebUtils.isHttp(subject)) { 258 HttpServletRequest request = WebUtils.getHttpRequest(subject); 259 HttpServletResponse response = WebUtils.getHttpResponse(subject); 260 forgetIdentity(request, response); 261 } 262 } 263 264 /** 265 * Removes the 'rememberMe' cookie from the associated {@link WebSubjectContext}'s request/response pair. 266 *
 267 * The {@code SubjectContext} instance is expected to be a {@link WebSubjectContext} instance with an HTTP 268 * Request/Response pair. If it is not a {@code WebSubjectContext} or that {@code WebSubjectContext} does not 269 * have an HTTP Request/Response pair, this implementation does nothing. 270 * 271 * @param subjectContext the contextual data, usually provided by a {@link Subject.Builder} implementation 272 */ 273 public void forgetIdentity(SubjectContext subjectContext) { 274 if (WebUtils.isHttp(subjectContext)) { 275 HttpServletRequest request = WebUtils.getHttpRequest(subjectContext); 276 HttpServletResponse response = WebUtils.getHttpResponse(subjectContext); 277 forgetIdentity(request, response); 278 } 279 } 280 281 /** 282 * Removes the rememberMe cookie from the given request/response pair. 283 * 284 * @param request the incoming HTTP servlet request 285 * @param response the outgoing HTTP servlet response 286 */ 287 private void forgetIdentity(HttpServletRequest request, HttpServletResponse response) { 288 getCookie().removeFrom(request, response); 289 } 290 } 291


This component has been deprecated in favor of Vaadin Grids. There is currently some debate about whether Vaadin will be the officially supported grid of choice or whether we will return to updating the Smart Table component. While Smart Table is a native Angular component, Vaadin grid (a polymer component) has a more robust feature set. Consider this a fair warning if deciding to adopt Smart Tables.
| head 1 | head 2 | head 3 | head 4 |
|---|---|---|---|
| content 1 | content 2 | content 3 | content 4 |
| content 1 | content 2 | content 3 | content 4 |
| content 1 | content 2 | content 3 | content 4 |
| content 1 | content 2 | content 3 | content 4 |
The Smart Table component is forked from ng2-smart-table and most of the ng2-smart-table documentation applies to this component. Refer to this documentation first, then read the following for instructions on additions and changes from the source.
| Property | Type | Default | Description |
|---|---|---|---|
| Other Properties | |||
| alternatingRowColors | boolean |
true | When set to true every other row shows a background color. |
| add.addButtonContent | string |
add | By default, the add button will display the add icon. If a string is passed, a button with this string as its label will be displayed instead of the icon. |
| add.addTip | string |
'Add New' | The text to display in the tooltip when the user mouses over the Add icon. Note that if add.addButtonContent is overridden to include a string to display, an icon is not displayed and this property will do nothing. |
| add.createButtonContent | string |
add | By default, the create button will display the add icon. If a string is passed, a button with this string as its label will be displayed instead of the icon. |
| add.createTip | string |
'Create' | The text to display in the tooltip when the user mouses over the Create icon. Note that if add.createButtonContent is overridden to include a string to display, an icon is not displayed and this property will do nothing. |
| add.cancelButtonContent | string |
clear | By default, the add cancel button will display the clear icon. If a string is passed, a button with this string as its label will be displayed instead of the icon. |
| add.createTip | string |
'Cancel' | The text to display in the tooltip when the user mouses over the Cancel icon. Note that if add.cancelButtonContent is overridden to include a string to display, an icon is not displayed and this property will do nothing. |
| delete.deleteButtonContent | string |
delete | By default, the delete button will display the delete icon. If a string is passed, a button with this string as its label will be displayed instead of the icon. |
| delete.deleteTip | string |
'Delete' | The text to display in the tooltip when the user mouses over the Delete icon. Note that if delete.deleteButtonContent is overridden to include a string to display, an icon is not displayed and this property will do nothing. |
| edit.editButtonContent | string |
edit | By default, the edit button will display the edit icon. If a string is passed, a button with this string as its label will be displayed instead of the icon. |
| edit.editTip | string |
'Edit' | The text to display in the tooltip when the user mouses over the Edit icon. Note that if edit.editButtonContent is overridden to include a string to display, an icon is not displayed and this property will do nothing. |
| edit.saveButtonContent | string |
done | By default, the save button will display the done icon. If a string is passed, a button with this string as its label will be displayed instead of the icon. |
| edit.saveTip | string |
'Save Changes' | The text to display in the tooltip when the user mouses over the Save icon. Note that if edit.saveButtonContent is overridden to include a string to display, an icon is not displayed and this property will do nothing. |
| edit.cancelButtonContent | string |
clear | By default, the edit cancel button will display the clear icon. If a string is passed, a button with this string as its label will be displayed instead of the icon. |
| edit.cancelTip | string |
'Cancel' | The text to display in the tooltip when the user mouses over the Cancel icon. Note that if edit.cancelButtonContent is overridden to include a string to display, an icon is not displayed and this property will do nothing. |
| filterByLabel | string |
'filter by' | The text prefixed to the input name appearing in the filter input as placeholder text. |
| hover | boolean |
false | Whether or not to display a highlight color on the row when the user's mouse passes over the row. |
| noDataMessage | string |
'No data found' | The text to display when no data is loaded into the table. |
| valign | string |
'middle' | Sets the vertical alignment of every cell in the table. Possible values are top, middle, bottom. |
| width | string |
'100%' | Takes any valid CSS values for the width property. By default the table will stetch to 100% width of its parent container. By setting the value to "auto" or an empty string ("") the table width will be determined by the contents. Note that if the contents of the table or the number of columns requires the table to stretch wider than 100% of available width of the containing element, the table will be as wide as it needs to be regardless of the value of this setting. |
The following theme-related CSS custom properties are available to use throughout your application's CSS files should you decide to use them to further customize your brand's appearance. By default, the values of these properties are set to use the Dematic brand theme. However, you can easily override all of the following default value with your own theme values using the SCSS methods definded in the KION Theme System documentation.
| CSS Custom property | Description | Value |
|---|---|---|
| --kg-table-bg-color | Background color for entire table (has the affectd of setting row color). | var(--kg-color-white) |
| --kg-table-border-width | Border that appears around table and between rows. | var(--kg-border-width) |
| --kg-table-border-color | Color of border. | var(--kg-border-color) |
| --kg-table-head-bg-color | Background color of table head. | var(--kg-color-white) |
| --kg-table-head-color | Text color for table head. | var(--kg-body-color) |
| --kg-table-filter-bg-color | Background color for the filter placeholder. Only applies to Smart Tables. | var(--kg-color-secondary-lighter-30) |
| --kg-table-filter-color | Text color for the filter placeholder. | var(--kg-color-gray-400) |
| --kg-table-cell-padding-vert | Vertical cell padding. | 5px |
| --kg-table-cell-padding-horiz | Horizontal cell padding. | 20px |
| --kg-table-action-padding | Padding for row action cell. Only applies to Smart Tables. | 4px |
| --kg-table-font-size | Font size for table contents. | 1rem |
| --kg-table-active-bg-color | Background color for active rows. | var(--kg-color-primary-lighter-30) |
| --kg-table-accent-bg-color | Background color used for alternating rows. Requires <table> to use the "table-striped" class. | var(--kg-color-gray-100) |
| --kg-table-hover-bg-color | Background color to use when hovering over clickable table rows. | var(--kg-color-gray-200) |
| --kg-table-button-add-color | Add item button text color. Only applies to Smart Tables. | var(--kg-table-head-color) |
| --kg-table-button-add-bg-color | Add item button background color. Only applies to Smart Tables. | var(--kg-table-head-bg-color) |
| --kg-table-button-add-bg-hover-color | Add item button hover background color. Only applies to Smart Tables. | var(--kg-color-secondary-lighter-10) |


org.flixel.system.input.Keyboard
- type
- class
- extends
- Input
Keeps track of what keys are pressed and how with handy Bools or strings.
- Parameters:
KeyName
- String name of the key (e.g. "LEFT" or "A")
KeyCode
- The numeric Flash code for this key.
- Returns:
- Whether any keys are currently pressed.
- Parameters:
KeyName
- The String
name of the key.
- Returns:
- The key code for that key.
- Parameters:
FlashEvent
- A KeyboardEvent
object.
- Parameters:
FlashEvent
- A KeyboardEvent
object.
- Parameters:
Key
- One of the key constants listed above (e.g. "LEFT" or "A").
- Returns:
- Whether the key was just pressed
- Parameters:
Key
- One of the key constants listed above (e.g. "LEFT" or "A").
- Returns:
- Whether the key is just released.
- Parameters:
Record
- Array of data about key states.
- Parameters:
Key
- One of the key constants listed above (e.g. "LEFT" or "A").
- Returns:
- Whether the key is pressed
- Returns:
- An array of key state data. Null if there is no data.


This inspection reports any
import
statements in
Groovy
script files that are unused.
Powered by JetGroovy


You are {{username}}
Game Event
{{ tileSlot.tile.letter }}
{{ tileSlot.tile.value }}
EXCHANGE
DONE
SHUFFLE


Elasticities¶
In some cases we might be interested in testing certain intervention strategies on our models. In general we will be most intested in what is the consequence for the environment, meaning what happens with the exchange reactions in the model. Here, micom
allows you to respond two kind of questions:
What impact does changing a bacterial abundance have on the exchanges?
What impact does changing the exchnage bounds (ergo diet) have on the exchanges?
For that we use the concept of elasticity coefficients which are a dimensionless normalized measure of how much the parameter \(p\) affects the flux \(v\):
micom
can calculate the elasticities for abundances and diet in one go.
This again uses cooperative tradeoff to limit the solution space.
[1]:
from micom import Community, data
from micom.elasticity import exchange_elasticities
tax = data.test_taxonomy()
com = Community(tax, solver="gurobi")
eps = exchange_elasticities(com, fraction=1.0)
eps.head()
100%|██████████| 5/5 [00:00<00:00, 5.78models/s]
100%|██████████| 4/4 [00:00<00:00, 26.02optimizations/s]
100%|██████████| 5/5 [00:00<00:00, 12.57optimizations/s]
[1]:
| reaction | effector | direction | elasticity | type | |
|---|---|---|---|---|---|
| EX_ac_m | EX_ac_m | EX_glc__D_m | zero | -3.339689e-07 | exchanges |
| EX_acald_m | EX_acald_m | EX_glc__D_m | zero | -2.948751e-06 | exchanges |
| EX_akg_m | EX_akg_m | EX_glc__D_m | zero | -3.915087e-06 | exchanges |
| EX_co2_m | EX_co2_m | EX_glc__D_m | forward | 9.238545e-01 | exchanges |
| EX_etoh_m | EX_etoh_m | EX_glc__D_m | zero | 7.460696e-07 | exchanges |
Here reaction refers to the target flux and effector to the changed parameter. The direction indicates the flux direction and the type whether we changed an exchange bound or a taxa abundance. So for instance the 4th row would tell us that raising glucose import by one unit (one unit of additional glucose in the diet) would increase the carbon dioxide production by 0.92 units. The other rows do not impose a significant change, are not sensitive to glucose availability.
[ ]:


{% load static %}
Please arrive ~20 minutes before your talk in the speakers lounge for last minute arrangements.
You'll be invited to the videoconference for your talk where you'll be introduced by one of our moderators, afterwards your talk begins.
If you want to hold your talk directly in the videoconference that's great, then there's basically nothing more to do other than uploading your slides to the conference (ideally do that in the preparation time :P) and start talking ;)
If you prerecorded your talk we'll switch the stream to the recording and afterwards back to the videoconference where you can do a little Q&A (if you want to).
If you are livestreaming basically the same thing happens.
You should still join the videoconference at least listen-only to hear the moderator
announce you, so you know when to begin.
Please enable local recording so we'll have a backup copy if anything goes wrong
with the stream.
In any case the conference will be locked during your talk so guests can only use the chat. During Q&A we might allow others to activate their microphones, but we'll need to see how well that goes.
Optionally the stream can end after the recording and the Q&A will not be recorded.
If you want a high quality livestream of your talk you'll need to set up OBS. Here are some guidlines on how to configure it if you don't already have a working setup.
OBS Download: obsproject.com
Enable Automatically record when streaming
and Keep recording when stream stops
,
just to make sure you don't forget to enable your local recording.
Set service to Custom...
rtmp://ingest.c3voc.de/relay
{{ key }}
{% else %}will be given to you by mail{% endif %}
Output Mode: Simple
Output: Streaming
Create 3 scenes:
Add a source, select Video Capture Device
, name it e.g. Camera
Select the correct input device, e.g. Cam Link 4K
. Set Resolution to 1920x1080 if possible.
You can try to mess around with the other settings to get a better picture, but the default values usually are good enough.
If nessary resize to canvas size: Right click -> Transform -> Fit to screen
Scene Fullscreen Desktop
Add a source, select either Screen Capture
or Window Capture
.
Screen Capture has the benefit that it basically just shows everything on your screen,
and if you open your slides they'll be visible as well, but it has the drawback that you
can't have the slides fill the screen and still see your controls or the chat if you only
have one screen connected
If you have a second screen this makes everything a lot easier, otherwise experiment till you get a good input for your slides.
If nessary resize to canvas size: Right click -> Transform -> Fit to screen
Picture in PictureAdd a source, select Scene
, select Fullscreen Desktop
Add a source, select Scene
, select Fullscreen Camera
Resize the added camera to a small corner, either do this by feel or rightclick -> transform -> edit transform. For size use something like 512x288.
Depending on your slides feel free to move it to any corner you like, but bottom right is usually the best.
If you feel fancy you can also reduce the size of your slides, orient them slightly offset, and add a background image: stream-background.png
This could then look something like this example, that's the with the slides scaled to 1584x891 and positioned at 16x16 and with the camera beging scaled to 624x351 and positioned at 1280x713
Make sure your microphone is listed in the Audio Mixer section, otherwise go back to the settings and make sure it's selected there.
It should peak in the yellow region if you get a bit louder, but never go into red. Try to get your audio as clear as possible without going over that limit. You can select the advanced audio properties next to the volume graph and enable local preview so you can hear what you sound like without having to record and playback all the time. Don't forget that your systems audio settings might also need to be changed.
Do a test recording. Check that everything looks and sounds like you want it to.
Use VLC, mpv, ffplay, or any other player that supports rtmp and open
rtmp://ingest.c3voc.de/relay/{% if key %}{{ key }}{% else %}your-stream-key-here{% endif %}
Click Start Streaming
in OBS, after a few seconds image and sound should be played back.
Please contact us on friday and give us a way to quickly contact you. We will probably not have time to set up or debug anything during the conference as we barely have enough people to actually run it without hickups.
In order to join a conference room, please click the ‘Watch’ button, corresponding to the room in which you are going to give your talk. This example will be using HS4. A Grey button denotes that there is no active session for this room. You will now be redirected to the stream page
Now select the ‘Video conference’ button…
… and set your publicly visible name, accept the privay policy and click the ‘OK’ button. Please don’t use anything except lower case letters as your username.
You are now connected to the conference room. Please wait for the moderator to unlock your account, which will then allow you to share your microphone as it is described here
If you have any problems, please contact the office.


Opacity (Hover to see effect)
Move (Hover to see effect)
Values:
$trans-opacity__time:0.3s;
$trans-opacity__function:ease-in;
$trans-opacity:$trans-opacity__time $trans-opacity__function;
convenience variable for using both$trans-move__time:0.3s;
$trans-move__function:ease-in;
$trans-move:$trans-opacity__time $trans-move__function;
convenience variable for using both


{% include 'header.html' %}
Fill out the form below to sign up for the Hackathon. Individual signups are welcome! We will not put you on the team page but you may form teams with other individuals on the day of the event. After you submit this form you will be contacted by Ben from GeoStrategies to confirm the details and finalize your place in the event.
{% if flash.error %}Update (as of 01/8/2015)
Please check the code of conduct at the bottom of this page.
Update (as of 12/17/2014)
Individuals are encouraged to sign up using the form to the left. Please add the technologies you are comfortable in when you do. Individuals can form teams or join teams on the day of the event. No one will be left out.
Update (as of 11/26/2014)
We now have online signups!
Update (as of 11/25/2014)
We have acquired larger facilities, so signups are now limited to 15 teams.
Space for this event is limited and we are taking teams on a first come first served basis. We have six office rooms in one office space we will be using for the event. Each room can easily handle a four man team.
We do not have online signup this year, so please register your team by calling Ben at<PHONE_NUMBER>


Choose a data bundle from your computer and submit this form to upload it to the server and import the data.
There was a problem with the upload
Data imported successfully


Press n or j to go to the next uncovered block, b, p or k for the previous block.
| File | Statements | Branches | Functions | Lines | |||||
|---|---|---|---|---|---|---|---|---|---|
| evaluator/transactionRequest |
|
100% | 38/38 | 100% | 13/13 | 90.91% | 10/11 | 100% | 37/37 |
| handler/transactionHandler |
|
100% | 65/65 | 100% | 0/0 | 92.86% | 13/14 | 100% | 65/65 |
| handler/tree_node/transaction/inquiry |
|
100% | 36/36 | 100% | 16/16 | 91.67% | 11/12 | 100% | 31/31 |
| handler/tree_node/transaction/nodeHandler |
|
72.41% | 21/29 | 100% | 0/0 | 50% | 4/8 | 72.41% | 21/29 |
| handler/tree_node/transaction/tree |
|
89.29% | 25/28 | 75% | 9/12 | 80% | 4/5 | 88.89% | 24/27 |
| models/common |
|
100% | 5/5 | 100% | 0/0 | 100% | 2/2 | 100% | 5/5 |
| models/transaction |
|
87.88% | 29/33 | 57.14% | 8/14 | 83.33% | 10/12 | 93.55% | 29/31 |
| models/tree-transaction_viewmodel |
|
100% | 30/30 | 100% | 0/0 | 100% | 10/10 | 100% | 30/30 |
| setting/transaction-error |
|
100% | 3/3 | 100% | 0/0 | 100% | 0/0 | 100% | 3/3 |
| setting/velocity |
|
100% | 3/3 | 100% | 0/0 | 100% | 0/0 | 100% | 3/3 |
| utility |
|
95.24% | 20/21 | 50% | 1/2 | 66.67% | 2/3 | 95.24% | 20/21 |
| validation |
|
100% | 54/54 | 100% | 43/43 | 84.62% | 11/13 | 100% | 51/51 |


Blog
My thoughts
2017
2016
-
Singular Value Decomposition of The Ambassadors 11/07
-
My definition of Bayesian statistics 10/18
-
A genetic example of Latent Dirichlet Allocation 09/08
-
Shiny: easily passing a long list of items to selectInput choices 08/11
-
Probability as Art 07/17
-
First Post: Website Active 07/10


Latest Projects
Project | 01
Project | 01 title
I'm a Paragraph. Click here to add your own text and edit me. It’s easy. Just click “Edit Text” or double click me and you can start adding your own content and make changes to the font. Feel free to drag and drop me anywhere you like on your page. I’m a great place for you to write more. Tell a story about yourself
Project | 01
Project | 01 title
I'm a Paragraph. Click here to add your own text and edit me. It’s easy. Just click “Edit Text” or double click me and you can start adding your own content and make changes to the font. Feel free to drag and drop me anywhere you like on your page. I’m a great place for you to write more. Tell a story about yourself


We're sorry for the inconvenience but this email has already been used. We only allow one run per player.


Minishift is a command-line tool that provisions and manages single-node OpenShift clusters optimized for development workflows.
minishift [command]
Use "minishift [command] --help" for more information about a command.


5 references to ResolveAliasPatterns
System.Management.Automation (5)
engine\CommandSearcher.cs (1)
692
if ((_commandResolutionOptions & SearchResolutionOptions.
ResolveAliasPatterns
) != 0)
engine\GetCommandCommand.cs (1)
793
options |= SearchResolutionOptions.
ResolveAliasPatterns
;
engine\Modules\ModuleCmdletBase.cs (1)
7247
SearchResolutionOptions.CommandNameIsPattern | SearchResolutionOptions.
ResolveAliasPatterns
| SearchResolutionOptions.ResolveFunctionPatterns,
engine\MshCmdlet.cs (1)
619
(SearchResolutionOptions.CommandNameIsPattern | SearchResolutionOptions.ResolveFunctionPatterns | SearchResolutionOptions.
ResolveAliasPatterns
)
help\AliasHelpProvider.cs (1)
187
SearchResolutionOptions.
ResolveAliasPatterns
, CommandTypes.Alias,


For installation Silly Datatable run follow command in root directory of your Angular project:
npm install silly-datatable --save
After successful installation need to add Silly Datatable module into imports in app module:
Don't forget import this module:
import {{'{'}} SillyDatatableModule {{'}'}} from 'silly-datatable';


Hi, you have sent request to unsubscribe to newsletter for this site. If you really sent this request, then click on the following link: %s or you can ignore this message. Kind regards, My site


Fighter Fuel
Since the fighter class needs arrows in their off-hand to shoot into the air
Let's rename the arrows as fuel and give the player arrows with a custom name of fuel
First let's determine where in the code we need to make the change
There is a place in the code where the player is choosing a career, at this point when they choose fighter they should get the fuel
Take a look at the player mouse click event this is where the code change needs to be made
After the code that gets the career, if the career is fighter, we want to give them a custom named stack:
You can use this code as reference:
Can you see how to give the bomber snowballs named "Bombs"?
To decrement the stack, and get the length and type of the off-hand stack consider this code:
Can you visualize how to add a fuel for fighters which is decremented each time the press left mouse to accelerate?


Home
Classes
3d Printer
Drones
Owl Pellets
Play-Doh
Minecraft Circuitry
Rube Goldberg
Green Screen & Stop Motion
Snap Circuits
Cow Eyes
About
Contact Us
Classes
Drones
Owl Pellets
Play-Doh
Minecraft Circuitry
Rube Goldberg
Green Screens & Stop Motion
Week 7
Week 8
Week 9


loading...
Music Bot Server
Home
About
Blog
Help
My Camara
Capture
Back to Video
Hello, Janani
Online
Janani
Offline


Overview of Parameters Module¶
- Release
2.1
- Date
Jun 05, 2020
Params Module¶
Calculate the governing scales and determine the appropriate simulation model
This module calculates the governing non-dimensional parameters defined in papers by Socolofsky and Adams (2002, 2005) and Socolofsky et al. (2011) and uses this information to recommend the appropriate simulation model.
Class Objects and Methods¶
|
Compute the characteristic scales for a |
|
docstring for simulate |
|
Save the results to a text file |
|
Compute the governing variables at a given depth |
|
Compute the trap height for the lowest intrusion |
|
Compute the peel height for the lowest intrusion |
|
Compute the cross-flow separation height |
|
Compute the spreading ratio of particle n at the given depth |
|
Determine the critical cross-flow velocity |


Conference Attendees
Sorry, but there are not any attendees with last names starting with {{attendeeLetterChosen}}.
{{attendee.lastname}}, {{attendee.firstname}}
{{attendee.jobtitle}}
{{attendee.organization}}
No attendees match your currently selected filter.


Before Change
if (s in ("killed", "dead") or s.startswith("failed")) and t not in failed_tasks:
env.logger.warning("{} ``{}``".format(t, s))
failed_tasks.add(t)
if all(x in ("killed", "completed", "dead") or x.startswith("failed") for x in res):
raise RuntimeError("{} completed, {} dead, {} failed, {} killed)".format(
len([x for x in res if x=="completed"]), len([x for x in res if x=="dead"]),
len([x for x in res if x.startswith("failed")]), len([x for x in res if x=="killed"])))
After Change
monitor_interval=monitor_interval, resource_monitor_interval=resource_monitor_interval)
with open(res_file, "wb") as res_file:
pickle.dump(res, res_file)
if res["ret_code"] != 0 and "exception" in res:
with open(os.path.join(os.path.expanduser("~"), ".sos", "tasks", task + ".err"), "a") as err:
err.write("sos execute quit with code {} and exception {}: {}\n".format(
res["ret_code"], res["exception"].__class__.__name__, repr(res["exception"])))
exit_code.append(res["succ"])
sys.exit(sum(exit_code))
elif args.queue == "":
from .hosts import list_queues


The MkE SDK provides C++ and Python implementations of ROS2 point cloud publisher nodes.
The C++ implementation of ROS2 publisher node is called mkeros2_node
. This node is capable of connecting to a MagikEye sensor via the MkE API and publishing its 3D data via a ROS topic. Note that the code depends on the C++ MkE API client library libmkeclient which is also distributed as a part of this SDK.
The Python implementation of ROS2 publisher node is called pymkeros2_node
. This node is capable of connecting to a MagikEye sensor via the MkE API and publishing its 3D data via a ROS topic. Note that the code depends on the Python MkE API package pymkeapi which is also distributed as a part of this SDK.
© 2016-2021 MagikEye Inc.


Twitter is testing scheduled tweets for their web app
by SururTwitter is testing scheduled tweets for its web app, a feature cribbed from their TweetDeck app.
The feature is currently only being tested with a fraction of Twitter users but has already received an enthusiastic reception from lucky users. The feature is useful for planned promotions, announcements and other professional users, but has less utility for day to day casual twitter users.
The company has been increasingly busy in recent weeks, working on threaded replies, DM search and Categorized Topic lists.
Due to their apps being based on their web app the feature should become available to app users on Windows, iOS and Android in due course also.
Have any of our readers been included in the scheduled tweets test? Let us know your experience below.


Snookes1516.github.io
Freelance writing work, freelance writers
Kanawha river elk river emerald rd davis creek downtown charleston ashton place south charleston d s t t trace fork 64 64 64 laidley lee st rhl blvd d lawndale
Welcome to Ruth Dudley Edwards: journalist, crimite. The website of crime fiction writer, biographer and historian Ruth Dudley Edwards. Since 1993 Ruth has written seriously and/or frivolously for almost every national. The Workhouse in Dudley, Worcestershire. Insurance Suffolk Brokerage - Long Island Insurance. Amazon.com: Crazy People: Dudley Moore, Daryl Hannah, Paul Reiser, J.T. Walsh, Bill Smitrovich, Alan North, David Paymer, Danton Stone, Paul Bates, Dick Cusack
Find the right court or tribunal. Once you have both given 'notice' at your local register office(s) we will confirm your booking with us in writing and send you an information pack outlining. Ruth Dudley Edwards: crime fiction. What do we offer? 4Writers.net is an online freelance writing service with over 10 years of experience providing freelance writing opportunities to dedicated. Career In The Spotlight. At Connnexions, we are passionate about raising the aspirations and knowledge of the young people of Dudley. Alongside our partners Enter by the Narrow Gate. Theological Reflection for Catechetical Sunday 2013 by Harry Dudley. Paul Dudley White (June 6, 1886 – October 31, 1973), American physician and cardiologist, was born in Roxbury, Massachusetts, the son of Herbert Warren White.
APA - Citation Styles - Research Guides at Naval. Theological Reflection - Harry Dudley. GOV.UK uses cookies to make the site simpler. Find out more about cookies. IN THE LABOUR APPEAL COURT OF SOUTH AFRICA Held in Johannesburg Case no: CA 1/05 In the matter between Lilian Dudley Appellant And The City of Cape Town 1st Respondent. Amazon.com: Crazy People: Dudley Moore, Daryl Hannah
Your Marriage Ceremony - Dudley. Long Island New York’s Premier, Full Service Insurance Brokerage By Insurance Suffolk Brokerage We are an all-risk, Long Island insurance brokerage.
Two year olds in Dudley could get up to 15 hours free childcare. In Dudley this is known
ROUTE 21 SOUTHRIDGE / TRACE FORK / DUDLEY FARMS. Connexions Dudley Information, Advice and Guidance. Dudley, Worcestershire Bibliography Up to 1834. Dudley had a parish workhouse on the south side of Tower Street to the north of the town centre. 11 Smart Tips for Brilliant Writing - Copyblogger. Do you sound smarter when you use big words? According to a study published in Applied Cognitive Psychology, the answer is no. In fact, complex writing.
The Crime at Black Dudley (Albert Campion) and millions of other books are available for instant access. view Kindle eBook view Audible audiobook.


Toggle navigation
Fireberry Pi
Dashboard
Add Device
Add a New Device
Name
Phone Number
Phone Carrier
(choose carrier)
AT&T
Sprint
T-Mobile
Verizon
Submit


|
Panda3D
|
This object holds the camera position, etc., and other general setup information for rendering a particular scene. More...
Public Member Functions | |
| __init__ (const SceneSetup) | |
| Camera | getCameraNode () |
| Returns the camera used to render the scene. More... | |
| const NodePath | getCameraPath () |
| Returns the NodePath to the camera. More... | |
| const TransformState | getCameraTransform () |
| Returns the position of the camera relative to the starting node. More... | |
| const TransformState | getCsTransform () |
| Returns the transform from the camera's coordinate system to the GSG's internal coordinate system. More... | |
| const TransformState | getCsWorldTransform () |
| Returns the position from the starting node relative to the camera, in the GSG's internal coordinate system. More... | |
| BoundingVolume | getCullBounds () |
| Returns the bounding volume that should be used to perform view-frustum culling (in the space of get_cull_center()). More... | |
| const NodePath | getCullCenter () |
| Returns the point from which the culling operations will be performed. More... | |
| DisplayRegion | getDisplayRegion () |
| Returns the display region for the scene. More... | |
| const RenderState | getInitialState () |
| Returns the initial state as set by a previous call to set_initial_state(). More... | |
| bool | getInverted () |
| Returns the current setting of the inverted flag. More... | |
| const Lens | getLens () |
| Returns the particular Lens used for rendering. More... | |
| const NodePath | getSceneRoot () |
| Returns the root node of the scene. More... | |
| int | getViewportHeight () |
| Returns the height of the viewport (display region) in pixels. More... | |
| int | getViewportWidth () |
| Returns the width of the viewport (display region) in pixels. More... | |
| const TransformState | getWorldTransform () |
| Returns the position of the starting node relative to the camera. More... | |
| setCameraNode (Camera camera_node) | |
| Specifies the camera used to render the scene. More... | |
| setCameraPath (const NodePath camera_path) | |
| Specifies the NodePath to the camera. More... | |
| setCameraTransform (const TransformState camera_transform) | |
| Specifies the position of the camera relative to the starting node. More... | |
| setCsTransform (const TransformState cs_transform) | |
| Specifies the transform from the camera's coordinate system to the GSG's internal coordinate system. More... | |
| setCsWorldTransform (const TransformState cs_world_transform) | |
| Specifies the position from the starting node relative to the camera, in the GSG's internal coordinate system. More... | |
| setDisplayRegion (DisplayRegion display_region) | |
| Specifies the display region for the scene. More... | |
| setInitialState (const RenderState initial_state) | |
| Sets the initial state which is applied to all nodes in the scene, as if it were set at the top of the scene graph. More... | |
| setInverted (bool inverted) | |
| Changes the current setting of the inverted flag. More... | |
| setLens (const Lens lens) | |
| Indicates the particular Lens used for rendering. More... | |
| setSceneRoot (const NodePath scene_root) | |
| Specifies the root node of the scene. More... | |
| setViewportSize (int width, int height) | |
| Specifies the size of the viewport (display region), in pixels. More... | |
| setWorldTransform (const TransformState world_transform) | |
| Specifies the position of the starting node relative to the camera. More... | |
| Public Member Functions inherited from TypedObject | |
| TypeHandle | getType () |
| int | getTypeIndex () |
| Returns the internal index number associated with this object's TypeHandle, a unique number for each different type. More... | |
| bool | isExactType (TypeHandle handle) |
| Returns true if the current object is the indicated type exactly. More... | |
| bool | isOfType (TypeHandle handle) |
| Returns true if the current object is or derives from the indicated type. More... | |
| Public Member Functions inherited from ReferenceCount | |
| int | getRefCount () |
| Returns the current reference count. More... | |
| ref () | |
| Explicitly increments the reference count. More... | |
| bool | testRefCountIntegrity () |
| Does some easy checks to make sure that the reference count isn't completely bogus. More... | |
| bool | testRefCountNonzero () |
| Does some easy checks to make sure that the reference count isn't zero, or completely bogus. More... | |
| bool | unref () |
| Explicitly decrements the reference count. More... | |
Static Public Member Functions | |
| static TypeHandle | getClassType () |
| Static Public Member Functions inherited from TypedReferenceCount | |
| static TypeHandle | getClassType () |
| Static Public Member Functions inherited from TypedObject | |
| static TypeHandle | getClassType () |
| Static Public Member Functions inherited from ReferenceCount | |
| static TypeHandle | getClassType () |
Additional Inherited Members | |
| Public Attributes inherited from TypedObject | |
| TypeHandle | type |
| Returns the TypeHandle representing this object's type. More... | |
| Public Attributes inherited from ReferenceCount | |
| int | ref_count |
| The current reference count. More... | |
This object holds the camera position, etc., and other general setup information for rendering a particular scene.
| __init__ | ( | const | SceneSetup | ) |
| Camera getCameraNode | ( | ) |
Returns the camera used to render the scene.
| const TransformState getCameraTransform | ( | ) |
Returns the position of the camera relative to the starting node.
|
static |
| const TransformState getCsTransform | ( | ) |
Returns the transform from the camera's coordinate system to the GSG's internal coordinate system.
| const TransformState getCsWorldTransform | ( | ) |
Returns the position from the starting node relative to the camera, in the GSG's internal coordinate system.
| BoundingVolume getCullBounds | ( | ) |
Returns the bounding volume that should be used to perform view-frustum culling (in the space of get_cull_center()).
This is normally the current lens' bounding volume, but it may be overridden with Camera::set_cull_bounds().
| const NodePath getCullCenter | ( | ) |
Returns the point from which the culling operations will be performed.
This is normally the camera, but if camera->set_cull_center() has been specified, it will be that special node instead.
| DisplayRegion getDisplayRegion | ( | ) |
Returns the display region for the scene.
| const RenderState getInitialState | ( | ) |
Returns the initial state as set by a previous call to set_initial_state().
| bool getInverted | ( | ) |
Returns the current setting of the inverted flag.
When this is true, the scene is rendered into the window upside-down, flipped like a mirror along the X axis.
| const NodePath getSceneRoot | ( | ) |
Returns the root node of the scene.
| int getViewportHeight | ( | ) |
Returns the height of the viewport (display region) in pixels.
| int getViewportWidth | ( | ) |
Returns the width of the viewport (display region) in pixels.
| const TransformState getWorldTransform | ( | ) |
Returns the position of the starting node relative to the camera.
This is the inverse of the camera transform.
| setCameraNode | ( | Camera | camera_node | ) |
Specifies the camera used to render the scene.
| setCameraTransform | ( | const TransformState | camera_transform | ) |
Specifies the position of the camera relative to the starting node.
| setCsTransform | ( | const TransformState | cs_transform | ) |
Specifies the transform from the camera's coordinate system to the GSG's internal coordinate system.
| setCsWorldTransform | ( | const TransformState | cs_world_transform | ) |
Specifies the position from the starting node relative to the camera, in the GSG's internal coordinate system.
| setDisplayRegion | ( | DisplayRegion | display_region | ) |
Specifies the display region for the scene.
| setInitialState | ( | const RenderState | initial_state | ) |
Sets the initial state which is applied to all nodes in the scene, as if it were set at the top of the scene graph.
| setInverted | ( | bool | inverted | ) |
Changes the current setting of the inverted flag.
When this is true, the scene is rendered into the window upside-down and backwards, that is, inverted as if viewed through a mirror placed on the floor.
| setSceneRoot | ( | const NodePath | scene_root | ) |
Specifies the root node of the scene.
| setViewportSize | ( | int | width, |
| int | height | ||
| ) |
Specifies the size of the viewport (display region), in pixels.
| setWorldTransform | ( | const TransformState | world_transform | ) |
Specifies the position of the starting node relative to the camera.
This is the inverse of the camera transform.


Braithwaite, Daniel Keough
| Birth Name | Braithwaite, Daniel Keough |
| Gender | male |
| Age at Death | 76 years, 1 month, 24 days |
Narrative
Daniel was a Stone Polisher??
SMH - BRAITHWAITE, Daniel - 25 April, 1984, at Redcliffe Hospital, Queensland, late of Lewisham, beloved husband of Phyllis (dec), beloved father of Daniel (dec), Joan (dec), Brian (dec), Dennis, father-in-law of Margaret & Joy, grandfather of Brian, Robyn, David, Paul (dec), Craig & Ian, and great-grandfather of Adam & Sharn, aged 76 years.
BRAITHWAITE - Rels & friends of the late DANIEL BRAITWAITE are invited to a Memorial Service to be held at John Mark Anglican Church, 125 Proctor Parade, Chester Hill, on Monday 7 May,1984 at 11am.
Events
| Event | Date | Place | Description | Sources |
|---|---|---|---|---|
| Birth | 1908-03-00 | Camperdown NSW #12851 | ||
|
|
||||
| Death | 1984-04-25 | Redcliffe Qld late of Lewisham NSW | ||
|
|
||||
| Burial | 1984-05-07 | Memorial Service -St Mark’s CofE Chester Hill NSW | ||
|
|
Parents
| Relation to main person | Name | Birth date | Death date | Relation within this family (if not by birth) |
|---|---|---|---|---|
| Father | Braithwaite, Edward | 1874 | ||
| Mother | Keogh, Florence A. M. | 1957 | ||
| Braithwaite, Daniel Keough | 1908-03-00 | 1984-04-25 | ||
| Sister | Braithwaite, [Living] | |||
| Brother | Braithwaite, [Living] |
Families
Family of Braithwaite, Daniel Keough and Pratt, Phyllis Harriet |
|||||||||||||||||
| Married | Wife | Pratt, Phyllis Harriet ( * 1911-03-31 + 1978-07-21 ) | |||||||||||||||
|
|||||||||||||||||
| Children |
| Name | Birth Date | Death Date |
|---|---|---|
| Braithwaite, Joan Lillian | 1927 | 1929-09-25 |
| Braithwaite, Daniel “Lenny” | 1929 | 1934 |
| Braithwaite, Brian Edward | 1932-09-02 | 1979-08-08 |
| Braithwaite, [Living] |
| Type | Value | Notes | Sources |
|---|---|---|---|
| _UID | E8F610A89D0EDB119522CC2348A4E540E492 |
Attributes
| Type | Value | Notes | Sources |
|---|---|---|---|
| _UID | E7F610A89D0EDB119522CC2348A4E540E382 |


I am currently studying statistics at Seoul National University and am part of Bayesian Statistics Lab ran by Prof. Jaeyong Lee. My research interest is in fast Bayesian computation using graphics processing units (GPUs).
Washington University is a special place for me as I was able to venture into diverse subjects of study and find what I love to do. During my study, I was able to discover my passion for numbers and models for explaining a various phenomenon of this world. Personally, I am grateful for the amazing people I met and the valuable experiences that shaped and molded me to be who I am.


Woman charged with threatening Caesars Entertainment lawyers
by Alexis EgelandA Las Vegas woman faces charges in connection with threatening letters mailed to her mother’s former supervisor at Planet Hollywood Resort and attorneys representing the resort’s parent company, court records show.
A federal grand jury indicted Latonia Smith, 25, on Wednesday on five counts of mailing threatening communications. According to court records, threatening letters were sent to her mother’s former supervisor and to attorneys defending a lawsuit against Caesars Entertainment Corp., Planet Hollywood’s parent company, between Sept. 30, 2018, and Oct. 1, 2019.
According to the indictment, one of the letters stated, “Your throat will be slit you will be recorded as the blood spills from your neck and just as you gasp to take your final undeserving breath three bullets will be placed right through your skull.”
This is a developing story. Check back for updates.


JavaScript is disabled on your browser.
Overview
Package
Class
Use
Tree
Deprecated
Index
Help
Prev Letter
Next Letter
Frames
No Frames
All Classes
A
B
C
D
E
F
G
H
I
K
L
M
O
P
R
S
T
U
V
W
D
DataBuffer
- Class in
controls.cslavemanagement
A DataBuffer is a storage structure used to keep some data which comes from network.
DataBuffer()
- Constructor for class controls.cslavemanagement.
DataBuffer
DataBuffer
- Class in
shared
DataBuffer(long[], long[], int, int)
- Constructor for class shared.
DataBuffer
DatasUpdater
- Class in
controls.cslavemanagement
DatasUpdater(SlaveManagementFacade)
- Constructor for class controls.cslavemanagement.
DatasUpdater
DefaultComparator
- Class in
cslave
DefaultComparator()
- Constructor for class cslave.
DefaultComparator
DelaysAverageDisplayer
- Class in
gui.panels.monitoring.delays
DelaysAverageDisplayer(SlaveManagementFacade)
- Constructor for class gui.panels.monitoring.delays.
DelaysAverageDisplayer
DelaysAveragesGraph
- Class in
gui.panels.monitoring.delays
DelaysAveragesGraph(SlaveManagementFacade, int)
- Constructor for class gui.panels.monitoring.delays.
DelaysAveragesGraph
DelaysInfosProvider
- Class in
gui.panels.monitoring.delays
DelaysInfosProvider(SlaveManagementFacade, int)
- Constructor for class gui.panels.monitoring.delays.
DelaysInfosProvider
DELETE_TYPE
- Static variable in class controls.protocols.ldap.
LDAPProtocolParser
deleteAction(ActionEvent)
- Method in class tools.widgets.ldap.
LDAPInstructionCreateCreator
deleteAction(ActionEvent)
- Method in class tools.widgets.ldap.
LDAPInstructionUpdateCreator
DEPLOY_CMD
- Static variable in class shared.
Constants
deployTest(AbstractMonitoredTest, String)
- Method in interface controls.cslavemanagement.interfaces.
ISlaveManagement
Deploys a test on slaves applications
deployTest(AbstractMonitoredTest, String)
- Method in class controls.cslavemanagement.
SlaveManagementFacade
deployTest(String)
- Method in interface controls.ctestplanmanagement.interfaces.
ITestPlanManagement
Deploys a test into slaves applications
deployTest(String)
- Method in class controls.ctestplanmanagement.
TestPlanManagementFacade
detectSlaves(String)
- Method in interface controls.cslavemanagement.interfaces.
ISlaveManagement
Detects slaves applications on network defined by ipAddress
detectSlaves(String)
- Method in class controls.cslavemanagement.
SlaveManagementFacade
A
B
C
D
E
F
G
H
I
K
L
M
O
P
R
S
T
U
V
W
Overview
Package
Class
Use
Tree
Deprecated
Index
Help
Prev Letter
Next Letter
Frames
No Frames
All Classes


Log In
Contact
About
HOME
FACULTIES
CAMPUS LIFE
ENROLL NOW
NEWS & MEDIA
PROGRAMMES
Application Form
Submit


--- layout: post esbma_id: 1576 title: Yours, Mine and Ours date: 2006-02-02 14:09:36 keywords: dev ---
For the last couple of years, I have been managing my weblog with a desktop content management tool called CityDesk, made by Fog Creek Software. This fine product has suited me very well. Most blogs serve their content with a scripting language, dynamically generating pages from a database, with all article editing taking place in a web browser. That approach doesn't work so well for me. First of all, I prefer to serve my content as static HTML. More importantly, I tend to write full-length articles, so I prefer to write my content in something stronger than an HTML textarea.
So for me, CityDesk is a good piece of software. It has templates and a basic scripting language and a simple built-in word processor and tools to manage my links.
However, I stopped using CityDesk a couple of months ago (Sorry Joel!). Sometime later in this article I intend to make some sort of a point, but for now I want to tell the story of the tool I now use to manage my weblog.
Like I said, CityDesk is great, but a few things about it kept bugging me:
So I decided to write my own content management tool. I call it ESBMA, which stands for "Eric Sink's Blog Management App". (The astute reader will realize now that this is not an article about how to choose cool names for products.)
ESBMA is 8,469 lines of C# code designed to manage a weblog exactly the way I want, including the following features:
For me, this is the best blogging tool in the world.
For anybody other than me, ESBMA is one of the worst pieces of software ever written:
So ESBMA has lots of problems, but they don't really bother me very much. Every once in a while I fix a bug. Mostly I just avoid them, since I know where they all are.
Actually, this is my third attempt to write my own blogging tool. The first two attempts failed because I took the time to consider the needs of other people. Instead of building the perfect tool just for ME, I got distracted thinking about how I could turn my blogging tool into a business venture.
This time I succeeded. I built a blogging tool which works perfectly for me. It won't work for anybody else. For other people, it is not merely "user unfriendly", it is "user hostile".
My blogging tool is an example of "MeWare".
I claim here that there are three categories of software:
For completeness, I suppose I should probably mention the obvious fourth category:
Coming up with examples of NobodyWare will be left as an exercise for the reader. :-)
As I said, ESBMA is an example of MeWare. I wrote it "just for me". I have no other users, therefore I have none of the challenges which arise when developing software for other people.
I consider the concept of MeWare to be somewhat new. Simply put, MeWare happens today because today's developer tools are so amazing. I would never have written ESBMA if I had to do it in C against the Win32 API.
Software development is really expensive. Typically, the costs of developing software are recovered by convincing lots of people to use it and collecting money from [or through] those users [directly or indirectly]. When software is developed for a single user, the opportunities to recover the development costs are dramatically reduced.
So MeWare only makes sense when the development costs are very low. I was able to create ESBMA for myself because coding with C# and Visual Studio is an extremely productive experience.
In contrast to ESBMA, its predecessor CityDesk is an example of UsWare. CityDesk is a shrinkwrap product of Fog Creek. It was developed by Joel Spolsky. He uses it to maintain his website. Other people use it too.
To any objective eye, the difference between CityDesk and ESBMA is obvious. CityDesk is polished and easy to use. ESBMA is user hostile, sometimes gratuitously so.
At this point some reader who is familiar with CityDesk is screaming, "Wait! You can't use CityDesk as an example of a good product. CityDesk is a failed product. Joel hasn't released a new version in 42 years and he never responds to questions about it anymore!"
OK, fine. Joel himself seems to admit that CityDesk hasn't been the big seller he hoped it might be. However, the success or failure of CityDesk isn't relevant to my point.
Which reminds me, I promised you I would make a point, didn't I? OK, here it is:
The
gap between developer and user can be enormous.
It's a canyon, and it takes serious effort to cross it.
If in fact CityDesk is to be considered an unsuccessful product, I claim that its failure is an issue of marketing, not an issue of product quality. People who use CityDesk love it. It is elegant and extremely easy to use. I daresay it is the leading application in its market niche. The problem is that there just aren't very many people in that niche. In the world of content management, the war between Web-based solutions and thick clients is over -- the Web apps won. There just aren't many people like me who want a single user desktop content management system that generates static HTML.
In other words, CityDesk did a great job crossing the canyon, only to find out that there weren't very many people standing over there.
Consider what would happen if I decided to take ESBMA up to the next level, across the canyon, from MeWare to UsWare. I would have to make it work as well for other people as it works for me. I would have to fix all the problems described above, plus dozens more I didn't even mention. Off the cuff, I estimate that an UsWare version of my blogging app would be ten times more effort than the MeWare version I have now.
And of course, it would be marketing suicide, since I would be competing with the well established CityDesk for the affections of the six remaining people on earth who care about apps like this.
So let's face it -- MeWare isn't actually very interesting. Aside from the occasional outlier like myself, nobody is developing MeWare. All of us are developing software on behalf of other people. Whether your software is commercial or open source, it's all about the users.
Why do we develop software for other people? Because they need software, and they are not developing it for themselves, for only two reasons I can think of:
In either case, the users are expecting us to create software on their behalf. They expect us to see things from their perspective, to value the things that they think are important.
This is hard.
The detachment between developer and user is greatest in the case of ThemWare. I create software. Somebody else uses it. I do not.
This creates three challenges that I want to highlight:
In this situation, I work all day creating dialog boxes and toolbars, but I don't actually know what to do with them.
Several years ago I worked as a developer of data visualization tools for scientists. Our software could take data and create pretty pictures like contour plots and line graphs and colorized grids. I took physics and chemistry in college, but that doesn't make me a scientist. I really never knew how to use the software I was developing. I could tell you the arcane details of how our macro language worked, but I couldn't tell you what a Fast Fourier Transform is. I still can't. So I could never make our software do anything interesting, but our customers could make amazing pictures with it.
The people who use my software are not like me. They're in another field. I'm a software programmer, but those people were trained in auto mechanics or interior decorating or dentistry. I don't know how they see the world. Understanding their perspective doesn't come naturally for me at all.
I can illustrate this situation with a real-life example that I face quite regularly. The SourceGear web site has a "store" which allows our customers to purchase licenses for our products. This store is a piece of software, and I am the developer responsible for it. However, I never actually use it. Obviously I never buy a copy of my own software. (I was tempted to once. It was the last day of the month and our sales were about a hundred bucks shy of our monthly goal. I was so tempted to whip out my credit card and place an order for one copy of Vault.)
Anyway, this store is ThemWare, and I don't think I understand Them. We sell our products to developers, and I understand developers just fine. But many companies funnel all purchasing through a department which is dedicated to that purpose. Apparently there is some sort of impedance mismatch between me and the folks in those purchasing departments, because people keep coming to our store and buying the wrong thing.
One of our products is called SourceOffSite. The current version is 4.1, but we do still continue to sell the 3.5 version for people who prefer not to upgrade. (Starting with version 4.0, the SourceOffSite requires the .NET Framework, and not everybody wants to install it.) Anyway, version 4.1 and version 3.5 require different kind of serial numbers. When you come to our store, it's important that you buy the correct version.
So the store tries very hard explain the situation. The information is at the top of the order form. In red. After you fill out the order form, you are reminded again, just to be sure.
But so far, the canyon between me and Them still looks big. We get email basically every day from somebody who just bought SourceOffSite and then discovered that their newly purchased 4.1 serial number will not work with their 3.5 server. It is only a slight exaggeration to say that everybody who comes to buy 3.5 licenses does it wrong.
My next version of the SourceGear store needs to have an additional verification step for people in purchasing departments who are trying to buy SourceOffSite. When the purchaser places an order for SourceOffSite, they will see a message like this:
Please go ask the developer to confirm which version they want.
To prove that you actually spoke with a developer, ask them for the answer to the following question:
• "Virtual memory" is:
1. An upcoming technology for recording TV shows
2. A feature of your computer
3. A piece of jargon from Star Trek
There are six billion people on the planet. I can't be expected to be fond of all of them.
I am one of the few software developers in central Illinois who does not work for State Farm Insurance. State Farm is one of the largest insurance companies in the world. Their headquarters is in Bloomington, just an hour or so down the road from us here in Champaign.
The sheer size of State Farm is simply amazing. This company is monstrous, like the Borg from Star Trek, assimilating every IT resource in the area. They employ thousands upon thousands of programmers, all of whom are busily working on software which will be distributed to countless insurance agent drones scattered all over the nation.
Even though Bloomington is a small city of perhaps 100,000 people, Microsoft has an office in Bloomington because State Farm is their largest non-government customer.
I can't imagine working at State Farm. I don't even like insurance agents. Every day I would go to the office and build software to help insurance agents be more efficient in their ongoing efforts to annoy me.
The temptation for sabotage would be overwhelming.
In terms of the size of the canyon, ThemWare is probably the worst possible scenario. If I am building software that I don't use and don't know how to use for people I don't understand or even like, how good is my software going to be?
I probably see every feature in terms of how difficult it will be to implement, rather than how valuable it will be for my users.
I probably find myself wanting to label or document the features using my jargon instead of theirs.
I probably create features that are tedious or unintuitive for my users. I can't imagine why the user interface I designed doesn't make sense to them.
ThemWare is hard.
The situation with UsWare isn't quite as bad. I create software. Other people use it. So do I.
Unlike the situation with ThemWare, I as a developer actually have at least one thing in common with my users: We both use my software. This suggests that we probably have even more things in common. Perhaps we can even understand each other.
The common expression for using your own software is "eating your own dogfood". Sometimes this term gets verbed by simply calling it "dogfooding".
If you'll indulge me briefly, I'd like to tell you what I think is the best dogfooding story ever. However, it's not a software story. It's a woodworking story.
The primary machine tool in any well-equipped woodshop is a table saw. Basically, it's a polished cast iron table with a slot through which protrudes a circular saw blade, ten inches in diameter. Wood is cut by sliding it across the table into the spinning blade.
A table saw is an extremely dangerous tool. My saw can cut a 2-inch thick piece of hard maple with no effort at all. Frankly, it's a tool which should only be used by someone who is a little bit afraid of it. It should be obvious what would happen if a finger ever came in contact with the spinning blade. Over 3,000 people each year lose a finger in an accident with a table saw.
A guy named Stephen Gass has come up with an amazing solution to this problem. He is a woodworker, but he also has a PhD in physics. His technology is called Sawstop. It consists of two basic inventions:
The videos of this product are amazing. Slide a piece of wood into the spinning blade, and it cuts the board just like it should. Slide a hot dog into the spinning blade, and it stops instantly, leaving the frankfurter with nothing more than a nick.
Here's the spooky part: Stephen Gass tested his product on his own finger! This is a guy who really wanted to close the distance between him and his customers. No matter how much I believed in my product, I think I would find it incredibly difficult to stick my finger in a spinning table saw blade. Unbelievable!
I think dogfooding is one of the most important things a developer can do. Nothing gets you closer to the perspective of your users than becoming one of them. But UsWare still has challenges.
Recently, this very issue has been discussed with respect to Microsoft's dogfooding of Team System. People wonder if Microsoft is going to end up creating a set of developer tools that are useful only for software companies. This is a valid concern. There are far more companies out there that produce software simply as a means toward producing something else, like jets or laundry detergent. Those companies probably don't work exactly the way software companies do.
With UsWare, there is a tendency to get stuck in the following path of logic:
I have this problem with the SourceGear DiffMerge tool that comes bundled with Vault. This app can be used to help perform a three-way merge. The basic operation is fairly complex, so the tool needs to do a great job presenting a user interface which is easy to understand. Apparently, it does not.
I helped designed the tool, so it always makes perfect sense to me. So, when users have trouble understanding it, I have a tendency to suddenly become Basil Fawlty, the rude English hotel manager played by John Cleese:
User: I don't get it.
Basil Fawlty: It's perfectly simple. There are three files being displayed on your screen and we shouldn't have to label which one is which because it seems perfectly obvious to us and so it is not the software which is defective here but rather, its user. Thank you so much, good day.
Unfortunately, very shortly after this happened the first time, one of SourceGear's developers walked into my office:
SourceGear Developer: Hey Eric, you know that DiffMerge tool we ship? I don't get it.
Basil Fawlty: Right! Apparently I'm the one who is defective here then. Manuel!
It is more or less impossible for me to design a user interface that I don't understand, but it is all too simple for me to design one that other people don't understand.
Another problem with UsWare is the case where I the developer design and optimize features for the way I use them, forgetting the my users might be using them differently. For an example of this, I'm going to switch places and cite a case where I am the user.
My favorite email client is Mozilla Thunderbird. I like it very much, except I wish that flagged messages would work the way they do in Outlook. Every time I see a new release, I have high hopes that flagged messages will finally work the way I expect. Last week I upgraded to the new 1.5 release, and once again, I was disappointed. Thunderbird supports flags, but it cannot search for flagged messages or filter views with flag as one of the criteria.
Bottom line: Thunderbird has flags, but they seem to be mostly for show. They look nice, but they aren't very useful.
I assume that Thunderbird is UsWare. In other words, I assume that all Thunderbird developers actually use Thunderbird as their mail client. I am forced to conclude that the Thunderbird developers just don't use flags the way I do.
Let me tell you about another UsWare problem we've experienced at SourceGear. First, a little background:
Oversimplifying, there are basically two ways to use a version control system. You can use a standalone application, or, you can integrate the features directly into the Visual Studio IDE.
Here's the problem:
You see, I hate using source control integration within Visual Studio. Our product does include this feature, but I never use it. In fact, right now most of the people at SourceGear don't use it. However, a clear majority of our customers do. This little canyon causes problems.
Sometime in the last year or so, the painfully obvious truth hit me like a ton of bricks: Our users want integration. We have always explained things to our customers somewhat like this:
But this is exactly the opposite of what they want. Most people don't want a standalone source control application. Some of our customers have never even launched it. They just want source control features to show up in all the right places in their IDE. The key thing to notice is that IDE stands for Integrated Development Environment.
If you are reading this and wondering how I could miss something so obvious, then perhaps I have convinced you how easy it is to find a canyon between you and your users.
Here at SourceGear, most of us are software developers, and we use Visual Studio. We build version control tools for software developers, most of whom are using Visual Studio. Obviously, we eat our own dogfood by using our own product as our version control system for the entire team. Nobody could possibly be more similar to their customers than we are, right? :-)
I have known all along that most of our users want integration. But I guess I never let it really sink in. Sometimes my thoughts about our product strategy have been better aligned with the way I use the product, rather than with the way our customers use it.
Anyway, integration is getting a lot more air time among the developers at SourceGear.  We are trying to cross the canyon between us and people who only use our product within Visual Studio, and other IDEs as well:
We get it. A lot of our attention right now is being spent trying to make sure that people can enjoyably use Vault in the IDE they prefer.
And by the way, once we get the new Visual Studio integration client working, I will be using it.
And UsWare is hard because we keep assuming our users are exactly like us when they're not.
This is the point in the article when you are expecting me to suddenly reveal a pearl of great wisdom on how to solve these canyon problems.
Sorry, but our time is up. :-)
You see, this article is the essay version of a talk I am presenting to the Jacksonville .NET User Group. Right about now is the point where I will be out of time. If I had left time for a really good answer to this problem then I wouldn't have had time to for my John Cleese imitation, which I can assure you was far more effective in person than it was in print.
However, although I can't offer give a good answer to this problem, I have just enough time for something flippant and trite:
Listen to your users
And be transparent. Let yourself be accountable for listening to your users. The main reason SourceGear did a Dreamweaver plugin is because we have a public support forum where dozens of people asked us to do one. This is one of our most common feature requests. How could we ignore them?
Your users have things to say. Stop telling them how great your software is and listen to them tell you how to make it better.


Document layout analysis
Please use one of these files as input:'PNG','JPG','JPGE','PBM','PDF'
{{warning}}


In [1]: import pandas as pd In [2]: import matplotlib.pyplot as plt
For this tutorial, air quality data about \(NO_2\) and Particulate matter less than 2.5 micrometers is used, made available by openaq and downloaded using the py-openaq package. The air_quality_no2_long.csv" data set provides \(NO_2\) values for the measurement stations FR04014, BETR801 and London Westminster in respectively Paris, Antwerp and London.
air_quality_no2_long.csv"
In [3]: air_quality = pd.read_csv("data/air_quality_no2_long.csv") In [4]: air_quality = air_quality.rename(columns={"date.utc": "datetime"}) In [5]: air_quality.head() Out[5]: city country datetime location parameter value unit 0 Paris FR 2019-06-21 00:00:00+00:00 FR04014 no2 20.0 µg/m³ 1 Paris FR 2019-06-20 23:00:00+00:00 FR04014 no2 21.8 µg/m³ 2 Paris FR 2019-06-20 22:00:00+00:00 FR04014 no2 26.5 µg/m³ 3 Paris FR 2019-06-20 21:00:00+00:00 FR04014 no2 24.9 µg/m³ 4 Paris FR 2019-06-20 20:00:00+00:00 FR04014 no2 21.4 µg/m³
In [6]: air_quality.city.unique() Out[6]: array(['Paris', 'Antwerpen', 'London'], dtype=object)
I want to work with the dates in the column ‘datetime’ as datetime objects instead of plain text
In [7]: air_quality["datetime"] = pd.to_datetime(air_quality["datetime"]) In [8]: air_quality["datetime"] Out[8]: 0 2019-06-21 00:00:00+00:00 1 2019-06-20 23:00:00+00:00 2 2019-06-20 22:00:00+00:00 3 2019-06-20 21:00:00+00:00 4 2019-06-20 20:00:00+00:00 ... 2063 2019-05-07 06:00:00+00:00 2064 2019-05-07 04:00:00+00:00 2065 2019-05-07 03:00:00+00:00 2066 2019-05-07 02:00:00+00:00 2067 2019-05-07 01:00:00+00:00 Name: datetime, Length: 2068, dtype: datetime64[ns, UTC]
Initially, the values in datetime are character strings and do not provide any datetime operations (e.g. extract the year, day of the week,…). By applying the to_datetime function, pandas interprets the strings and convert these to datetime (i.e. datetime64[ns, UTC]) objects. In pandas we call these datetime objects similar to datetime.datetime from the standard library a Timestamp.
datetime
to_datetime
datetime64[ns, UTC]
datetime.datetime
Timestamp
Note
As many data sets do contain datetime information in one of the columns, pandas input function like read_csv and read_json can do the transformation to dates when reading the data using the parse_dates parameter with a list of the columns to read as Timestamp:
read_csv
read_json
parse_dates
pd.read_csv("../data/air_quality_no2_long.csv", parse_dates=["datetime"])
Why are these Timestamp objects useful. Let’s illustrate the added value with some example cases.
What is the start and end date of the time series data set working with?
In [9]: air_quality["datetime"].min(), air_quality["datetime"].max() Out[9]: (Timestamp('2019-05-07 01:00:00+0000', tz='UTC'), Timestamp('2019-06-21 00:00:00+0000', tz='UTC'))
Using Timestamp for datetimes enable us to calculate with date information and make them comparable. Hence, we can use this to get the length of our time series:
In [10]: air_quality["datetime"].max() - air_quality["datetime"].min() Out[10]: Timedelta('44 days 23:00:00')
The result is a Timedelta object, similar to datetime.timedelta from the standard Python library and defining a time duration.
Timedelta
datetime.timedelta
The main time related concepts of pandas are explained in Overview.
I want to add a new column to the dataframe containing only the month of the measurement
In [11]: air_quality["month"] = air_quality["datetime"].dt.month In [12]: air_quality.head() Out[12]: city country datetime location parameter value unit month 0 Paris FR 2019-06-21 00:00:00+00:00 FR04014 no2 20.0 µg/m³ 6 1 Paris FR 2019-06-20 23:00:00+00:00 FR04014 no2 21.8 µg/m³ 6 2 Paris FR 2019-06-20 22:00:00+00:00 FR04014 no2 26.5 µg/m³ 6 3 Paris FR 2019-06-20 21:00:00+00:00 FR04014 no2 24.9 µg/m³ 6 4 Paris FR 2019-06-20 20:00:00+00:00 FR04014 no2 21.4 µg/m³ 6
By using Timestamp objects for dates, a lot of time-related properties are provided by pandas. For example the month, but also year, weekofyear, quarter,… All of these properties are accessible by the dt accessor.
month
year
weekofyear
quarter
dt
An overview of the existing properties is given in Time/date components. More details about the dt accessor to return datetime like properties for the values of the Series are provided in .dt accessor.
What is the average \(NO_2\) concentration for each day of the week for each of the measurement locations?
In [13]: air_quality.groupby([air_quality["datetime"].dt.weekday, "location"])["value"].mean() Out[13]: datetime location 0 BETR801 27.875000 FR04014 24.856250 London Westminster 23.969697 1 BETR801 22.214286 FR04014 30.999359 ... 5 FR04014 25.266154 London Westminster 24.977612 6 BETR801 21.896552 FR04014 23.274306 London Westminster 24.859155 Name: value, Length: 21, dtype: float64
Remember the split-apply-combine pattern provided by groupby from the tutorial on statistics calculation? Here, we want to calculate a given statistic (e.g. mean \(NO_2\)) for each weekday and for each measurement location. To group on weekdays, we use the datetime property weekday (with Monday=0 and Sunday=6) of pandas Timestamp, which is also accessible by the dt accessor. The grouping on both locations and weekdays can be done to split the calculation of the mean on each of these combinations.
groupby
weekday
Danger
As we are working with a very short time series in these examples, the analysis does not provide a long-term representative result!
Plot the typical \(NO_2\) pattern during the day of our time series of all stations together. In other words, what is the average value for each hour of the day?
In [14]: fig, axs = plt.subplots(figsize=(12, 4)) In [15]: air_quality.groupby(air_quality["datetime"].dt.hour)["value"].mean().plot(kind='bar', rot=0, ax=axs) Out[15]: <matplotlib.axes._subplots.AxesSubplot at 0x7f2d0e537790> In [16]: plt.xlabel("Hour of the day"); # custom label for the x-axis using matplotlib In [17]: plt.ylabel("$NO_2\ (µg/m^3)$");
Similar to the previous case, we want to calculate a given statistic (e.g. mean \(NO_2\)) for each hour of the day and we can use the split-apply-combine approach again. For this case, the datetime property hour of pandas Timestamp, which is also accessible by the dt accessor.
hour
In the tutorial on reshaping, pivot was introduced to reshape the data table with each of the measurements locations as a separate column:
pivot
In [18]: no_2 = air_quality.pivot(index="datetime", columns="location", values="value") In [19]: no_2.head() Out[19]: location BETR801 FR04014 London Westminster datetime 2019-05-07 01:00:00+00:00 50.5 25.0 23.0 2019-05-07 02:00:00+00:00 45.0 27.7 19.0 2019-05-07 03:00:00+00:00 NaN 50.4 19.0 2019-05-07 04:00:00+00:00 NaN 61.9 16.0 2019-05-07 05:00:00+00:00 NaN 72.4 NaN
By pivoting the data, the datetime information became the index of the table. In general, setting a column as an index can be achieved by the set_index function.
set_index
Working with a datetime index (i.e. DatetimeIndex) provides powerful functionalities. For example, we do not need the dt accessor to get the time series properties, but have these properties available on the index directly:
DatetimeIndex
In [20]: no_2.index.year, no_2.index.weekday Out[20]: (Int64Index([2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, ... 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019], dtype='int64', name='datetime', length=1033), Int64Index([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ... 3, 3, 3, 3, 3, 3, 3, 3, 3, 4], dtype='int64', name='datetime', length=1033))
Some other advantages are the convenient subsetting of time period or the adapted time scale on plots. Let’s apply this on our data.
Create a plot of the \(NO_2\) values in the different stations from the 20th of May till the end of 21st of May
In [21]: no_2["2019-05-20" : "2019-05-21"].plot();
By providing a string that parses to a datetime, a specific subset of the data can be selected on a DatetimeIndex.
More information on the DatetimeIndex and the slicing by using strings is provided in Indexing.
Aggregate the current hourly time series values to the monthly maximum value in each of the stations.
In [22]: monthly_max = no_2.resample("M").max() In [23]: monthly_max Out[23]: location BETR801 FR04014 London Westminster datetime 2019-05-31 00:00:00+00:00 74.5 97.0 97.0 2019-06-30 00:00:00+00:00 52.5 84.7 52.0
A very powerful method on time series data with a datetime index, is the ability to resample time series to another frequency (e.g., converting secondly data into 5-minutely data).
resample
The resample method is similar to a groupby operation:
it provides a time-based grouping, by using a string (e.g. M, 5H,…) that defines the target frequency
M
5H
it requires an aggregation function such as mean, max,…
mean
max
An overview of the aliases used to define time series frequencies (alos called offset aliases) is given in Offset aliases.
When defined, the frequency of the time series is provided by the freq attribute:
freq
In [24]: monthly_max.index.freq Out[24]: <MonthEnd>
Make a plot of the daily median \(NO_2\) value in each of the stations.
In [25]: no_2.resample("D").mean().plot(style="-o", figsize=(10, 5)) Out[25]: <matplotlib.axes._subplots.AxesSubplot at 0x7f2d0e359f90>
More details on the power of time series resampling is provided in Resampling.
resampling
Valid date strings can be converted to datetime objects using to_datetime function or as part of read functions.
Datetime objects in pandas supports calculations, logical operations and convenient date-related properties using the dt accessor.
A DatetimeIndex contains these date-related properties and supports convenient slicing.
Resample is a powerful method to change the frequency of a time series.
Resample
More information on time series and date functionalities is given in Time series / date functionality.


Certificate
We hereby certify that
{{ data['name'].replace('"', '') }}
has attended Berlin Python Pizza 2019 and enjoyed it a lot


| rangeBetween {SparkR} | R Documentation |
Defines the frame boundaries, from start
(inclusive) to end
(inclusive).
rangeBetween(x, start, end) ## S4 method for signature 'WindowSpec,numeric,numeric' rangeBetween(x, start, end)
x |
a WindowSpec |
start |
boundary start, inclusive. The frame is unbounded if this is the minimum long value. |
end |
boundary end, inclusive. The frame is unbounded if this is the maximum long value. |
Both start
and end
are relative from the current row. For example, "0" means
"current row", while "-1" means one off before the current row, and "5" means the five off
after the current row.
We recommend users use Window.unboundedPreceding
, Window.unboundedFollowing
,
and Window.currentRow
to specify special boundary values, rather than using long values
directly.
A range-based boundary is based on the actual value of the ORDER BY expression(s). An offset is used to alter the value of the ORDER BY expression, for instance if the current ORDER BY expression has a value of 10 and the lower bound offset is -3, the resulting lower bound for the current row will be 10 - 3 = 7. This however puts a number of constraints on the ORDER BY expressions: there can be only one expression and this expression must have a numerical data type. An exception can be made when the offset is unbounded, because no value modification is needed, in this case multiple and non-numeric ORDER BY expression are allowed.
a WindowSpec
rangeBetween since 2.0.0
Other windowspec_method:
orderBy()
,
partitionBy()
,
rowsBetween()
## Not run:
##D id <- c(rep(1, 3), rep(2, 3), 3)
##D desc <- c('New', 'New', 'Good', 'New', 'Good', 'Good', 'New')
##D df <- data.frame(id, desc)
##D df <- createDataFrame(df)
##D w1 <- orderBy(windowPartitionBy('desc'), df$id)
##D w2 <- rangeBetween(w1, 0, 3)
##D df1 <- withColumn(df, "sum", over(sum(df$id), w2))
##D head(df1)
## End(Not run)


Google’s Material Design guidelines now identify components that are still in ‘Beta’
by Abner LiGoogle’s Material Design guidelines are a living document that updates over time. In order to be “more transparent about which components, patterns, and elements are likely to evolve in the near term,” the company’s design team is now applying a “beta” label.
Like in other areas, the beta label on design components are “subject to change.” That said, they are “still backed by research and careful consideration.” It comes as Google wants to “get new components into your hands faster and learn from how you use them.” There are two reasons for a spec to receive this classification:
- It hasn’t been fully engineered on enough of our platforms: Implementing new guidance on different platforms is an important part of finalizing the design. Material supports four platforms: Android, Flutter, iOS, and the web. Implementing a new component on one platform is a first step, but we want to address any concerns that come up as we implement across our other platforms.
- The underlying concept is still emerging: For example, machine learning is clearly changing the world, but design best practices are still taking shape. Our patterns for machine learning-powered features are a first attempt at helping designers grapple with certain use cases and situations. However, given the newness of machine learning in user interfaces, it’s crucial to acknowledge that the landscape is changing rapidly and our guidance might need significant updates to continue to work well.
The designation will be dropped when a design component is “implemented in code for multiple platforms or becomes a well-established pattern across several Google products.” Currently, seven Material Design components, design elements, and UI patterns are in beta:
- Backdrop
- Side sheet
- Data visualization
- Applying density
- Customizing motion
- Object detection: Live camera
- Object detection: Static image
- Barcode scanning
FTC: We use income earning auto affiliate links. More.


<relcell>
The <relcell>
element defines a cell in the relationship table
(<reltable>
). The <topicref>
elements that it
contains are related to the <topicref>
elements in other cells of the
same row. By default, topics or resources that are referenced in the same cell are not
related to each other, unless you change the @collection-type
attribute of the
<relcell>
to indicate that they are related.
Category: Basic map elements


CSS by Chandler
Not CSS ,yes CSS position, not CSS
Not CSS ,yes CSS border, not CSS
Not cool Rightio not cool again
Hover over me
Tooltip text
Display links as block elements:
HTML
CSS
JavaScript
Using CSS Counters:
HTML Tutorial
CSS Tutorial
JavaScript Tutorial