| | |
- gdata.service.GDataService(atom.service.AtomService)
-
- FinanceService
- gdata.service.Query(__builtin__.dict)
-
- PortfolioQuery
- PositionQuery
class FinanceService(gdata.service.GDataService) |
| | |
- Method resolution order:
- FinanceService
- gdata.service.GDataService
- atom.service.AtomService
- __builtin__.object
Methods defined here:
- AddPortfolio(self, portfolio_entry=None)
- AddTransaction(self, transaction_entry=None, transaction_feed=None, position_entry=None, portfolio_id=None, ticker_id=None)
- Args:
transaction_entry: TransactionEntry (required)
transaction_feed: TransactionFeed (optional; see Notes)
position_entry: PositionEntry (optional; see Notes)
portfolio_id: string (optional; see Notes) This may be obtained
from a PortfolioEntry's portfolio_id attribute.
ticker_id: string (optional; see Notes) This may be obtained from
a PositionEntry's ticker_id attribute. Alternatively it can
be constructed using the security's exchange and symbol,
e.g. 'NASDAQ:GOOG'
Notes:
Either a TransactionFeed OR a PositionEntry OR (a portfolio ID AND
ticker ID) must be provided.
- DeletePortfolio(self, portfolio_entry=None)
- DeletePosition(self, position_entry=None, portfolio_id=None, ticker_id=None, transaction_feed=None)
- A position is deleted by deleting all its transactions.
Args:
position_entry: PositionEntry (optional; see Notes)
portfolio_id: string (optional; see Notes) This may be obtained
from a PortfolioEntry's portfolio_id attribute.
ticker_id: string (optional; see Notes) This may be obtained from
a PositionEntry's ticker_id attribute. Alternatively it can
be constructed using the security's exchange and symbol,
e.g. 'NASDAQ:GOOG'
transaction_feed: TransactionFeed (optional; see Notes)
Notes:
Either a PositionEntry OR (a portfolio ID AND ticker ID) OR
a TransactionFeed must be provided.
- DeleteTransaction(self, transaction_entry=None)
- GetPortfolio(self, portfolio_id=None, query=None)
- GetPortfolioFeed(self, query=None)
- GetPosition(self, portfolio_id=None, ticker_id=None, query=None)
- GetPositionFeed(self, portfolio_entry=None, portfolio_id=None, query=None)
- Args:
portfolio_entry: PortfolioEntry (optional; see Notes)
portfolio_id: string (optional; see Notes) This may be obtained
from a PortfolioEntry's portfolio_id attribute.
query: PortfolioQuery (optional)
Notes:
Either a PortfolioEntry OR a portfolio ID must be provided.
- GetTransaction(self, portfolio_id=None, ticker_id=None, transaction_id=None)
- GetTransactionFeed(self, position_entry=None, portfolio_id=None, ticker_id=None)
- Args:
position_entry: PositionEntry (optional; see Notes)
portfolio_id: string (optional; see Notes) This may be obtained
from a PortfolioEntry's portfolio_id attribute.
ticker_id: string (optional; see Notes) This may be obtained from
a PositionEntry's ticker_id attribute. Alternatively it can
be constructed using the security's exchange and symbol,
e.g. 'NASDAQ:GOOG'
Notes:
Either a PositionEntry OR (a portfolio ID AND ticker ID) must
be provided.
- UpdatePortfolio(self, portfolio_entry=None)
- UpdateTransaction(self, transaction_entry=None)
- __init__(self, email=None, password=None, source=None, server='finance.google.com', **kwargs)
- Creates a client for the Finance service.
Args:
email: string (optional) The user's email address, used for
authentication.
password: string (optional) The user's password.
source: string (optional) The name of the user's application.
server: string (optional) The name of the server to which a connection
will be opened. Default value: 'finance.google.com'.
**kwargs: The other parameters to pass to gdata.service.GDataService
constructor.
Methods inherited from gdata.service.GDataService:
- AuthSubTokenInfo(self)
- Fetches the AuthSub token's metadata from the server.
Raises:
NonAuthSubToken if the user's auth token is not an AuthSub token
- ClientLogin(self, username, password, account_type=None, service=None, auth_service_url=None, source=None, captcha_token=None, captcha_response=None)
- Convenience method for authenticating using ProgrammaticLogin.
Sets values for email, password, and other optional members.
Args:
username:
password:
account_type: string (optional)
service: string (optional)
auth_service_url: string (optional)
captcha_token: string (optional)
captcha_response: string (optional)
- Delete(self, uri, extra_headers=None, url_params=None, escape_params=True, redirects_remaining=4)
- Deletes the entry at the given URI.
Args:
uri: string The URI of the entry to be deleted. Example:
'/base/feeds/items/ITEM-ID'
extra_headers: dict (optional) HTTP headers which are to be included.
The client automatically sets the Content-Type and
Authorization headers.
url_params: dict (optional) Additional URL parameters to be included
in the URI. These are translated into query arguments
in the form '&dict_key=value&...'.
Example: {'max-results': '250'} becomes &max-results=250
escape_params: boolean (optional) If false, the calling code has already
ensured that the query will form a valid URL (all
reserved characters have been escaped). If true, this
method will escape the query and any URL parameters
provided.
Returns:
True if the entry was deleted.
- FetchOAuthRequestToken(self, scopes=None, extra_parameters=None, request_url='https://www.google.com/accounts/OAuthGetRequestToken', oauth_callback=None)
- Fetches and sets the OAuth request token and returns it.
Args:
scopes: string or list of string base URL(s) of the service(s) to be
accessed. If None, then this method tries to determine the
scope(s) from the current service.
extra_parameters: dict (optional) key-value pairs as any additional
parameters to be included in the URL and signature while making a
request for fetching an OAuth request token. All the OAuth parameters
are added by default. But if provided through this argument, any
default parameters will be overwritten. For e.g. a default parameter
oauth_version 1.0 can be overwritten if
extra_parameters = {'oauth_version': '2.0'}
request_url: Request token URL. The default is
'https://www.google.com/accounts/OAuthGetRequestToken'.
oauth_callback: str (optional) If set, it is assume the client is using
the OAuth v1.0a protocol where the callback url is sent in the
request token step. If the oauth_callback is also set in
extra_params, this value will override that one.
Returns:
The fetched request token as a gdata.auth.OAuthToken object.
Raises:
FetchingOAuthRequestTokenFailed if the server responded to the request
with an error.
- GenerateAuthSubURL(self, next, scope, secure=False, session=True, domain='default')
- Generate a URL at which the user will login and be redirected back.
Users enter their credentials on a Google login page and a token is sent
to the URL specified in next. See documentation for AuthSub login at:
http://code.google.com/apis/accounts/docs/AuthSub.html
Args:
next: string The URL user will be sent to after logging in.
scope: string or list of strings. The URLs of the services to be
accessed.
secure: boolean (optional) Determines whether or not the issued token
is a secure token.
session: boolean (optional) Determines whether or not the issued token
can be upgraded to a session token.
- GenerateOAuthAuthorizationURL(self, request_token=None, callback_url=None, extra_params=None, include_scopes_in_callback=False, scopes_param_prefix='oauth_token_scope', request_url='https://www.google.com/accounts/OAuthAuthorizeToken')
- Generates URL at which user will login to authorize the request token.
Args:
request_token: gdata.auth.OAuthToken (optional) OAuth request token.
If not specified, then the current token will be used if it is of
type <gdata.auth.OAuthToken>, else it is found by looking in the
token_store by looking for a token for the current scope.
callback_url: string (optional) The URL user will be sent to after
logging in and granting access.
extra_params: dict (optional) Additional parameters to be sent.
include_scopes_in_callback: Boolean (default=False) if set to True, and
if 'callback_url' is present, the 'callback_url' will be modified to
include the scope(s) from the request token as a URL parameter. The
key for the 'callback' URL's scope parameter will be
OAUTH_SCOPE_URL_PARAM_NAME. The benefit of including the scope URL as
a parameter to the 'callback' URL, is that the page which receives
the OAuth token will be able to tell which URLs the token grants
access to.
scopes_param_prefix: string (default='oauth_token_scope') The URL
parameter key which maps to the list of valid scopes for the token.
This URL parameter will be included in the callback URL along with
the scopes of the token as value if include_scopes_in_callback=True.
request_url: Authorization URL. The default is
'https://www.google.com/accounts/OAuthAuthorizeToken'.
Returns:
A string URL at which the user is required to login.
Raises:
NonOAuthToken if the user's request token is not an OAuth token or if a
request token was not available.
- Get(self, uri, extra_headers=None, redirects_remaining=4, encoding='UTF-8', converter=None)
- Query the GData API with the given URI
The uri is the portion of the URI after the server value
(ex: www.google.com).
To perform a query against Google Base, set the server to
'base.google.com' and set the uri to '/base/feeds/...', where ... is
your query. For example, to find snippets for all digital cameras uri
should be set to: '/base/feeds/snippets?bq=digital+camera'
Args:
uri: string The query in the form of a URI. Example:
'/base/feeds/snippets?bq=digital+camera'.
extra_headers: dictionary (optional) Extra HTTP headers to be included
in the GET request. These headers are in addition to
those stored in the client's additional_headers property.
The client automatically sets the Content-Type and
Authorization headers.
redirects_remaining: int (optional) Tracks the number of additional
redirects this method will allow. If the service object receives
a redirect and remaining is 0, it will not follow the redirect.
This was added to avoid infinite redirect loops.
encoding: string (optional) The character encoding for the server's
response. Default is UTF-8
converter: func (optional) A function which will transform
the server's results before it is returned. Example: use
GDataFeedFromString to parse the server response as if it
were a GDataFeed.
Returns:
If there is no ResultsTransformer specified in the call, a GDataFeed
or GDataEntry depending on which is sent from the server. If the
response is niether a feed or entry and there is no ResultsTransformer,
return a string. If there is a ResultsTransformer, the returned value
will be that of the ResultsTransformer function.
- GetAuthSubToken(self)
- Returns the AuthSub token as a string.
If the token is an gdta.auth.AuthSubToken, the Authorization Label
("AuthSub token") is removed.
This method examines the current_token to see if it is an AuthSubToken
or SecureAuthSubToken. If not, it searches the token_store for a token
which matches the current scope.
The current scope is determined by the service name string member.
Returns:
If the current_token is set to an AuthSubToken/SecureAuthSubToken,
return the token string. If there is no current_token, a token string
for a token which matches the service object's default scope is returned.
If there are no tokens valid for the scope, returns None.
- GetClientLoginToken(self)
- Returns the token string for the current token or a token matching the
service scope.
If the current_token is a ClientLoginToken, the token string for
the current token is returned. If the current_token is not set, this method
searches for a token in the token_store which is valid for the service
object's current scope.
The current scope is determined by the service name string member.
The token string is the end of the Authorization header, it doesn not
include the ClientLogin label.
- GetEntry(self, uri, extra_headers=None)
- Query the GData API with the given URI and receive an Entry.
See also documentation for gdata.service.Get
Args:
uri: string The query in the form of a URI. Example:
'/base/feeds/snippets?bq=digital+camera'.
extra_headers: dictionary (optional) Extra HTTP headers to be included
in the GET request. These headers are in addition to
those stored in the client's additional_headers property.
The client automatically sets the Content-Type and
Authorization headers.
Returns:
A GDataEntry built from the XML in the server's response.
- GetFeed(self, uri, extra_headers=None, converter=<function GDataFeedFromString at 0x7f809e0af488>)
- Query the GData API with the given URI and receive a Feed.
See also documentation for gdata.service.Get
Args:
uri: string The query in the form of a URI. Example:
'/base/feeds/snippets?bq=digital+camera'.
extra_headers: dictionary (optional) Extra HTTP headers to be included
in the GET request. These headers are in addition to
those stored in the client's additional_headers property.
The client automatically sets the Content-Type and
Authorization headers.
Returns:
A GDataFeed built from the XML in the server's response.
- GetMedia(self, uri, extra_headers=None)
- Returns a MediaSource containing media and its metadata from the given
URI string.
- GetNext(self, feed)
- Requests the next 'page' of results in the feed.
This method uses the feed's next link to request an additional feed
and uses the class of the feed to convert the results of the GET request.
Args:
feed: atom.Feed or a subclass. The feed should contain a next link and
the type of the feed will be applied to the results from the
server. The new feed which is returned will be of the same class
as this feed which was passed in.
Returns:
A new feed representing the next set of results in the server's feed.
The type of this feed will match that of the feed argument.
- GetOAuthInputParameters(self)
- Post(self, data, uri, extra_headers=None, url_params=None, escape_params=True, redirects_remaining=4, media_source=None, converter=None)
- Insert or update data into a GData service at the given URI.
Args:
data: string, ElementTree._Element, atom.Entry, or gdata.GDataEntry The
XML to be sent to the uri.
uri: string The location (feed) to which the data should be inserted.
Example: '/base/feeds/items'.
extra_headers: dict (optional) HTTP headers which are to be included.
The client automatically sets the Content-Type,
Authorization, and Content-Length headers.
url_params: dict (optional) Additional URL parameters to be included
in the URI. These are translated into query arguments
in the form '&dict_key=value&...'.
Example: {'max-results': '250'} becomes &max-results=250
escape_params: boolean (optional) If false, the calling code has already
ensured that the query will form a valid URL (all
reserved characters have been escaped). If true, this
method will escape the query and any URL parameters
provided.
media_source: MediaSource (optional) Container for the media to be sent
along with the entry, if provided.
converter: func (optional) A function which will be executed on the
server's response. Often this is a function like
GDataEntryFromString which will parse the body of the server's
response and return a GDataEntry.
Returns:
If the post succeeded, this method will return a GDataFeed, GDataEntry,
or the results of running converter on the server's result body (if
converter was specified).
- PostOrPut(self, verb, data, uri, extra_headers=None, url_params=None, escape_params=True, redirects_remaining=4, media_source=None, converter=None)
- Insert data into a GData service at the given URI.
Args:
verb: string, either 'POST' or 'PUT'
data: string, ElementTree._Element, atom.Entry, or gdata.GDataEntry The
XML to be sent to the uri.
uri: string The location (feed) to which the data should be inserted.
Example: '/base/feeds/items'.
extra_headers: dict (optional) HTTP headers which are to be included.
The client automatically sets the Content-Type,
Authorization, and Content-Length headers.
url_params: dict (optional) Additional URL parameters to be included
in the URI. These are translated into query arguments
in the form '&dict_key=value&...'.
Example: {'max-results': '250'} becomes &max-results=250
escape_params: boolean (optional) If false, the calling code has already
ensured that the query will form a valid URL (all
reserved characters have been escaped). If true, this
method will escape the query and any URL parameters
provided.
media_source: MediaSource (optional) Container for the media to be sent
along with the entry, if provided.
converter: func (optional) A function which will be executed on the
server's response. Often this is a function like
GDataEntryFromString which will parse the body of the server's
response and return a GDataEntry.
Returns:
If the post succeeded, this method will return a GDataFeed, GDataEntry,
or the results of running converter on the server's result body (if
converter was specified).
- ProgrammaticLogin(self, captcha_token=None, captcha_response=None)
- Authenticates the user and sets the GData Auth token.
Login retreives a temporary auth token which must be used with all
requests to GData services. The auth token is stored in the GData client
object.
Login is also used to respond to a captcha challenge. If the user's login
attempt failed with a CaptchaRequired error, the user can respond by
calling Login with the captcha token and the answer to the challenge.
Args:
captcha_token: string (optional) The identifier for the captcha challenge
which was presented to the user.
captcha_response: string (optional) The user's answer to the captch
challenge.
Raises:
CaptchaRequired if the login service will require a captcha response
BadAuthentication if the login service rejected the username or password
Error if the login service responded with a 403 different from the above
- Put(self, data, uri, extra_headers=None, url_params=None, escape_params=True, redirects_remaining=3, media_source=None, converter=None)
- Updates an entry at the given URI.
Args:
data: string, ElementTree._Element, or xml_wrapper.ElementWrapper The
XML containing the updated data.
uri: string A URI indicating entry to which the update will be applied.
Example: '/base/feeds/items/ITEM-ID'
extra_headers: dict (optional) HTTP headers which are to be included.
The client automatically sets the Content-Type,
Authorization, and Content-Length headers.
url_params: dict (optional) Additional URL parameters to be included
in the URI. These are translated into query arguments
in the form '&dict_key=value&...'.
Example: {'max-results': '250'} becomes &max-results=250
escape_params: boolean (optional) If false, the calling code has already
ensured that the query will form a valid URL (all
reserved characters have been escaped). If true, this
method will escape the query and any URL parameters
provided.
converter: func (optional) A function which will be executed on the
server's response. Often this is a function like
GDataEntryFromString which will parse the body of the server's
response and return a GDataEntry.
Returns:
If the put succeeded, this method will return a GDataFeed, GDataEntry,
or the results of running converter on the server's result body (if
converter was specified).
- RevokeAuthSubToken(self)
- Revokes an existing AuthSub token.
Raises:
NonAuthSubToken if the user's auth token is not an AuthSub token
- RevokeOAuthToken(self, request_url='https://www.google.com/accounts/AuthSubRevokeToken')
- Revokes an existing OAuth token.
request_url: Token revoke URL. The default is
'https://www.google.com/accounts/AuthSubRevokeToken'.
Raises:
NonOAuthToken if the user's auth token is not an OAuth token.
RevokingOAuthTokenFailed if request for revoking an OAuth token failed.
- SetAuthSubToken(self, token, scopes=None, rsa_key=None)
- Sets the token sent in requests to an AuthSub token.
Sets the current_token and attempts to add the token to the token_store.
Only use this method if you have received a token from the AuthSub
service. The auth token is set automatically when UpgradeToSessionToken()
is used. See documentation for Google AuthSub here:
http://code.google.com/apis/accounts/AuthForWebApps.html
Args:
token: gdata.auth.AuthSubToken or gdata.auth.SecureAuthSubToken or string
The token returned by the AuthSub service. If the token is an
AuthSubToken or SecureAuthSubToken, the scope information stored in
the token is used. If the token is a string, the scopes parameter is
used to determine the valid scopes.
scopes: list of URLs for which the token is valid. This is only used
if the token parameter is a string.
rsa_key: string (optional) Private key required for RSA_SHA1 signature
method. This parameter is necessary if the token is a string
representing a secure token.
- SetClientLoginToken(self, token, scopes=None)
- Sets the token sent in requests to a ClientLogin token.
This method sets the current_token to a new ClientLoginToken and it
also attempts to add the ClientLoginToken to the token_store.
Only use this method if you have received a token from the ClientLogin
service. The auth_token is set automatically when ProgrammaticLogin()
is used. See documentation for Google ClientLogin here:
http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html
Args:
token: string or instance of a ClientLoginToken.
- SetOAuthInputParameters(self, signature_method, consumer_key, consumer_secret=None, rsa_key=None, two_legged_oauth=False, requestor_id=None)
- Sets parameters required for using OAuth authentication mechanism.
NOTE: Though consumer_secret and rsa_key are optional, either of the two
is required depending on the value of the signature_method.
Args:
signature_method: class which provides implementation for strategy class
oauth.oauth.OAuthSignatureMethod. Signature method to be used for
signing each request. Valid implementations are provided as the
constants defined by gdata.auth.OAuthSignatureMethod. Currently
they are gdata.auth.OAuthSignatureMethod.RSA_SHA1 and
gdata.auth.OAuthSignatureMethod.HMAC_SHA1
consumer_key: string Domain identifying third_party web application.
consumer_secret: string (optional) Secret generated during registration.
Required only for HMAC_SHA1 signature method.
rsa_key: string (optional) Private key required for RSA_SHA1 signature
method.
two_legged_oauth: boolean (optional) Enables two-legged OAuth process.
requestor_id: string (optional) User email adress to make requests on
their behalf. This parameter should only be set when two_legged_oauth
is True.
- SetOAuthToken(self, oauth_token)
- Attempts to set the current token and add it to the token store.
The oauth_token can be any OAuth token i.e. unauthorized request token,
authorized request token or access token.
This method also attempts to add the token to the token store.
Use this method any time you want the current token to point to the
oauth_token passed. For e.g. call this method with the request token
you receive from FetchOAuthRequestToken.
Args:
request_token: gdata.auth.OAuthToken OAuth request token.
- UpgradeToOAuthAccessToken(self, authorized_request_token=None, request_url='https://www.google.com/accounts/OAuthGetAccessToken', oauth_version='1.0', oauth_verifier=None)
- Upgrades the authorized request token to an access token and returns it
Args:
authorized_request_token: gdata.auth.OAuthToken (optional) OAuth request
token. If not specified, then the current token will be used if it is
of type <gdata.auth.OAuthToken>, else it is found by looking in the
token_store by looking for a token for the current scope.
request_url: Access token URL. The default is
'https://www.google.com/accounts/OAuthGetAccessToken'.
oauth_version: str (default='1.0') oauth_version parameter. All other
'oauth_' parameters are added by default. This parameter too, is
added by default but here you can override it's value.
oauth_verifier: str (optional) If present, it is assumed that the client
will use the OAuth v1.0a protocol which includes passing the
oauth_verifier (as returned by the SP) in the access token step.
Returns:
Access token
Raises:
NonOAuthToken if the user's authorized request token is not an OAuth
token or if an authorized request token was not available.
TokenUpgradeFailed if the server responded to the request with an
error.
- UpgradeToSessionToken(self, token=None)
- Upgrades a single use AuthSub token to a session token.
Args:
token: A gdata.auth.AuthSubToken or gdata.auth.SecureAuthSubToken
(optional) which is good for a single use but can be upgraded
to a session token. If no token is passed in, the token
is found by looking in the token_store by looking for a token
for the current scope.
Raises:
NonAuthSubToken if the user's auth token is not an AuthSub token
TokenUpgradeFailed if the server responded to the request with an
error.
- upgrade_to_session_token(self, token)
- Upgrades a single use AuthSub token to a session token.
Args:
token: A gdata.auth.AuthSubToken or gdata.auth.SecureAuthSubToken
which is good for a single use but can be upgraded to a
session token.
Returns:
The upgraded token as a gdata.auth.AuthSubToken object.
Raises:
TokenUpgradeFailed if the server responded to the request with an
error.
Data descriptors inherited from gdata.service.GDataService:
- captcha_token
- Get the captcha token for a login request.
- captcha_url
- Get the captcha URL for a login request.
- source
- The source is the name of the application making the request.
It should be in the form company_id-app_name-app_version
Data and other attributes inherited from gdata.service.GDataService:
- auth_token = None
- handler = None
- tokens = None
Methods inherited from atom.service.AtomService:
- UseBasicAuth(self, username, password, for_proxy=False)
- Sets an Authenticaiton: Basic HTTP header containing plaintext.
Deprecated, use use_basic_auth instead.
The username and password are base64 encoded and added to an HTTP header
which will be included in each request. Note that your username and
password are sent in plaintext.
Args:
username: str
password: str
- request(*args, **kwargs)
- # The deprecated_function wraps the actual call to f.
- use_basic_auth(self, username, password, scopes=None)
Data descriptors inherited from atom.service.AtomService:
- __dict__
- dictionary for instance variables (if defined)
- __weakref__
- list of weak references to the object (if defined)
- debug
- If True, HTTP debug information is printed.
- override_token
Data and other attributes inherited from atom.service.AtomService:
- auto_set_current_token = True
- auto_store_tokens = True
- current_token = None
- port = 80
- ssl = False
|
class PortfolioQuery(gdata.service.Query) |
| |
A query object for the list of a user's portfolios. |
| |
- Method resolution order:
- PortfolioQuery
- gdata.service.Query
- __builtin__.dict
- __builtin__.object
Methods defined here:
- set_positions(self, value)
- set_returns(self, value)
Data descriptors defined here:
- positions
- The positions query parameter
- returns
- The returns query parameter
Methods inherited from gdata.service.Query:
- ToUri(self)
- __init__(self, feed=None, text_query=None, params=None, categories=None)
- Constructor for Query
Args:
feed: str (optional) The path for the feed (Examples:
'/base/feeds/snippets' or<EMAIL_ADDRESS>text_query: str (optional) The contents of the q query parameter. The
contents of the text_query are URL escaped upon conversion to a URI.
params: dict (optional) Parameter value string pairs which become URL
params when translated to a URI. These parameters are added to the
query's items (key-value pairs).
categories: list (optional) List of category strings which should be
included as query categories. See
http://code.google.com/apis/gdata/reference.html#Queries for
details. If you want to get results from category A or B (both
categories), specify a single list item 'A|B'.
- __str__(self)
Data descriptors inherited from gdata.service.Query:
- __dict__
- dictionary for instance variables (if defined)
- __weakref__
- list of weak references to the object (if defined)
- alt
- The feed query's alt parameter
- author
- The feed query's author parameter
- max_results
- The feed query's max-results parameter
- orderby
- The feed query's orderby parameter
- published_max
- The feed query's published-max parameter
- published_min
- The feed query's published-min parameter
- start_index
- The feed query's start-index parameter
- text_query
- The feed query's q parameter
- updated_max
- The feed query's updated-max parameter
- updated_min
- The feed query's updated-min parameter
Methods inherited from __builtin__.dict:
- __cmp__(...)
- x.__cmp__(y) <==> cmp(x,y)
- __contains__(...)
- D.__contains__(k) -> True if D has a key k, else False
- __delitem__(...)
- x.__delitem__(y) <==> del x[y]
- __eq__(...)
- x.__eq__(y) <==> x==y
- __ge__(...)
- x.__ge__(y) <==> x>=y
- __getattribute__(...)
- x.__getattribute__('name') <==> x.name
- __getitem__(...)
- x.__getitem__(y) <==> x[y]
- __gt__(...)
- x.__gt__(y) <==> x>y
- __iter__(...)
- x.__iter__() <==> iter(x)
- __le__(...)
- x.__le__(y) <==> x<=y
- __len__(...)
- x.__len__() <==> len(x)
- __lt__(...)
- x.__lt__(y) <==> x<y
- __ne__(...)
- x.__ne__(y) <==> x!=y
- __repr__(...)
- x.__repr__() <==> repr(x)
- __setitem__(...)
- x.__setitem__(i, y) <==> x[i]=y
- __sizeof__(...)
- D.__sizeof__() -> size of D in memory, in bytes
- clear(...)
- D.clear() -> None. Remove all items from D.
- copy(...)
- D.copy() -> a shallow copy of D
- get(...)
- D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.
- has_key(...)
- D.has_key(k) -> True if D has a key k, else False
- items(...)
- D.items() -> list of D's (key, value) pairs, as 2-tuples
- iteritems(...)
- D.iteritems() -> an iterator over the (key, value) items of D
- iterkeys(...)
- D.iterkeys() -> an iterator over the keys of D
- itervalues(...)
- D.itervalues() -> an iterator over the values of D
- keys(...)
- D.keys() -> list of D's keys
- pop(...)
- D.pop(k[,d]) -> v, remove specified key and return the corresponding value
If key is not found, d is returned if given, otherwise KeyError is raised
- popitem(...)
- D.popitem() -> (k, v), remove and return some (key, value) pair as a
2-tuple; but raise KeyError if D is empty
- setdefault(...)
- D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
- update(...)
- D.update(E, **F) -> None. Update D from E and F: for k in E: D[k] = E[k]
(if E has keys else: for (k, v) in E: D[k] = v) then: for k in F: D[k] = F[k]
- values(...)
- D.values() -> list of D's values
Data and other attributes inherited from __builtin__.dict:
- __hash__ = None
- __new__ = <built-in method __new__ of type object at 0x7569a0>
- T.__new__(S, ...) -> a new object with type S, a subtype of T
- fromkeys = <built-in method fromkeys of type object at 0xcde770>
- dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.
v defaults to None.
|
class PositionQuery(gdata.service.Query) |
| |
A query object for the list of a user's positions in a portfolio. |
| |
- Method resolution order:
- PositionQuery
- gdata.service.Query
- __builtin__.dict
- __builtin__.object
Methods defined here:
- set_returns(self, value)
- set_transactions(self, value)
Data descriptors defined here:
- returns
- The returns query parameter
- transactions
- The transactions query parameter
Methods inherited from gdata.service.Query:
- ToUri(self)
- __init__(self, feed=None, text_query=None, params=None, categories=None)
- Constructor for Query
Args:
feed: str (optional) The path for the feed (Examples:
'/base/feeds/snippets' or<EMAIL_ADDRESS>text_query: str (optional) The contents of the q query parameter. The
contents of the text_query are URL escaped upon conversion to a URI.
params: dict (optional) Parameter value string pairs which become URL
params when translated to a URI. These parameters are added to the
query's items (key-value pairs).
categories: list (optional) List of category strings which should be
included as query categories. See
http://code.google.com/apis/gdata/reference.html#Queries for
details. If you want to get results from category A or B (both
categories), specify a single list item 'A|B'.
- __str__(self)
Data descriptors inherited from gdata.service.Query:
- __dict__
- dictionary for instance variables (if defined)
- __weakref__
- list of weak references to the object (if defined)
- alt
- The feed query's alt parameter
- author
- The feed query's author parameter
- max_results
- The feed query's max-results parameter
- orderby
- The feed query's orderby parameter
- published_max
- The feed query's published-max parameter
- published_min
- The feed query's published-min parameter
- start_index
- The feed query's start-index parameter
- text_query
- The feed query's q parameter
- updated_max
- The feed query's updated-max parameter
- updated_min
- The feed query's updated-min parameter
Methods inherited from __builtin__.dict:
- __cmp__(...)
- x.__cmp__(y) <==> cmp(x,y)
- __contains__(...)
- D.__contains__(k) -> True if D has a key k, else False
- __delitem__(...)
- x.__delitem__(y) <==> del x[y]
- __eq__(...)
- x.__eq__(y) <==> x==y
- __ge__(...)
- x.__ge__(y) <==> x>=y
- __getattribute__(...)
- x.__getattribute__('name') <==> x.name
- __getitem__(...)
- x.__getitem__(y) <==> x[y]
- __gt__(...)
- x.__gt__(y) <==> x>y
- __iter__(...)
- x.__iter__() <==> iter(x)
- __le__(...)
- x.__le__(y) <==> x<=y
- __len__(...)
- x.__len__() <==> len(x)
- __lt__(...)
- x.__lt__(y) <==> x<y
- __ne__(...)
- x.__ne__(y) <==> x!=y
- __repr__(...)
- x.__repr__() <==> repr(x)
- __setitem__(...)
- x.__setitem__(i, y) <==> x[i]=y
- __sizeof__(...)
- D.__sizeof__() -> size of D in memory, in bytes
- clear(...)
- D.clear() -> None. Remove all items from D.
- copy(...)
- D.copy() -> a shallow copy of D
- get(...)
- D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.
- has_key(...)
- D.has_key(k) -> True if D has a key k, else False
- items(...)
- D.items() -> list of D's (key, value) pairs, as 2-tuples
- iteritems(...)
- D.iteritems() -> an iterator over the (key, value) items of D
- iterkeys(...)
- D.iterkeys() -> an iterator over the keys of D
- itervalues(...)
- D.itervalues() -> an iterator over the values of D
- keys(...)
- D.keys() -> list of D's keys
- pop(...)
- D.pop(k[,d]) -> v, remove specified key and return the corresponding value
If key is not found, d is returned if given, otherwise KeyError is raised
- popitem(...)
- D.popitem() -> (k, v), remove and return some (key, value) pair as a
2-tuple; but raise KeyError if D is empty
- setdefault(...)
- D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
- update(...)
- D.update(E, **F) -> None. Update D from E and F: for k in E: D[k] = E[k]
(if E has keys else: for (k, v) in E: D[k] = v) then: for k in F: D[k] = F[k]
- values(...)
- D.values() -> list of D's values
Data and other attributes inherited from __builtin__.dict:
- __hash__ = None
- __new__ = <built-in method __new__ of type object at 0x7569a0>
- T.__new__(S, ...) -> a new object with type S, a subtype of T
- fromkeys = <built-in method fromkeys of type object at 0xcdf4e0>
- dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.
v defaults to None.
| |


Personal Extension Name:
Request Interval (in minutes):
Request URL:
Browser Button Action:
Open Popup Window
Open Popup Button Link
Popup Button URL:
Notification Title:
Enable Notifications:
Save Settings


class: center, middle, inverse, title-slide # ETC1010: Data Modelling and Computing ## Week of introduction: Rmarkdown ### Professor Di Cook & Dr. Nicholas Tierney ### EBS, Monash U. ### 2019-08-07 --- class: bg-blue .vvvhuge.white.center.middle[ What is this song? ] --- class: bg-black .gigantic.white.middle.center[ Recap ] --- class: center # Traffic Light System  --- .center[ # Traffic Light System ] -- .red.pull-left.huge.middle[ # Red Post it -- * I need a hand * Slow down ] -- .green.pull-right.huge.middle[ # Green Post it -- * I am up to speed * I have completed the thing ] --- class: bg-main1, center, bottom, white  From Jessica Ward (@JKRWard) of R Ladies Newcaslte (UK) - @RLadiesNCL https://twitter.com/RLadiesNCL/status/1138812826917724160 --- background-image: url(https://njtierney.updog.co/img/unvotes-oz-usa.png) background-size: contain background-position: 50% 50% class: center, bottom, white --- background-image: url(https://njtierney.updog.co/img/tower-of-babel.gif) background-size: contain background-position: 50% 50% class: center, bottom, white --- background-image: url(https://njtierney.updog.co/img/edstem.png) background-size: contain background-position: 50% 50% class: center, bottom, white --- class: bg-main1 # R essentials: A short list (for now) .large.white[ - Functions are (most often) verbs, followed by what they will be applied to in parentheses: ] ```r do_this(to_this) do_that(to_this, to_that, with_those) ``` -- .large.white[ - Columns (variables) in data frames are accessed with `$`: ] ```r dataframe$var_name ``` -- .large.white[ - Packages are installed with the `install.packages` function and loaded with the `library` function, once per session: ] ```r install.packages("package_name") library(package_name) ``` --- # Today: Outline .huge[ * Why we care about Reproducibility * R + markdown = Rmarkdown * Controling output and input of rmarkdown * Exercises on creating rmarkdown reports on the humble platypus * Form up assignment groups * Quiz * Release assignment (later today) ] ??? * Reproducibility: Why we care * Rmarkdown * YAML * Code * text * markdown (online quiz) * rmarkdown - edit the existing one on platypus! * code chunks * code chunk names * chunk options * exercise on this * setting different chunk options globally * exercise extending the platypus report * make assignment groups * release assignment * quiz Should be able to answer the questions: How should I start an rmarkdown document? What do I put in the YAML metadata? How do I create a code chunk? What sort of options to I need to worry about for my code? What is the value in a reproducible report? What is markdown? Can I combine my software and my writing? --- class: bg-black .vvhuge.white.center.middle[ We are in a tight spot with reproducibility ] --- .blockquote.huge[ Only 6 out of 53 landmark results could be reproduced -- [Amgen, 2014*](https://www.nature.com/articles/483531a) ] .footnote[`*` Heard via Garret Grolemund's [great talk](https://www.youtube.com/watch?v=HVlwNayog-k)] --- .blockquote.huge[ An estimated 75% - 90% of preclinical results cannot be reproduced -- [Begley, 2015*](https://www.ncbi.nlm.nih.gov/pubmed/25552691) ] .footnote[`*` Heard via Garret Grolemund's [great talk](https://www.youtube.com/watch?v=HVlwNayog-k)] --- .blockquote.huge[ Estimated **annual** cost of irreproducibility for biomedical industry = 28 Billion USD -- [Freedman, 2015*](https://journals.plos.org/plosbiology/article?id=10.1371/journal.pbio.1002165) ] .footnote[`*` Heard via Garret Grolemund's [great talk](https://www.youtube.com/watch?v=HVlwNayog-k)] --- background-image: url(https://njtierney.updog.co/gifs/njt-gif-jaws-dolly-zoom.gif) background-size: contain background-position: 50% 50% class: center, bottom, white --- background-image: url(https://njtierney.updog.co/gifs/ice-climber-fall.gif) background-size: contain background-position: 50% 50% class: center, bottom, white --- background-image: url(https://njtierney.updog.co/img/open-science-berg.jpeg) background-size: contain background-position: 50% 50% class: center, bottom, white --- class: bg-main1 center middle .vvhuge[ So what can we do about it? ] --- # Reproducibility checklist .huge[ Near-term goals: - Are the tables and figures reproducible from the code and data? - Does the code actually do what you think it does? - In addition to what was done, is it clear **why** it was done? (e.g., how were parameter settings chosen?) ] --- # Reproducibility checklist .huge[ Long-term goals: - Can the code be used for other data? - Can you extend the code to do other things? ] --- # Literate programming is a partial solution .huge[ * Literate programming shines some light on this dark area of science. * An idea from [Donald Knuth](https://en.wikipedia.org/wiki/Donald_Knuth) where you combine your text with your code output to create a document. * A _blend_ of your literature (**text**), and your programming (**code**), to create something you can read from top to bottom. ] --- .huge[ So ] -- .huge[ Imagine a report: Introduction, methods, results, discussion, and conclusion, ] -- .huge[ and all the bits of code that make each section. ] .huge[ With rmarkdown, you can see all the pieces of your data analysis all together. Each time you knit the analysis is ran from the beginning ] --- class: bg-main1 .vhuge[ Markdown as a new player to legibility ] -- .vhuge[ In 2004, [John Gruber](https://en.wikipedia.org/wiki/John_Gruber), of [daring fireball](https://daringfireball.net/) created [markdown](https://en.wikipedia.org/wiki/Markdown), a simple way to create text that rendered into a HTML webpage. ] --- class: bg-main1 .pull-left[ ``` - bullet list - bullet list - bullet list ``` ] -- .pull-right.huge.white[ - bullet list - bullet list - bullet list ] --- class: bg-main1 .pull-left.huge[ ``` 1. numbered list 2. numbered list 3. numbered list __bold__, **bold**, _italic_, *italic* > quote of something profound ``` ] -- .pull-right.huge[ 1. numbered list 2. numbered list 3. numbered list __bold__, **bold**, _italic_, *italic* > quote of something profound ] --- class: bg-black .vvhuge.white[ With very little marking up, we can create rich text, that **actually resembles** the text that we want to see. ] --- class: bg-main1 .vvhuge.white[ **Learn to use markdown** In your small groups, spend five minutes working through [markdowntutorial.com](https://www.markdowntutorial.com/) ]
05
:
00
--- class: bg-main1 # Rmarkdown helps complete the solution to the reproducibility problem -- .huge[ * Q: How do we take `markdown` + `R code` = "literate programming environment" * A: `Rmarkdown` ] --- # Rmarkdown... -- .huge[ Provides an environment where you can write your complete analysis, and marries your text, and code together into a rich document. ] -- .huge[ You write your code as code chunks, put your text around that, and then hey presto, you have a document you can reproduce. ] --- # Reminder: You've already used rmarkdown!  --- # How will we use R Markdown? .huge[ - Every assignment + project / is an R Markdown document - You'll always have a template R Markdown document to start with - The amount of scaffolding in the template will decrease over the semester - These lecture notes are created using R Markdown (!) ] --- # The anatomy of an rmarkdown document .huge[ There are three parts to an rmarkdown document. * Metadata (YAML) * Text (markdown formatting) * Code (code formatting) ] -- .vvhuge.center[DEMO] --- class: bg-main1 # Metadata: YAML (YAML Ain't Markup Language) .huge[ * The metadata of the document tells you how it is formed - what the **title** is, what **date** to put, and other control information. * If you're familiar with `\(\LaTeX\)`, this is ksimilar to how you specify document type, styles, fonts, options, etc in the front matter / preamble. ] --- class: bg-main1 # Metadata: YAML .huge[ * Rmarkdown documents use YAML to provide the metadata. It looks like this: ```YAML --- title: "An example document" author: "Nicholas Tierney" output: html_document --- ``` It starts an ends with three dashes `---`, and has fields like the following: `title`, `author`, and `output`. ] --- class: bg-main1 # Text .huge[ Is markdown, as we discussed in the earlier section, It provides a simple way to mark up text ] .pull-left.huge[ ``` 1. bullet list 2. bullet list 3. bullet list ``` ] .pull-right.huge[ 1. bullet list 1. bullet list 1. bullet list ] --- # Code .vhuge[ We refer to code in an rmarkdown document in two ways: 1. Code chunks, and 2. Inline code. ] --- # Code: Code chunks .huge[ `Code chunks` are marked by three backticks and curly braces with `r` inside them: ````markdown ```{r chunk-name} # a code chunk ``` ```` ] --- class: bg-main1 .huge[ **a backtick** is a special character you might not have seen before, it is typically located under the tilde key (`~`). On USA / Australia keyboards, is under the escape key:

image from https://commons.wikimedia.org/wiki/File:ANSI_Keyboard_Layout_Diagram_with_Form_Factor.svg

 ] --- # Code: Inline code .huge[ Sometimes you want to run the code inside a sentence. This is called running the code "inline". ] -- .huge[ You might want to run the code inline to name the number of variables or rows in a dataset in a sentence like: > There are XXX observations in the airquality dataset, and XXX variables. ] --- # Code: Inline code .huge[ You can call code "inline" like so: ````markdown There are `r nrow(airquality) ` observations in the airquality dataset, and `r ncol(airquality) ` variables. ```` Which gives you the following sentence ] -- .huge[ > There are 153 observations in the airquality dataset, and 6 variables. ] --- # Code: Inline code .huge[ What's great about this is that if your data changes upstream, then you don't need to work out where you mentioned your data, you just update the document. ] --- class: bg-main1 # Your Turn: Put it together .huge[ Go to `rstudio.cloud` and * open the document "01-oz-atlas.Rmd" * knit the document * Change the data section at the top to be from a different state instead of "New South Wales" * knit the document again * How do the text and figures in the document change? ]
05
:
00
--- class: bg-main1 center middle .gigantic[ break ] --- background-image: url(https://imgs.xkcd.com/comics/art_project.png) background-size: contain background-position: 50% 50% class: center, bottom, black --- class: bg-main1 # Code: Chunk names .huge[ Straight after the ` ```{r ` you can use a text string to name the chunk: ` ```{r read-crime-data} ` ] ````markdown ```{r read-crime-data} crime <- read_csv("data/crime-data.csv") ``` ```` --- class: bg-main1 # Code: Chunk Names .huge[ Naming code chunks has three advantages: 1. Navigate to specific chunks using the drop-down code navigator in the bottom-left of the script editor. 2. Graphics produced by chunks now have useful names. 3. You can set up networks of cached chunks to avoid re-performing expensive computations on every run. ] --- # Code: Chunk names .huge[ - Every chunk should ideally have a name. - Naming things is hard, but follow these rules and you'll be fine: 1. One word that describes the action (e.g., "read") 2. One word that describes the thing inside the code (e.g, "gapminder") 3. Separate words with "-" (e.g., `read-gapminder`) ] --- # Code: Chunk options .huge[ You can control how the code is output by changing the code chunk options which follow the title. ] ````markdown ```{r read-gapminder, eval = FALSE, echo = TRUE} gap <- read_csv("gapminder.csv") ``` ```` .huge[ What do you think this does? ]
00
:
30
--- class: bg-main1 # Code: Chunk options .vlarge[ The code chunk options you need to know about right now are: * `cache`: TRUE / FALSE. Do you want to save the output of the chunk so it doesn't have to run next time? * `eval`: TRUE / FALSE Do you want to evaluate the code? * `echo`: TRUE / FALSE Do you want to print the code? * `include`: TRUE / FALSE Do you want to include code output in the final output document? Setting to `FALSE` means nothing is put into the output document, but the code is still run. ] .large[ You can read more about the options at the official documentation: https://yihui.name/knitr/options/#code-evaluation ] --- # Your turn .huge[ * go to `rstudio.cloud`, open document `01-oz-atlas.Rmd` and change the document so that the code output is hidden, but the graphics are shown. (Hint: Google "rstudio rmarkdown cheatsheet" for some tips!) * Re-Knit the document. * Take a look at the [R Markdown Gallery](https://rmarkdown.rstudio.com/gallery.html). ]
05
:
00
--- # Global options: Set and forget .huge[ You can set the default chunk behaviour once at the top of the `.Rmd` file using a chunk like: ```r knitr::opts_chunk$set( echo = FALSE, cache = TRUE ) ``` then you will only need to add chunk options when you have the occasional one that you'd like to behave differently. ] --- class: bg-main1 # Your turn .huge[ * Go to your `01-oz-atlas.Rmd` document on `rstudio.cloud` and change the global settings at the top of the rmarkdown document to `echo = FALSE`, and `cache = TRUE` ```r knitr::opts_chunk$set( echo = FALSE, cache = TRUE ) ``` * Update the other code chunks by removing the code chunk options. ]
03
:
00
--- class: bg-indigo .vvhuge.white.center[ DEMO The many different outputs of rmarkdown ] --- class: bg-main1 # Your turn: Different types of documents .huge[ 1. Change the output of your current R Markdown file to produce a **Word document**. Now try to produce pdf - this may not work! That's OK, we do'nt need it right now. 2. Create a new document that will produce a slide show `File > New R Markdown > Presentation` 3. Create a flexdashboard document - see this option in the `File > New R Markdown > From template` list. ] --- class: bg-indigo .vhuge.white[ Your Turn: Making the groups ] .huge.white[ We are going to set up the groups for doing assignment work. 1. Choose a quote from the bag. 2. Find the other people in the class with the same quote as you 3. Grab your gear and claim a table to work together at. ] --- class: bg-indigo .huge.white[ Your Turn: Ask your team mates these questions: 1. What is one food you'd never want to taste again? 2. If you were a comic strip character, who would you be and why? LASTLY, come up with a name for your team and tell this to a tutor, along with the names of members of the team. ]
05
:
00
--- class: bg-main1 # Your Turn .vhuge.white[ * Go to rstudio.cloud to `oz-atlas-final.Rmd` * Read through the document and add text where prompted to learn more about the Australian native platypus! ] --- # Recap: .huge[ - There is a Reproducibility Crisis - rmarkdown = YAML + text + code - rmarkdown has many different output types - Platypus are interesting! - Assignment will be announced later today ] --- # Learning more: .huge[ - [R Markdown cheat sheet](https://github.com/rstudio/cheatsheets/raw/master/rmarkdown-2.0.pdf) and Markdown Quick Reference (Help -> Markdown Quick Reference) handy, we'll refer to it often as the course progresses ] --- # Lab quiz .huge[ Take the quiz for today from ED. ] --- ## Share and share alike
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. ??? *Note on ethics:* When you use someone else's work, you need to (1) check if it's allowed, that it has a [creative commons license](http://creativecommons.org/licenses/by/4.0/), (2) reference them as the source. - If you have a big document, build it up in pieces. You can run just one code chunk at a time, or the past several, or even one line of code. The "Run" button has a menu of options of doing the coding in pieces. - The workspace of your R Markdown document is separate from the Console - rmarkdown runs code from the start to finish in a new environment


Owning Palette: Action-Status VIs
Requires: Logger
Creates a new listener for logging statements. By default, there is at least one listener, which is the internal listener used for the default log file.
| Error In describes error conditions that occur before this node runs. This input provides standard error in functionality. | |
| Listener ID is an unique string to identify the listener. | |
| Error Out contains error information. This output provides standard error out functionality. |


Kickoff meeting: 14/10/2019, Pisa
- 9,30 – 13,00:
- General introduction of the meeting (Project coordinator)
- Presentation of the six work packages (WP leader)
- Coffee break at 11,00 and lunch at 13,00
- 14,30-18,00
- Presentation by project members
- Michele Loreti, Tan Duong, Luca Di Stefano, Marino Miculan, Vincenzo Ciancia, ... others?
- Coffee break at 16,00


Octon is a personal assistant that'll notify you when new releases have been pushed on github or docker. You will be able to view the changelog of a release.
Github
Docker
Daily emails
Weekly emails
Rss feed
Simply star a project with your github or docker account and octon will automatically notify you of new releases.


Store Info
Notice:
Information is stored locally to your Device and not on any of our servers.
This is the Windows and version you are running. (help)
Example: Windows 10 64x, Version 1903.
This is the Mac computer and version you are running. (help)
Example: Early 2015 Macbook Pro Retina, macOS Sierra 10.12.6.
This is the Linux distro and version you are running. (help)
Example: Ubuntu 18.04.
This is the Phone you are running, and the Android version you are running. (help)
Example: Pixel 3, Android 9.
This is the Device you are running, and the iOS version you are running. (help)
Example: iPhone XR iOS 12.3.1.


Overview
In this project, we developed an efficient, scalable way for clients to onboard into our service that's delivered through a combination of human service and software. I designed a new feature for a web application.
My Role
Product Designer, responsible for the end-to-end design process from discovery to launch.
The Team
1 Tech Lead, 2 developers, 1 Product Manager
Background
CV1.0 was a software enabled service company running college application guidance programs for high school students. The service is a structured curriculum administered by a human advisor, and the software is used for generating students’ application plans based on data and proprietary algorithms. In order to start the program, the student needs to sign up for the web-based software platform, enter some information, and get paired with a human advisor by the operations team. We call this process before the first meeting between the student and advisor onboarding.
The Problem
The existing onboarding process takes longer than promised. Students need to wait a long time before knowing who their advisor is and having their first meeting. For high school students and their parents who are under the stress of college applications, this is especially frustrating. Bad first impression from onboarding hurts the business with customer service issues, escalations, and cancellations.
Diagonosing the Current Situation
To find out why the current onboarding process is taking so long, I started off by interviewing the operations team at the company – the folks who conduct the process every day and knows the problem the best. I conducted whiteboarding sessions with three operational managers from our three different program. Together we mapped out the current end-to-end workflow from a client signing the contract to the first time they meet with an advisor, and identified pain points along the way.
It turns out that each stage of the onboarding process has different problems that contribute to the delay:
Sales/operation data integration is error prone
Sometimes client contract data can be missing during the process of being transmitted from the sales forms to the tools used by operations, which means sometimes operation doesn’t even know that there is a new client that needs to be paired with an advisor
Information needed to pair an advisor with a student is scattered across many different tools, making the manual pairing process complicated
To match a student with an advisor, folks at operations need to know about the advisor’s availability, their time zones, and if the student has any special requirements for genders or backgrounds. Astonishingly, these pieces of information are stored across eight different tools, making the pairing process unscalable.
After the student and advisor are being paired in the system, there is no automated notifications or instructions for scheduling the first meeting
Once being paired with a new student, the advisor needs to manually send the student a self-introduction email and figure out a time for the first meeting by emailing back and forth. A lot of delays can happen in this process because neither the advisor (who is a college student) nor the students (who are still in high school) check their emails all the time.
Clients wait in a black box
On the client side, not only is their wait time long, but they also have no visibility into this critical part of their program. Waiting with no sense of control is very anxiety-inducing for clients.
Through interviewing operations, I also identified the current time to first value (time from signing the contract to meet with an advisor) as a baseline for future comparisons. It turns out that it takes 3-5 days on average for the student to be paired, and another 9 days from being paired to scheduling the first meeting successfully. This was a big bottle neck for the business to increase customer satisfaction and decrease de-bookings.
Because time to first value is so important for the business, we set our success metrics as “95% of users can schedule first session within 48 hours of payment”.
This is an iterative process with the operations team, who is both an important stakeholder and also one of the end users, and the engineering team who delivers the final product.
Make it simple and scalable
Since the sales operations integration problem is technical, I focused on the other areas of problem on the design side:
Information needed to pair an advisor with a student is scattered across many different tools, making the manual pairing process complicated
After the student and advisor are being paired in the system, there is no automated notifications or instructions for scheduling the first meeting
Clients wait in a black box
Based on the problem and the goal of solving time to first value, I defined several design goals to guide my ideation process:
To solve for the (1), I collaborated with the operations team and got a prioritized list of data points that are needed for pairing. Because the client and the advisor need to meet on a regular cadence through several months, availability and time zone are the most important hard requirements. After that, students and their parents are most likely to have specific gender requirements. Lastly, students may have specific requirements for advisors, but our staffing resources are limited and can’t account for all special requirements. Therefore we need to convey to students that our advisors went through the same training and are equally qualified to deliver the service.
To solve for (2)(3)(4), instead of putting a black box in front of clients, I decided to let them take charge and select their own advisors. With the availability and timezone data collected in (1), not only can students be automatically matched with advisors who have overlapping availabilities, but they can also go ahead and select a time slot from the advisor’s availability for their first meeting right after pairing themselves with an advisor.
Designing a system that ties together three distinct user groups
Because the business is a unique combination of service and software, the web-based software system has three distinct groups of users – students (clients), advisors, and the operations team that manages the interaction between students and advisors. For clients, they need a simple yet effective way to understand what they need to do and who they can choose to pair with. For advisors, they have a way to enter availabilities but other data is missing and there’s no reminding mechanisms. For operations, they need visibility into clients’ onboarding progress and make sure advisors enter the required data. To make sure the design accounts for the whole system and the three user groups working together, I got inspiration from service blueprints and mapped the whole system with client experience on the top level, and the underlying operations below.
Making trade-offs
As soon as I got this first draft of the workflow done, I started showing it to the engineering leads for the project. I quickly found out that given the current resources and business needs, it was not realistic to add additional data points in the system. We need to work with what’s already there, availability and timezone, and make the experience work around it. For example, instead of having advisors’ majors and other background information as individual data points that can be used for matching, we decided to utilize the existing biography field and standardize the advisor biographies so that they reflect similar information. For special requests and less common use cases such as upgrading to more programs, the operations team will be notified and will continue handling them manually.
In collaboration with engineering, we went through several iterations of a much more scoped-down and specific flow.
When making the visual design, I utilized our existing UI components and interaction patterns as much as possible and went through a few iterations with internal feedback from stakeholders and advisors first. Then I tested a click-through prototype with student users to make sure any usability issues are addressed prior to implementation. I also designed the full email notification flow for the system.
To ensure successful delivery, I collaborated closely with engineering throughout the implementation process to clarify any ambiguities and conduct QA on Github pull requests.
One thing I learned over past projects is that it is important to track data post-launch so that the team can 1) learn and iterate and 2) measure the effect of the release. As the designer, I was particularly interested in learning whether the user behaviors were as expected and time to first value for those users who go through the new onboarding process. To measure user behavior, I set up and analyzed screen recording and heat maps in Hotjar. Through monitoring user behavior, I identified improvements to be made in the future including more information in bios and improvements on mobile.
In the end, the business decided to only roll it out to the smallest program we had (less than 10% of total clients), so we didn’t reach the ambitious metrics of “95% of users can schedule first session within 48 hours of payment”. But within the program we piloted in, we reached this goal.
In the end, I was satisfied with how the feature turned out and how users interacted with it, but looking back it was particularly obvious that I should have involved engineering in the discovery and solution exploration process
I started showing design proposals to engineering as soon as I finished discovery and made the first draft, but that felt surprising to engineers, since they were involved in neither the discovery process nor the solution brainstorming. Over time, I have learned from both practice and from the book Inspired that the more contexts engineers have, the more efficient development will be, as engineers are excellent problem solvers and the most familiar with the cost in building. It’s never too early to bring engineers in.


Katenar:
Is that the gem? Well done!
I cannot touch it, so there is no need to give it to me.
But take it to the village hidden in the center of the forest and give it to Kurstin. She will tell you what to do next.
Take care to only travel there during the daytime...
Depart immediately.


Will Simons and I worked on developing the iOS and Android app for the SJSU Production of The Circle.
The SJSU Production of The Circle allowed the audience to roam around a building and interact with actors of the play. The audience could choose their own adventure and to see different sides to the story.
Due to the scale of the play, actors would not be able to keep track of all the players and send messages or give points manually to them.
The purpose of The Circle App was to monitor the position of the user as they traversed through the building. Automatic push notifications were sent to users if they were in a certain room during an event, giving the user the illusion that they were being messaged and given points by the actors.
As the user interacted with the actors and perform tasks, they scored points. A leaderboard was added so that users could see how well they are performing compared to other audience members. The leaderboard ranks started at high numbers to give the impression that the user was part of a large company.
Technology
Meteor
We decided on using Meteor to develop our app. Meteor is a full-stack web development framework. This means it handles the database, the front-end, the back-end, and almost everything in between. Meteor is also built on top of Cordova, so it has the ability to be deployed onto mobile devices.
We chose Meteor because Will and I both were more acquainted in web development than in app development. Using Meteor, we were able to jump into development immediately.
When the user first logs in, they download a pre-defined list of events that occur at different times.
Rather than keeping track of the user on a server, we programmed all the logic to happen on the client. Push notifications are all local and fired from within the app.
As the user traverses through the building, the app keeps track of the users location and fires off events when it thinks the user has triggered one.
iBeacons
To keep track of user locations, we used iBeacons. iBeacons are tiny physical objects that emit a bluetooth signal that can be detected by most smartphones. Using a modified iBeacon Cordova plugin, we are able to detect the proximity between a person's smart phone and an iBeacon.
iBeacons were placed all over the building and on actors.
Based on which iBeacons the user is closest to, we can deduce which room the user is in. We are also able to deduce if the user is right next to an actor.
Problems...
iBeacon Gotchas
iBeacons are fine when the app is open, as they give fairly decent range values in the form of a float. However, if the app is in the background, then the iBeacons can only give discrete values of proximity such as Near, Far, and Unknown. These discrete values are very finicky and because of that, users were accidentally sent messages that weren't meant for them. We figured that there wasn't much we can do but to just roll with it.
"Am I going to have to pay for that bandwidth?"
We initially designed the app so that all information, including positional data, were sent to the server in an interval. This proved to be an extremely substantial load when we did a test run with 50 concurrent users. The server would hit maximum capacity within the first minute.
By this time, the app was nearing completion and we had a week left to develop. We made the decision to move as much server logic to the client as possible, and to not send location data to the server. This transition was made easier by the fact that Meteor shares a common API on the server and the client. We were able to finish the app on time.
Due to eventual technological malfunctions, actors were told to blame a fictional character named "Trevor" whenever there was a bug. Will and I later registered our names as Trevor when we attended the official runs of the play.
 I am glad I was able to play around with a lot of cool technologies, as well as meet a lot of cool people in theater. If I could, I would totally do this again. Even with all the problems, I had a great learning experience.
The most satisfying part of this experience was hearing an audience member say, "How did it know where I was?"


{% raw %}
Summary
Mandatory: 3 elements Must-Support: 3 elements
Extensions
This structure refers to these extensions:


What is more popular on Twitter right now?
OR
This is
finals
project (
video submission
) for
CS50x
. Source code is available on
GitHub
. © 2012 Ankit Aggarwal


Use PDF API's to render pages of a PDF document with rendering options. Document is placed under assets folder in the same path


Planet Sick-Boy: http://www.sick-boy.com "We Put the SIN in Cinema"
© Copyright 2001 Planet Sick-Boy. All Rights Reserved.
If somebody told me there was a non-porn film with more money shots than Happiness, I just wouldn't believe them.  The film was tossed out of the 1999 Toronto International Film Festival (only to return in 2000 with an edited rape scene) and was banned in its native France just three days after it opened.
So what's the hubbub? Baise-moi is equal parts Thelma and Louise, Natural Born Killers and Cum Suckers From Outer Space IV. It's about a pornography-addicted hooker (who kills her uptight roommate) and a porn-star rape victim (who kills her brother) who meet after missing the last train one dark evening.
Baise-moi was made to make viewers uncomfortable, and in that regard, the film can be considered a success. There isn't much happening artistically here; it's just a lot of humping and killing. I've been begging for more of each in my diet of film, and now that I have them, I feel kind of nauseous.
1:27 - NR but contains graphic sex and violence, rape, language and drug use
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


| Package | Description |
|---|---|
| javax.jdo.spi |
This package contains the interfaces and classes used by JDO implementations.
|
| Modifier and Type | Method and Description |
|---|---|
PersistenceCapable |
PersistenceCapable.jdoNewInstance(StateManager sm)
Return a new instance of this class, with the jdoStateManager set to the
parameter, and jdoFlags set to LOAD_REQUIRED.
|
PersistenceCapable |
PersistenceCapable.jdoNewInstance(StateManager sm,
Object oid)
Return a new instance of this class, with the jdoStateManager set to the
parameter, key fields initialized to the values in the oid, and jdoFlags
set to LOAD_REQUIRED.
|
PersistenceCapable |
JDOImplHelper.newInstance(Class pcClass,
StateManager sm)
Create a new instance of the class and assign its
jdoStateManager . |
PersistenceCapable |
JDOImplHelper.newInstance(Class pcClass,
StateManager sm,
Object oid)
Create a new instance of the class and assign its
jdoStateManager and key values from the ObjectId. |
| Modifier and Type | Method and Description |
|---|---|
boolean |
StateManager.getBooleanField(PersistenceCapable pc,
int field,
boolean currentValue)
Return the value for the field.
|
byte |
StateManager.getByteField(PersistenceCapable pc,
int field,
byte currentValue)
Return the value for the field.
|
char |
StateManager.getCharField(PersistenceCapable pc,
int field,
char currentValue)
Return the value for the field.
|
double |
StateManager.getDoubleField(PersistenceCapable pc,
int field,
double currentValue)
Return the value for the field.
|
float |
StateManager.getFloatField(PersistenceCapable pc,
int field,
float currentValue)
Return the value for the field.
|
int |
StateManager.getIntField(PersistenceCapable pc,
int field,
int currentValue)
Return the value for the field.
|
long |
StateManager.getLongField(PersistenceCapable pc,
int field,
long currentValue)
Return the value for the field.
|
Object |
StateManager.getObjectField(PersistenceCapable pc,
int field,
Object currentValue)
Return the value for the field.
|
Object |
StateManager.getObjectId(PersistenceCapable pc)
Return the object representing the JDO identity
of the calling instance.
|
PersistenceManager |
StateManager.getPersistenceManager(PersistenceCapable pc)
Return the
PersistenceManager that owns this instance. |
short |
StateManager.getShortField(PersistenceCapable pc,
int field,
short currentValue)
Return the value for the field.
|
String |
StateManager.getStringField(PersistenceCapable pc,
int field,
String currentValue)
Return the value for the field.
|
Object |
StateManager.getTransactionalObjectId(PersistenceCapable pc)
Return the object representing the JDO identity
of the calling instance.
|
Object |
StateManager.getVersion(PersistenceCapable pc)
Return the object representing the version
of the calling instance.
|
boolean |
StateManager.isDeleted(PersistenceCapable pc)
Tests whether this object has been deleted.
|
boolean |
StateManager.isDirty(PersistenceCapable pc)
Tests whether this object is dirty.
|
boolean |
StateManager.isLoaded(PersistenceCapable pc,
int field)
Return
true if the field is cached in the calling
instance. |
boolean |
StateManager.isNew(PersistenceCapable pc)
Tests whether this object has been newly made persistent.
|
boolean |
StateManager.isPersistent(PersistenceCapable pc)
Tests whether this object is persistent.
|
boolean |
StateManager.isTransactional(PersistenceCapable pc)
Tests whether this object is transactional.
|
void |
StateManager.makeDirty(PersistenceCapable pc,
String fieldName)
Mark the associated
PersistenceCapable field dirty. |
void |
StateManager.preSerialize(PersistenceCapable pc)
Guarantee that the serializable transactional and persistent fields
are loaded into the instance.
|
void |
StateManager.providedBooleanField(PersistenceCapable pc,
int field,
boolean currentValue)
The value of the field requested to be provided to the
StateManager . |
void |
StateManager.providedByteField(PersistenceCapable pc,
int field,
byte currentValue)
The value of the field requested to be provided to the
StateManager . |
void |
StateManager.providedCharField(PersistenceCapable pc,
int field,
char currentValue)
The value of the field requested to be provided to the
StateManager . |
void |
StateManager.providedDoubleField(PersistenceCapable pc,
int field,
double currentValue)
The value of the field requested to be provided to the
StateManager . |
void |
StateManager.providedFloatField(PersistenceCapable pc,
int field,
float currentValue)
The value of the field requested to be provided to the
StateManager . |
void |
StateManager.providedIntField(PersistenceCapable pc,
int field,
int currentValue)
The value of the field requested to be provided to the
StateManager . |
void |
StateManager.providedLongField(PersistenceCapable pc,
int field,
long currentValue)
The value of the field requested to be provided to the
StateManager . |
void |
StateManager.providedObjectField(PersistenceCapable pc,
int field,
Object currentValue)
The value of the field requested to be provided to the
StateManager . |
void |
StateManager.providedShortField(PersistenceCapable pc,
int field,
short currentValue)
The value of the field requested to be provided to the
StateManager . |
void |
StateManager.providedStringField(PersistenceCapable pc,
int field,
String currentValue)
The value of the field requested to be provided to the
StateManager . |
static void |
JDOImplHelper.registerClass(Class pcClass,
String[] fieldNames,
Class[] fieldTypes,
byte[] fieldFlags,
Class persistenceCapableSuperclass,
PersistenceCapable pc)
Register metadata by class.
|
boolean |
StateManager.replacingBooleanField(PersistenceCapable pc,
int field)
The replacement value of the field in the calling instance.
|
byte |
StateManager.replacingByteField(PersistenceCapable pc,
int field)
The replacement value of the field in the calling instance.
|
char |
StateManager.replacingCharField(PersistenceCapable pc,
int field)
The replacement value of the field in the calling instance.
|
double |
StateManager.replacingDoubleField(PersistenceCapable pc,
int field)
The replacement value of the field in the calling instance.
|
byte |
StateManager.replacingFlags(PersistenceCapable pc)
The owning
StateManager uses this method to supply the
value of the flags to the PersistenceCapable instance. |
float |
StateManager.replacingFloatField(PersistenceCapable pc,
int field)
The replacement value of the field in the calling instance.
|
int |
StateManager.replacingIntField(PersistenceCapable pc,
int field)
The replacement value of the field in the calling instance.
|
long |
StateManager.replacingLongField(PersistenceCapable pc,
int field)
The replacement value of the field in the calling instance.
|
Object |
StateManager.replacingObjectField(PersistenceCapable pc,
int field)
The replacement value of the field in the calling instance.
|
short |
StateManager.replacingShortField(PersistenceCapable pc,
int field)
The replacement value of the field in the calling instance.
|
StateManager |
StateManager.replacingStateManager(PersistenceCapable pc,
StateManager sm)
Replace the current value of
jdoStateManager . |
String |
StateManager.replacingStringField(PersistenceCapable pc,
int field)
The replacement value of the field in the calling instance.
|
void |
StateManager.setBooleanField(PersistenceCapable pc,
int field,
boolean currentValue,
boolean newValue)
Mark the field as modified by the user.
|
void |
StateManager.setByteField(PersistenceCapable pc,
int field,
byte currentValue,
byte newValue)
Mark the field as modified by the user.
|
void |
StateManager.setCharField(PersistenceCapable pc,
int field,
char currentValue,
char newValue)
Mark the field as modified by the user.
|
void |
StateManager.setDoubleField(PersistenceCapable pc,
int field,
double currentValue,
double newValue)
Mark the field as modified by the user.
|
void |
StateManager.setFloatField(PersistenceCapable pc,
int field,
float currentValue,
float newValue)
Mark the field as modified by the user.
|
void |
StateManager.setIntField(PersistenceCapable pc,
int field,
int currentValue,
int newValue)
Mark the field as modified by the user.
|
void |
StateManager.setLongField(PersistenceCapable pc,
int field,
long currentValue,
long newValue)
Mark the field as modified by the user.
|
void |
StateManager.setObjectField(PersistenceCapable pc,
int field,
Object currentValue,
Object newValue)
Mark the field as modified by the user.
|
void |
StateManager.setShortField(PersistenceCapable pc,
int field,
short currentValue,
short newValue)
Mark the field as modified by the user.
|
void |
StateManager.setStringField(PersistenceCapable pc,
int field,
String currentValue,
String newValue)
Mark the field as modified by the user.
|
Copyright © 2005–2020 Apache Software Foundation. All rights reserved.


{% include layout/metahead.html %} TODO: INDEX-PAGE IS A BODY CLASS THAT NEEDS TO BE ADDED AS A LAYOUT VARIABLE


Hi, I’m Brian! I’m a software engineer based out of San Francisco with a keen interest in video game design, computer graphics, and the ever-majestic SF BART.
Over the years, I’ve worked on a few personal projects related to CG and games. Here are some highlights:
pbrt
. This is a work in progress that gets attention when I want to take a break from interactive media.As far as my professional life goes, I currently work at Dropbox, where I’m building a great productivity tool called Paper. Previously, I worked on the Knowledge Graph at Google and news feed ranking at Facebook. The views expressed in this blog are my own and do not represent the views of my employer.
Email<EMAIL_ADDRESS>GitHub: brkho
Twitter: @brkhoot
Website: brkho.com


Eddystone vs iBeacon
If you are interested in IoT, you’ve probably heard of Estimote. They are probably the leading beacon provider in the IoT field and that’s for a good reason. We’ve had their dev kit for a while, and had since been using them happily ever since. Their beacons quality is top notch, software frequently updated, and customer service usually responsive.
As of recently, Estimote annouced support for Google’s Eddystone protocol, a beacon broadcast protocol which is a competitor to iBeacon from Apple. I will admit that I am a pretty much hopeless Google fanboy, since their products tend to give end users more freedom. But this time, we had a much better, concrete reason to jump ship from iBeacon to Eddystone, fleet management.
When iBeacon was launched, fleet management was probably not a very big concern, and Apple probably left it totally to the app developers, out of the protocols scope. Because of this, iBeacon supports only a simple UUID broadcast scheme. To get more specific info about the beacon, you need to poll this from the beacon directly. This is where things get ugly though, because polling information from the beacon also brings security concerns to the table. While Estimote has a key based security protocol, it was shown that it could be hacked and while Estimote have since updated their security protocol, beacon polling is still a pretty big security concern. And it is currently the only way to get other information (battery level, temperature, sensor readings etc) from your beacon, if you’re using iBeacon as the broadcast protocol.
And that is where Eddystone steps in. Eddystone supports three packet types, UID, URL, and TLM (which stands for telemetry). UID packet is a iBeacon type packet which transmits a UID, for providing context information to your app. URL transmits a URL (no surprises there) and its use case is quite different, please check Physical Web if you are interested. An eddystone beacon is meant to be configured to broadcast either one of these two schemes, and in addition to these, it will also transmit a TLM packet, which will contain its battery level information and any other sensory data. This mitigates the need to poll the beacon, and obviously, the less you connect to it, more secure it is. Which prompted us to step in and jump ship to Eddystone.
Configuration on Estimote side was a breeze. With just a couple of taps on the official app, our beacons were transmitting Eddystone UIDs. Configuration on our backend was not so straightforward though. Since Eddystone is relatively new, I couldn’t find any decoding libraries for Go. That’s why I had to write Goodystone. I also prepared this bash script to play around and confirm my results. (While I was at it, I also refactored my iBeacon decoding logic to its own repo as well, which became I Be Gone haha, see what I did there ?)
In the end, this TLM packet really saved the day for us, because it was obvious polling the beacons for this would bring lots of issues. Another day to thank the big G I guess !


Why do only some repositories show up in Unsubmitted Packages?
After you login via GitHub to the My page, your public repositories will be scanned. Your repositories that GitHub has tagged as containing Python will be searched for a setup.py and if one is found, that repository is eligible for submittal and will appear in the Unsubmitted Packages table. For general help with packages, see the official Packaging Python Projects page
What happens when the Submit button is pushed?
Your repository is cloned and then python setup.py sdist --formats gztar is executed to generate distribution files for your package. Those distribution files are the added to the index, a web page is created based on your Readme.md file (the first line is removed and the rest is converted from Markdown to HTML), the first 30 words past the first line of your Readme.md are used for search purposes, your package will start getting downloads tracked, and it will appear in the Submitted Packages table.
What happens when the Update button is pushed?
The same exact steps as when the Submit button is pushed. If you have incremented the version number in submit.py, both old versions and the new one will be available on the index.
What happens when the Remove button is pushed?
Your package is removed from the index, as is its web page. Download statistics are kept, although not accessible, in case the package is re-submitted later.


FAQ
Answers to common questions about what does and does not exist
Where do you get your data?
TMSDNE gets its data from a variety of sources on both the left and the right. Using some of the top financial journals' api output we collect our data daily.
Why would you want to take journal data out of context
In our humble estimation most financial journalism inherently is out of context. With the bias in all forms of media TMSDNE is an exercise in trying to leverage data science to create less bias financial journalism.
What other forms of journalism could this be applied to?
Theoretically, any type of journalism that needs to be leveled out. As the algorithm becomes stronger through deep learning, the articles would become less bias and more consumable.
If it doens't exist, what is it?
That is an existential question that we here at TMSDNE are not equipped to answer.


ACES allows users to execute services directly from Ark transactions using the SmartData bridge data field and encoded listeners services provided by ACES.
With this service, users are able to send a specified amount of Eth to a target Eth account using Ark.
With this service, users are able to deploy Ethereum code contracts directly to the Ethereum network using Ark. Users supply compiled solidity compiled contract code to the service and pay for deployment using an Ark wallet.
With this service, users are able to send a specified amount of Ark to the service and receive a return Ark transaction.


Referencing¶
SpectralRadex has been released under a MIT license and therefore you are free to use, modify or copy it in any way you wish. However, if you use SpectralRadex for any research purposes there are several references you should include.
Firstly, RADEX itself was copied essentially in its entirety and forms the basis of all model ouputs. Therefore, one should reference Van der Tak & Black 2007, the original work. Further, one should take care to acknowledge the work of those producing their collisional data. If you used the collisional files built into SpectralRadex, these were all taken from the Lamda Database where you can find the appropriate references for your molecules.
Finally, and particularly if you used the spectral modelling capabilities of SpectralRadex, we’d ask that you reference the paper in which we first described the module Holdship et al. 2021 (in prep). and point your readers in the direction of spectralradex.readthedocs.io


A class containing useful utility functions for scene manipulation.
geometry -- The geometry for the set of materials.
materials -- The materials for the object.
Creates a new Group that contains a new mesh for each material defined in materials. Beware that this is not the same as an array of materials which defines multiple materials for 1 mesh.
This is mostly useful for objects that need both a material and a wireframe implementation.
child -- The object to add to the parent
scene -- The scene to detach the object on.
parent -- The parent to attach the object from.
Attaches the object to the parent without the moving the object in the worldspace. Beware that to do this the matrixWorld needs to be updated, this can be done by calling the updateMatrixWorld method on the parent object.
child -- The object to remove from the parent
scene -- The scene to attach the object on.
parent -- The parent to detach the object from.
Detaches the object from the parent and adds it back to the scene without moving in worldspace. Beware that to do this the matrixWorld needs to be updated, this can be done by calling the updateMatrixWorld method on the parent object.