Review Responses¶
The GMAT API was reviewed by interested parties on February 15, 2019. Five RFAs (Request for Action) reports are filed based on this review. The design updates based on these RFAs are summarized here.
RFA ID |
Title |
Reporter |
|---|---|---|
APIRFA01 |
Unsafe C++ API |
Joel Parker |
APIRFA02 |
Python version compatibility |
Joel Parker |
APIRFA03 |
Handling of persistent objects in GMAT memory when using the API |
Jacob Englander |
APIRFA04 |
Complexity of “Create” Interface |
Steve Hughes |
APIRFA05 |
Rename and simplify the Setup() command |
Steve Hughes |
APIRFA06 |
API Style Guide |
Steve Hughes |
API RFA 01 - Unsafe C++ API¶
Requested action¶
The target languages for the API were presented as including a C++ API, which is available “for free” since GMAT is written in C++ natively. But if this is intended for end users, the stable “public” API will be interspersed with the existing internal-only API, which may cause unintended consequences.
The team should look into the need for a public-facing C++ API, and if there is a straightforward way (e.g. in SWIG) to separate the public “safe” C++ API from the internal core version.
Supporting Rationale¶
Users expecting a production-quality safe API in C++ may be confused or misled by the availability of unsafe, internal-only calls if the two are mixed. This could lead users to inadvertently using unsafe calls, or avoiding the C++ API altogether.
Response¶
The “C++ API” for the design is a bit of a misnomer for two reasons. First, SWIG is a tool that wraps C++ code for other languages. As such, there is no API product for C++ users. Second, the typical use case for the API is one that follows the procedure
Open interactive session on the target platform
Load GMAT into the active session
Build objects (either by hand or by loading a platform specific script)
Exercise the objects (either interactively or through platform specific scripts)
C++ users will benefit from the new Create() and Initialize() functions provided for API users. These functions automate the object interconnections for GMAT components, initially for those targeted by the API use cases, and eventually over a much broader range of classes.
For C++ users, there is no interactive environment like that supplied by Python and MATLAB. C++ works on a “compile and run” paradigm; as such, it does not supply a mechanism for the interactive use that makes API functions like the GMAT API’s Help() functions useful. C++ users can call that function, but they only see the output after compiling and running the compiled program, making the functionality limited at best. Similarly for the other additions to GMAT for the API. The functionality is generally available, but of limited use when working in GMAT’s native C++ language.
The design document has been updated (see the note in User Experiences), intended to clarify how C++ fits into the API.)
API RFA 02 - Python version compatibility¶
Requested action¶
The reliance of the current GMAT API on a specific major.minor version of Python is not ideal, as it could lead to extensive configuration issues on the user side to match versions when using GMAT, alongside other tools that potentially have differing requirements. The team should investigate mitigations for this, and confirm that: a) this specific minor-version reliance is necessary, b) that the chosen version is the best one, and c) that there are no better options that could be selected to enhance ease of configuration. Investigating the approach of other Python APIs may help here.
Supporting Rationale¶
The current GMAT API relies on a specific Python major.minor version as of the time of the API release. GMAT will not likely be the only tool being used on end-user machines that requires Python, so that specific reliance may cause problematic configuration issues. Further, GMAT will have a different release schedule from other tools, requiring reconfiguration on each upgrade to make sure things don’t get broken. It may result in less adoption of the GMAT API if setup is known to be difficult and fragile.
Response¶
The GMAT Python interface relies on specific Python major/minor versioning. The SWIG documentation distinguishes between Python 2.x and Python 3.x for some features, but does not distinguish minor versions. However, SWIG is generating C++ wrapper code which is then compiled and linked. The issue comes with the link step: the shared library links to a specific Python library, which is then a dependency for its use. More about Python binary compatibility can be found at https://docs.python.org/3.7/c-api/stable.html.
The API team did try building the current API using the Py_LIMITED_API option discussed at the link. That option is incompatible with the current release of SWIG.
The development team will track this issue during implementation. If a solution is found, it will be implemented and recommended for inclusion with GMAT’s Python interface build. If not, the Python linkage will be made to the same library as is used for the GMAT Python interface in order to avoid library conflicts.
API RFA 03 - Handling of persistent objects in GMAT memory when using the API¶
Requested action¶
Potential user actions that might cause memory leaks or other issues as objects to go out of scope between GMAT and user code should be explored and tested as necessary.
If I understand correctly from the review, when the user instantiates an object in their Python (or MATLAB or C++) workspace, GMAT creates that object and passes it by reference to the calling program. My question is, what happens if the user deletes that object in their calling program or if it just goes out of scope.
For instance, if the calling program does:
myThing = GMAT.createThing()
myThing.doStuff()
del myThing
The above code will result in the Python object myThing being deleted and therefore the reference to GMAT’s Thing is deleted. But what happens to the Thing that GMAT created dynamically? Is it deleted when Python’s reference to it is deleted? Or does it persist?
Similarly, suppose you are doing this in a loop
for (some range):
myThing = GMAT.createThing()
myThing.doStuff()
In the above code, myThing is an automatic variable that vanishes as soon as it goes out of scope. Since its scope is one particular iteration of the loop, myThing will be created and destroyed n times. What happens to the GMAT object on the other end of the myThing reference? Does it get deleted, too, or do we get n of them in memory? If the latter, is there any way to get rid of them or do we have to have the calling program close GMAT and re-open it?
Does the answer change if the calling program is in C++ vs Python or MATLAB? I know that I could create and destroy objects the “right” way by calling into GMATbase if I were an expert in the GMAT codebase, but when you create a clean C++ API then this issue could come up.
Supporting Rationale¶
I’m worried about creating a memory leak if the user creates and destroys many GMAT objects in the calling program.
Response¶
Objects created by SWIG generated code are C++ objects contained inside of a target platform wrapper. By default, these objects are managed using the platform’s memory management facilities. For example, if a constructor for a GMAT object is accessed directly from Java, the resulting object wrapper is managed in Java. When the wrapper goes out of scope, the Java garbage collector can delete it. When the wrapper is deleted, it calls the destructor of the contained object. That call can be overridden using a SWIG setting that releases object management to the underlying C++ code on an object by object basis.
The GMAT API will manage this setting inside of the Create() function. Objects constructed using the Create() function will me managed inside of the GMAT configuration manager. Repeated calls to Create() for the same named object will return the reference/pointer to the object created on the first call, as long as that object remains in the configuration. Memory management for objects created using constructor calls outside of the Create() function are the responsibility of the platform making the call.
As with all C/C++ programming, we will need to watch the memory management closely as work proceeds, and provide as much support as we can to making it transparent to the user when possible, and simple to understand when necessary.
API RFA 04 - Complexity of “Create” Interface¶
Requested action¶
The examples for object initialization were relatively simple:
Create("Spacecraft", "EO1")
Create("CoordinateSystem", "ECI", "Earth", "MJ2000Eq")
In general, there are a lot of special cases where certain data is required (for example, if the Coordinate system axes above were “ObjectReferenced” instead of “MJ2000Eq” additional information is required on the Primary and Secondary bodies.
The design needs to clarify how required fields for object creation are handled, especially when the choice of one setting changes on a model dramatically changes what other information is required to configure that model such as when a Propagator Type is SPK instead of an integrator. Additionally,
The design also needs to clarify how required vs. optional information will be handled at object creation. For example, Spacecraft has numerous settings. For complex objects what will be required at construction, and what will be set via “Set()” methods.
Supporting Rationale¶
The API will be quite difficult to use, and possibly error prone, if the complexity of object initialization is not well designed and well documented.
Response¶
Object creation is a straigtforward call to the constructor for the object. The Create command is used to make constructor calls and place object management under control of the GMAT engine by placing the objects into the configuration database. (See the description of memory management for RFA 3, above).
The concern here is more about object initialization, performed by the Setup() command in the draft document, now renamed Initialize() (see RFA 5, below). As stated in the description of that command, the object to object interconnections are set when Initialize() is called prior to object use. Missing elements are identified in the return from that call.
As the reviewer notes, there is a lot of complexity in some of the GMAT objects. Part of the challenge of coding the changes needed for the API is covering that complexity. The development team will concentrate efforts on making high usage objects as robust as possible in this regard, with a focus on clear configuration messages made to the users for the objects used in the use cases.
While we will make our best efforts to address the object complexity issues during the initial year of development, we expect that we will revisit this issue once use case 1 has been implemented, in hopes of refining the strategy that addresses it at a larger scope than a case by case approach.
API RFA 05 - Rename and simplify the Setup() command¶
Requested action¶
The Setup()/initialization process is confusing and possible dangerous because omitting the call may result in an undesirable state. The code example in the review was:
import gmat_py as gmat
gmat.Setup("MyCustomStartupFile.txt")
csConverter = gmat.CoordinateConverter()
eci = gmat.Create("CoordinateSystem", "ECI", "Earth", "MJ2000Eq")
ecef = gmat.Create("CoordinateSystem", "ECEF", "Earth", "BodyFixed")
gmat.Setup()
csConverter.Convert(mjd, rvIn, eci, rvOut, ecef)
During the review, it sounded like it is relatively easy to eliminate the first call to setup by modifying the import line to contain startup file configuration.
The second call confused a lot of people, and there is concern that forgetting to call SetUp() could result in an issue in the configuration that is not obvious to the user. The main confusion is that typically in an API, once an object is constructed, it is ready for use. That is not the case in the current design. It appears the SetUp() call is similar to BeginMissionSequence, and is required due to the existing GMAT design. If that is not correct, consider designs that do not require a Setup() call. If the existing design of GMAT requires such a call, consider using a more descriptive set of function names and provide a way to create and initialize new objects during execution. For example
import gmat_py as gmat
csConverter = gmat.CoordinateConverter()
eci = gmat.Create("CoordinateSystem", "ECI", "Earth", "MJ2000Eq")
gmat.InitializeObjects()
csConverter.Convert(mjd, rvIn, eci, rvOut, ecef)
// Based on previous execution, determined we need a new model, so create
// during execution and use. Need to initialize that object but leave the
// state of the rest of the objects alone.
ecef = gmat.Create("CoordinateSystem", "ECEF", "Earth", "BodyFixed")
// only initialize ecef, other objects are not re-initialized
gmat.InitializeObjects(ecef)
Finally, if an object has not been initialized before use, the API must provide that information back to the user (probably as an exception).
Supporting Rationale¶
The single biggest concern for users/reviewers was the call to SetUp(). Existing GMAT design may require a Setup()-like call, but if that is the case, care must be taken in the design and documentation should be clear, and user errors need to be trapped to avoid un-intended non-obvious failure modes.
Response¶
The originally proposed Setup() command has been renamed Initialize(). Based on the work one team member performed after the original design document was written, we agree that we can incorporate the core GMAT initialization when we load the system into the target platform’s environment, so you’ll see that the examples in the design document no longer include that first call.
The purpose of the Initialize() call is to establish object-to-object interconnections, and to validate that the objects are ready for use. This is different from the BeginMissionSequence behavior in GMAT, though. GMAT has a requirement when running a script that all of the scripted components be set and that their references also be connected. In GMAT, this occurs after objects are loaded into the GMAT Sandbox. That step is performed, in the API, using the Initialize() command.
One result of initialization here is the generation of a list of connections that were needed but not found. We may present this as an exception, but may present it in a more user friendly format.
API RFA 06 - API Style Guide¶
Requested action¶
Develop and maintain an API style guide as development progresses.
Supporting Rationale¶
Low-level models and functions in GMAT do not always have a consistent interface style between them. We should ensure as we expose models via the API, that the interface style and “wrappers” are consistent between models to make the API easy to use.
Response¶
The development team will include a style guide in the user documentation. A placeholder for it has been added to the User’s Guide table of contents.


Description
This program creates a sequence using the default sequence class, ISequence, and adds a number of words to it. The program sorts the words in ascending order and searches the sequence for the word "fox". Finally, it prints the word that is in position 9.
Concept
This program is a sample to demonstrate the use of the default class ISequence.
Task
This program uses a sequence to store and sort words in ascending order.


Pep Guardiola is asked his views about Newcastle United and Steve Bruce - here's his reply
Manchester City boss Pep Guardiola is eager to put last season's 2-1 loss behind him
by Lee RyderPep Guardiola has backed Newcastle United to survive in the Premier League again this season - and he feels that Manchester City's visit to St James' Park will be just as tough as last term under Rafa Benitez.
The Barcelona legend watched on last term as City were beaten 2-1 on Tyneside in one of the biggest shocks of the top-flight season.
Now he is expecting another difficult test as the prepared to take on Steve Bruce's side.
Guardiola said at his Press conference to preview the game: "It's tough with a new manager but they have good results.
"I think they will stay in the Premier League.
"They are physically strong, fast up front.
"Their structure is quite similar to under Rafa Benitez."
United slipped 1-0 behind against City last term before goals from Salomon Rondon and Matt Ritchie clinched a big win.
Guardiola reflected: "We forgot to play (last season).
"We scored a goal and forgot to attack. We learned from that, obviously, but we had a bad, bad day.
"Everybody understood that and we make a step forward."
City still went on to win the title last season despite the defeat against Benitez's side.
He said: "After that, we tried to be who we are.
"At that moment, I wasn't thinking about winning the Premier League or winning 14 games in a row.
"That would be a big mistake."


Support the NHS but helping to raise money which is needed to improve facilities, fund new equipment, provide important additional services.


Salary Calculator
What's your salary per year before tax?
£
Results table and chart:
Gross salary:
£
Tax free allowance:
£
Total taxable:
£
Income tax paid:
£
National insurance:
£
Total deductions:
£
Take-home salary:
£


I'm a looping presentation with no controls!
Wow!
Look at me go!
Alright, time for me to go back to the beginning...


| Module | AndAnd::ObjectGoodies |
| In: |
lib/andand.rb
|
This module is included in Object, so each of these methods are added to Object when you require ‘andand’. Each method is an adverb: they are intended to be enchained with another method, such as receiver.adverb.method
The purpose of an adverb is to modify what the primary method returns.
Adverbs also take blocks or procs, passing the receiver as an argument to the block or proc. They retain the same semantics with a block or proc as they do with a method. This behaviour weakly resembles a monad.
Returns nil if its receiver is nil, regardless of whether nil actually handles the actual method ot what it might return.
'foo'.andand.size => 3 nil.andand.size => nil 'foo'.andand { |s| s << 'bar' } => 'foobar' nil.andand { |s| s << 'bar' } => nil
Does not invoke the method or block and returns the receiver. Useful for comemnting stuff out, especially if you are using me for debugging purposes: change the .me to .dont and the semantics of your program are unchanged.
[1, 2, 3, 4, 5].me { |x| p x } => prints and returns the array [1, 2, 3, 4, 5].dont { |x| p x } => returns the array without printing it
Invokes the method and returns the receiver if nothing is raised. Therefore, the purpose of calling the method is strictly for side effects. In the block form, it resembles tap from Ruby 1.9, and is useful for debugging. It also resembles returning from Rails, with slightly different syntax.
Object.new.me do |o| def o.foo 'foo' end end => your new object
In the method form, it is handy for chaining methods that don‘t ordinarily return the receiver:
[1, 2, 3, 4, 5].me.pop.reverse => [4, 3, 2, 1]


Potted Plot | History | First Night Critics | Did You Know? | Behind the Scenes | Original Cast
First performed at the Opéra Comique, London, on November 17th, 1877
Revived at the Savoy Theatre, London, on October 11th, 1884.
The scene is the exterior of the Baronet, Sir Marmaduke Pointdextre's Elizabethan Mansion. It is midday.
Sir Marmaduke's son, Alexis, an officer of the Grenadier Guards, is betrothed to Aline, Lady Sangazure's daughter.
Mrs Partlet, a pew opener, arrives with her daughter, Constance. To her mother's surprise, Constance confesses that the man she loves is none other than the elderly Vicar, Dr Daly. The Dr enters and professes himself resigned to bachelordom.
Aline arrives and is greeted by her mother and Alexis. The time has come for the signing of the marriage contract.
After the ceremony all leave. Aline and Alexis are alone. Alexis is so overwhelmed by love for Aline that he would like all others to share the experience. He plans to distribute a love-philtre throughout the village. Within half an hour all that has partaken will fall for the first person they see who has also partaken.
Conveniently the supplier of the potion, John Wellington Wells, from the firm of J. W. Wells & Co, the old-established firm of family sorcerers, arrives and Alexis orders a quantity.
Aline fetches a large teapot and the potion is placed inside.
All arrive for a banquet and the tea is dispersed around. It soon becomes evident by the strange conduct of the cast that the potion is beginning to work.
Act two is set at midnight. All the peasantry are discovered asleep on the ground. They begin to wake up and true to the effects of the potion they fall immediately for the first person they see. Constance arrives, in tears, leading the elderly Notary.
"Dear friends, take pity on my lot,
My cup is not of nectar!
I long have loved - and who would not?
Our kind and reverend rector."
Sir Marmaduke, has also taken the philtre, and he enters arm-in-arm with Mrs Partlet!
When all have left the stage, John Wellington Wells arrives. He is getting worried about some of the unexpected effects of his drug. Even more so when Lady Sangazure catches sight of him and becomes immediately attracted. Mr Wells protests that he is already engaged to a maiden on a South Pacific isle. They depart.
Aline decides to drink the love-philtre herself. However she runs into Dr Daly and falls hopelessly in love with him.
Alexis arrives, embraces Aline, and is amazed when she rejects him.
Mr Wells turns up and explains that to break the spell either Alexis or himself must yield up his life. Aline protests that if they are all to be restored to their old loves and Alexis were to die then she would be left out in the cold.
A vote is taken and it is decided Mr Wells must be the victim.
All rejoice as Mr Wells disappears through a trapdoor in a burst of red fire.
Click here for a complete libretto to Patience
| History |
In 1876, following the success of Trial By Jury, a comedy Opera Company was formed by D'Oyly Carte for the purpose of furthering the project of a national school of English comic opera. Gilbert and Sullivan were, of course, to be the principal artists involved although it was never the intention to foster their works exclusively. Other librettists and composers were to be encouraged. Various projects fell through and so it was that the next opera to appear at the Opéra Comique was by Gilbert and Sullivan.
For the idea of The Sorcerer Gilbert turned to one of his own short stories, The Elixir of Love, which had been published in The Graphic. It was not altogether a happy choice. The theme of havoc wrought by a love phitre was already running rampant on the English stage. Although far from original Gilbert's new use of it met with the approval of the critics.
The Sorcerer was written by Gilbert for Fred Sullivan (Arthur's brother), whose success in Trial by Jury made him a natural choice for the leading comedian in succeeding operas. Sullivan's early death made it necessary to search for another talent and it was in this opera that Gilbert formed the nucleus of that historic company of actor-singers who were to be distinguished by the title "Savoyards".
Gilbert engaged a drawing-room entertainer named George Grossmith, who had never appeared on the professional stage and a man with an uncertain ear for music named Rutland Barrington, also quite inexperienced as an actor.
Even Grossmith, himself, wondered why he was being engaged for the leading character in a comic opera. Gilbert insisted that was not the voice or looks that were to be important.
Grossmith and Barrington became inseparable from Savoy operas and made the hits of their lives in the works of Gilbert and Sullivan.
| First night critics |
Times
Observer
Times
Punch
Hornet
Daily News
Figaro
Figaro
Figaro
Times
|
|
| Did you know? |
When D'Oyly Carte commissioned Gilbert and Sullivan to write an original comic opera he gave them no restrictions as to whom they might hire to play the parts, or how they would conduct rehearsals. The original contract stipulated that the authors should receive in advance £210 against a royalty of a little over £6 per performance, the payment to be divided equally between them.
| Behind the scenes |
When Gilbert came to direct the Savoy Operas he was faced with working with singers, many of whom were without any stage experience.
He would show the actors exactly how to pronounce his dialogue often clapping to emphasize certain words.
He would also stand on the stage beside the actor repeating the words with appropriate gestures over and over again until they were delivered, as he desired them to be.


Yahoo! Optimal LSH
Malcolm Slaney, Yahoo! Research, November 2011
Introduction
The Python and Matlab code in this distribution implement a locality-sensitive (LSH) hash for high-dimensional data. This task is important because web-scale multimedia is often high-dimensional, and thus suffers from the curse of dimensionality, and large. Yet users want answers within milliseconds.
My favorite introduction to LSH is this article:
Slaney, M. and Casey, M.,
"Locality Sensitive Hashing for Finding Nearest Neighbours,"
IEEE Signal Processing, March 2008.
The LSH parameter optimization algorithm is described in this article, which is currently under review:
Malcolm Slaney, Yury Lifshits, Junfeng He, "Optimal Locality-Sensitive Hashing," Submitted to Proceedings of the IEEE, Special Issue on Web-Scale Multimedia, Summer 2012.
There are three pieces of documentation. They are as follows:
- The Python Implementation - Python code that
implements the LSH index and provides basic test code. The classes in this code
are best used as base classes. You will probably extend the TestDataClass to read/write your data
and provide your desired interface.
- Matlab Code to Optimize the Parameters - The Matlab code uses distance
information (both nearest-neighbors and any-neighbor distances) to compute the optimal parameters
for any LSH implementation. The only parameters are the cost of computing the LSH hash (a time) and
the cost for checking that the LSH candidate(s) are correct (another time). The Matlab
code gives all the necessary parameters, with and without multiprobe.
- An example - Python and Matlab code that illustrate one LSH experiment.
Legal Notice
Copyright (c) 2011, Yahoo! Inc.
All rights reserved.
Redistribution and use of this software in source and binary forms,
with or without modification, are permitted provided that the following
conditions are met:
-
Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.
-
Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the
following disclaimer in the documentation and/or other
materials provided with the distribution.
-
Neither the name of Yahoo! Inc. nor the names of its
contributors may be used to endorse or promote products
derived from this software without specific prior
written permission of Yahoo! Inc.


Achievements at Cisco
Between 2007 and 2015, I was with the Video and Content Platforms Research and Advanced Development Group at Cisco, where I architected, designed and developed algorithms, protocols, products and solutions in the service provider and enterprise video domains.
- Conference and Industry Talks
- Research and Recruitment Talks, and Tutorials
- Journal and Magazine Publications
- Editorials
- Conference Publications
Conference and Industry Talks
(Related papers are available below)
- Quality-Aware HTTP Adaptive Streaming
IBC - Sept. 2015 - Enhancing MPEG DASH Performance via Server and Network Assistance
IBC - Sept. 2015 - Adaptive Streaming Deployments: Challenges and Solutions
Cisco Live - June 2015, Cisco Live Milan - Jan. 2015 - IPTV and Over-the-Top Video: Managed and Unmanaged Video Delivery
Cisco Live - June 2015, Cisco Live Milan - Jan. 2015, Cisco Live - May 2014, Cisco Live Melbourne - Mar. 2014, Cisco Live Milan - Jan. 2014 - Challenges with Large-Scale Adaptive Streaming Deployments
VSF VidTrans - Feb. 2015 - The Next Big Thing in Video
VideoNext Wksp. Panel Session - Dec. 2014 - Challenges with Large-Scale Adaptive Streaming Deployments
SCTE Cable-Tec Expo - Sept. 2014 - Streaming Video over HTTP with Consistent Quality
ACM MMSys - Mar. 2014 - IPTV Transport and Distribution: Will IPTV Replace Traditional Broadcast?
SMPTE Australia - July 2013 - Internet Video and Adaptive Streaming Technologies
SMPTE Australia - July 2013 - IPTV, Internet Video and Adaptive Streaming Technologies
Cisco Live - June 2013, Cisco Live Melbourne - Mar. 2013, Cisco Live London - Jan. 2013, Cisco Plus Canada - May 2012 - DASH and HEVC: New Standards Enabling Ultra-High Quality Video Services
Streaming Forum Panel Session - June 2013 - Server-Based Traffic Shaping for Stabilizing Oscillating Adaptive Streaming Players
ACM NOSSDAV - Feb. 2013 - Introduction to IPTV and Service Provider Video Technologies
Cisco Live - June 2012, Cisco Live Melbourne - Mar. 2012, Cisco Live - July 2011 - TV Everywhere: Part I
Cisco Live - June 2012, Cisco Live London - Jan. 2012 - Watching Video over the Web: Internet Video and Adaptive Streaming Technologies
Cisco Live - June 2012, Cisco Live Melbourne - Mar. 2012, Cisco Live - July 2011 - TV Everywhere
ACM NOSSDAV Keynote - June 2012 - What Happens When HTTP Adaptive Streaming Players Compete for Bandwidth?
ACM NOSSDAV - June 2012 - Scaling Server-Based Channel-Change Acceleration to Millions of IPTV Subscribers
Packet Video Workshop (Special Session on IPTV: Contribution, Distribution and Consumption of Entertainment-Grade Video) - May 2012 - Introductory - A-to-Z Video Architectures: Video Fundamentals, Headend Design, and Video Transport and Distribution
Cisco Live London - Jan. 2012 - Monitoring Video Services in Service Provider Networks
MENOG 7 - Oct. 2010 - Introduction to Service Provider Video Service Technologies, Architectures and Standards
Cisco Live - June 2010 - On the Scalability of RTCP-Based Network Tomography for IPTV Services
IEEE CCNC (Special Session on IPTV towards Seamless Infotainment) - Jan. 2010 - The Future of Video Services
Packet Video Workshop Panel Session - May 2009 - Reducing Channel Change Times in IPTV with Real-Time Transport Protocol
VSF VidTrans - Feb. 2009 - A Unified Approach for Repairing Packet Loss and Accelerating Channel Changes in Multicast IPTV
IEEE CCNC (Special Session on IPTV towards Seamless Infotainment) - Jan. 2009 - IP/MPLS Core Network Impacts on IPTV SLAs and Quality of Experience
SMPTE/VSF Joint Conference - Feb. 2008 - Error Control for IPTV over xDSL Networks
IEEE CCNC (Special Session on IPTV Technologies and Applications) - Jan. 2008
Research and Recruitment Talks, and Tutorials
- Over the Top Content Delivery: State of the Art and Challenges Ahead (link, slides)
IEEE ICME Tutorial - June 2015 - Internet Video and HTTP Adaptive Streaming
UCLA (EE 238 Guest Lecture) - Nov. 2014 - HTTP Adaptive Streaming Enhancements for Large-Scale Deployments
UCLA - Nov. 2014 - Over the Top Content Delivery: State of the Art and Challenges Ahead (link)
ACM Multimedia Tutorial - Nov. 2014 - IPTV and Over-the-Top Video: Principles, Standards and Future Research Directions (link)
IEEE ICIP Tutorial - Oct. 2014 - HTTP Adaptive Streaming Enhancements for Large-Scale Deployments
Aalto University - Sept. 2014 - HTTP Adaptive Streaming Enhancements for Large-Scale Deployments
Bilkent University - June 2014 - Internet Video and HTTP Adaptive Streaming
EPFL (EE 551 Guest Lecture) - Apr. 2014 - HTTP Adaptive Streaming: Principles, Ongoing Research and Standards
IEEE ICME Tutorial - July 2013 - Internet Video and Adaptive Streaming Technologies
EPFL (EE 551 Guest Lecture) - May 2012 - IP-Based Video Delivery: IPTV and Streaming
Georgia Tech (ECE 6613 Guest Lecture) - Oct. 2011 - Watching Video over the Web: Adaptive Streaming over HTTP
VAWN Seminar Series - Mar. 2011 - IPTV - Transport, Distribution and Quality of Experience
Hong Kong Polytechnic University - Oct. 2010 - IPTV - Transport, Distribution and Quality of Experience (link)
Hong Kong University of Science and Technology - Oct. 2010 - IPTV - Transport, Distribution and Quality of Experience
EPFL - July 2010 - IPTV and the Future of Video Services
Georgia Tech (ECE 6613 Guest Lecture) - Mar. 2010 - IPTV and the Future of Video Services
Georgia Tech (CoC Seminar) - Jan. 2010 - IPTV and the Future of Video Services
IEEE CCNC Tutorial - Jan. 2010 - Video Transport, Distribution and Quality of Experience (link)
University of Toronto - Oct. 2009 - A Unified Approach for Repairing Packet Loss and Accelerating Channel Changes in Multicast IPTV
IEEE Computer Society (Vancouver Chapter) - Apr. 2009 - Video Transport, Distribution and Quality of Experience
Simon Fraser University - Feb. 2009 - VQE - Techniques to Improve IPTV Quality of Experience
DoCoMo USA Research Labs - June 2008 - VQE - Techniques to Improve IPTV Quality of Experience
Stanford University - Apr. 2008 - Impact of Core and Access Network Impairments on IPTV SLAs
Bilkent University (EE/CS Weekly Seminar) - Mar. 2008 - Impact of Core and Access Network Impairments on IPTV SLAs (link)
Drexel University (ECE Colloquium) - Mar. 2008 - Impact of Core and Access Network Impairments on IPTV SLAs
Georgia Tech (ECE 6542 Guest Lecture) - Feb. 2008 - Video-on-Demand and IPTV Solutions
Georgia Tech (CSIP/Telecom Weekly Seminar) - Oct. 2007
Journal and Magazine Publications
- Ali C. Begen, "Spending quality time with the Web video," IEEE Internet Comput., vol. 20/6, pp. 42-48, Nov./Dec. 2016 (DOI: 10.1109/MIC.2016.49) [link]
- Zhi Li, Xiaoqing Zhu, Joshua Gahm, Rong Pan, Hao Hu, Ali C. Begen and David Oran, "Probe and adapt: rate adaptation for HTTP video streaming at scale," IEEE J. Select. Areas Commun., Special Issue on Adaptive Media Streaming, vol. 32/4, pp. 719-733, Apr. 2014 (DOI: 10.1109/JSAC.2014.140405) [link]
- Saamer Akhshabi, Sethumadhavan Narayanaswamy, Ali C. Begen and Constantine Dovrolis, "An experimental evaluation of rate-adaptive video players over HTTP," EURASIP Signal Processing: Image Communication, vol. 27/4, pp. 271-287, Apr. 2012 (DOI: 10.1016/j.image.2011.10.003) [link]
- Zhi Li, Xiaoqing Zhu, Ali C. Begen and Bernd Girod, "IPTV multicast with peer-assisted lossy error control," IEEE Trans. Circuits Syst. Video Technol., vol. 22/3, pp. 434-449, Mar. 2012 (DOI: 10.1109/TCSVT.2011.2164835) [link]
- John Evans, Ali C. Begen, Jason Greengrass and Clarence Filsfils, "Toward lossless video transport," IEEE Internet Comput., vol. 15/6, pp. 48-57, Nov./Dec. 2011 (DOI: 10.1109/MIC.2011.101) [link]
- Ali C. Begen, Tankut Akgul and Mark Baugher, "Watching video over the Web, part 2: applications, standardization, and open issues," IEEE Internet Comput., vol. 15/3, pp. 59-63, May/June 2011 (DOI: 10.1109/MIC.2010.156) [link]
- Ali C. Begen, Tankut Akgul and Mark Baugher, "Watching video over the Web, part 1: streaming protocols," IEEE Internet Comput., vol. 15/2, pp. 54-63, Mar./Apr. 2011 (DOI: 10.1109/MIC.2010.155) [link]
- K.-H. Kelvin Chan, S.-H. Gary Chan and Ali C. Begen, "SPANC: optimizing scheduling delay for peer-to-peer live streaming," IEEE Trans. Multimedia, vol. 12/7, pp. 743-753, Nov. 2010 (DOI: 10.1109/TMM.2010.2053524) [link]
- Ali C. Begen, Colin Perkins and Joerg Ott, "On the use of RTP for monitoring and fault isolation in IPTV," IEEE Network, Special Issue on Improving Quality of Experience for Network Services, vol. 24/2, pp. 14-19, Mar./Apr. 2010 (DOI: 10.1109/MNET.2010.5430139) [link]
- Xing Jin, S.-H. Gary Chan, Wan-Ching Wong and Ali C. Begen, "A distributed protocol to serve dynamic groups for peer-to-peer streaming," IEEE Trans. Parallel Distrib. Syst., vol. 21/2, pp. 216-228, Feb. 2010 (DOI: 10.1109/TPDS.2009.58) [link]
- Khalid Ahmad and Ali C. Begen, "IPTV and video networks in the 2015 timeframe: the evolution to medianets," IEEE Commun. Mag., vol. 47/12, pp. 68-74, Dec. 2009 (DOI: 10.1109/MCOM.2009.5350371) [link] [ blog]
- Ali C. Begen, Neil Glazebrook and William Ver Steeg, "Reducing channel-change times with the real-time transport protocol," IEEE Internet Comput., Special Issue on IPTV, vol. 13/3, pp. 40-47, May/June 2009 (DOI: 10.1109/MIC.2009.67) [link]
- Jason Greengrass, John Evans and Ali C. Begen, "Not all packets are equal, part 2: the impact of network packet loss on video quality," IEEE Internet Comput., vol. 13/2, pp. 74-82, Mar./Apr. 2009 (DOI: 10.1109/MIC.2009.40) [link]
- Jason Greengrass, John Evans and Ali C. Begen, "Not all packets are equal, part 1: streaming video coding and SLA requirements," IEEE Internet Comput., vol. 13/1, pp. 70-75, Jan./Feb. 2009 (DOI: 10.1109/MIC.2009.14) [link]
Editorials
- Ali C. Begen, Mario Kolberg and Madjid Merabti, "Trends in consumer communications," IEEE Commun. Mag., vol. 52/12, pp. 142, Dec. 2014 (DOI: 10.1109/MCOM.2014.6979965) [link]
- Ali C. Begen, Mario Kolberg and Madjid Merabti, "Trends in consumer communications: networked homes," IEEE Commun. Mag., vol. 52/6, pp. 184, June 2014 (DOI: 10.1109/MCOM.2014.6829962) [link]
- Christian Timmerer, Carsten Griwodz, Ali C. Begen, Thomas Stockhammer and Bernd Girod, "Guest editorial adaptive media streaming," IEEE J. Select. Areas Commun., vol. 32/4, pp. 681-683, Apr. 2014 (DOI: 10.1109/JSAC.2014.140401) [link]
- Ali C. Begen, Mario Kolberg and Madjid Merabti, "Trends in consumer communications," IEEE Commun. Mag., vol. 51/11, pp. 112-113, Nov. 2013 (DOI: 10.1109/MCOM.2013.6658661) [link]
- Ali C. Begen, Mario Kolberg and Madjid Merabti, "Trends in consumer communications: integration, integration, and integration," IEEE Commun. Mag., vol. 51/6, pp. 142, June 2013 (DOI: 10.1109/MCOM.2013.6525607) [link]
- Ali C. Begen, Mario Kolberg and Madjid Merabti, "Trends in consumer communications," IEEE Commun. Mag., vol. 50/11, pp. 130, Nov. 2012 (DOI: 10.1109/MCOM.2012.6353692) [link]
- Ali C. Begen, Mario Kolberg and Madjid Merabti, "Trends in consumer communications: integration, integration and integration," IEEE Commun. Mag., vol. 50/6, pp. 132, June 2012 (DOI: 10.1109/MCOM.2012.6211497) [link]
- Ali C. Begen, Mario Kolberg, Madjid Merabti and Stan Moyer, "Consumer communication applications drive network integration," IEEE Commun. Mag., vol. 49/11, pp. 164-165, Nov. 2011 (DOI: 10.1109/MCOM.2011.6069724) [link]
Conference Publications
- Ali C. Begen, "Quality-aware HTTP adaptive streaming," in Proc. Int. Broadcasting Convention Conf. (IBC), Amsterdam, The Netherlands, Sept. 2015 (DOI: 10.1049/ibc.2015.0004) [link]
- Emmanuel Thomas, M.O. van Deventer, Thomas Stockhammer, Ali C. Begen and Jeroen Famaey, "Enhancing MPEG DASH performance via server and network assistance," in Proc. Int. Broadcasting Convention Conf. (IBC), Amsterdam, The Netherlands, Sept. 2015 (DOI: 10.1049/ibc.2015.0014) [link] (One of the papers in The Best of IET and IBC 2015-2016)
- Ali C. Begen, Tim Donahue, Josh Gahm and Zhi Li, "Challenges with large-scale adaptive streaming deployments," in Proc. SCTE Cable-Tec Expo, Denver, CO, Sept. 2014
- Zhi Li, Ali C. Begen, Joshua Gahm, Yufeng Shan, Bruce Osler and David Oran, "Streaming video over HTTP with consistent quality," in Proc. ACM Multimedia Systems Conf. (MMSys), Singapore, Mar. 2014 (DOI: 10.1145/2557642.2557658) [link]
- Danny H. Lee, Constantine Dovrolis and Ali C. Begen, "Caching in HTTP adaptive streaming: friend or foe?" in Proc. ACM Int. Wksp. Network and Operating Systems Support for Digital Audio and Video (NOSSDAV), Singapore, Mar. 2014 (DOI: 10.1145/2597176.2578270) [link]
- Saamer Akhshabi, Lakshmi Anantakrishnan, Constantine Dovrolis and Ali C. Begen, "Server-based traffic shaping for stabilizing oscillating adaptive streaming players," in Proc. ACM Int. Wksp. Network and Operating Systems Support for Digital Audio and Video (NOSSDAV), Oslo, Norway, Feb. 2013 (DOI: 10.1145/2460782.2460786) [link]
- Saamer Akhshabi, Lakshmi Anantakrishnan, Constantine Dovrolis and Ali C. Begen, "What happens when HTTP adaptive streaming players compete for bandwidth?" in Proc. ACM Int. Wksp. Network and Operating Systems Support for Digital Audio and Video (NOSSDAV), Toronto, Canada, June 2012 (DOI: 10.1145/2229087.2229092) [link]
- Marc Mignon, Koen Bouckhout, Joshua Gahm and Ali C. Begen, "Scaling server-based channel-change acceleration to millions of IPTV subscribers," in Proc. Packet Video Wksp., Munich, Germany, May 2012 (DOI: 10.1109/PV.2012.6229721) [link] (Best-paper Award)
- Zhi Li, Ali C. Begen and Bernd Girod, "Delay-optimal burst erasure codes for parallel links," in Proc. Int. Symp. Network Coding, Beijing, China, July 2011 (DOI: 10.1109/ISNETCOD.2011.5979067) [link]
- Saamer Akhshabi, Ali C. Begen and Constantine Dovrolis, "An experimental evaluation of rate-adaptation algorithms in adaptive streaming over HTTP," in Proc. ACM Multimedia Systems Conf. (MMSys), San Jose, CA, Feb. 2011 (DOI: 10.1145/1943552.1943574) [link] (ACM SIGMM Test of Time Paper Award in the category of multimedia systems-networking)
- Zhi Li, Ali C. Begen, Xiaoqing Zhu and Bernd Girod, "Accelerated IPTV channel change with transcoded unicast bursting," in Proc. ACM Multimedia, Firenze, Italy, Oct. 2010 (DOI: 10.1145/1873951.1874076) [link]
- Zhi Li, Xiaoqing Zhu, Ali C. Begen and Bernd Girod, "IPTV multicast with peer-assisted lossy error control," in Proc. Visual Communications and Image Processing (VCIP), Huang Shan, An Hui, China, July 2010
- Ali C. Begen, Colin Perkins and Joerg Ott, "On the scalability of RTCP-based network tomography for IPTV services," in Proc. IEEE Consumer Communications and Networking Conf. (CCNC), Special Session on IPTV towards Seamless Infotainment, Las Vegas, NV, Jan. 2010 (DOI: 10.1109/CCNC.2010.5421780) [link]
- K.-H. Kelvin Chan, S.-H. Gary Chan and Ali C. Begen, "Optimizing substream scheduling for peer-to-peer live streaming," in Proc. IEEE Consumer Communications and Networking Conf. (CCNC), Las Vegas, NV, Jan. 2010 (DOI: 10.1109/CCNC.2010.5421848) [link]
- Zhi Li, Xiaoqing Zhu, Ali C. Begen and Bernd Girod, "Peer-assisted packet loss repair for IPTV video multicast," in Proc. ACM Multimedia, Beijing, China, Oct. 2009 (DOI: 10.1145/1631272.1631328) [link]
- Y.-T. Hillman Li, Dongni Ren, S.-H. Gary Chan and Ali C. Begen, "Low-delay mesh with peer churns for peer-to-peer streaming," in Proc. IEEE Int. Conf. Multimedia and Expo (ICME), New York, NY, June 2009 (DOI: 10.1109/ICME.2009.5202800) [link] (Invited paper)
- Guifeng Zheng, S.-H. Gary Chan, Xiaonan Luo and Ali C. Begen, "Pattern-push: a low-delay mesh-push scheduling for live peer-to-peer streaming," in Proc. IEEE Int. Conf. Multimedia and Expo (ICME), New York, NY, June 2009 (DOI: 10.1109/ICME.2009.5202705) [link]
- Zhi Li, Xiaoqing Zhu, Ali C. Begen and Bernd Girod, "Forward and retransmitted systematic lossy error protection for IPTV video multicast," in Proc. Packet Video Wksp., Seattle, WA, May 2009 (DOI: 10.1109/PACKET.2009.5152142) [link]
- Ali C. Begen, Neil Glazebrook and William Ver Steeg, "A unified approach for repairing packet loss and accelerating channel changes in multicast IPTV," in Proc. IEEE Consumer Communications and Networking Conf. (CCNC), Special Session on IPTV towards Seamless Infotainment, Las Vegas, NV, Jan. 2009 (DOI: 10.1109/CCNC.2009.4784878) [link] (Invited paper)
- Ali C. Begen, "Error control for IPTV over xDSL networks," in Proc. IEEE Consumer Communications and Networking Conf. (CCNC), Special Session on IPTV Technologies and Applications, Las Vegas, NV, Jan. 2008 (DOI: 10.1109/ccnc08.2007.146) [link] (Invited paper)
Copyright Notice
The manuscripts on this page are copyrighted by the authors or the journals in which they were published. They are provided for the purpose of non-commercial dissemination of scientific work.


have a Robin MK2 solar diverter and want to charge 48vdc battery bank, when my hot water is hot. ive noticed on a thread it seems possible to do this using a pulsed output from the diverter. what sort of charger stands this sort of rapid switching?
I intend to use the 48vdc batteries to run a spare 600w grid tie inverter via a buck boost circuit, that has a fixed current set, so at night it will provide 200w of power to cancel out my houses background use.
later I might get more batteries and increase the output to say 500w, so some of our other load is covered like TV's laptops.
Re: pulsed battery charging
Tinbum has experience of a diverter and battery charging. If he doesn't notice this thread and respond, try a PM.
Re: pulsed battery charging
cheers, already pm'ed him hence the post.
Re: pulsed battery charging
You didn't even hint at that! PM me if he doesn't respond and I'll nudge him. Failing that, the obvious answer is you'll need to speak to the charger manufacturer to get their help. The ideal situation would be that the charger can accept a control input, so you leave the charger permanently powered and drive the control signal instead of switching mains. It needs more thought than it's had so far because you'd need to extract another output and condition it to suit the charger.
Re: pulsed battery charging
Hi,
I use Eltek chargers of 3 differing types.
Initially I was using these 1kW chargers;
http://www.ebay.co.uk/itm/351177203790?ru=http%3A%2F%2Fwww.ebay.co.uk%2F...
They are switched on the AC using AF mode but I did have to change a small relay within them as the contacts didn't last. (Same relay but with different contact material, also used a socket to aid later replacement if needed- haven't had to replace since ).
I still use the above but now I've also added 5 of these 175W chargers as one of my meters won't work with the diverter without some import being registered so I try and do the switching with small loads;
http://www.ppauctions.com/archived/archived_lot.php?arc_id=13837
With these I leave the AC on and switch the DC output, once 5 of these are on a 1kW turns on and the sequence starts again. (175W output but input is about 210W)
I then have some Eltek flatpack2 HE chargers
Hope that helps.
Nick
Re: pulsed battery charging
hadnt thought about switching the dc side. i wonder if better control couldnt be achived as Robert suggests using an output from the mk2 that can vary the current from the charger.
Re: pulsed battery charging
Roberts idea would be ideal and probably is feasible but I don't have the skill at the moment or time to learn it. It would certainly help me with my meter from hell!!
Re: pulsed battery charging
You probably want to consider the life of the battery too. I wonder what all that micro-cycling does to the battery after a year or two. I don't know enough about battery chemistry to know if's likely to cause an issue. Any chemistry gurus out there?
Re: pulsed battery charging
http://batteryuniversity.com/ seems to be a good source of general information.
Re: pulsed battery charging
They do sell pulse chargers for batteries that are supposed to help the battery- slightly different I know to what I'm doing though.
Even with direct DC MPPT chargers you are still at the whim of what the sun is doing. I work on the philosophy that you know the battery will be damaged if you don't charge it and that its only the initial 'bulk charge' and some of the 'absorption charge' that will be subjected to the varying voltage and current. I can't see a better way to do it without importing from the grid or only using a part of the pv.
Re: pulsed battery charging
When there's some excess PV, but not enough to fully satisfy the charger without importing, what's the maximum frequency you'll switch it at? Do you bang away at it as if it were an immersion heater, or do you adopt a much gentler algorithm?
Re: pulsed battery charging
Just came across this paper on pulse chargers which is fairly interesting:
http://www.ipenz.org.nz/ipenz/publications/transactions/Transactions98/e...
although it's 16 years old, so may not represent the state of the art. But it certainly has a few cautionary statements such as:
A low cost charger may consist
solely of a transformer and full-bridge rectifier, and in the cheapest of these the output is often
determined by the mains voltage and the turns ratio of the transformer. Usually such a circuit has no
output filter so that during float charge operation the 100Hz AC ripple can produce micro-cycling of
the battery consisting of small charge/discharge cycles which are increasingly detrimental over time.
and in its conclusions:
A simple ‘unintelligent’ invariant pulse charging approach was shown to dramatically decrease
charging time but is also capable of gassing the battery and must be applied with care. In this
technique specific pulse widths and/or magnitudes must be chosen carefully to fit each lead-acid battery
and may need modification with battery age.
Re: pulsed battery charging
No much gentler.
I use them in AF mode and now its even more gentle since I added the five 175W chargers.
With just the 1kW chargers they were set for being on a minimum of 2 seconds though they do ramp their output up- hence switching the ac.
Now with the 175W they are on for about 10 seconds minimum unless the sun were to go behind a cloud when they are set for 0.5 seconds minimum. The 1kW's come on once five 175W are on.
All the chargers are switch mode.
Re: pulsed battery charging
Do you have multiple chargers attempting to charge the same battery simultaneously, or is each charger responsible for its own sub-set of batteries?
Re: pulsed battery charging
They all do one big battery bank 48v and about 1200Ah.
Re: pulsed battery charging
Do the chargers co-operate with each other, or are they all oblivious of their competition?
Re: pulsed battery charging
The 5no 175W all have a single control unit where the voltage is set so they all work at the same voltage.
The 4 no 1kW all have separate voltage adjustment though I have set all these to the same voltage. I have just bought a proper Eltek housing for these (as link above) so will be putting them in that which may interlink the voltage settings.
The Flatpack 2 HE chargers are all software controlled and do communicate with each other and also do staged charging.
The batteries are also charged directly from some PV using a Moringstar MPPT 60 charger. This in effect actually does the main control of the charging due to the setting voltages I put into the Elteks, which varies between summer and winter. The elteks basically put the bulk charge in and keep the batteries near/in the absorption stage.
Re: pulsed battery charging
No much gentler. I use them in AF mode and now its even more gentle since I added the five 175W chargers.
Can you remind us what AF setting you are using? My recollection is that your supply meters have very small "sweet zones" so I would expect that your AF setting would have to be very restrictive.
Depending on the sketch that you are using, the AF parameter will be in one these forms:
Re: pulsed battery charging
My meters have changed (a few times). They used to be 1100J but I now have one meter with a zero sweet zone and the other with 3600J
My sketch is old so I have;
float offsetOfEnergyThresholdsInAFmode = 0.4; // <-- must not exceed 0.5
that's not where I used to change it though,
I preferred to change what you used to call
#define JOULES_PER_WATT_HOUR 3600 // 0.001 kWh = 3600 Joules
Re: pulsed battery charging
Changing the value of JOULES_PER_WATT_HOUR to anything other than 3600 has never made sense to me. My later sketches include a SWEETZONE_IN_JOULES declaration so that this aspect can be tidily changed.
An offset value of 0.4 means that your two energy thresholds are at the 10% and 90% points of the energy bucket. Given that there will always be some overshoot, that's a very relaxed setting. It's interesting to know that this setting is acceptable to your 3600J meter. I generally set this parameter to 0.1 so that only 20% of the available range is in use. This should be OK with most types of meters that are to be found in these parts.
With hindsight, it was probably unwise of me to mention the limiting value of 0.5. In practice, no system will work when set to this value because there will always be some overshoot which will result in penalties being correctly applied by the meter.
Re: pulsed battery charging
Given that there will always be some overshoot, that's a very relaxed setting. It's interesting to know that this setting is acceptable to your 3600J meter.
I had to use as much as I possibly could of the sweet zone with the first meters because it was so small and with trial and error I found this worked fine with no import at all.
Re: pulsed battery charging
That sounds a good approach to me. Use as much of the penalty-free zone as you can get away with.
If there's any drift between the two measurement systems (meter and Router), there is bound to be an occasional glitch/pulse. The more of the 'sweet-zone' that is used, the more frequent such chargeable events will be. If your new 3600J meter is working nicely alongside your various dumploads, it sounds as if you've got the AF setting just right.
Re: pulsed battery charging
It does work really well, so much so that when the meter was first put in, I thought it was faulty. It took 3 days to clock up 1kWh (that's its resolution). Even now its only reading 112kWh and it was put in on 23rd July, half of that has been in this the last month, which has been dull.
I just wish I could resolve what to do about the other meter.
I'm wondering how things are going to be with the new smart meters and if they are going to be rolled out for 3 phase supplies as well. I know BG are rolling out their smart meters now but has the final spec actually been finalized?
Re: pulsed battery charging
Hi Tinbum
I think i'm following the setup you have. Why are you switching the DC output from the rectifiers though? Do the rectifiers not like having the AC switched? A surge issue? If the DC output is turned off does the rectifier use any juice?
Do you then have an additional inverter to get back to 240vac or are you using the 48v directly? (ie am i missing another part of the puzzle?) If you have an inverter is it just one or do you have a clever way to step up the output capability as well?
Thanks
Re: pulsed battery charging
Hi,
The 175W are dc switched.
The 1kW and the 2Kw are ac switched.
The only issue I had was, as I described above, with a small relay in the 1kw. Since swapping that relay I've not had any problem.
When I had that relay problem I purchased some really cheap DC SSR's on ebay to try incase I hadn't solved it. As I had these I decided to use them when I added the 175W chargers. These 5 chargers use a total of 25w when all the DC SSR's are off, as shown by one of those plug in meters, and 1200W when all are on.
I had initially though about using DC switching but quality SSR's (Crydom) for DC were a lot more expensive. As the 175W chargers only output about 3A max I thought it worth trying the cheap ones. I'm not sure that I would risk them for 1kW or 2kW though.
I have one 4.5kW inverter and have this set on a 'sell mode'. This is controlled by an external photocell so that it comes on below a certain light level. I have this set a 4A (1kW) when we are up and at night I turn it down to 3A when I go to bed. This covers our base load. We will still import if we turn a kettle on when its dark or during the day if the PV isn't enough. It generally works very well though. Its also slightly inefficient as for a small part of the day the pv will be supplying when the inverter is also supplying. The chargers will put this back in the batteries though, with inefficiencies. I haven't made that part any better as I have an SMA system ready to be installed that will work with totally automatic use of the batteries day or night.
Re: pulsed battery charging
Hi,
Cool gotcha now.
Your inverter allows you to say how much it will produce? Or are you just restricting it to 3A by some cleverness? & hence knowing it will only make 1kw or 4.5kw.
How do you use the AC? Does it just connect into your consumer unit or are there parts of the system that gets the free power but not all?
How do you handle disconnecting from the grid when the grid power goes/comes back?
Are you moving to an SMA Island setup then? Or are you going to use the inverter with the battery built in?
Are you not happy with your setup or is it just easier to get SMA's? (very interested)
If you're dumping yours.... errr let me know ;-)
Thanks
Re: pulsed battery charging
You can set the inverter in 0.5A steps with a press of the button.
Everything get the power and I'm always connected to the grid though I could connect it so I could run off grid- which I have done for a month while we were having our DNO supply upgraded. It ran well off grid, but the diverter introduced a lot of flicker during the day and iI had to limit the max PV output. Switching 3kw loads on an inverter with a diverter makes it very hard work for the inverter to keep everything within range!!
No, I have a 3 phase sunny backup set and the auto transfer box to install. That's going to take some setting up using a diverter as well!!
Sorry, the system I'm using will continue to be used as we actually have 2 supplies and the SMA will just be on the one.
The main disadvantage with my system is that it wont automatically supply power from the batteries if you turn a kettle or oven on during the day when the PV isn't enough or on a night.
Re: pulsed battery charging
You can set the inverter in 0.5A steps with a press of the button.
Isn't the inverter a voltage source? Is that setting a trip current? What's the advantage of winding it back when you go to bed? What happens if you don't?
[EDIT]
Ahh... never mind... I was thinking you were off grid. When you're on-grid it's more a current source, and I guess you're trying to reduce your battery sourced exports overnight?
Re: pulsed battery charging
What inverter have you got that allows you to change its output?
How does it sync its waveform with that of the grid when its connected (back) to the grid?
Just checking I've got it, you've got the PV making 240 connect to the grid. spare PV gets rectified to 48v battery, which then gets inverted back to 240 which is then connected to the same AC as the consumer unit, grid & PV. ie you've got "input" from the grid, PV and inverter, whilst dumping spare into the batteries?
I didn't think you were allowed to connect a Sunny Backup - its missing something can't remember - but its not for UK connections? Or are you using a Sunny Island and a backup ?
I take it you've got the G59 raley built into the system as your inverter is connected to the grid?
(I'm debating about what I want to do - as long as I'm not frying anything!)


A B C D E F G H I J L M N O P R S T U V W Y
All Classes All Packages
All Classes All Packages
All Classes All Packages
C
- callAddDish(int, int, int) - Method in class Model.Database.BBDDHelper
-
Call a procedure.
- callCommand(String, Object) - Method in class Model.Model
-
function that takes a comannd an based of that treats a object
- callProcedure(String, Object) - Method in class Model.Database.BBDDConnector
- cancelItem(String) - Method in class View.Aunthentification
- cancelItem(String) - Method in class View.SubView.Menu
-
Function that cancel a Item.
- cancelItem(String) - Method in class View.SubView.TableMangement
-
Function that cancel an item in view.
- cancelReserve(User) - Method in class Network.Network
-
This method is based on making a cancellation of a reservation.
- Carte - Class in View.SubView
-
Carte class extends JPanel serves to admin the carte selection
- Carte(CarteController) - Constructor for class View.SubView.Carte
-
This function shows the the menu of dishes.
- CarteController - Class in Controller.SubController
-
CarteController class
- CarteController(PreServiceController) - Constructor for class Controller.SubController.CarteController
-
Default constructor
- CentralizedRestaurantServer - Class in Model
- CentralizedRestaurantServer() - Constructor for class Model.CentralizedRestaurantServer
- changeCurrentState(String) - Method in class View.ServiceState
-
In this function we change the current state from a String.
- changeCurrentView(JPanel) - Method in class View.SplitPlane
-
most important function that allow us to be switching to view to other view without loosing the side panel
- changeService() - Method in class Controller.FormController
-
change service state
- changeState(String) - Method in class Controller.FormController
-
changes the state to service to preservice, and vice-verse
- changeWindowState() - Method in class Controller.SideMenuController
-
This method change the State of the different Windows.
- CharBar - Class in View.SubView
-
CharBar Class extends JPanel generates the bar of the stadistics
- CharBar(LinkedList<Ranking>) - Constructor for class View.SubView.CharBar
-
Default Constructor of the class
- ClientManager - Class in Network
-
Client manager class that manages the client requests extends Thread class
- ClientManager(Socket, Network) - Constructor for class Network.ClientManager
-
contructor of the class
- ClientOrder - Class in View.SubView
-
ClientOrder class extends Jpanel serves to admin Service
- ClientOrder(Reserve, ClientOrderController) - Constructor for class View.SubView.ClientOrder
-
This function aims at realizing its respective constructor.
- ClientOrderController - Class in Controller.SubController
-
Client Order controller
- ClientOrderController(ServiceController) - Constructor for class Controller.SubController.ClientOrderController
-
Default contructor
- closeService() - Method in class Model.Model
-
close service
- Configuration - Class in Model.Database
-
Read Json.
- Configuration() - Constructor for class Model.Database.Configuration
-
This method serves to setup the configuration of our BBDD.
- connect() - Method in class Model.Database.BBDDConnector
-
This method is based in connect the BBDD and if it detects any connectivity problem it will launch an error message thanks to try catch.
- Controller - package Controller
- Controller.SubController - package Controller.SubController
- Countdown - Class in Model
-
The main function of this type is to carry out the countdown operation.
- Countdown(JLabel, Date) - Constructor for class Model.Countdown
-
This function is the class constructor countdown.
- createMenu(String) - Method in class Controller.FormController
-
Create the menu
- createMenu(String) - Method in class Controller.PreServiceController
-
create a menu
- createMenu(String, Restaurant) - Method in class Model.Database.DAOManager
-
Function that create a menu.
All Classes All Packages


BathroomBuddy
Find a Bathroom Stall Near Me
List
Map
650 4th Floor Men's Room
Busy
3 minutes ago
Stall 0
☆
☆
☆
★
★
Busy
3 minutes ago
Stall 1
☆
☆
☆
★
★
Free
3 minutes ago
Stall 2
☆
☆
☆
★
★
650 3rd Floor Men's Room
Busy
3 minutes ago
Stall 0
☆
☆
☆
★
★
Busy
3 minutes ago
Stall 1
☆
☆
☆
★
★
Free
3 minutes ago
Stall 2
☆
☆
☆
★
★


New Buy Scenario
Potential Profit : {{potentialProfit || 0.00 | currency}}
Merchant
Item Description
Type
Retail
Paid
Discount
Type
%
$
Net Cost
{{error}}
Potential Sale
Potential Shipping
Charge to Buyer
Potential Shipping
Costs for You as the Seller
Potential Paypal Fee
Potential Listing Fee
Potential Final-Value Fee
Net Sale


ArxivRequest
public protocol ArxivRequest
A type providing specification of aXiv API request.
-
Returns full specification of the request.
Conformig type decide and document configuration of the returned specification.
Declaration
Swift
var requestSpecification: ArxivRequestSpecification { get }
-
url
Extension methodReturns URL for making arXiv API calls specified by the request.
Declaration
Swift
var url: URL { get }
-
sorted(by:
Extension method) Returns a new request changing the sorting criterion in
requestSpecification
.Declaration
Swift
func sorted(by sortingCriterion: ArxivRequestSpecification.SortingCriterion) -> ArxivRequest
Parameters
sortCriterion
A sorting criterion.
-
sortingOrder(_:
Extension method) Returns a new request changing the sorting order in
requestSpecification
.Declaration
Swift
func sortingOrder(_ sortingOrder: ArxivRequestSpecification.SortingOrder) -> ArxivRequest
Parameters
sortingOrder
A sorting order.
-
startIndex(_:
Extension method) Returns a new request changing the start index in
requestSpecification
.Use to imlement paging. For example, if
itemsPerPage == 20
, the first page corresponds tostartIndex == 0
, the second page tostartIndex == 40
, the third page tostartIndex == 60
etc.ArxivReponse
values can be used for getting various page indicies for given response.From arxiv API manual:
In cases where the API needs to be called multiple times in a row, we encourage you to play nice and incorporate a 3 second delay in your code.
Because of speed limitations in our implementation of the API, the maximum number of results returned from a single call (
itemsPerPage
) is limited to 30000 in slices of at most 2000 at a time, using theitemsPerPage
andstartIndex
query parameters.For example to retrieve matches 6001-8000:
term("electron", in: .any) .startIndex(6000) .itemsPerPage(8000)
Large result sets put considerable load on the server and also take a long time to render. We recommend to refine queries which return more than 1,000 results, or at least request smaller slices. For bulk metadata harvesting or set information, etc., the OAI-PMH interface is more suitable. A request with
itemsPerPage
> 30,000 will result in an HTTP 400 error code with appropriate explanation. A request for 30000 results will typically take a little over 2 minutes to return a response of over 15MB. Requests for fewer results are much faster and correspondingly smaller.Precondition
i >= 0
Declaration
Swift
func startIndex(_ i: Int) -> ArxivRequest
Parameters
i
Start index of the request.
-
itemsPerPage(_:
Extension method) Returns a new request changing the number of items per single response page in
requestSpecification
.From arxiv API manual:
In cases where the API needs to be called multiple times in a row, we encourage you to play nice and incorporate a 3 second delay in your code.
Because of speed limitations in our implementation of the API, the maximum number of results returned from a single call (
itemsPerPage
) is limited to 30000 in slices of at most 2000 at a time, using theitemsPerPage
andstartIndex
parameters.For example to retrieve matches 6001-8000:
term("electron", in: .any) .startIndex(6000) .itemsPerPage(8000)
Large result sets put considerable load on the server and also take a long time to render. We recommend to refine queries which return more than 1,000 results, or at least request smaller slices. For bulk metadata harvesting or set information, etc., the OAI-PMH interface is more suitable. A request with
itemsPerPage > 30000
will result in anHTTP 400
error code with appropriate explanation. A request for30000
results will typically take a little over 2 minutes to return a response of over 15MB. Requests for fewer results are much faster and correspondingly smaller.Precondition
n > 0
Declaration
Swift
func itemsPerPage(_ n: Int) -> ArxivRequest
Parameters
n
Maximum number of articles per response.
-
fetch(using:
Extension method, asynchronousdelegate: ) Uses provided session to download and parse articles specified by the request and delivers the result asynchronously.
Throws
An error which is either
ArxivURLError
,ArxivServerError
,ArxivParserError
orArxivAPIError
.Declaration
Swift
@available(macOS 12.0.0, iOS 15.0.0, *) func fetch(using session: URLSession, delegate: URLSessionTaskDelegate? = nil) async throws -> ArxivResponse
Parameters
session
An
URLSession
object used for fetching.delegate
A delegate that receives life cycle and authentication challenge callbacks as the transfer progresses.
-
fetchTask(using:
Extension methodcompletion: ) Uses provided session to create and return a task described by the request.
The completion handler takes a single
Result
argument, which is either a succesfuly parsedArxivResponse
or an error, if one occurs. The error is eitherArxivURLError
,ArxivServerError
,ArxivParserError
orArxivAPIError
.If multiple tasks are programatically run in a raw, a 3 seconds delay between the tasks is recomended by arxiv API manual.
Note
Completion handler is called on session’sdelegateQueue
.Declaration
Swift
func fetchTask(using session: URLSession, completion: @escaping ArxivFetchTaskCompetionHandler) -> URLSessionDataTask
Parameters
session
An
URLSession
object used for creating and running the task.completion
A function to be called after the task finishes.
-
fetch(using:
Extension methodcompletion: ) Uses provided session to create and and run a task described by the request. Method returns the task after it starts running.
The completion handler takes a single
Result
argument, which is either a succesfuly parsedArxivResponse
, or anArxivKitError
, if one occurs.If multiple tasks are programatically run in a raw, a 3 seconds delay between the tasks is recomended by arxiv API manual.
Note
Completion handler is called on session’sdelegateQueue
.Declaration
Swift
@discardableResult func fetch(using session: URLSession, completion: @escaping ArxivFetchTaskCompetionHandler) -> URLSessionDataTask
Parameters
session
An
URLSession
object used for creating and running the task.completion
A function to be called after the task finishes.
-
fetchTask(using:
Extension methodassignResultTo: on: ) Uses provided session to create and return a task described by the request.
When the task completes, a result is assigned to property indicated by
keyPath
on the provided object.The result is either a succesfuly parsed
ArxivResponse
or an error, if one occurs. The error is eitherArxivURLError
,ArxivServerError
,ArxivParserError
orArxivAPIError
.Note
The assignment happens on session’sdelegateQueue
.Declaration
Swift
func fetchTask<Root>( using session: URLSession, assignResultTo keyPath: ArxivFetchResultKeypath<Root>, on object: Root ) -> URLSessionDataTask
Parameters
session
An
URLSession
object used for creating and running the task.keyPath
A key path that indicates the property to assign.
object
The object that contains the property.
-
fetch(using:
Extension methodassignResultTo: on: ) Uses provided session to create and and run a task described by the request. Method returns the task after it starts running.
The result is either a succesfuly parsed
ArxivResponse
or an error, if one occurs. The error is eitherArxivURLError
,ArxivServerError
,ArxivParserError
orArxivAPIError
.Note
The assignment happens on session’sdelegateQueue
.Declaration
Swift
@discardableResult func fetch<Root>( using session: URLSession, assignResultTo keyPath: ArxivFetchResultKeypath<Root>, on object: Root ) -> URLSessionDataTask
Parameters
session
An
URLSession
object used for creating and running the task.keyPath
A key path that indicates the property to assign.
object
The object that contains the property.


$\newcommand{\ones}{\mathbf 1}$
Approximation
Let $x^\star$ be optimal for the least-norm problem \[ \begin{array}{ll} \mbox{minimize} & \|x\|_p \\ \mbox{subject to} & Ax=b, \end{array} \] with variable $x \in \mathrm{R}^n$, where $A\in \mathrm{R}^{m \times n}$, with $m \ll n$.
For $p=2$, we would expect to see many components of $x^\star$ equal to zero.
True.
Incorrect.
False.
Correct!
For $p=1$, we would expect to see many components of $x^\star$ equal to zero.
True.
Correct!
False.
Incorrect.
For $p=\infty$, we would expect many components of $x^\star$ to take on the values $\pm \|x^\star \|_\infty$.
True.
Correct!
False.
Incorrect.


Introduction:
My name is Jordan Chalupka, and at the time of writing this I am in my third year at of Software Engineering at the University of Guelph. For the past 8 months I have been working at Adknown, in Guelph. The purpose of this blog is to document my time at Adknown; covering topics such as my goals, projects I was involved with, and skills that I gained through this work experience.
About Adknown:
For my first two work terms I had the pleasure to work for
Adknown, a leading web and app publishing company with a
passion for ad-tech. The development team at Adknown works on developing and maintaining software
used
by the marketing and game development team, as well as many innovative side-projects.
One awesome part about my experience working at Adknown was the quarterly events. During my first
work term the Adknown
team went to see the Toronto Blue Jays play and during my second work term we went axe throwing
and to a board game café.
Job Description
During my time at Adknown I worked as a Software Engineer. In this role I was given the
opportunity to work on a large number
of projects such as creating user-interfaces, designing websites, creating tools, and more. One
of my favourite parts of working at Adknown was the diversity of projects that I was able to work
on. As far as programming languages I used PHP and Nodejs.
Every Monday morning I participated in the developer meeting, with all of the other developers.
In this meeting each developer would discuss what they had worked on in the previous
week, any issues, questions, or cool findings that came along the way, and what they were
planning
to work on the next week. I felt that these meetings were a really great way to keep everyone on
the
developer team in tune with what was happening in the company.
During my work terms I was able to use a lot of new and interesting technologies. For example before starting at Adknown I had no prior experience with AWS, and by the end of the work term I am comfortable using several different services provided by AWS.
Projects:
During my time at Adknown I got to work on a lot of really cool projects. Here is a brief outline
on a few of my favourites.
Automated Domain Registration
In order to automate the creation of new domains I created a tool which interacted with several AWS services such as Route53, Cloudfront, and CertificateManager in order to register new domains. Later in my work term this tool was also integrated with a domain-name generation API using prefix/suffix combinations.
Retro App Projects UI
One of the first projects I worked on at Adknown was creating an organizational tool for the game development team to better communicate the creation and status of games created by the game development team. This tool was created using Bootstrap-tables linked to a database. One memory from this project was that it was my first experience managing requirements from multiple groups as both the game developers, as well as management had requirements for the tool and it was necessary to combine everyone's requirements into the final product.
Image Insertion Tool
I also created a tool to assist in adding images for our content based sites. A requirement for this tool was that images needed to be cropped to specific dimensions specified by the creator of the site. To build this tool I used a javascript library called cropper.js to assist in the image cropping. The tool allowed the user to simply select which predefined dimension they would like to crop their image to (from a list of possible dimensions) and the tool would automatically crop the image to the desired dimensions. The user could then move the crop around the image to position it nicely.
Learning Goals & Reflections
One of my goals even before coming to Adknown was to learn more about different AWS services
and how
to effectively utilize them. Since Adknown has identified the value in using AWS, I spent a lot
of time learning about and getting familiar with several AWS services and so have accomplished
my goal. In fact, I was even able to learn and use a new AWS tool called Step Functions, and
introduce
this technology in a presentation to the development team. I believe that knowing how to leverage
AWS services is a very transferable skill to future work experiences.
Another goal that I had this semester was to improve my web development skills. Although I had
experience in web-development before working at Adknown, I feel that this experience has helped
my
to take a more systematic approach to web development. Also, I feel that my front-end development
skills have improved a lot since I started working at Adknown, and I now feel much more
comfortable with making changes to the look and design of a web page.
While a lot of the projects that I worked on at Adknown were given to me based on technologies I
had learned in my own time
outside of school, I feel that many of my courses greatly assisted me during my time at Adknown.
One course that I felt greatly
prepared me was CIS*2750, where one of the challenges is to work with a large codebase. Another
course which I felt greatly
assisted me is CIS*3530 Data Base Systems and Concepts. Having taken a course strictly on
database design and applications
I felt prepared to complete work requiring database knowledge, and that while there were new
things that I learned, I was
able to complete many jobs much faster and with less assistance.
Lessons Learned:
-
Ensure that tasks are completed based on the business requirements vs the tech for the solution being perfect. Sometimes it's better to put out a hacked up version of something to see if it will work before spending a lot of time and effort getting it perfect the first time.
-
Being able to talk to the end user directly about business requirements is invaluable and should be leveraged whenever possible. This allows errors to be caught early and improves the overall quality of the software produced.
-
Take advantage of co-workers' strengths and areas of expertise. Being able to communicate effectively with a diverse group of developers can really improve efficiency when working with unfamiliar technologies.
Conclusion:
I would consider my first two work terms a huge success. I learned a lot, gained valuable experiences, got to work with a great team, and had some fun while doing it. I would like to thank Tim and Andrew for giving me this opportunity, and to the rest of the Adknown team for being awesome.
Best of luck to Adknown with your new office space and future employees.


Dates: {{start-date}} - ongoing
Number of Credits: {{number-of-credits}}
{{description}}
{{learning-objectives-intro}}
{{target-audiences-intro}}


Click to clownload a spreadsheet
Click to clownload a PDF
Click this button to make an Asynchronous Request Click Here


| Synonym | Reference | Specificity |
| Transglutaminase | Exact | |
| transglutaminase | Exact | |
| transglutaminases | Exact | |
| Transglutaminases | Exact |
| Identifier | Name | Relation |
| HGNC:16255 | TGM6 | isa |
| HGNC:30790 | TGM7 | isa |
| HGNC:11779 | TGM3 | isa |
| HGNC:11778 | TGM2 | isa |
| HGNC:11780 | TGM4 | isa |
| HGNC:11781 | TGM5 | isa |
| HGNC:11777 | TGM1 | isa |
| HGNC:3531 | F13A1 | isa |
| HGNC:3381 | EPB42 | isa |


Sushi tonight?
Pizza?
We had sushi last time!
For me one Vegetariana! Plus some chili oil on it!
Done. Delivery takes 5 minutes!
Awesome! See you later! : )


Structures
The following structures are available globally.
-
Captures colors in a platform independent way for subsequent specialization.
See moreDeclaration
Swift
public struct Color : Equatable
-
The
See morePoint
generic captures a single in space.Declaration
Swift
public struct Point<N> : Equatable, CustomStringConvertible where N : Numeric
-
A generic type that stores a 2D dimenion (with width and height)
See moreDeclaration
Swift
public struct Dimension<N> : Equatable, CustomStringConvertible where N : Numeric
-
A generic type that captrues a rectangular region in 2D space with an origin and size
See moreDeclaration
Swift
public struct Rectangle<N> : Equatable, CustomStringConvertible where N : Numeric
-
Enables the definition or identification of the type of any of the core Tiled objects such as maps, layers, etc.
See moreDeclaration
Swift
public struct TiledType : OptionSet, CustomStringConvertible
-
Object types represent pre-defined sets of objects that can be applied to Tiled objects.
See moreObjectTypes
captures these definitions and enables both reading and writing of the file of definitions. That can be useful for programmatically creating the object types for use in Tiled.Declaration
Swift
public struct ObjectTypes : Loadable
-
An
See moreObjectType
captures a set of properties and their default values that can be applied to any Tiled objectDeclaration
Swift
public struct ObjectType
-
Undocumented
See moreDeclaration
Swift
public struct BridgablePropertyProcessor<TargetType> : TiledKit.MapPostProcessor, TiledKit.LayerPostProcessor, TiledKit.ObjectPostProcessor where TargetType : EngineObject
-
Captures a resolved reference to an image, including its dimensions
See moreDeclaration
Swift
public struct ImageReference
-
A
See moreGroup
represents the collection ofLayer
s a Tiled Group Layer contains (aLayer.Kind
of.group
)Declaration
Swift
public struct Group : LayerContainer
-
Undocumented
See moreDeclaration
Swift
public struct GroupLayer : LayerProtocol, LayerContainer
-
Undocumented
See moreDeclaration
Swift
public struct ImageLayer : LayerProtocol
-
Declaration
Swift
public struct ObjectLayer : LayerProtocol
-
Undocumented
See moreDeclaration
Swift
public struct TileLayer : LayerProtocol
-
Layers capture the contents of a
Map
can be one of four kinds- Tile A grid of
Tile
s - __ Object__ A collection of
Object
s - Group A collection of
Layer
s enabling hierarchy within theMap
- Image An image not in a
TileSet
Every layer has a set of common attributes (such as an offest) and can capture user specified properites too.
See moreDeclaration
Swift
public struct Layer : LayerProtocol, MutablePropertied
- Tile A grid of
-
Represents the reference to a specific
See moreTile
in a tileLayer
for a givenMap
. It captures not only an identifier uniquely identifying theTile
(and theTileSet
it is in) but also if theTile
should be flipped (seeTileFlip
)Declaration
Swift
public struct TileGID : ExpressibleByIntegerLiteral, Equatable
-
Represents a Tiled map which can be loaded from a Tiled
See moretmx
file (other Tiled formats can be supported in the future, such as JSON). It contains the root collection ofLayer
s as well as carrying the references to theTileSet
s used by theMap
Declaration
Swift
public struct Map : LayerContainer, Loadable, MutablePropertied
-
Represents a Tiled object (which are contained inside Object
See moreLayer
s). All objects share some common attributes (e.g. their position inside their containingLayer
).Declaration
Swift
public struct Object : Equatable, ObjectProtocol, MutablePropertied


| ifsogui.label: | Types | Modinfo | Source |
| ifsoGUI_Label | Label Type. |
| Type ifsoGUI_Label Extends ifsoGUI_Base | |
| Description | Label Type. |
| Methods Summary | |
|---|---|
| CanActive | Can this gadget be active. |
| Draw | Draws the gadget. |
| GetJustify | Returns the text justification. |
| GetLabel | Returns the labels text. |
| GetShowBorder | Returns whether or not the labels border is showing. |
| IsMouseOver | Returns whether or not the mouse is over the gadget. |
| LoadSkin | Called to load a skin for one instance of the gadget. |
| MouseOut | Called when the mouse leaves the gadget. |
| MouseOver | Called when the mouse is over this gadget. |
| Refresh | Refreshes the gadget. |
| SetEnabled | Sets the gadget enabled/disabled. |
| SetFocus | Gives the gadget the focus. |
| SetJustify | Sets the text justification. |
| SetLabel | Sets the labels text. |
| SetShowBorder | Sets whether the labels border will show. |
| SetTabOrder | Sets the gadgets TabOrder. 0=Do not tab to this gadget -1=Last in the Tab Order. |
| Functions Summary | |
|---|---|
| Create | Create and returns a Label gadget. |
| LoadTheme | Called to load the graphics when a new theme is loaded. |
| SystemEvent | GUI system event occured. |
| Method CanActive:Int() | |
| Description | Can this gadget be active. |
| Information | Internal function should not be called by the user. |
| Method Draw(parX:Int, parY:Int, parW:Int, parH:Int) | |
| Description | Draws the gadget. |
| Information | Internal function should not be called by the user. |
| Method GetJustify:Int() | |
| Description | Returns the text justification. |
| Method GetLabel:String() | |
| Description | Returns the labels text. |
| Method GetShowBorder:Int() | |
| Description | Returns whether or not the labels border is showing. |
| Method IsMouseOver:Int(parX:Int, parY:Int, parW:Int, parH:Int, iMouseX:Int, iMouseY:Int) | |
| Description | Returns whether or not the mouse is over the gadget. |
| Information | Internal function should not be called by the user. |
| Method LoadSkin(strSkin:String) | |
| Description | Called to load a skin for one instance of the gadget. |
| Method MouseOut(iMouseX:Int, iMouseY:Int, gOverGadget:ifsoGUI_Base) 'No mouse exit events for label | |
| Description | Called when the mouse leaves the gadget. |
| Information | Internal function should not be called by the user. |
| Method MouseOver(iMouseX:Int, iMouseY:Int, gWasOverGadget:ifsoGUI_Base) 'No mouse enter events for label | |
| Description | Called when the mouse is over this gadget. |
| Information | Internal function should not be called by the user. |
| Method Refresh() | |
| Description | Refreshes the gadget. |
| Information | Recalculates any geometry/font changes, etc. Internal function should not be called by the user. |
| Method SetEnabled(bEnabled:Int = True) 'Sets the gadget enabled or not. | |
| Description | Sets the gadget enabled/disabled. |
| Method SetFocus() | |
| Description | Gives the gadget the focus. |
| Information | This sets this gadget as the Active Gadget. |
| Method SetJustify(iJustify:Int) | |
| Description | Sets the text justification. |
| Information | ifsoGUI_LABEL_JUSTIFY_LEFT, ifsoGUI_LABEL_JUSTIFY_CENTER, ifsoGUI_LABEL_JUSTIFY_RIGHT. |
| Method SetLabel(strLabel:String) | |
| Description | Sets the labels text. |
| Method SetShowBorder(bShowBorder:Int) | |
| Description | Sets whether the labels border will show. |
| Method SetTabOrder(iTabOrder:Int) | |
| Description | Sets the gadgets TabOrder. 0=Do not tab to this gadget -1=Last in the Tab Order. |
| Function Create:ifsoGUI_Label(iX:Int, iY:Int, iW:Int, iH:Int, strName:String, strText:String = "") | |
| Description | Create and returns a Label gadget. |
| Function LoadTheme() | |
| Description | Called to load the graphics when a new theme is loaded. |
| Information | A GadgetSystemEvent is then sent out to all gadgets. Internal function should not be called by the user. |
| Function SystemEvent(id:Int, data:Int) | |
| Description | GUI system event occured. |
| Information | Internal function should not be called by the user. |
| Version | 1.00 |
|---|---|
| Author | Marcus Trisdale |
| Copyright | (c) 2009 Marcus Trisdale |


--- layout: default ---
I'm a Cyber Engineering student at Louisiana Tech University.
I love working on things. My hobbies include coding, security, embedded systems, cars, motorcycles, hardware, electronics, and much more. I become absorbed with anything I can tinker with. I've done a range of things including assembly languages, data scraping webpages, 3-d printing parts for my car, and welding together parts for my bike.


| Name | Description |
|---|---|
| SMR_DOL | Test example: SynchronousInductionMachineReluctanceRotor direct-on-line |
| SMR_Inverter | Test example: SynchronousInductionMachineReluctanceRotor with inverter |
| SMPM_NoLoad | SMPM at no-load |
| SMPM_Inverter | Test example: PermanentMagnetSynchronousInductionMachine with inverter |
| SMPM_CurrentSource | Test example: PermanentMagnetSynchronousInductionMachine fed by current source |
| SMPM_VoltageSource | Test example: PermanentMagnetSynchronousInductionMachine fed by FOC |
| SMPM_Braking | Test example: PermanentMagnetSynchronousInductionMachine acting as brake |
| SMEE_DOL | Test example: ElectricalExcitedSynchronousInductionMachine starting direct on line |
| SMEE_Generator | Test example: ElectricalExcitedSynchronousInductionMachine as Generator |
| SMEE_LoadDump | Test example: ElectricalExcitedSynchronousInductionMachine with voltage controller |
| SMEE_Rectifier | Test example: ElectricalExcitedSynchronousInductionMachine with rectifier |


{% extends "ui/base-devices.html" %} {% load url from future %} {% load icons %} {% block sidebar %}
Devices being edited:
Hint: use checkboxes next to labels to mark fields that you want to change.
Fields highlighted in yellow mean different values between devices.
{% endblock %}


--- layout: member_profile title: "Felix Widmann" permalink: /members/widmann/ name: "Felix Widmann" affiliation: "Max Planck Institute for Extraterrestrial Physics" jointaffiliation: country: "Germany" position: "PhD Student" researchtitle: "Optimizing the GRAVITY interferometer for the observation of faint objects and improving radial velocity measurements of galactic center stars" summary: "I am a PhD student at the MPE, where I am part of the Infrared and Submillimeter Group. My work is focusing on the GRAVITY interferometer at the VLTI in Chile. I work on increasing the sensitivity limit as well as understanding the effects and the propagation of polarization in GRAVITY and in the VLTI in general. This work is a mixture of on-site experiments, data analysis, and simulations. Additionally I work with data from the integral field spectrograph SINFONI at the VLTI. I focus on observations of the stars closest to the supermassive black hole in the center of our galaxy. By measuring precise radial velocities of those stars we can test the effects of general relativity in the vicinity of a supermassive black hole." prior: "Master: Optomechanical setup for FSO receiving terminal in GEO to OGS downlink. German Aerospace Center (DLR). 10/15 - 11/16." orcid: website: "https://widmannf.github.io/" linkedin: "https://www.linkedin.com/in/felix-widmann-ab045b141/" rgate: "https://www.researchgate.net/profile/Felix_Widmann3" research: ["Interferometry" , "Wavefront Sensing" , "Spectroscopy" ] keywords: "Interferometry -- Wavefront Sensing -- Spectroscopy" email<EMAIL_ADDRESS>image_path: /assets/img/NYRIA_Logo_small.png ---
Current Research Summary:
{{ page.summary}}Prior Research:
{{ page.prior}}


Subscribe Now
Subscribe Now ! To Become A Prime Member Of Our MusicBoard Army. Our Websites Fetch Data From Worlwide Records.
Unlimited Streaming
MusicBoard Will Always Be The First to Provide Latest Hits And Early Acess To Latest Releasing Music Albums At Unlimited Acess.
Favourite Any Playlist
Favourite Any Playlist , Share Your Favourite Playlist AMong Friends , Acess Top 100 Worldwide Playlist And Find New Music.
Join Our Music Community (3.99 $/ Month)
Join Now At lowest Price Ever ! We need to come together before we come apart. Join MusicBoard and millions of others who believe in Music, love, and common decency.
Join NowThe Month Of October Music Chart
Get Notified Now!


vignettes/VI_geospatial.Rmd
VI_geospatial.Rmd
USA-NPN provides phenology-relevant climate data in raster format. There are two main suites of products in this category: Accumulated Growing Degree Days and Extended Spring Indices. Accumulated Growing Degree Days and the Extended Spring Indices are both representations of accumulated temperature. As accumulated winter and spring heat drives many spring season phenological events in much of the country, these products can be used to better understand patterns in the current and historical timing of these events across the landscape. For a complete description of the USA-NPN approach and notes for working with each data type see the Open File Report on USA-NPN Gridded Data.
Both suites are available as:
All of these products can be downloaded using the npn_download_geospatial call. There is a number of other products and permutations of the above listed AGDD and Spring Index products, so you can get a complete list of available layers and additional details about them including resolution, extent and the abstract/layer description.
layers <- npn_get_layer_details()
The following sections describe how to parameterize calls for both AGDD and Spring Index layers. These calls result in raster data sets for the contiguous United States.
If you are interested in how many GDDs had accumulated when the red maple in your backyard leafed out, or what day the Spring Index requirements for leaf out were met for your location, you may wish to query the layers for these values, based on location and date. There are two ways to accomplish this, using the npn_get_point_data function which works for all layers and the npn_get_AGDD_point_data function, which only works for AGDD layers and provides a more precise result.
npn_get_agdd_point_data(
'gdd:agdd_50f',
'38',
'-90',
'2019-02-25'
)
This returns a value of 7.64098 GDD, base 50F, for the coordinates 38 north, -90 west on February 25th, 2019.
npn_get_point_data(
'si-x:lilac_bloom_ncep',
'30',
'-90',
'2019-02-25'
)
This returns a value for lilac bloom of day 48, for the coordinates 30 north, -90 west, as of February 25th, 2019.
The above mentioned AGDD products use base temperatures of 32F or 50F and are managed through WCS services. There is also a function to get dynamic AGDD calculations based on a user defined base temperature and a number of other parameters.
custom_agdd_raster <- npn_get_custom_agdd_raster(
method = 'double-sine',
climate_data_source = 'NCEP',
temp_unit = 'fahrenheit',
start_date = '2019-01-01',
end_date = '2019-05-10',
base_temp = 20,
upper_threshold = 90
)
Heat accumulation is commonly used as a way of predicting the timing of phenological transitions in plants and animals, including when plants exhibit leaf out, flowering, or fruit ripening, or when insects emerge from dormancy. This is typically expressed as accumulated heat units, either Growing Degree Hours or Growing Degree Days. Growing degree day thresholds have been established for many species, and are commonly used in agriculture, horticulture, and pest management to schedule activities such as harvesting, pesticide treatment, and flower collection. The USA-NPN is currently generating Accumulated Growing Degree Days (AGDD) rasters using a January 1 start date, calculated using simple averaging. These are available calculated using two base temperatures, 32 degrees Fahrenheit (F) and 50 F.
When querying certain layers, the underlying data is agnostic about the specific year, and in these cases it makes sense to use the day of year to request data, since that will provide a standardized result, (i.e., April 1st is day 91 in some years and day 92 in others).
npn_download_geospatial(
'gdd:30yr_avg_agdd_50f',
95
)
But if you’re looking at a specific year, such as a current year layer, it makes sense to use a specific calendar date (formatted YYYY-MM-DD). It’s also possible to save the raster directly to file instead of loading it into memory.
npn_download_geospatial(
'gdd:agdd',
'2018-05-05',
output_path='20180505-agdd-value.tiff'
)
In the case of the historic Spring Index layers, however, the product represents the overall outcome for the entire year, so while the year component of the date matters, the month and day do not. In this case, specify January 1 as the month and date.
npn_download_geospatial(
"si-x:average_bloom_prism",
"1995-01-01"
)
The dimension.range value, returned in the npn_get_layer_details() function, clarifies the full set of applicable dates for each layer.
Of course, it’s also easy to grab raster data and load it into a visual plot as in this example, showing a map of AGDD base 50 on 2019-06-25:
AGDDJun2019<-npn_download_geospatial(
"gdd:agdd_50f",
"2019-06-25"
)
## [1] "https://geoserver.usanpn.org/geoserver/wcs?service=WCS&version=2.0.1&request=GetCoverage&format=geotiff&coverageId=gdd:agdd_50f&SUBSET=time(\"2019-06-25T00:00:00.000Z\")"
plot(
AGDDJun2019,
main = "AGDD base 50 on June 25th, 2019"
)
An important layer to know of is the 30 year average for AGDD products. This is useful for many comparative analyses. This layer takes DOY as the date input, since it’s the average AGDD value for each day of year for 1981 - 2010.
average_30yr <- npn_download_geospatial(
"gdd:30yr_avg_agdd",
45
)
The Extended Spring Indices are mathematical models that predict the “start of spring” (timing of first leaf or first bloom) at a particular location. These models were constructed using historical observations of the timing of first leaf and first bloom in a cloned lilac cultivar (Syringa X chinensis ‘Red Rothomagensis’) and two cloned honeysuckle cultivars (Lonicera tatarica L. ‘Arnold Red’ and Lonicera korolkowii Stapf, also known as ‘Zabelii’), which were selected based on the availability of historical observations from across a wide geographic area. Primary inputs to the model are temperature and weather events, beginning January 1 of each year. The model outputs are first leaf and first bloom date for a given location.
Data for the Spring Index is available through an enumeration of layers that represents each of the three sub-models as well as an ‘average’ model which represents the aggregation of the three sub-models. These layers are further enumerated by both of the represented phenophases, leaf and bloom. In the example below, first the layer representing only the Arnold Red model for 1987 is retrieved, while the second function call gets the model averaging all three of the models for the same year.
npn_download_geospatial(
"si-x:arnoldred_bloom_prism",
"1987-01-01"
)
average_model <- npn_download_geospatial(
"si-x:average_bloom_prism",
"1987-01-01"
)
The Spring Indices are also unique in that the algorithm has been run against the BEST climate data set, so historic data going back to 1880 is available.
BESTSIxData1905 <- npn_download_geospatial(
'si-x:average_bloom_best',
'1905-01-01'
)
## [1] "https://geoserver.usanpn.org/geoserver/wcs?service=WCS&version=2.0.1&request=GetCoverage&format=geotiff&coverageId=si-x:average_bloom_best&SUBSET=time(\"1905-01-01T00:00:00.000Z\")"
NAvalue(BESTSIxData1905) <- -9999
plot(
BESTSIxData1905,
main = "Spring Index, 1905"
)
Besides the AGDD and Spring Index layers there are a number of other useful layers available through these services, including daily temperature minimum and maximums and aggregated MODISv6 phenometrics.
The daily temperature minimum and maximum values are the underlying climate data used to generate current year AGDD and Spring Index maps. These data are generated by NOAA’s National Centers for Environmental Prediction (NCEP) and are reserved through NPN’s geospatial services.
daily_max_20190505 <- npn_download_geospatial(
'climate:tmax',
'2019-05-05'
)
## [1] "https://geoserver.usanpn.org/geoserver/wcs?service=WCS&version=2.0.1&request=GetCoverage&format=geotiff&coverageId=climate:tmax&SUBSET=time(\"2019-05-05T00:00:00.000Z\")"
plot(
daily_max_20190505,
main = "Daily Temperature Max (C), May 5th, 2019"
)
The MODISv6 layers are aggregate values for remote sensing values from the MODISv6 data set, representing a subset of the following phenometrics, aggregated across 2001 - 2017: EVI Area, Mid-Greenup, Mid-Greendown. The available aggregate values for each layer are: median, TSslope, and mean absolute deviation. This example shows the median green up value, as DOY. Note that because this layer has a fixed date, the date parameter is input as a blank string.
median_greenup <- npn_download_geospatial(
'inca:midgup_median_nad83_02deg',
''
)
plot(
median_greenup,
main = "MODIS Median Mid-Greenup, 2001 - 2017"
)