|
iSensor-SPI-Buffer
1.15
Firmware for the iSensor-SPI-Buffer board to enable full throughput buffered data capture on Analog Devices IMUs
|
iSensor-SPI-Buffer register interfacing module. Called by user SPI and USB CLI More...
#include "usb.h"
#include "reg.h"
#include "imu.h"
#include "sd_card.h"
#include "buffer.h"
#include "flash.h"
#include "data_capture.h"
#include "user_spi.h"
#include "dfu.h"
#include "dio.h"
#include "timer.h"
#include "user_interrupt.h"
#include "isr.h"
Functions | |
| static uint16_t | ProcessRegWrite (uint8_t regAddr, uint8_t regValue) |
| Process a write to the iSensor-SPI-Buffer registers. More... | |
| static void | GetSN () |
| Populates the six SN registers automatically. More... | |
| static void | GetBuildDate () |
| Populates the firmware date registers automatically. More... | |
| volatile uint16_t g_regs[NUM_REG_PAGES *REG_PER_PAGE] | __attribute__ ((aligned(32))) |
| bool | Reg_Is_Burst_Read (uint8_t addr) |
| Check if the requested read is a start of a burst. More... | |
| void | Reg_Init () |
| Initialize the register module by loading all saves values from flash. More... | |
| void | Reg_Update_Identifiers () |
| Load SN and date code registers to SRAM. More... | |
| void | Reg_Buf_Dequeue_To_Outputs () |
| Dequeues an entry from the buffer and loads it to the primary output registers. More... | |
| uint16_t | Reg_Read (uint8_t regAddr) |
| Process a register read request (from master) More... | |
| uint16_t | Reg_Write (uint8_t regAddr, uint8_t regValue) |
| Process a register write request (from master) More... | |
| void | Reg_Process_Command () |
| Processes a command register write. This function is called from main loop. More... | |
| void | Reg_Factory_Reset () |
| Load factory default values for all registers, and applies any settings changes. More... | |
| void | Reg_Button_Handler () |
| Handler for when the user button is pressed. More... | |
Variables | |
| volatile uint32_t | g_update_flags = 0 |
| volatile uint16_t * | g_CurrentBufEntry |
| static volatile uint32_t | selected_page = BUF_CONFIG_PAGE |
iSensor-SPI-Buffer register interfacing module. Called by user SPI and USB CLI
Copyright (c) Analog Devices Inc, 2020 All Rights Reserved.
| volatile uint16_t g_regs [NUM_REG_PAGES * REG_PER_PAGE] __attribute__ | ( | (aligned(32)) | ) |
iSensor-SPI-Buffer global register array (read-able via SPI). Global scope
|
static |
Populates the firmware date registers automatically.
Registers are populated by parsing the DATE macro result, which is set at compile time
|
static |
Populates the six SN registers automatically.
The SN registers are populated from the 96-bit unique ID (UID)
|
static |
Process a write to the iSensor-SPI-Buffer registers.
This function handles filtering for read-only registers. It also handles setting the deferred processing flags as needed for any config/command register writes. This are processed on the next pass of the main loop.
| void Reg_Buf_Dequeue_To_Outputs | ( | ) |
Dequeues an entry from the buffer and loads it to the primary output registers.
This function is called from the main loop to preserve SPI responsiveness while a buffer entry is being dequeued into the output registers. This allows a user to read the buffer contents while the values are being moved (if they start reading at buffer entry 0). After moving all values to the correct location in the output register array, the function sets up the burst read DMA (if enabled in user SPI config).
| void Reg_Button_Handler | ( | ) |
Handler for when the user button is pressed.
This function executes commands based on the button configuration set in BTN_CONFIG. This function can be called from an interrupt context (EXTI rising edge interrupt for button). The EXTI pending interrupt register for the button line should be cleared before and after executing this function to add some implicit debouncing (interrupt won't trigger, then immediately trigger again).
| void Reg_Factory_Reset | ( | ) |
Load factory default values for all registers, and applies any settings changes.
This is accomplished in "lazy" manner via a preprocessor define for each register default value (defaults are stored in program memory, storage is managed by compiler). This function only changes values in SRAM, does not change flash contents (registers will reset on next re-boot).
| void Reg_Init | ( | ) |
Initialize the register module by loading all saves values from flash.
Most register values are loaded directly from the flash register array. Some values (SN and FW date) are encoded into the code, and must be loaded separately using Update_Identifiers()
| bool Reg_Is_Burst_Read | ( | uint8_t | addr | ) |
Check if the requested read is a start of a burst.
For a burst to start, the buffer read page must be selected, the address must be BUF_RETRIEVE, and buffer burst mode must be enabled.
| void Reg_Process_Command | ( | ) |
Processes a command register write. This function is called from main loop.
Only one command can be executed per write to the USER_COMMAND register. Command execution priority is determined by the order in which the command flags are checked.
| uint16_t Reg_Read | ( | uint8_t | regAddr | ) |
Process a register read request (from master)
| regAddr | The byte address of the register to read |
For selected pages not addressed by iSensor-SPI-Buffer, the read is passed through to the connected IMU, using the spi_passthrough module. If the selected page is [253 - 255] this read request is processed directly.
| void Reg_Update_Identifiers | ( | ) |
Load SN and date code registers to SRAM.
These register values are encoded into the .text section of flash
| uint16_t Reg_Write | ( | uint8_t | regAddr, |
| uint8_t | regValue | ||
| ) |
Process a register write request (from master)
| regAddr | The address of the register to write to |
| regValue | The value to write to the register |
For selected pages not addressed by iSensor-SPI-Buffer, the write is passed through to the connected IMU, using the spi_passthrough module. If the selected page is [252 - 255] this write request is processed directly. The firmware echoes back the processed write value so that the master can verify the write contents on the next SPI transaction.
| volatile uint16_t* g_CurrentBufEntry |
Pointer to buffer entry. Will be 0 if no buffer entry "loaded" to output registers
| volatile uint32_t g_update_flags = 0 |
Register update flags for main loop processing. Global scope
|
static |
Selected page. Starts on 253 (config page)


|
||||||||||
| PREV NEXT | FRAMES NO FRAMES |
| Packages that use ActionInvocation | |
|---|---|
| com.opensymphony.xwork2 | Main Xwork interfaces and classes. |
| com.opensymphony.xwork2.interceptor | Interceptor classes. |
| com.opensymphony.xwork2.interceptor.annotations | Interceptor annotations. |
| com.opensymphony.xwork2.mock | XWork specific mock classes. |
| com.opensymphony.xwork2.spring.interceptor | Spring specific interceptor classes. |
| com.opensymphony.xwork2.validator | XWork validation subsystem. |
| org.apache.struts2.config | Classes for Struts configuration and property handling. |
| org.apache.struts2.dispatcher | Classes for action dispatching in Struts (the Controller part of MVC). |
| org.apache.struts2.interceptor | Web specific interceptor classes. |
| org.apache.struts2.interceptor.debugging | |
| org.apache.struts2.interceptor.validation | |
| org.apache.struts2.portlet.interceptor | |
| org.apache.struts2.portlet.result | |
| org.apache.struts2.util | Miscellaneous helper classes. |
| org.apache.struts2.validators | |
| org.apache.struts2.views.freemarker | Classes for views using FreeMarker. |
| org.apache.struts2.views.xslt | The new xslt view supports an extensible Java XML adapter framework that makes it easy to customize the XML rendering of objects and to incorporate structured XML text and arbitarary DOM fragments into the output. |
| Uses of ActionInvocation in com.opensymphony.xwork2 |
|---|
| Classes in com.opensymphony.xwork2 that implement ActionInvocation | |
|---|---|
class |
DefaultActionInvocation
The Default ActionInvocation implementation |
| Fields in com.opensymphony.xwork2 declared as ActionInvocation | |
|---|---|
protected ActionInvocation |
DefaultActionProxy.invocation
|
| Methods in com.opensymphony.xwork2 that return ActionInvocation | |
|---|---|
ActionInvocation |
ActionContext.getActionInvocation()
Gets the action invocation (the execution state). |
ActionInvocation |
ActionProxy.getInvocation()
|
ActionInvocation |
DefaultActionProxy.getInvocation()
|
| Methods in com.opensymphony.xwork2 with parameters of type ActionInvocation | |
|---|---|
void |
ActionChainResult.execute(ActionInvocation invocation)
|
void |
Result.execute(ActionInvocation invocation)
Represents a generic interface for all action execution results, whether that be displaying a webpage, generating an email, sending a JMS message, etc. |
void |
ActionContext.setActionInvocation(ActionInvocation actionInvocation)
Sets the action invocation (the execution state). |
| Uses of ActionInvocation in com.opensymphony.xwork2.interceptor |
|---|
| Methods in com.opensymphony.xwork2.interceptor with parameters of type ActionInvocation | |
|---|---|
protected boolean |
MethodFilterInterceptor.applyInterceptor(ActionInvocation invocation)
|
void |
PreResultListener.beforeResult(ActionInvocation invocation,
String resultCode)
This callback method will be called after the Action execution and before the Result execution. |
protected String |
DefaultWorkflowInterceptor.doIntercept(ActionInvocation invocation)
Intercept ActionInvocation and returns a inputResultName
when action / field errors is found registered. |
protected abstract String |
MethodFilterInterceptor.doIntercept(ActionInvocation invocation)
Subclasses must override to implement the interceptor logic. |
protected Object |
ConversionErrorInterceptor.getOverrideExpr(ActionInvocation invocation,
Object value)
|
abstract String |
AbstractInterceptor.intercept(ActionInvocation invocation)
Override to handle interception |
String |
AliasInterceptor.intercept(ActionInvocation invocation)
|
String |
ChainingInterceptor.intercept(ActionInvocation invocation)
|
String |
ConversionErrorInterceptor.intercept(ActionInvocation invocation)
|
String |
ExceptionMappingInterceptor.intercept(ActionInvocation invocation)
|
String |
I18nInterceptor.intercept(ActionInvocation invocation)
|
String |
Interceptor.intercept(ActionInvocation invocation)
Allows the Interceptor to do some processing on the request before and/or after the rest of the processing of the request by the ActionInvocation or to short-circuit the processing and just return a String return code. |
String |
LoggingInterceptor.intercept(ActionInvocation invocation)
|
String |
MethodFilterInterceptor.intercept(ActionInvocation invocation)
|
String |
ModelDrivenInterceptor.intercept(ActionInvocation invocation)
|
String |
ParameterFilterInterceptor.intercept(ActionInvocation invocation)
|
String |
ParameterRemoverInterceptor.intercept(ActionInvocation invocation)
Decide if the parameter should be removed from the parameter map based on paramNames and paramValues . |
String |
ParametersInterceptor.intercept(ActionInvocation invocation)
|
String |
PrepareInterceptor.intercept(ActionInvocation invocation)
|
String |
ScopedModelDrivenInterceptor.intercept(ActionInvocation invocation)
|
String |
StaticParametersInterceptor.intercept(ActionInvocation invocation)
|
String |
TimerInterceptor.intercept(ActionInvocation invocation)
|
static void |
PrefixMethodInvocationUtil.invokePrefixMethod(ActionInvocation actionInvocation,
String[] prefixes)
This method will prefix actionInvocation 's ActionProxy 's
method with prefixes before invoking the prefixed method. |
protected String |
TimerInterceptor.invokeUnderTiming(ActionInvocation invocation)
Is called to invoke the action invocation and time the execution time. |
private void |
LoggingInterceptor.logMessage(ActionInvocation invocation,
String baseMessage)
|
protected void |
ExceptionMappingInterceptor.publishException(ActionInvocation invocation,
ExceptionHolder exceptionHolder)
Default implementation to handle ExceptionHolder publishing. |
protected void |
I18nInterceptor.saveLocale(ActionInvocation invocation,
Locale locale)
Save the given locale to the ActionInvocation. |
| Uses of ActionInvocation in com.opensymphony.xwork2.interceptor.annotations |
|---|
| Methods in com.opensymphony.xwork2.interceptor.annotations with parameters of type ActionInvocation | |
|---|---|
void |
AnnotationWorkflowInterceptor.beforeResult(ActionInvocation invocation,
String resultCode)
Invokes any @BeforeResult annotated methods |
String |
AnnotationWorkflowInterceptor.intercept(ActionInvocation invocation)
Discovers annotated methods on the action and calls them according to the workflow |
| Uses of ActionInvocation in com.opensymphony.xwork2.mock |
|---|
| Classes in com.opensymphony.xwork2.mock that implement ActionInvocation | |
|---|---|
class |
MockActionInvocation
Mock for an ActionInvocation . |
| Fields in com.opensymphony.xwork2.mock declared as ActionInvocation | |
|---|---|
(package private) ActionInvocation |
MockActionProxy.invocation
|
| Methods in com.opensymphony.xwork2.mock that return ActionInvocation | |
|---|---|
ActionInvocation |
MockActionProxy.getInvocation()
|
| Methods in com.opensymphony.xwork2.mock with parameters of type ActionInvocation | |
|---|---|
void |
MockResult.execute(ActionInvocation invocation)
|
String |
MockInterceptor.intercept(ActionInvocation invocation)
Allows the Interceptor to do some processing on the request before and/or after the rest of the processing of the request by the DefaultActionInvocation or to short-circuit the processing and just return a String return code. |
void |
MockActionProxy.setInvocation(ActionInvocation invocation)
|
| Uses of ActionInvocation in com.opensymphony.xwork2.spring.interceptor |
|---|
| Methods in com.opensymphony.xwork2.spring.interceptor with parameters of type ActionInvocation | |
|---|---|
String |
ActionAutowiringInterceptor.intercept(ActionInvocation invocation)
Looks for the ApplicationContext under the attribute that the Spring listener sets in
the servlet context. |
| Uses of ActionInvocation in com.opensymphony.xwork2.validator |
|---|
| Methods in com.opensymphony.xwork2.validator with parameters of type ActionInvocation | |
|---|---|
protected void |
ValidationInterceptor.doBeforeInvocation(ActionInvocation invocation)
Gets the current action and its context and calls DefaultActionValidatorManager.validate(Object, String) . |
protected String |
ValidationInterceptor.doIntercept(ActionInvocation invocation)
|
| Uses of ActionInvocation in org.apache.struts2.config |
|---|
| Methods in org.apache.struts2.config with parameters of type ActionInvocation | |
|---|---|
void |
NullResult.execute(ActionInvocation invocation)
|
| Uses of ActionInvocation in org.apache.struts2.dispatcher |
|---|
| Methods in org.apache.struts2.dispatcher with parameters of type ActionInvocation | |
|---|---|
protected String |
StrutsResultSupport.conditionalParse(String param,
ActionInvocation invocation)
Parses the parameter for OGNL expressions against the valuestack |
void |
VelocityResult.doExecute(String finalLocation,
ActionInvocation invocation)
Creates a Velocity context from the action, loads a Velocity template and executes the template. |
protected abstract void |
StrutsResultSupport.doExecute(String finalLocation,
ActionInvocation invocation)
Executes the result given a final location (jsp page, action, etc) and the action invocation (the state in which the action was executed). |
protected void |
StreamResult.doExecute(String finalLocation,
ActionInvocation invocation)
|
protected void |
ServletRedirectResult.doExecute(String finalLocation,
ActionInvocation invocation)
Redirects to the location specified by calling HttpServletResponse.sendRedirect(String) . |
void |
ServletDispatcherResult.doExecute(String finalLocation,
ActionInvocation invocation)
Dispatches to the given location. |
protected void |
PlainTextResult.doExecute(String finalLocation,
ActionInvocation invocation)
|
void |
StrutsResultSupport.execute(ActionInvocation invocation)
Implementation of the execute method from the Result interface. |
void |
ServletActionRedirectResult.execute(ActionInvocation invocation)
|
void |
HttpHeaderResult.execute(ActionInvocation invocation)
Sets the optional HTTP response status code and also re-sets HTTP headers after they've been optionally evaluated against the ValueStack. |
protected org.apache.velocity.Template |
VelocityResult.getTemplate(ValueStack stack,
org.apache.velocity.app.VelocityEngine velocity,
ActionInvocation invocation,
String location,
String encoding)
Given a value stack, a Velocity engine, and an action invocation, this method returns the appropriate Velocity template to render. |
| Uses of ActionInvocation in org.apache.struts2.interceptor |
|---|
| Fields in org.apache.struts2.interceptor declared as ActionInvocation | |
|---|---|
protected ActionInvocation |
BackgroundProcess.invocation
|
| Methods in org.apache.struts2.interceptor that return ActionInvocation | |
|---|---|
ActionInvocation |
BackgroundProcess.getInvocation()
Retrieves the action invocation. |
| Methods in org.apache.struts2.interceptor with parameters of type ActionInvocation | |
|---|---|
protected void |
ScopeInterceptor.after(ActionInvocation invocation,
String result)
|
protected void |
MessageStoreInterceptor.after(ActionInvocation invocation,
String result)
Handle the storing of field errors / action messages / field errors, which is done after action invocation, and the operationMode is in 'STORE'. |
protected void |
ScopeInterceptor.before(ActionInvocation invocation)
|
protected void |
MessageStoreInterceptor.before(ActionInvocation invocation)
Handle the retrieving of field errors / action messages / field errors, which is done before action invocation, and the operationMode is 'RETRIEVE'. |
void |
ScopeInterceptor.beforeResult(ActionInvocation invocation,
String resultCode)
|
protected String |
TokenInterceptor.doIntercept(ActionInvocation invocation)
|
protected String |
ExecuteAndWaitInterceptor.doIntercept(ActionInvocation actionInvocation)
|
private String |
ScopeInterceptor.getKey(ActionInvocation invocation)
|
protected BackgroundProcess |
ExecuteAndWaitInterceptor.getNewBackgroundProcess(String name,
ActionInvocation actionInvocation,
int threadPriority)
Creates a new background process |
protected Object |
StrutsConversionErrorInterceptor.getOverrideExpr(ActionInvocation invocation,
Object value)
|
protected String |
MessageStoreInterceptor.getRequestOperationMode(ActionInvocation invocation)
Get the operationMode through request paramter, if allowRequestParameterSwitch
is 'true', else it simply returns 'NONE', meaning its neither in the 'STORE_MODE' nor
'RETRIEVE_MODE'. |
protected String |
TokenSessionStoreInterceptor.handleInvalidToken(ActionInvocation invocation)
|
protected String |
TokenInterceptor.handleInvalidToken(ActionInvocation invocation)
Determines what to do if an invalida token is provided. |
protected String |
RolesInterceptor.handleRejection(ActionInvocation invocation,
HttpServletResponse response)
Handles a rejection by sending a 403 HTTP error |
protected String |
TokenSessionStoreInterceptor.handleValidToken(ActionInvocation invocation)
|
protected String |
TokenInterceptor.handleValidToken(ActionInvocation invocation)
Called when a valid token is found. |
String |
ServletConfigInterceptor.intercept(ActionInvocation invocation)
Sets action properties based on the interfaces an action implements. |
String |
ScopeInterceptor.intercept(ActionInvocation invocation)
|
String |
RolesInterceptor.intercept(ActionInvocation invocation)
|
String |
ProfilingActivationInterceptor.intercept(ActionInvocation invocation)
|
String |
MessageStoreInterceptor.intercept(ActionInvocation invocation)
|
String |
FileUploadInterceptor.intercept(ActionInvocation invocation)
|
String |
CreateSessionInterceptor.intercept(ActionInvocation invocation)
|
String |
CheckboxInterceptor.intercept(ActionInvocation ai)
|
(package private) static void |
ScopeInterceptor.lock(Object o,
ActionInvocation invocation)
|
| Constructors in org.apache.struts2.interceptor with parameters of type ActionInvocation | |
|---|---|
BackgroundProcess(String threadName,
ActionInvocation invocation,
int threadPriority)
Constructs a background process |
| Uses of ActionInvocation in org.apache.struts2.interceptor.debugging |
|---|
| Methods in org.apache.struts2.interceptor.debugging with parameters of type ActionInvocation | |
|---|---|
String |
DebuggingInterceptor.intercept(ActionInvocation inv)
|
| Uses of ActionInvocation in org.apache.struts2.interceptor.validation |
|---|
| Methods in org.apache.struts2.interceptor.validation with parameters of type ActionInvocation | |
|---|---|
protected String |
AnnotationValidationInterceptor.doIntercept(ActionInvocation invocation)
|
| Uses of ActionInvocation in org.apache.struts2.portlet.interceptor |
|---|
| Methods in org.apache.struts2.portlet.interceptor with parameters of type ActionInvocation | |
|---|---|
String |
PortletPreferencesInterceptor.intercept(ActionInvocation invocation)
|
| Uses of ActionInvocation in org.apache.struts2.portlet.result |
|---|
| Methods in org.apache.struts2.portlet.result with parameters of type ActionInvocation | |
|---|---|
void |
PortletVelocityResult.doExecute(String location,
ActionInvocation invocation)
|
void |
PortletResult.doExecute(String finalLocation,
ActionInvocation actionInvocation)
Execute the result. |
private void |
PortletVelocityResult.executeActionResult(String location,
ActionInvocation invocation)
Executes the result |
protected void |
PortletResult.executeActionResult(String finalLocation,
ActionInvocation invocation)
Executes the action result. |
private void |
PortletResult.executeRegularServletResult(String finalLocation,
ActionInvocation actionInvocation)
Executes the regular servlet result. |
void |
PortletVelocityResult.executeRenderResult(String finalLocation,
ActionInvocation invocation)
Creates a Velocity context from the action, loads a Velocity template and executes the template. |
protected org.apache.velocity.Template |
PortletVelocityResult.getTemplate(ValueStack stack,
org.apache.velocity.app.VelocityEngine velocity,
ActionInvocation invocation,
String location,
String encoding)
Given a value stack, a Velocity engine, and an action invocation, this method returns the appropriate Velocity template to render. |
| Uses of ActionInvocation in org.apache.struts2.util |
|---|
| Fields in org.apache.struts2.util declared as ActionInvocation | |
|---|---|
(package private) ActionInvocation |
InvocationSessionStore.InvocationContext.invocation
|
| Methods in org.apache.struts2.util that return ActionInvocation | |
|---|---|
static ActionInvocation |
InvocationSessionStore.loadInvocation(String key,
String token)
Checks the Map in the Session for the key and the token. |
| Methods in org.apache.struts2.util with parameters of type ActionInvocation | |
|---|---|
static void |
InvocationSessionStore.storeInvocation(String key,
String token,
ActionInvocation invocation)
Stores the DefaultActionInvocation and ActionContext into the Session using the provided key for loading later using InvocationSessionStore.loadInvocation(java.lang.String, java.lang.String) |
| Constructors in org.apache.struts2.util with parameters of type ActionInvocation | |
|---|---|
InvocationSessionStore.InvocationContext(ActionInvocation invocation,
String token)
|
| Uses of ActionInvocation in org.apache.struts2.validators |
|---|
| Classes in org.apache.struts2.validators that implement ActionInvocation | |
|---|---|
static class |
DWRValidator.ValidatorActionInvocation
|
| Uses of ActionInvocation in org.apache.struts2.views.freemarker |
|---|
| Fields in org.apache.struts2.views.freemarker declared as ActionInvocation | |
|---|---|
protected ActionInvocation |
PortletFreemarkerResult.invocation
|
protected ActionInvocation |
FreemarkerResult.invocation
|
| Methods in org.apache.struts2.views.freemarker with parameters of type ActionInvocation | |
|---|---|
void |
PortletFreemarkerResult.doExecute(String location,
ActionInvocation invocation)
Execute this result, using the specified template location. |
void |
FreemarkerResult.doExecute(String location,
ActionInvocation invocation)
Execute this result, using the specified template location. |
private void |
PortletFreemarkerResult.executeActionResult(String location,
ActionInvocation invocation)
|
private void |
PortletFreemarkerResult.executeRenderResult(String location,
ActionInvocation invocation)
|
| Uses of ActionInvocation in org.apache.struts2.views.xslt |
|---|
| Methods in org.apache.struts2.views.xslt with parameters of type ActionInvocation | |
|---|---|
void |
XSLTResult.execute(ActionInvocation invocation)
|
|
||||||||||
| PREV NEXT | FRAMES NO FRAMES |


Kakamega Hombeoyz stun Mathare United
by JEFF KINYANJUIIn Summary
- The Slum Boys brought in John Mwangi for Clifford Alwanga in the 57th minute and the youngster pulled one back five minutes later, heading in Martin Ongori’s corner kick.
- Mathare coach Salim Ali brought in Tyson Otieno for defender Martin Ongori, an obvious attempt to improve the team’s attack.
Peter Thiongo grabbed a brace as visiting Kakamega Homeboyz beat 10-man Mathare United 3-1 in a Kenyan Premier League (KPL) match at the Kenyatta Stadium in Machakos on Friday afternoon.
The win takes Homeboyz to second on the log with 20 points from 11 matches while the Slum Boys are seventh with 17 points having played the same number of matches.
Mathare could have taken the lead in the seventh minute, but Clifford Alwanga’s header went wide after an inviting cross by James Kinyanjui.
Kakamega Homeboyz missed a clear cut chance at the half-hour mark, Moses Mudavadi heading wide after a good cross by David Okoth.
Four minutes later, former Nakuru All Stars forward Thiongo failed to tap the ball into an empty net after a good cut-back pass by Stephen Etyang, who had received a defence-splitting pass from Shami Kibwana.
Thiongo made amends just before the breather heading in Stephen Etyang’s cross from the right past Mathare custodian Job Ochieng to give the visitors the lead.
Second half
Thiongo doubled the lead in the 51st minute, tapping in a pass from the impressive Shami Kibwana and Etyang should have made it 3-0 two minutes later after a quick counter-attack, but his final shot went just inches wide.
The Slum Boys brought in John Mwangi for Clifford Alwanga in the 57th minute and the youngster pulled one back five minutes later, heading in Martin Ongori’s corner kick.
Mathare coach Salim Ali brought in Tyson Otieno for defender Martin Ongori, an obvious attempt to improve the team’s attack.
Homeboyz custodian Gabriel Andika made a brilliant double save in 72nd minute – first denying Kevin Kimani from close range and parrying away Andrew Juma’s header.
Mathare United midfielder Roy Okal was sent off in the 75th minute for a second bookable offense after tackling Thiongo from behind. Homeboyz made use of the numerical advantage and kept pressing the Slum Boys high and were rewarded again in the 81st minute, David Okoth capitalising on a goalmouth melee to slot the third for the visitors.


# OCR and AR in React Native February 13th, 2018. React Native Meetup Copenhagen. Founders House.
## Pedro Madruga * Software engineer (js) * Web and Mobile * Founder of [occam.ooo](https://occam.ooo) * [Podcaster](www.scopecreeperspodcast.com) * Co-organizer for RN Meetup Copenhagen * Volunteer * Copenhagen since 2012
## Today's menu 🍔 🍟 * OCR * Demo * AR * Demo (...in a prototype)
## OCR in React Native Optical Character Recognition ### What's out there for RN? * Tesseract * Google Cloud (Vision API) * ...
## React Native Tesseract OCR * Runs in iOS (somewhat officially) * Based on Tesseract-OCR-iOS * No language detection * Static trained data included * Hard to setup * Free
## Google Cloud Vision API * Easy to setup * Easy to use (POST w/ base64) * Rich Response * Language detection * Paid
```javascript export const getURL = `https://vision.googleapis.com/v1/images:annotate?key=${GOOGLE_CLOUD_KEY}`; export const getTextRequestBody = image => ({ method: 'POST', body: JSON.stringify({ requests: [ { image: { content: image }, features: [ { type: 'TEXT_DETECTION' } ] } ] }) }); ```
# STOP Demo time
## ARKit in React Native * React Native ARKit * Expo AR (three.js) * React ARKit * Viro
## React Native ARkit * (Relatively) easy setup * Works... * ... using other library than React-Native Camera * Debugging?
# STOP Demo time
# Thank you * www.pedromadruga.com * twitter.com/thepedromadruga


|
Team 302 Robot
|
#include <DragonLimelight.h>
Public Types | |
| enum | LED_MODE { LED_DEFAULT, LED_OFF, LED_BLINK, LED_ON } |
| enum | CAM_MODE { CAM_VISION, CAM_DRIVER } |
| enum | STREAM_MODE { STREAM_DEFAULT, STREAM_MAIN_AND_SECOND, STREAM_SECOND_AND_MAIN } |
| enum | SNAPSHOT_MODE { SNAP_OFF, SNAP_ON } |
| Public Types inherited from IDragonSensor | |
| enum | SENSOR_USAGE { UNKNOWN_SENSOR = -1, MAIN_LIMELIGHT, FORWARD_SENSOR, REARWARD_SENSOR, MAX_SENSORS } |
Public Member Functions | |
| DragonLimelight ()=delete | |
| DragonLimelight (IDragonSensor::SENSOR_USAGE usage, std::string tableName, double mountingHeight, double mountingHorizontalOffset, double rotation, double mountingAngle, double targetHeight, double targetHeight2) | |
| ~DragonLimelight ()=default | |
| double | GetDistance () const override |
| double | GetConfidence () const override |
| bool | HasTarget () const |
| double | GetTargetHorizontalOffset () const |
| double | GetTargetVerticalOffset () const |
| double | GetTargetArea () const |
| double | GetTargetSkew () const |
| double | GetPipelineLatency () const |
| double | EstimateTargetDistance () const |
| std::vector< double > | Get3DSolve () const |
| IDragonSensor::SENSOR_USAGE | GetUsage () const override |
| void | SetTargetHeight (double targetHeight) |
| void | SetLEDMode (DragonLimelight::LED_MODE mode) |
| void | SetCamMode (DragonLimelight::CAM_MODE mode) |
| void | SetPipeline (int pipeline) |
| void | SetStreamMode (DragonLimelight::STREAM_MODE mode) |
| void | ToggleSnapshot (DragonLimelight::SNAPSHOT_MODE toggle) |
| void | PrintValues () |
| Public Member Functions inherited from IDragonSensor | |
| IDragonSensor ()=default | |
| ~IDragonSensor ()=default | |
| Public Member Functions inherited from IDragonDistanceSensor | |
| IDragonDistanceSensor ()=default | |
| ~IDragonDistanceSensor ()=default | |
Definition at line 35 of file DragonLimelight.h.
| Enumerator | |
|---|---|
| CAM_VISION | |
| CAM_DRIVER |
Definition at line 47 of file DragonLimelight.h.
| Enumerator | |
|---|---|
| LED_DEFAULT | |
| LED_OFF | |
| LED_BLINK | |
| LED_ON |
Definition at line 39 of file DragonLimelight.h.
| Enumerator | |
|---|---|
| SNAP_OFF | |
| SNAP_ON |
Definition at line 60 of file DragonLimelight.h.
| Enumerator | |
|---|---|
| STREAM_DEFAULT | |
| STREAM_MAIN_AND_SECOND | |
| STREAM_SECOND_AND_MAIN |
Definition at line 53 of file DragonLimelight.h.
|
delete |
| DragonLimelight::DragonLimelight | ( | IDragonSensor::SENSOR_USAGE | usage, |
| std::string | tableName, | ||
| double | mountingHeight, | ||
| double | mountingHorizontalOffset, | ||
| double | rotation, | ||
| double | mountingAngle, | ||
| double | targetHeight, | ||
| double | targetHeight2 | ||
| ) |
| mountingHeight | - network table name |
| mountingHorizontalOffset | - mounting height of the limelight |
| rotation | - mounting horizontal offset from the middle of the robot |
| mountingAngle | - clockwise rotation of limelight |
| targetHeight | - mounting angle of the camera |
| targetHeight2 | - height the target - height of second target |
|
default |
| double DragonLimelight::EstimateTargetDistance | ( | ) | const |
Definition at line 232 of file DragonLimelight.cpp.
| std::vector< double > DragonLimelight::Get3DSolve | ( | ) | const |
Definition at line 96 of file DragonLimelight.cpp.
|
overridevirtual |
Method: GetConfidence Description: Indicates how accurate the returned value is Returns: double 0.0 == ignore (sensor has an error)
Method: GetConfidence Description: Indicates how accurate the returned value is Returns: double 0.0 == ignore (sensor has an error)
Implements IDragonSensor.
Definition at line 86 of file DragonLimelight.cpp.
|
overridevirtual |
Method: GetDistance Description: Return the measured distance in inches
Method: GetDistance Description: Return the measured distance in inches
Implements IDragonDistanceSensor.
Definition at line 70 of file DragonLimelight.cpp.
| double DragonLimelight::GetPipelineLatency | ( | ) | const |
Definition at line 173 of file DragonLimelight.cpp.
| double DragonLimelight::GetTargetArea | ( | ) | const |
Definition at line 163 of file DragonLimelight.cpp.
| double DragonLimelight::GetTargetHorizontalOffset | ( | ) | const |
Definition at line 106 of file DragonLimelight.cpp.
| double DragonLimelight::GetTargetSkew | ( | ) | const |
Definition at line 168 of file DragonLimelight.cpp.
| double DragonLimelight::GetTargetVerticalOffset | ( | ) | const |
Definition at line 135 of file DragonLimelight.cpp.
|
overridevirtual |
Method: GetUsage Description: Indicate what the sensor is used for
Method: GetUsage Description: Indicate what the sensor is used for
Implements IDragonSensor.
Definition at line 183 of file DragonLimelight.cpp.
| bool DragonLimelight::HasTarget | ( | ) | const |
Definition at line 101 of file DragonLimelight.cpp.
| void DragonLimelight::PrintValues | ( | ) |
Definition at line 222 of file DragonLimelight.cpp.
| void DragonLimelight::SetCamMode | ( | DragonLimelight::CAM_MODE | mode | ) |
Definition at line 201 of file DragonLimelight.cpp.
| void DragonLimelight::SetLEDMode | ( | DragonLimelight::LED_MODE | mode | ) |
Definition at line 196 of file DragonLimelight.cpp.
| void DragonLimelight::SetPipeline | ( | int | pipeline | ) |
Definition at line 206 of file DragonLimelight.cpp.
| void DragonLimelight::SetStreamMode | ( | DragonLimelight::STREAM_MODE | mode | ) |
Definition at line 211 of file DragonLimelight.cpp.
| void DragonLimelight::SetTargetHeight | ( | double | targetHeight | ) |
Definition at line 189 of file DragonLimelight.cpp.
| void DragonLimelight::ToggleSnapshot | ( | DragonLimelight::SNAPSHOT_MODE | toggle | ) |
Definition at line 217 of file DragonLimelight.cpp.


|
Break Out Project, By Luis Bechara
POST MORTEM: Getting the game was a long process of figuring out c++ and SDL among other things such as understanding patterns. However I am satisfied of the initial result as a close-to-be MVP, it can be improved on futher by: 1- Encapsoluting all the game logic inside respective objects instead of the main fuction. 2- Create a SceneManager to load each instance as a child of a GameObject class. 3- Encasoluting all the Draw and SDL behaivior in a Renderer class that knows how the draw each object on screen to follow a more conventional MVC. also the game can be extended as follows. 1- writting more levels files. 2- enabling progression between levels and more clear game states. 3- enabling more localization files
|
#include <stdint.h>
Go to the source code of this file.
Macros | |
| #define | KHRONOS_APICALL |
| #define | KHRONOS_APIENTRY |
| #define | KHRONOS_APIATTRIBUTES |
| #define | KHRONOS_SUPPORT_INT64 1 |
| #define | KHRONOS_SUPPORT_FLOAT 1 |
| #define | KHRONOS_MAX_ENUM 0x7FFFFFFF |
Typedefs | |
| typedef int32_t | khronos_int32_t |
| typedef uint32_t | khronos_uint32_t |
| typedef int64_t | khronos_int64_t |
| typedef uint64_t | khronos_uint64_t |
| typedef signed char | khronos_int8_t |
| typedef unsigned char | khronos_uint8_t |
| typedef signed short int | khronos_int16_t |
| typedef unsigned short int | khronos_uint16_t |
| typedef signed long int | khronos_intptr_t |
| typedef unsigned long int | khronos_uintptr_t |
| typedef signed long int | khronos_ssize_t |
| typedef unsigned long int | khronos_usize_t |
| typedef float | khronos_float_t |
| typedef khronos_uint64_t | khronos_utime_nanoseconds_t |
| typedef khronos_int64_t | khronos_stime_nanoseconds_t |
Enumerations | |
| enum | khronos_boolean_enum_t { KHRONOS_FALSE = 0 , KHRONOS_TRUE = 1 , KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM } |
| #define KHRONOS_APIATTRIBUTES |
| #define KHRONOS_APICALL |
| #define KHRONOS_APIENTRY |
| #define KHRONOS_MAX_ENUM 0x7FFFFFFF |
| #define KHRONOS_SUPPORT_FLOAT 1 |
| #define KHRONOS_SUPPORT_INT64 1 |
| typedef float khronos_float_t |
| typedef signed short int khronos_int16_t |
| typedef int32_t khronos_int32_t |
| typedef int64_t khronos_int64_t |
| typedef signed char khronos_int8_t |
| typedef signed long int khronos_intptr_t |
| typedef signed long int khronos_ssize_t |
| typedef unsigned short int khronos_uint16_t |
| typedef uint32_t khronos_uint32_t |
| typedef uint64_t khronos_uint64_t |
| typedef unsigned char khronos_uint8_t |
| typedef unsigned long int khronos_uintptr_t |
| typedef unsigned long int khronos_usize_t |


{% extends 'base.html' %} {% block content %} RSS Upload: {{object.name}} This will look at {{object.rss_feed_url}} and create an object for each item. {% csrf_token %} Continue? Back to My Accounts {% endblock %}


{% extends 'base.html' %} {% block content %}
You can use the The Awards REST API to create calls to get the data you need to integrate with The Award app.
During the period, we may change some features based on developer feedback. If we do make changes, we'll announce them on the developer documentation without advance notice..
You can now provide more information through contacts for URLs that link to registered domains by using the Content Attachments API.Contact for more details.


AWS::Grafana::Workspace
Specifies a workspace. In a workspace, you can create Grafana dashboards and visualizations to analyze your metrics, logs, and traces. You don't have to build, package, or deploy any hardware to run the Grafana server.
Syntax
To declare this entity in your AWS CloudFormation template, use the following syntax:
JSON
{ "Type" : "AWS::Grafana::Workspace", "Properties" : { "AccountAccessType" :
String
, "AuthenticationProviders" :[ String, ... ]
, "ClientToken" :String
, "DataSources" :[ String, ... ]
, "Description" :String
, "Name" :String
, "NotificationDestinations" :[ String, ... ]
, "OrganizationalUnits" :[ String, ... ]
, "OrganizationRoleName" :String
, "PermissionType" :String
, "RoleArn" :String
, "SamlConfiguration" :SamlConfiguration
, "StackSetName" :String
, "VpcConfiguration" :VpcConfiguration
} }
YAML
Type: AWS::Grafana::Workspace Properties: AccountAccessType:
String
AuthenticationProviders:- String
ClientToken:String
DataSources:- String
Description:String
Name:String
NotificationDestinations:- String
OrganizationalUnits:- String
OrganizationRoleName:String
PermissionType:String
RoleArn:String
SamlConfiguration:SamlConfiguration
StackSetName:String
VpcConfiguration:VpcConfiguration
Properties
AccountAccessType
-
Specifies whether the workspace can access AWS resources in this AWS account only, or whether it can also access AWS resources in other accounts in the same organization. If this is
ORGANIZATION
, theworkspaceOrganizationalUnits
parameter specifies which organizational units the workspace can access.Required: No
Type: String
Allowed values:
CURRENT_ACCOUNT | ORGANIZATION
Update requires: No interruption
AuthenticationProviders
-
Specifies whether this workspace uses SAML 2.0, AWS IAM Identity Center (successor to AWS Single Sign-On), or both to authenticate users for using the Grafana console within a workspace. For more information, see User authentication in Amazon Managed Grafana.
Required: No
Type: List of String
Update requires: No interruption
ClientToken
-
A unique, case-sensitive, user-provided identifier to ensure the idempotency of the request.
Required: No
Type: String
Pattern:
^[!-~]{1,64}$
Update requires: Replacement
DataSources
-
Specifies the AWS data sources that have been configured to have IAM roles and permissions created to allow Amazon Managed Grafana to read data from these sources.
This list is only used when the workspace was created through the AWS console, and the
permissionType
isSERVICE_MANAGED
.Required: No
Type: List of String
Update requires: No interruption
Description
-
The user-defined description of the workspace.
Required: No
Type: String
Minimum:
0
Maximum:
2048
Update requires: No interruption
Name
-
The name of the workspace.
Required: No
Type: String
Pattern:
^[a-zA-Z0-9-._~]{1,255}$
Update requires: No interruption
NotificationDestinations
-
The AWS notification channels that Amazon Managed Grafana can automatically create IAM roles and permissions for, to allow Amazon Managed Grafana to use these channels.
Required: No
Type: List of String
Update requires: No interruption
OrganizationalUnits
-
Specifies the organizational units that this workspace is allowed to use data sources from, if this workspace is in an account that is part of an organization.
Required: No
Type: List of String
Update requires: No interruption
OrganizationRoleName
-
The name of the IAM role that is used to access resources through Organizations.
Required: No
Type: String
Minimum:
1
Maximum:
2048
Update requires: No interruption
PermissionType
-
If this is
SERVICE_MANAGED
, and the workplace was created through the Amazon Managed Grafana console, then Amazon Managed Grafana automatically creates the IAM roles and provisions the permissions that the workspace needs to use AWS data sources and notification channels.If this is
CUSTOMER_MANAGED
, you must manage those roles and permissions yourself.If you are working with a workspace in a member account of an organization and that account is not a delegated administrator account, and you want the workspace to access data sources in other AWS accounts in the organization, this parameter must be set to
CUSTOMER_MANAGED
.For more information about converting between customer and service managed, see Managing permissions for data sources and notification channels. For more information about the roles and permissions that must be managed for customer managed workspaces, see Amazon Managed Grafana permissions and policies for AWS data sources and notification channels
Required: No
Type: String
Allowed values:
CUSTOMER_MANAGED | SERVICE_MANAGED
Update requires: No interruption
RoleArn
-
The IAM role that grants permissions to the AWS resources that the workspace will view data from. This role must already exist.
Required: No
Type: String
Minimum:
1
Maximum:
2048
Update requires: No interruption
SamlConfiguration
-
If the workspace uses SAML, use this structure to map SAML assertion attributes to workspace user information and define which groups in the assertion attribute are to have the
Admin
andEditor
roles in the workspace.Required: No
Type: SamlConfiguration
Update requires: No interruption
StackSetName
-
The name of the AWS CloudFormation stack set that is used to generate IAM roles to be used for this workspace.
Required: No
Type: String
Update requires: No interruption
VpcConfiguration
-
The configuration for connecting to data sources in a private VPC (Amazon Virtual Private Cloud).
Required: No
Type: VpcConfiguration
Update requires: No interruption
Return values
Ref
When you pass the logical ID of this resource to the intrinsic Ref
function, Ref
returns the resource name. For example:
{ "Ref": "Id" }
For more information about using the Ref
function, see Ref.
Fn::GetAtt
The Fn::GetAtt
intrinsic function returns a value for a specified attribute of this type. The following are the available attributes and sample return values.
For more information about using the Fn::GetAtt
intrinsic function, see Fn::GetAtt.
CreationTimestamp
-
The date that the workspace was created.
Type: Timestamp
Endpoint
-
The URL that users can use to access the Grafana console in the workspace.
Type: String
GrafanaVersion
-
The version of Grafana supported in this workspace.
Type: String
Id
-
The unique ID of this workspace.
Type: String
ModificationTimestamp
-
The most recent date that the workspace was modified.
Type: Timestamp
SamlConfigurationStatus
-
Specifies whether the workspace's SAML configuration is complete.
Valid values:
CONFIGURED | NOT_CONFIGURED
Type: String
SsoClientId
-
The ID of the IAM Identity Center-managed application that is created by Amazon Managed Grafana.
Type: String
Status
-
The current status of the workspace.
Valid values:
ACTIVE | CREATING | DELETING | FAILED | UPDATING | UPGRADING | DELETION_FAILED | CREATION_FAILED | UPDATE_FAILED | UPGRADE_FAILED | LICENSE_REMOVAL_FAILED
Type: String
Examples
Create a workspace
Create an Amazon Managed Grafana workspace using CloudFormation
JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "Amazon Grafana workspace stack", "Resources": { "AmazonGrafanaWorkspaceIAMRole": { "Type": "AWS::IAM::Role", "Properties": { "ManagedPolicyArns": ["arn:aws:iam::aws:policy/service-role/AmazonGrafanaAthenaAccess"], "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Service": [ "grafana.amazonaws.com" ] }, "Action": [ "sts:AssumeRole" ] }] } } }, "AmazonGrafanaWorkspace": { "Type": "AWS::Grafana::Workspace", "Properties": { "AccountAccessType": "CURRENT_ACCOUNT", "Name": "AmazonGrafanaWorkspace", "Description": "Amazon Grafana Workspace", "AuthenticationProviders": ["SAML"], "PermissionType": "CUSTOMER_MANAGED", "RoleArn": { "Fn::GetAtt": [ "AmazonGrafanaWorkspaceIAMRole", "Arn" ] }, "SamlConfiguration": { "IdpMetadata": { "Xml": "<md:EntityDescriptor xmlns:md='urn:oasis:names:tc:SAML:2.0:metadata' entityID='entityId'>DATA</md:EntityDescriptor>" }, "AssertionAttributes": { "Name": "displayName", "Login": "login", "Email": "email", "Groups": "group", "Role": "role", "Org": "org" }, "RoleValues": { "Editor": ["editor1"], "Admin": ["admin1"] }, "AllowedOrganizations": ["org1"], "LoginValidityDuration": 60 } } } }, "Outputs": { "WorkspaceEndpoint": { "Value": { "Fn::GetAtt": [ "AmazonGrafanaWorkspace", "Endpoint" ] } }, "WorkspaceStatus": { "Value": { "Fn::GetAtt": [ "AmazonGrafanaWorkspace", "Status" ] } }, "WorkspaceId": { "Value": { "Ref": "AmazonGrafanaWorkspace" } }, "GrafanaVersion": { "Value": { "Fn::GetAtt": [ "AmazonGrafanaWorkspace", "GrafanaVersion" ] } } } }
YAML
Description: Amazon Grafana workspace stack Resources: AmazonGrafanaWorkspaceIAMRole: Type: 'AWS::IAM::Role' Properties: ManagedPolicyArns: - 'arn:aws:iam::aws:policy/service-role/AmazonGrafanaAthenaAccess' AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - grafana.amazonaws.com Action: - 'sts:AssumeRole' AmazonGrafanaWorkspace: Type: 'AWS::Grafana::Workspace' Properties: AccountAccessType: CURRENT_ACCOUNT Name: AmazonGrafanaWorkspace Description: Amazon Grafana Workspace AuthenticationProviders: - SAML PermissionType: CUSTOMER_MANAGED RoleArn: !GetAtt - AmazonGrafanaWorkspaceIAMRole - Arn SamlConfiguration: IdpMetadata: Xml: >- <md:EntityDescriptor xmlns:md='urn:oasis:names:tc:SAML:2.0:metadata' entityID='entityId'>DATA</md:EntityDescriptor> AssertionAttributes: Name: displayName Login: login Email: email Groups: group Role: role Org: org RoleValues: Editor: - editor1 Admin: - admin1 AllowedOrganizations: - org1 LoginValidityDuration: 60 Outputs: WorkspaceEndpoint: Value: !GetAtt - AmazonGrafanaWorkspace - Endpoint WorkspaceStatus: Value: !GetAtt - AmazonGrafanaWorkspace - Status WorkspaceId: Value: !Ref AmazonGrafanaWorkspace GrafanaVersion: Value: !GetAtt - AmazonGrafanaWorkspace - GrafanaVersion


CHAPTER 201F
RENTAL HOUSING TRUST FUND
REPEALED. L 1997, c 350, §18.
Cross References
Rental housing revolving fund, see chapter 201H, part III, subpart J.


Refresh panel
[uninitialized]
[uninitialized]
[uninitialized]
Proxies enabled for sequence:
New in 23.0!
Import .srt file & add to new caption track
New in 22.0.0!
Enable all disabled clips in sequence
Show Clip Colorspace in Events
Move Clip 13 Seconds on Timeline
New in 14.3.1!
Detect cuts in active sequence
New in 14.1!
Open a production
Toggle Production lock
Close all Production projects
Trash all open Production projects
Create new sequence from selection
Adjust Graphics White Luminance
New in 14.0!
Create new project
Generate system compatibility report
Change colorspace of active sequence
New in 13.1!
Close all but active project
Find all adjustment layers
Consolidate duplicate footage
Close all sequences (in active project)
Report sequence VR settings
Open selected project items in Source monitor
Re-interpret selected project items
Create sub-sequence
Select all re-timed clips
Select all reversed clips
Write log file of console output
Set the current Workspace
Stitch selected files in AME
System
Close front-most Source monitor clip
Close all clips in Source monitor
Open PProPanel folder
Open Premiere Pro's Log Files folder
Detect Anywhere Server
Identify open Team Projects
Check SDK Forums
Read API documentation
Copy Presets
AE project item count
Turn off Start dialog
Clear media cache
List available export presets
Import and Create
Ingest files, create proxies
Import MoGRT
Create Sequence
Import Composition(s) from AE project
Create Sequence From Preset
Open different project
Import Files
Open in Source Monitor...
Add proxy to first projItem
Drag and drop import
Metadata and Project manipulation
Toggle proxies in active project
Replace media...
Add sequence markers
Add clip markers
Update PAR
Manipulate XMP
Update all media
Modify project metadata
Set scratch disk path
Randomize sequence selection
Mute fun!
Manipulate keyframes
insert or append to active sequence
insert or append, to top tracks
overwrite at CTI
Label first projectItem
Create subclip
Report selection to Events panel
Randomize project selection
Make selected items offline
Online all offline
Update framerate
Change marker colors
Change sequence timecode display
Save Project layout
Load Project layout
New project from sequence
Auto-reframe active sequence
Export
Transcode first project item
Transcode external file
Save sequence frame as .png
Consolidate & Transfer project
Dump XMP from all items
Save project copy...
Save project
Export frames for markers
Export FCP XML
Export sequence to AAF
Render active sequence in AME


BreakAway
Bored in the house? We got you.
Home
Map placeholder
Generated list
This because you're active
This because you're bored
This because you're hungry


--- layout: post title: "Hook Operations" author: "Steven Black" type: "" header_text: "" lead_text: "" excerpt: "" category: tags: [] pygments: true ---
In this article, I'll introduce a new design pattern called hook operations, which defines mechanisms to make software flexible and extendible. this is the first design pattern i've ever created from scratch, so I welcome any comments or questions you may have about it.
All software design patterns are born from the need for flexibility. But few patterns explicitly address the issue of how to make software extensible or configurable downstream or at run-time. Furthermore, the more a framework or component is reused, the more clients it serves (by definition) and the greater is the stress on it to adapt. Hook Operations are a way of adapting frameworks or components without stressing them unduly.
Before proceeding, here are some definitions:
Hook: a call within software that's explicitly designated to provide future flexibility.
Hook Operation: code that implements a hook.
Hook Operation Design Pattern: defines interfaces and methodologies for hook operations.
For the most part, the Hook Operation design pattern is applicable in both object and non-object oriented programming. I discuss both, but I only allude to the general implementation mechanisms of procedural hooks, and the code examples presented in this article focus only on object-oriented hooks. I'll cover procedural hooks in a future article.
Hook Operation
The Hook Operation design pattern defines interfaces and mechanisms by which software is engineered to be flexible and extended by people other than its creators.
Toolkits and frameworks are composed of general-purpose classes that are later adapted by others. Toolkits provide for code and component reuse, and frameworks provide for architectural reuse. In both cases, flexibility and extensibility are virtues. How to best provide this adaptability?
In Visual FoxPro, instance programming is one way toolkits and frameworks are sometimes adapted. When you work in the Screen Designer, or in non-class objects in the Class Designer, you are instance programming; that is, you are adding user-code to object instances. This is usually fine and it works, but it means the following disadvantages:
Subclassing is another common way toolkits and frameworks are meant to be adapted. Adaptation by subclassing, however, presents similar problems:
Moreover downstream subclassing constrains framework creators in future releases. The framework creators have no control of framework subclassing. This puts framework creators in a difficult position: on one hand they want to perpetually improve their classes, but on the other hand each change may break somebody's code.
Hook operations are usually a viable alternative to instance programming and subclassing.
To illustrate a simple hook, consider a control with the click method in Listing 1. The built-in click method is preceded by the hook operation THIS.PreClickHook(). The PreClickHook() method is a good place for users to place custom processing in subclasses without polluting the built-in Click behavior.
FUNCTION Click THIS.PreClickHook() WAIT WINDOW "Built-in Click Method Starts Now" * <100 lines of code> ENDFUNC
Listing 1. A simple hook. In this example the user can either instance-program or subclass and place code in the PreClickHook() method. Later we'll see other alternatives to implement hooks.
Subclassing, though, can be problematic. If we could implement hooks without subclassing, we would see the following benefits:
Listing 2 shows how we could modify Listing 1 to engineer hooks without subclassing. Instead of delegating to a local method, the hook calls out to an object reference which can be dynamically configured.
FUNCTION Click oSomeObjectReference.ClickHook() WAIT WINDOW "Built-in Click Method Starts Now" * <100 lines of code> ENDFUNC
Listing 2. Another simple hook. In this example the hook is implemented by reference to another separate object.
Hooks usually do nothing by default; they are used by exception, if at all. A hook is a separate and distinct method or process, reserved for adaptation, in a way separates the adaptation from built-in behavior. The hook is usually invoked in such a way that the built-in behavior can be enhanced or replaced without affecting the original source and without altering the built-in behavior provided by the class.
The key thing to take from the above is hook operations are ubiquitous calls to external code and, by default and for the moment, that external code simply does nothing.
Later in this article I'll illustrate 2 sorts of hook operations. I'll just describe them for now:
Object Hooks are hooks that are fulfilled by attaching behavior objects to instances. See figure 1.
Figure 1: Object hooks illustrated, here for a single Click() method. In diagram A the instance is not hooked and functions as normal. In diagram B the instance is hooked by a hook object whose non-blank methods extend (or possibly override) the code in the instance.
Procedural Hooks are hooks that are fulfilled procedurally. This fulfillment may be a straight program call, but it could also be metadata-driven. See figure 2.
Figure 2: A metadata-based procedural hook illustrated. Here a call to a Hook Manager triggers a lookup which returns the name of a program to execute. Since hooks are used by exception, normally the lookup would return nothing.
Hooks are appropriate in places where you want a program to be adaptable. Where might that be? Two conflicting forces determine this. On one hand, hook operations are most valuable at critical junctures in the program. On the other hand, usability suggests that hooks should be placed at predictable junctures.
In object-oriented programs, critical junctures are commonly adjacent to significant state transformations. For example, in an accounting application, the place where transactions are posted is a critical juncture. One would hope for a hook either before and after such important state transitions.
Critical junctures are difficult to identify, especially in frameworks -- criticality, after all, depends on the implementation. An irrelevant juncture in one application may be crucial in another. For completeness, all plausible junctures (all major state transformations) would need to be hooked (and documented). This is onerous.
Predictable junctures, on the other hand, are architecturally predictable places. For example, predictable junctures could be defined as where methods begin and end. Predictable junctures are sometimes (but not always) located close to critical junctures, and their predictability makes them very usable.
How close are predictable junctures to critical ones? This is a function code volume: The briefer the method code, the likelier predictable junctures are proximate to critical junctures.
The tradeoff between critical and predictable junctures is a developer-education issue. If implementers are not able to identify where hook operations are placed, then they wont be able to engineer the adaptations they require. The main benefit of hooking at predictable junctures is the hooks are much easier to identify and document.
I find it easiest to place hook operations at predictable junctures rather than fret about placing hooks at every critical juncture. But don't recommend hooking all predictable junctures. Every method of every object doesn't need a hook, and since the hook calls involve processing, it's best to use some common sense. Some common events I hook include Click(), DblClick(), RightClick(), DragDrop(), GotFocus() and a few others. For obvious reasons, I don't recommend hooking quasi-continuous events such as MouseMove() and Paint().
A number of hook structures are possible, depending on how the hook is engineered.
Internally fulfilled hooks: When hooked objects handle fulfill their hooks by instance programming or by subclassing, the structure illustrated in Figure 3 is typical. This classic structure is well known and is the basis for the Template Method design pattern as described by Gamma, Helm et al in their Design Patterns book.
Externally fulfilled hooks: If hook operations delegate to external hook implementations, this leads to many possible variants. Two examples: Figure 4 shows a case where the hook objects come from separate hook classes, and Figure 5 shows a case where the hook class is a superclass of the hooked class.
Figure 3: What I call "self-sufficient hooks" have a structure similar to that of the Template Method design pattern. Here you use inheritance or instance programming to modify the default behavior.
Figure 4: Supporting hooks are separate hook objects, here shown as separate classes from those they adorn.
Figure 5: Hooked objects and their hooks can share the same interface, which implies that they can share the same class hierarchy. This is very handy from a maintenance perspective since the interfaces remain automatically in synch.
Figure 5 deserves explanation because it is so counterintuitive and admittedly convoluted. One would think that a hook couldn't possibly be from a Parentclass of what we wish to modify. But it works great! Here's why:
Hooked objects use the public interface of hook objects. Therefore giving both a common interface makes sense because of the polymorphic nature of the linkages. Furthermore if they are of the same class, then keeping the interfaces in synch is a cinch.
If a hooked object is-a hook, then the concrete objects can use each other as hooks. Effectively, this means they can call each other's services as hook operations. For example, all the controls on a form could use the form's RightClick() services, preserving the RightClick() context of the form whilst the cursor is on a control.
Since hooked objects can call hooks, and hook objects are hooks, this means they can be chained together. (I'll explain this later in the Implementation section).
Assuming we are free to sprinkle hook operations throughout our events and methods, how to best place them? To help answer this, here are our placement choices relative to the built-in behaviors we may wish to adapt:
Pre-process hooks are invoked before the usual procedure code. Pre-process hooks are especially handy if they can override (or pre-empt or replace) built-in behavior.
Post-process hooks are invoked after the usual procedure code. Unlike pre-process hooks, post-process hooks cannot control the execution of the procedure which invokes it.
Mid-process hooks are invoked in mid-procedure. I won't discuss this option further, but bear in mind that these can be useful, especially within monolithic procedures.
There are two participants in the hook operation pattern. Note that the pattern can be extended, so one participant may play both roles.
Hooked Object
Contains a template method which contains one or more hook operations.
Hook Object
Not necessarily distinct from the Hooked Object
Implements the hook
Collaborations
The hooked object hook methods through hook operations.
Hook objects may themselves be hooks.
The advantages of Hook Operations include:
Some disadvantages are
This section briefly shows some ways hook operations can be implemented in Visual FoxPro
Listing 3 shows a simple call to a pre-process hook. This example uses the common convention of naming the pre-process with the prefix "pre", and similar hook operations are found in a number of VFP frameworks.
FUNCTION Click *-- Pre-process hook THIS.PreClick() WAIT WINDOW "Click" * <100 lines of code> ENDFUNC
Listing 3. A pre-hook followed by standard method code.
Listing 4 shows a simple post-processing hook. This example uses the common convention of naming the pre-process with the prefix "post"
FUNCTION Click WAIT WINDOW "Click" * <100 lines of code> *-- Post-process hook THIS.PostClick() ENDFUNC
Listing 4. A post-process Click hook.
As you may have guessed, pre and post-hooks can be combined, as shown in listing 5, in an attempt to achieve flexibility on both sides of the standard call. This is not recommended!
FUNCTION Click THIS.oHook.PreClick() && Pre-hook WAIT WINDOW "Click" * <100 lines of code> THIS.oHook.PostClick() && Post-hook ENDFUNC
Listing 5. Pre and post-hooks surround a standard method. If you intend this method to be subclassed, then avoid this!
However you do it, combining pre and post-hooks, as in listing 5, is not recommended if the method is to be subclassed. If you subclass the click method of listing 5, and use DODEFAULT() or the scope resolution operator (::) to invoke this parent method, then youll fire both the pre and post-hook at that point. Depending on the hooks, this can cause unexpected results because both hooks will fire as part of the scope resolution invocation.
In a generalization of Listing 3, we could substitute THIS.oHook to reference a specialized hook object, as illustrated in Listing 6.
FUNCTION Click *-- Pre-process hook THIS.oHook.PreClick() WAIT WINDOW "Click" * <100 lines of code> ENDFUNC
Listing 6. A pre-hook method belonging to a hook object. This gives us flexibility to substitute behavior objects, as well as accomplish the same thing as Listing 3 by setting THIS.oHook=THIS.
Listing 7 improves on Listings 3 and 6 because it uses a clean implementation heuristic: Hooks are called polymorphically. In other words, the Click() method of an object calls the Click() method of its hook.
FUNCTION Click *-- Pre-process hook THIS.oHook.Click() WAIT WINDOW "Click" * <100 lines of code> ENDFUNC
Listing 7. A cleaner version of Listings 3 and 6. Hook methods are called polymorphically.
Listing 8 shows a flexible variant of listing 7 where the pre-processing hook's return value controls the standard method execution. This is a crude NODEFAULT-like implementation, controlled by the pre-hooks return value.
FUNCTION Click IF THIS.oHook.Click() && Pre hook WAIT WINDOW "Click" * <100 lines of code> ENDIF ENDFUNC
Listing 8. A pre-process hook method (in a separate object) controls the execution of the standard method.
Listing 9 dramatically improves on Listing 5 because it uses both pre and post hooks, allowing you to completely bracket transformations. Listing 9 uses the following heristic:
In this separated "pre" and "post" architecture it is much safer to subclass the event or the method without scope-resolution (::) entanglement.
FUNCTION Click *-- Pre-process hook IF THIS.oHook.Click() THIS.ClickImplementation() ENDIF ENDFUNC FUNCTION ClickImplementation *-- The actual click implementation WAIT WINDOW "Click" * <100 lines of code> *-- Post-process hook THIS.oHook.ClickImplementation() ENDFUNC
Listing 9. A dramatically more flexible version of Listing 5. The pre-hook is called before the event code, the event code calls a method, and a post hook ends the method. Thus we have both pre- and post-hooks and few of the subclassing problems we'd have if both hooks were in the event code.
I personally think that code structured like that of listing 9 is very slick. Note that the event (like click() and dblclick()) fires the "pre" hook predictably near the beginning of its execution, and the method (the thing invoked by event) fires the "post" hook predictably the end of its execution. Thus we have, in effect, a hook on the way in, and another on the way out. Other advantages:
However I have just one problem with all this: the hooks in Listing 9 are dependent on the hook classes supporting a particular interface. One promising alternative is to vastly simplify the hook interface by having a single hook method to which we pass an appropriate context identifyer, like PROGRAM(). This leads to our last implementation topic, which is to use procedural hooks.
Listing 10 shows a variant of Listing 9 that decouples the hook from its implementation.
DEFINE CLASS FullyHookedButton AS CommandButton FUNCTION CLICK IF oApp.HookMgr( PROGRAM()) && The "Pre" hook THISFORM.SomeMethod() ENDIF ENDDEFINE DEFINE CLASS MyForm AS FORM ADD OBJECT oCmd AS FullyHookedButton FUNCTION SomeMethod * << Your code here >> THIS.oApp.HookMgr( PROGRAM()) && The "Post" hook ENDFUNC ENDDEFINE
Listing 10, a component with a hook before calling a Click implementation method. The Click implementation method contains its own hook at its conclusion. Note that the hook calls are made to a hook manager method which permits a clean and generic interface.
The key here is the clean and invariant call, THIS.oApp.HookMgr( PROGRAM()), which allows us to have a single hook method serve for all application hooks. Of course, considerable logic may be required within the oApp::HookMgr() method but, on the other hand, this would allow us to table-base the hook operations, which is infinitely more flexible than hard-coding hooks. This mechanism is similar to the one used internally by the VFP Class Browser. More on this in the next article.
VFP Class Browser: The VFP Class Browser is a real hookfest. By using its AddIn() method, and by specifying a method to hook, you can permanently register custom behavior for a variety of events. Registering the add-in is persistent because the AddIn() method creates a record in BROWSER.DBF, which lives in your HOME() directory.
Markus Egger's PowerBrowser: The public-domain PowerBrowser tool is an example of how a fully hooked application like VFP's Class Browser can be considerably adapted.
The INTL Toolkit: The INTL Toolkit, which I wrote, uses hook objects throughout.
Here is a simple example of a hook system. Here we have a form with a textbox and a combobox connected by hooks as shown in figure 6.
Some things of note in the sample code:
Hooks are chained. The combobox, for example, chains through a number of objects, first picking up Dropdown() and Interactivechange() behavior, followed by the Form's hooks, which in this case attach a 2-part Rightclick() behavior.
The Textbox's RightClick() is supplemented by the Form's RightClick() and that of the Form's hook, in this case some additional debug choices (full functionality not wired-in).
Note the GarbageCollect() procedures which are woven into the Release() processes to clean up these pointers. Without this, the form will never release without CLEAR ALL. In some versions of VFP, expect a GPF without this pointer clean-up.
Figure 6: The sample provided creates this system. The combobox hook chain starts is composed of two behavior objects before hooking to the form and its hook. The textbox hook chain is similarly extended by the form and its hook object.
*--------------------------------------------- *-- Sample for Hook Operation design pattern *-- Copyright 1997 by Steven Black *-- Version 1.0 May 22 1997 *--------------------------------------------- *-- Create a hookable form oForm= Create("Frm") *-- Describe what the user should do oForm.Caption= "RightClick around to execute hooks" *-- add a hookable textbox oForm.AddObject("txt", "Txt") *-- add a hookable combobox oForm.AddObject("Cbo", "Cbo") oForm.Cbo.Top= 30 *-- add dropdown and interactivechange behavior to *-- combobox by using hooks Local loTemp loTemp= Create("DropDown") oForm.Cbo.SetoHook( loTemp) loTemp= Create("Interactivechange") oForm.Cbo.SetoHook( loTemp) Release loTemp oForm.Cbo.ToolTipText= ; "Make a selection to execute hooks" oForm.Cbo.StatusBarText= ; "Make a selection to execute hooks" *-- Give all controls the Form's Right-click behavior oForm.txt.SetoHook( oForm) oForm.Cbo.SetoHook( oForm) *-- add a general shared debug utility object oForm.AddObject( "Debug", "DebugMenuHook") oForm.Debug.Top= 60 *-- Give all controls the debug menu behavior *-- (via form, which is already in the hook chain) oForm.SetoHook( oForm.Debug) *-- Show the works, though you wouldn't normally *-- make the debug hook object visible oForm.SetAll("Visible", .T.) oForm.Show() Read Events
************************************************** * Abstract Hook Behavior Class ************************************************** *-- Class: abstracthook *-- ParentClass: label *-- BaseClass: label *-- Baseclass for hooks * Define Class abstracthook As Label Caption = "Hook" ohook = .Null. Width= 150 BackColor= Rgb(0,255,0) Name = "abstracthook" Procedure Init *-- Say something smart This.Caption= This.Class Endproc Procedure Release *-- Release from memory. Release This Endproc
Procedure GarbageCollect *-- Clean up pointers This.ohook= .Null. Endproc *=== Hooked Events and Methods ==== * SetoHook( o) * RightClick() * PopUpMenu() * InteractiveChange() * DropDown() Procedure SetoHook *-- Automate the hook setting process. If a hook *-- already exists, hook to it, thus adding to the *-- hook chain. Parameters toPassed If Type( "THIS.oHook")= "O" And ; PEMSTATUS( This.ohook, "oHook", 5) This.ohook.SetoHook( toPassed) Else This.ohook= toPassed Endif Endproc Procedure RightClick If Type( "THIS.oHook")= "O" And ; PEMSTATUS( This.ohook, "RightClick", 5) This.ohook.RightClick Endif Release Popups Shortcut Define Popup Shortcut Shortcut Relative From Mrow(),Mcol() This.PopupMenu() If Cntbar( "Shortcut") > 0 Activate Popup Shortcut Endif Endproc Procedure PopupMenu *-- Delegate to the implementation chain If ! Isnull( This.ohook) And ; TYPE( "THIS.oHook") = "O" And ; PEMSTATUS( This.ohook, "PopUpMenu", 5) Return This.ohook.PopupMenu() Endif Endproc *-- Occurs when the user changes the value of a *-- control using the keyboard or the mouse. Procedure InteractiveChange *-- Delegate to the implementation chain If ! Isnull( This.ohook) And ; TYPE( "THIS.oHook") = "O" And ; PEMSTATUS( This.ohook, "InteractiveChange", 5) Return This.ohook.InteractiveChange() Endif Endproc *-- Occurs when the list portion of a ComboBox *-- control is about to drop down after the drop-down ; *-- arrow is clicked. Procedure DropDown *-- Delegate to the implementation chain If ! Isnull( This.ohook) And ; TYPE( "THIS.oHook") = "O" And ; PEMSTATUS( This.ohook, "DropDown", 5) Return This.ohook.DropDown() Endif Endproc Enddefine ************************************************** * Developer's Debug Menu Behavior (partial) ************************************************** *-- Class: debugmenuhook *-- ParentClass: abstracthook *-- BaseClass: label *-- Hook that produces debug choices in the *-- current shortcut menu * Define Class debugmenuhook As abstracthook Name = "debugmenuhook" Procedure PopupMenu DoDefault() Define Bar 1001 Of Shortcut Prompt "\-" Define Bar 1002 Of Shortcut Prompt "Debug" ; MESSAGE "Invokes the debug window" Define Bar 1003 Of Shortcut Prompt "\*0 Activate Popup Shortcut Endif Endproc Procedure PopupMenu *-- Delegate to the implementation chain If ! Isnull( This.ohook) And ; TYPE( "THIS.oHook") = "O" And ; PEMSTATUS( This.ohook, "PopUpMenu", 5) Return This.ohook.PopupMenu() Endif Endproc Procedure DblClick If ! Isnull( This.ohook) And ; TYPE( "THIS.oHook") = "O" And ; PEMSTATUS( This.ohook, "DblClick", 5) This.ohook.DblClick Endif Endproc Procedure Click If ! Isnull( This.ohook) And ; TYPE( "THIS.oHook") = "O" And ; PEMSTATUS( This.ohook, "Click", 5) Return This.ohook.Click() Endif Endproc Procedure DropDown If ! Isnull( This.ohook) And ; TYPE( "THIS.oHook") = "O" And ; PEMSTATUS( This.ohook, "DropDown", 5) Return This.ohook.DropDown() Endif Endproc Procedure InteractiveChange If ! Isnull( This.ohook) And ; TYPE( "THIS.oHook") = "O" And ; PEMSTATUS( This.ohook, "InteractiveChange", 5) Return This.ohook.InteractiveChange() Endif Endproc Enddefine ************************************************** *-- Class: frm *-- ParentClass: form *-- BaseClass: form *-- Form with Rightmouse Behavior * Define Class frm As Form DoCreate = .T. Caption = "Hooked Form" ohook = .Null. AutoCenter= .T. Name = "frm" ShowTips= .T. Procedure Release *-- Release from memory This.GarbageCollect() Release This Endproc Procedure GarbageCollect *-- Clean up pointers *-- ... recursively Local lni For lni= 1 To This.ControlCount This.Controls[lni].GarbageCollect() Endfor This.ohook= .Null. Endproc Procedure QueryUnload *-- Clean up first This.GarbageCollect() Endproc Procedure Destroy Clear Events Endproc *=== Hooked Events and Methods ==== * SetoHook( o) * RightClick() * PopUpMenu() * InteractiveChange() * DropDown() Procedure SetoHook *-- Automate the hook setting process. If a hook *-- already exists, hook to it, thus adding to the *-- hook chain. Lparameters txPassed If !Isnull( This.ohook) This.ohook.SetoHook( txPassed) Else This.ohook= txPassed Endif Endproc Procedure RightClick *-- Define a shortcut Release Popups Shortcut Define Popup Shortcut Shortcut Relative ; FROM Mrow(),Mcol() *-- Delegate to a shortcut specialty method This.PopupMenu() *-- Activate the shortcut If Cntbar( "Shortcut") > 0 Activate Popup Shortcut Endif Endproc Procedure PopupMenu *-- 3 sample shortcut menu bars Define Bar 100 Of Shortcut Prompt "Properties" ; MESSAGE "Display the properties sheet" Define Bar 200 Of Shortcut Prompt "Builders" ; MESSAGE "Invoke custom builders" Define Bar 300 Of Shortcut Prompt "Code" ; MESSAGE "Edit underlying code" *-- Delegate to the implementation chain If ! Isnull( This.ohook) And ; TYPE( "THIS.oHook") = "O" And ; PEMSTATUS( This.ohook, "PopUpMenu", 5) Return This.ohook.PopupMenu() Endif Endproc Procedure DropDown *-- Occurs when the list portion of a ComboBox *-- control is about to drop down after the *-- drop-down arrow is clicked. If ! Isnull( This.ohook) And ; TYPE( "THIS.oHook") = "O" And ; PEMSTATUS( This.ohook, "DropDown", 5) Return This.ohook.DropDown() Endif Endproc Procedure InteractiveChange *-- Occurs when the user changes the value ; *-- of a control using the keyboard or the mouse. *-- Fire pre-process hook If ! Isnull( This.ohook) And ; TYPE( "THIS.oHook") = "O" And ; PEMSTATUS( This.ohook, "InteractiveChange", 5) Return This.ohook.InteractiveChange() Endif Endproc Enddefine ************************************************** *-- Class: txt (c:\_workshop\hooks.vcx) *-- ParentClass: textbox *-- BaseClass: textbox *-- Textbox with Rightmouse Behavior * Define Class txt As TextBox Height = 23 Width = 100 *-- Hook reference ohook = .Null. Name = "txt" Procedure GarbageCollect *-- Clean up pointers This.ohook= .Null. Endproc *-- Releases from memory. Procedure Release Release This Endproc Procedure PopupMenu Define Bar _Med_cut Of Shortcut Prompt "Cu\* "U" This.ohook.SetoHook( toPassed) Else This.ohook= toPassed Endif Endproc Procedure Click If ! Isnull( This.ohook) This.ohook.Click Endif Endproc Procedure RightClick Release Popups Shortcut Define Popup Shortcut Shortcut Relative ; FROM Mrow(),Mcol() This.PopupMenu() If Cntbar( "Shortcut") > 0 Activate Popup Shortcut Endif Endproc Procedure DblClick If ! Isnull( This.ohook) This.ohook.DblClick Endif Endproc Enddefine
When you rightclick over the textbox, control is passed to the hook, which invokes a context sensitive shortcut menu. Some other things to draw from this example:
The hooked objects and the hooks dont need to be of the same Baseclass. Hooks can be lightweight objects, like labels, lines, or even Relations (which are ultra-lightweight).
Hooks can be shared by more than one object. There is nothing stopping us from having all the controls on our form pointing to the same hook.
Classes with code embedded with hook operations are generally more flexible than those that arent. If you define hook operations consistently and predictably throughout your application, then its usually possible to attach new behavior to satisfy the needs of a particular instance without subclassing. Moreover, hook operations can be reckoned and bound at run time.


Documentation for BBC Connected Studio and Taster pilots
The BBC's stats library is available documented here http://bbc.github.io/echo-docs/ You will be provided with counter names to use, there will be of the form
corporate.connectedstudio.<pilotname>.<page identifiers>.page
You will also need to add a label if the pilot is being tested in Taster, this will be of the form
tasterpilot=<pilot name>
If the pilot is going to presented outside the Taster frame you will need to add links (usually at the bottom) to BBC T&C documents. Something similar to the html fragment below.
Privacy policy |
Terms and conditions
If your site makes any use of cookies(including using the stats package above) you will have to add a cookie warning. This needs to be prominent on the users first visit to the site but can then disappear.

Cookies on this BBC
website

We use cookies to ensure you get the
best website experience. If you continue without
changing your settings, we'll assume that you are
happy to receive all cookies on this website.
However you can change your cookie settings at
any time.

Find out more

As part of your technical review we will be looking at cookie usage to check whether a more specific warning is required.
Please see Taster Tenants Integration pages
All pilots must be reviewed by one of the BBC's technical team prior to appearing in Taster. The important factors to consider are related to scalability and security.
Many pilots will require checking by the BBC's Information Security team. This involves filling in two forms, one describes how the application works and the steps taken to secure it, the other is a checklist of the top 25 security issues. If this is needed the developer will be given access to the BBC's systems to allow them to complete these forms and discuss them with the InfoSec team.# INDEX
All comments are moderated for approval.


3/20 email
Subject: After Hour Support for Faculty, Staff, and Students
Attention All CSI Students, Faculty and Staff
Starting tonight, students and faculty with a pressing Blackboard question can call Blackboard for assistance in using Blackboard when campus help desks and Blackboard administrators are unavailable. This after hours Blackboard support will be available by telephone:
· weeknights - between 8:00pm and 8:00 the next morning · weekends – all day and night on Saturdays and Sunday
CUNY has contracted with Blackboard to provide this telephone support as an additional service to our students and faculty to ensure coverage when the campus help desks are closed and Blackboard administrator support to students and faculty is unavailable. Please see After Hours Blackboard Support for information on how to access this after hours support service as well as examples of the Blackboard support provided.
Patricia Kahn, Ph.D. CIO and Assist. VP for Information Technology Services The College of Staten Island, CUNY 2A-303A<PHONE_NUMBER>


I have decided to make my week 53 weekly game jam project an official game, which will hopefully be released a week and a half from now. Howevee, this an optimistic estimate
Preliminary Description The game I had come up with for the theme of ‘One Hit’ was a procedurally generated space arcade shooter game, where you die in one hit. Unfortunately, a few difficulties arose during the creation process:
...Read More


This website serves as a proposal to introduce a new RFC 5646 variant to the standard, en-US-philly, to enable software developers to better provide localized services to users in Southern New Jersey and Philadelphia. While most of these localized services have traditionally been print media, the advent of voice assistants highlights the value of providing auditory responses that better reflect the local culture.
The language in this region is unique, with a number of specific words and grammar. As such, standard American English (en-US) does not fully express the actual way that people talk. The goal of these standardized dialects is to better localize language as it is used in online tools and media, and this should include the jawns that we say.
The population of Pennsylvania and New Jersey combined is about 22 million people. This is the size of many small nations and serves as an indication for the impact this new locale would have.
Looking up the specifications for RFC 5646, which defines the way that dialects are developed, as well as consulting the IANA Language Subtag Registry, it seems that this dialect would best fit as a new variant subtag that is based on the existing en-US locale.
As stated in section 3.6 of the RFC 5646, "variations within a language...or distinguishing variation MAY be registered as variant subtags". The contents of this website demonstrate the unique variations of English within Philadelphia, lending support to the idea that this should be considered a standardized variant.
This variant is being submitted as an entirely new subtag, as it is not defined as an ISO 639 code nor any code defined in other ISO specifications.
This website represents a formal intent to register this subtag, and the site is also is meant to collect support from the general public.
As precedent, there is already submitted the tag en-CA-newfound to represent the 500 thousand or so inhabitants of Newfoundland, on the eastern cost of Canada.
The specific vernacular of the Philadelphia region has been studied in detail by linguists including William Labov, from the University of Pennsylvania. He has written a number of books and academic works that highlight this variant of standard US English. Unlike a simple accent, the variation of Philadelphia English introduces new words into the language and has a number of grammatical differences.
Although Philly English is primarily based on US English, there are many words and phrases which are unique to the region. It was developed by a diverse group of inhabitants, creating a unique blend of African American Vernacular English along with influnces from European populations like the Irish, Italian, and German immigrants. You can learn more in the exploration tool below. This tool does not show specific variations in how words are said in Philadelphia compared to standard US English.
As defined in section 3.5 of RFC 5646, a variant subtag can be independently registered by sending an email to the IANA mailing list with the proposed record, as defined below.
Some words in this locale have become used enough that they have definitions on Google. This further provides justification for defining Philadelphia as a unique variant of US English.
You can read more about this locale in articles such as the Washington Post or a research paper by Ryan Hall . You can learn more about RFC 5646 from W3C. You can find RFC 5646 tags through this handy tool. Finally, more references are available at the bottom of this page.
Type: variant Subtag: philly Description: Philadelphia dialect of US English Added: 2018-xx-xx Prefix: en-US %%
Below is a list of common Philadelphia vernacular. It is not a complete list.
The tool below allows you to enter sentences and it will convert it to Philly English so you can better understand how to translate strings to this new locale.
PhillyScript is a new programming language, built on top of JavaScript, to help bring the uniqueness of Philadelphia to programming.
boul Animal { new(legs) { youse.legs := legs || 2; } } boul Dog <- Animal { new() { super(4); } } jawn* foo := new Animal(2); jawn a := jawns(1,2,3,4); if (a.witout(5)) { jawn* b := 'hello'; } else if (a.whereyat(1) === 0) { jawn* b := 'world'; } if (foo.legs === 2) { :) Human } else if (foo.legs !== 4) { :| Does not have 2 or 4 legs }
You can learn more about PhillyScript, including trying it out for yourself, on the PhillyScript page.


Let's start by getting some basic business information in our Loan Match Form.
How much are you seeking in financing?
{{cost | currency:"$"}}
What are you planning to do with your loan?
How long has your business been established?
What was your company's total revenue over the past 12 months?
What was your company's net income over the past 12 months?
What is your personal credit score?
How soon do you need funding?
Can you personally guarantee your loan?
Are you willing to provide a downpayment on the loan?
Can you provide collateral for the loan? If so, what kind?


{% load static %}
Cyber Threat Intelligence is a project made by students from Faculty of Electrical Engineering and Computing!


org.apache.hadoop.service
Interfaces
Service
ServiceStateChangeListener
Classes
AbstractService
CompositeService
LifecycleEvent
LoggingStateChangeListener
ServiceOperations
ServiceStateModel
Exceptions
ServiceStateException


We have absolutely no resources whatsoever to produce something so we are pretty useless, but we can guarantee that Borat Corporation is the only, and we repeat, only thing that are going to save this bullshit 2020.
CEO & Founder
Heljo, ma nejm iz Borat. Aj am crietor of diz sajt end aj lajk sexi taime.
<EMAIL_ADDRESS>Why is he here
Whay em aj here.
<EMAIL_ADDRESS>Designer
Hi, my name is Sacha Cohen and I am the designer of this useless website.
sachabaroncohen@gmail.com


You have three opportunities for extra credit. Feel free to do as many as you wish. They are all group extra credit opportunities. All three are due on 3/11/2016 at 3:30pm.
Before the implementation of your prototype, you compiled a list of inspirations. Since then, your prototype has probably made so many twists and turns and transformations that it is no longer recognizable as the idea that you started off with. To prepare for your final presentation, update your knowledge of related projects. Related projects can be existing applications, artifacts, products, or services that relate to your concept. Here, web search is your friend (potentially useful sites include Google, Google Scholar, the ACM Digital Library, TechCrunch, Engadget...). Pick the five related projects that a juror is mostly like to ask you "How are you different than _____?" In some cases, this might be a similar service like another to-do list, photo-sharing app, or party-finder. In other cases, it might be repurposing general services like Google Docs or Twitter.
Pick out your five favorite related projects. For each project, write a ~2 sentences that would answer juror questions like, "How are you different from _____? Why would people use your application instead of _____? In what situations would people use _____ instead of your application?"
Submit| Category | Nope | Adequacy | Proficiency | Mastery |
|---|---|---|---|---|
| Revisit Inspiration 3 points |
0: No extra credit submitted or any number of related projects submitted without meaningful explanation. | 1: One or two key relevant projects found and differences explained. (If more than two submitted, the rest are not relevant or not well explained.) | 2: Three or four key relevant projects found and differences explained. (If more than three submitted, the rest are not relevant or not well explained.) | 3: Five relevant projects found and differences explained. A juror will exclaim "Wow, you've really done your homework!" |
You have done an amazing job prototyping and evaluating your application, and now it's time to see what the world thinks. Launch your app to the public. This means advertising on Google or Facebook, creating a Fan Page on Facebook, posting in the Mozilla Marketplace, or announcing on your app on social networks like Facebook and Twitter. (Posting to a UCSD mailing list is a good start, but think broader.) These are all just suggestions for what you might do. The goal of this extra credit opportunity is to expose your app to the public by any method you wish to use.
Submit any materials that show that you have widely advertised your application. This can include email receipts, screenshots of the app on a app store, or URLs to app listings. Also submit any materials necessary to show that people outside of this class and the university have started using your application as a direct result of your launch. Since this will differ between groups, we will leave up to you to decide what exactly is necessary to be submitted. The only requirement is to provide sufficient proof to show that you have launched your app to the public and that people have started using it.
Submit| Category | Nope | Adequacy | Proficiency | Mastery |
|---|---|---|---|---|
| Publicize Your App 4 points |
0: Nothing submitted beyond the analytics that were a part of the main assignments. | 1: Evidence that you advertised on social media. BUT not evidence that people are using it (beyond what A9 required). | 3: Evidence that your social media advertising was widely noticed. AND evidence that a few people, or only people you know, have started using it (beyond what A9 required). | 4: Evidence that your social media advertising was widely noticed. AND evidence of its accessibility and more than a couple strangers (who are not people you know or in this class) have found your app and started using it. Submission includes longitudinal data (100+ users over 1+week over and above A9) on Woopra |
Record a 1-minute video that includes the motivation behind your app (needfinding/brainstorming) and the main feature or “secret sauce” in your app.
Think of this video as a mixture of advertising and showing off all the hard work you have put into your application. Here is a great example of a video, and here are the top 10 videos from past years. Exercise your creativity as much as possible! Try to plan out your video before actually taking any footage. Storyboards are great tool to use here. This video will not be used as part of your final presentation slides, but should instead complement your poster session as well as serve as a way for you to remember your hard work in years to come. Upload these videos to YouTube.
Submit| Category | Nope | Adequacy | Proficiency | Mastery |
|---|---|---|---|---|
| Create a Video 5 pts |
0: No user-centered motivation. Don't get to see a clear scenario showing several screens of the app and how it connects to the user's motivation. | 2: Video effectively conveys the user-centered motivation of the app's value. OR walks through a scenario with the app's main features. but not both. | 4: Video covers both the motivation behind the app. AND walks through a scenario showing several screens of the app and how it connects to the user's motivation. AND is visually attractive. | 5: Video covers both the motivation behind the app. AND walks through a scenario showing several screens of the app and how it connects to the user's motivation. AND is visually attractive. AND has mass appeal & creativity. | Outside the Box 1 pt |
The best video in the class will receive 6 points for this assignment. |


Why couldn't the programmer dance to the song?
Because he didn't get the algo-rhythm...
This is my home page to my blog.
Look at it.
It has text, it has colours, it has some HTML, it has CSS. Oh look, I just used a span.
Feel free to have a look around and read about what Im up to at EDA.


Drag and Drop Example
Things
{{thing}}
Other Things
{{thing}}
Things
{{things | json}}
Other Things
{{otherThings | json}}


Result for products
Men's Suit
Rp. 50.000
Men's Suit
Rp. 50.000
Men's Suit
Rp. 50.000
Men's Suit
Rp. 50.000
Men's Suit
Rp. 50.000


Buy and sell cryptocurrencies, trusted by 10M wallets with over $30 billion in transactions.
Trusted Wallets Investor
Digital Currency Exchanged
Countries Supported
Let’s check your hash rate to see how much you will earn today, Exercitation veniam consequat sunt nostrud amet.
Estimated 24 Hour Revenue:
Revenue will change based on mining difficulty and Ethereum price.
Digital currency in which a record of transactions is maintained.
Blockchain technology to create and run decentralized digital applications.
Cryptocurrency that enables instant payments to anyone in the world.
Join now with CRAPPO to get the latest news and start mining now


 (This was a difficult bug to find.)
(cache-delete-object object-id (rucksack-cache (rucksack heap))))
(incf (nr-object-bytes-sweeped heap) object-block-size)))
;;
(when (>= (nr-object-bytes-sweeped heap) (nr-object-bytes heap))
;; We've finished sweeping the object table: move to the next state.
(setf (state heap) :finishing))
;; Return the amount of work done.
work-done))
Source Context


{% if not request.session.project_language %}
Behind the scenes, Cadet uses a natural language processing library called spaCy. spaCy requires a base language object with basic information about your language and its linguistic properties. You can:
Use an existing language object from the options in the language data field. A new language object with a unique name will be created for this project with language data from the existing language. This will allows you to customize the language for this project without changing the base copy.
Create a new language object entirely from scratch. Enter a project language name and leave the language data field blank
{% else %}
This project's language is: {{ request.session.project_language }}
{% endif %}
{% endif %}
{% include 'stop_words.html' %}
{% include 'examples.html' %}
{% include 'tokenization.html' %}
{% include 'lemmata.html' %}
{% endblock %}
{% block extrajs %}
{{ form.media.js }}
{% endblock%}


D1VS Game
Buy & HODL D1VS, and earn TRX Dividends!
My Wallet
0.00000000 D1VS
0.00000000 TRX / $0.00 USD
My D1VS
0.00000000 TRX
My Dividends
+ $0.00 USD
Growth on Reinvest
Buy D1VS
Current Price:
0 TRX/ D1VS
Every D1VS purchase incurs a 10% Dividend Fee.
Sell D1VS
Current Value:
0 TRX/ D1VS
Every D1VS sale incurs a 10% Dividend Fee.
Here's your Link...
When others use your link to buy D1VS, you get a 3% commission!0 TRX
Contract Holdings
0 DIVS
Total Supply


Help us in our mission to make private and encrypted communications the default online.
Bitcoin Address: 1Q1nhq1NbxPYAbw1BppwKbCqg58ZqMb9A8
1Q1nhq1NbxPYAbw1BppwKbCqg58ZqMb9A8
Blockchain Info