Changes to the OA4MP server by version.
5.3.0
Release date 2023-04-11
- CIL-1069: Emails are sent ontheir own thread now.
- CIL-1638: Missing header in user info endpoint response.
- CIL-1655: added refresh_token_lifetime and refresh_token_iat to
refresh endpoint repsonse. These are not standard, but sufficiently many places do it now (and it's a really good idea)
so we will too. If there is ever a standard for this, we will support it.
- CIL-1667: The openid scope now will have the acr (authentication
class reference) returned if present.
- CIL-1668: QDL acl_add function will not throw an exception if the
added identifier is invalid, it will merely log it. Optionally, it may be requested to fail hard and fast with a flag.
- CIL-1671: Admin clients, if approved to do so, may either mint
identifiers in their own namespace or request specific identifiers.
- CIL-1677: Monitor last accessed times for various objects.
This includes clients, admin clients, virtual organizations and (in CILogon) users. This permits tracking across time.
As the system ages and scales up, being able to track which objects are in use is becoming critical.
5.2.9
Release date 2023-03-07
- CIL-1266: Allow grace period on refresh.
- CIL-1379: Revision of documentation for using self-signed cert with Tomcat 9+.
- CIL-1604: Incorporate various fixes from the RCAuth group.
- CIL-1608: Store the id token in the client's asset, rather than forcing the client to reget it.
- CIL-1625: Expired auth grant giving wrong error message.
- CIL-1629: Allow more units in configuration: hours and days are now supported.
- CIL-1639: Edge case that the user info endpoint was
not returning the right status code or header if a completely bogus bearer token was used.
- CIL-1640: Errant debug stack trace too chatty.
- QDL Issue 6: Document command line switches.
- QDL Issue 8: Add a fork function. This is not permitted in server mode.
- QDL Issue 9: Add a sleep(ms) function. Mostly this is an iad to testing.
- QDL Issue 10: add optional module supporting various formats such as XML, YAML, HOCON.
<IP_ADDRESS>
Release date 2023-02-07
- CIL-627: Migrate to Java 11, split off MyProxy code.
- CIL-630: Retire CILogon archived user table.
- CIL-869: Documentation for dynamic client registration additional attributes.
- CIL-1014: Explicit creation of memory stores does not work.
- CIL-1088: Compact logging of expired access or refresh token.
- CIL-1178: Shorter LDAP timeouts. These were set to 10 seconds, but since OA4MP was
running Java 8, a known bug there prevented this from being effective. As of this release, it should work.
- CIL-1327: NCSA QDl scripts should be invoked in post_userinfo
but not post_exchange phases.
- CIL-1330: Related to CIL-1342.
- CIL-1339: Simple configuration for clients using a QDL
driver script.
- CIL-1342: Custom redirects added in cases of error. QDL supports
throwing an basic error now, a specific OAuth 2 error and a CILogon specific error in the course of running
server scripts.
- CIL-1346: Certain returned errors in CILogon were not OAuth 2 compliant.
- CIL-1347: Side effect of CIL-1348.
- CIL-1348: Debug print for clients with custom short IDs did not work right,
resulting in an error rather than a log entry.
- CIL-1354: Remove OAuth 1 references from documentation.
- CIL-1366: exec_phase post_all was not working.
- CIL-1388: CILogon did not get custom error uri in DBService layer.
- CIL-1419: Proxy client sending extra scopes. It should request the exact same
scopes the user has granted.
- CIL-1423: metadata tag is officially ignored any place in a client
cfg element. This allows management of clients by external systems (e.g. COManage) to insert their own accounting information.
- CIL-1426: XRAS client errors. This was, in fact, a manisfestation of
a provisioning error from COManage.
- CIL-1464: Disable clipboard use by Command Line Client when used
as a proxy.
- CIL-1490: Scope matching for templates was too simple-minded, assuming every scope was
a uri or ignored. With scopes like compute.modify, better matching is needed.
- CIL-1493: Remove non standard cid claim in SciTokens.
- CIL-1498: is_defined failing on stem elements in QDL.
- CIL-1507: Simplify setting cfg attribute in the CLI.
- CIL-1518: (CILogon specific) raising error results in default status of -1 if not explicitly set.
Return QDL error status as default.
- CIL-1536: Modernize interface between token exchange and QDL.
- CIL-1538: Preserve debug_on flag in client when using the REST API.
- CIL-1541: Multiple scripts in a token handler only have very first one run.
Run all in sequence.
- CIL-1550: Java serialization issue with OA4MP managed claim sources. Fix is
to quit using java serialization completely.
- CIL-1553: Allows specifying subtree search scope in QDL.
- CIL-1556: Improved online documentation to the CLI.
- CIL-1582: Really badly formed post to token endpoint should return status of 400.
- CIL-1584: Improve handling of scopes sent to proxy server.
- OA4MP issue 44: Dynamic query of clients is documented here.
- OA4MP issue 81: Clients that upload a string of scopes to the CM endpoint should get back a string, not a JSON array.
- OA4MP issue 84: Client Management API should return code 201 not 200 on create.
Note: CILogon still returns 200.
- OA4MP issue 85: Improve RFC 7591 compliance.
- QDL issue 1: starts_with not processing sparse lists.
- QDL issue 2: diff function for stems added.
- QDL issue 3: args() added to replace script_args().
- QDL issue 4: allows stem called state. to be returned with raise_error().
- QDL issue 5: Input form of empty stem is incorrect.
Note that QDL issues now have a new system for tracking them directly and hence start with 1.
5.2.7
Release date 2022-07-18
- CIL-1081: Ersatz clients.
- CIL-1277: Server-wide client configuratioins.
- CIL-1288: Bad example in CLI search documentation.
- CIL-1296: Allow for arbitrary LDAP search filters. See
documentation here (last example)
- CIL-1301: Added inclusive pre_all, post_all phases for QDL
scripts. post_all means the script would be called at post_auth, post_token, post_refresh, post_exchange and post_user_info.
This allows for letting the script decide what to do.
- CIL-1302: Set default that QDL code blocks are rejected in client configurations.
For admin clients to upload raw QDL, they must be granted explicit permission.
- CIL-1306: LDAP error messages should be more informative.
- CIL-1307: Null pointer returned rather than useful message if bad parameters in
a code challenge are passed. Return something informative.
- CIL-1308: Do not do any initialization with the email system if it is disabled.
- CIL-1310: CILogon CLI can now compute the DN for a certificate at the command line.
- CIL-1312: Discovery servlet should return response modes and all grant types.
- CIL-1313: QDL module loading bug. Java modules were prevented from
loading in server mode.
- CIL-1318: JDBC drivers updates for MariaDB and MySQL are not compatible.
- CIL-1319: Bump mysql connector version.
- CIL-1321: Inheritance of client configurations via
prototypes.
- CIL-1324: OA4MP should log better errors for missing QDL scripts
- CIL-1328: OA4MP not running user metadata refresh consistently in user info endpoint
- CIL-1332: QDL error codes for CILogon database service
- CIL-1333: Client configurations with arrays of configurations not read right. Regression from previous versions of OA4MP.
- CIL-1334: Support for error uris in QDL's scripting sys_err. See server scripts.
5.2.6
Release date 2022-05-10
- CIL-1221:Add proxy_claims_list attributes support
to the client management endpoint.
- CIL-1225:Prevent mail util from throwing an exception
in certain cases if mail has been completely disabled.
- CIL-1253:introspect endpoint should not
require token_type_hint.
- CIL-1267:fail_on_error inLDAP configurations
not getting passed along consistently.
- CIL-1268: More graceful recovery from certain types
of errors. If, for instance, a client's LDAP is misconfigured, token operations (such as refresh) will fail, but
can be resumed rather than invalidating the flow.
5.2.5
Release date 2022-03-29
- issue #44: Document querying client management endpoint for all clients
associated with a given admin client.
- CIL-771: (experimental) token info endpoint.
- CIL-869: Documented extra parameters for the
dynamic client registration endpoint.
- CIL-1145: All references to log 4 java have been removed.
- CIL-1146: Client server proxying has been implemented. Read up on it
here
- CIL-1166: Python library interoperability issue,
- CIL-1184: Wrong entry in listing the cleanup interval property in the server properties table.
- CIL-1187: Errors in setTransactionState should be more descriptive
- CIL-1193: Support for CRT (Chinese Remainder Theorem) when
generating public/private key pairs.
- CIL-1206: QDL state serialization bug involving whitespace for token exchange
records.
- CIL-1208: Dependabot alerts for PostGreSQL version. Does not impact us,
but there is no update to the version they require for Java 8 libraries.
- CIL-1211: Garbage collection race condition. If a user starts an auth flow, their
code is invalid until they log in. If the garbage collector runs between the time the flow starts and they finish their login, the transaction
will have been garbage collected.
5.2.4
Release date 2022-02-01
- issue #16: Remove GPG signing for maven.
- issue #17: Fix scope documentation.
- issue #40:Dynamic registration for oidc-agent
- CIL-1088: Better log message in case of an invalid refresh token.
- CIL-1112: Support for generic access tokens as per RFC 9068
- CIL-1117: XML bug in Corretto workaround.
- CIL-1122: Garbage collect abandoned flows.
- CIL-1124: Userinfo endpoint should reject revoked tokens.
- CIL-1132: Allow "ANY" scope (as a special value that is a string) in SciTokens.
- CIL-1137: ID tokens unique identifier is not asserted as "jti" not as "token_id."
- CIL-1147: remove all references to log for java (log4j).
- CIL-1148: Update list of stores in the documentation.
- CIL-1153: removed and deprecated old unused flie store configuration
- CIL-1159: Better handling of missing attributes in dynamic client registration
5.2.3
Release Date 2021-11-02
- CIL-1101: Allow device flow as explicit type in dynamic client registration.
- CIL-1102: device code is now base 32 encoded in device flow
- CIL-1104: Require openid scope for user info endpoint.
5.2.2
Release Date 2021-09-28
- CIL-1041: Per client lifetime and interval for device flow.
- CIL-1058: Database versions updated.
- CIL-1061: PKCE support.
- CIL-1067: A JSON Webkey store with a single entry does not
require a default ID to be set.
- CIL-1072: Consistent update of ID token timestamps.
- CIL-1074: Independent QDL server mode logging.
5.2.1
Release Date 2021-08-31
- CIL-1057: Derby support added.
- CIL-1051: Track device flow transactions better in database.
5.2.0
Release date 2021-08-03
- CIL-1029: Check RFC 8725 for JWT best
practices. By and large we follow them.
- CIL-1030: CILogon specific. Too many
serial strings are made.
- CIL-1035: Clients with refresh tokens disabled
are getting long-lived entries in the transaction table. There should be nothing there for them.
By and large the major innovation in 5.2.0 and above is support for RFC 8628 -- the device flow.
5.1.4
Release date 2021-07-14
- CIL-961: Reduced scopes supported in token exchange.
- CIL-971: Token exchange does not update returned token id for compound refresh tokens.
- CIL-974: Complete VO support for refresh and token exchange endpoints.
- CIL980: Support for RFC 8707, the audience and resource standard.
- CIL-998: WLCG groups supported.
- CIL-1002: logging per client supported.
- CIL-1012: offline_access scope supported.
- CIL-1019: preferred_username claim asserted if found for
profile scope.
5.1.3
Release date 2021-06-10
- CIL-958: CIlogon now asserts the cilogon_uid claim, which is
a shortened version of the unique identifier.
- CIL-962: Support for WLCG wlcg.credkey claim.
- CIL-971: In certain cases, token exchange does not update the actual token.
- CIL-974: User info endpoint needs to ensure correct signing keys are used for custom issuers.
- CIL-976: Discovery paths for custom issuers need to be resolved better.
- CIL-980: RFC 8707 is supported
- CIL-985: Errant cast in revocation servlet caused unrecoverable error.
- CIL-986: Support for custom token issuers in
the introspection and revocation endpoints.
5.1
Release date 2021-04-14
- CIL-697: Improve error messages to include a description.
- CIL-708: review of token exchange endpoint.
- CIL-824: Making all demo clients at CILogon distinct.
- CIL-833: Better enforcement of response_type.
- CIL-841: Fix returned claims for NCSA client.
- CIL-843: Some NCSA clients require a flat list for the isMemberOf claim, some require a JSON object
that has group ids. Amend QDL script to accept a parameter to set this.
- CIL-845: Allow basic versioning of objects in stores (clients, users, admin clients) with the CLI.
- CIL-848: Add access control to QDL scripts on server based on client/admin id.
- CIL-855: Review and set policy for unrecognized scopes.
- CIL-871: OA4MP rejects wildcards in callbacks everywhere, both at registration
and using the client management API.
- CIL-872: OA4MP servers will now, by default, only garbage collect tokens that they have created.
There is a new server configuration flag to have all expired tokens removed too.
- CIL-882: Expired or invalid refresh tokens return an error of invalid_grant, not invalid_token.
- CIL-884: Client Management API allows updating public clients except for changing a public
client to a confidential one -- that would require a new secret and secrets are only created at registration.
Therefore, you must register a new client if you need a confidential one.
- CIL-889: Admin clients may now have a flag set that will allow them to reference QDL scripts. If this
is disabled (default) any configuration with a QDL block will be rejected.
- CIL-892: Missing documentation for the client well known URI tag. This can be found
here.
- CIL-906: In id tokens, the auth_time claim must be a number. It was being returned as a string.
- CIL-911: Return the state parameter with errors consistently.
- CIL-915: Review and update the scopes documentation for clients.
- CIL-917: Improved client registration templates to include more information.
- CIL-922: Base 32 encode all non-JWT tokens. This is because some libraries (in PHP)
were unable to reliably url encode the new tokens. Base 32 tokens are case insensitive to boot.
- CIL-931: The client management API needs to return strict_scopes when GETting a client.
- CIL-936: Public clients were being rejected for access tokens.
5.0
Release date 2020-09-30
- CIL-675,
CIL-631::SciTokens/WLCG support.
- CIL-696: Code management. Bottom line is that the wars and jars are huge because we have dependencies that use IBM's international character support.
Actual OA4MP code runs at about 7% or less of what is in a given war or jar.
- CIL-708,
CIL-689: Verify RFC 8693 (token exchange endpoint) compliance.
- CIL-720: Update dynamic client registration webpage to list required parameters.
- CIL-725: (RFC 7592) Allow admin clients to set the scopes of clients they administer.
- CIL-729: Limited support for ISO 6429. This affects command line clients and utilities only.
- CIL-737: Allow for prompt = select_login. Henceforth we accept all standard prompts except "none" and
"consent".
- CIL-738: Implement subset of
RFC 7662, the token introspection endpoint.
- CIL-739: Restrict to absolute URIs callbacks only.
- CIL-836, GitHub #19 : Make QDL support official.
- CIL-850 Error in reading old configuration by new configuration.
4.4.4
Release date 2020-06-22
- CIL-733: (RFC 7591/7592) token_endpoint_auth_method missing on GET
- CIL-734: (RFC 7591/7592) client metadate returned inside cfg object
- CIL-735: (RFC 7591/7592) cannot delete cfg object
4.4.3
Release date 2020-05-29
- CIL-683: CLI should update issuer for admin clients when asked to do so.
- CIL-684: Admin clients should have max_clients settable from CLI.
- CIL-685: CLI should ask for confirmation when deleting objects.
- CIL-701: Incorrect grant type should return status code of 400.
4.4.1
Release date 2020-04-23.
- Github issue 5: Support multiple response
modes
I.e., the callback may optionally have its authorization response parameters encoded as a fragment, not a query.
- Github issue 8: support for public clients
- Github issue 13, CIL-646: Implement rfc 7009
for token revocation.
- Github issue 15: OA4MP may be turned in to an OIDC
compliant
service by setting the OIDCEnabled flag
- Github issue 19:Added QDL support.
- CIL-525: More refresh token tests
- CIL-540:(CIlogon only) Relax requirements for user attributes. as long as a user is only requesting a scope
of openid (so no certs or extended information such as groups) and has an idp and an identifier CILogon will
accept
the user.
- CIL-639:Allow users to specify roles. In particular now, OA4MP will accept certain scoped additional request
parameters
and, depending on the client, act upon them.
- CIL-646: Support token introspection. There is now an /introspect endpoint available. First cut is very, very
basic and merely allows for a client to query if a given access token is valid. Since we are moving to
self-describing
tokens it is unclear if we should support the other operations which are basically reading the token back to a
service.
- CIL-648: Recheck claims at token refresh. There is also scripting support now for this.
- CIL-649: Support pairwise id and subject id (in CILogon).
- CIL-666: Command Line Interface improvements. Please see the cli manual for details.
- CIL-695: issuing the rm command in the CLI should prompt.
- CIL-693: Claim sources created via introspection need to have their state injected.
4.3
Release date 2019-11-20.
- CIL-352: CILogon previous subject issue. In some cases in CILogon, the country should be US and is not archived
this way when updating.
This really is just a minor annoyance.
- CIL-493: Extra scopes that have not been approved for a client are ignored, as per the spec.
- CIL-503: Creating a new user results in a serial string with the same index.
- CIL-518: Remove zero length files. This now has a flag to enable/disable this in the configuration.
It is only an issue if a server is using file storage. Look at the file store documentation to learn more.
- CIL-525: Added a file-based claim source in addition to claim sources from LDAP, headers and such. This allows
server
to manage either all their claims or have a repository for very specific ones.
- CIL-566: Fire email for admin client registration. NOTE: the reason this failed at one point was because
of an upgrade from Java 8 to Java 11. Please
see the email configuration documentation for the details of getting this to work. Basically you need to include
on more file.
- CIL-567: Support for RFC 7592, updating and removing client information.
- CIL-570: Better return codes when creating a transaction fails.
- CIL-575: List of failure codes from create transaction failure.
- CIL-576: The CLI should use the same logic as the registration form for callback URLs. This means allowing for
calls to http://localhost, e.g.
- CIL-579: Last modified date added to all clients. When a client is saved, this is updated. Note that this will
update database tables autoamtically.
- CIL-586: return list of scopes if different from what is requested. As per the spec. if a client requests a set
of scopes
but the server does not honor any of them, a list of what the server will honor is returned.
- CIL-609: remove blank lines in callback uri list when registering a new client.
- CIL-612: Limit number of OAuth clients than an admin can register.
Other things to note in this release is the the CLI now supports setting environment variables both in a
file (either a Java properties file or a JSON object in a file) and from the command line.
4.2
Release date 2019-05-15.
- Added support for turning on/off OIDC abilities in the configuration file with the OIDCEnabled flag.
- CIL-467:Eliminate init endpoint (this was very specific to CILogon).
- CIL-490: Added a check box on the client registration form to allow marking a client as public. Note that
this will automatically set the scopes to only "openid".
- CIL-506: Support for the OAuth dynamic client registration specification is added.
- CIL-515:demo client will now show the id token and information about it
- CIL-532: eduPersonEntitlement support. Generally all additional attributes that Shibboleth sends are now
returned as claims unless specifically omitted.
- CIL-535: configuration snippets are now stored and may be accessed generally in other client configurationd.
This allows for the practical inheritance of configurations.
- CIL-545:Accept a wider range of redirects during client registration.
Redirect URIs may be to any domain if the scheme is https. If the scheme is http then only redirects to
localhost
or a reserved private range such as 192.168.x.x are allowed. If the scheme is not http or https, any domain is
allowed.
This last feature is needed for mobile device support.
4.1.1
Release date 2018-10-29.
- CIL-476: Allow for setting reply-to header in email notifications
- CIL-491: Public clients get a trivial ID token when they get an access token. This allows certain services
like kubernetes to check the timestamps and the ID token.
- CIL-499: Check that certain claims are present before returning them. This prevents an unruly script
from creating an unsuable claims object.
- CIL-501: CLI displays multiple attributes when fully listing a client.
- CIL-505: (in the DB service) Return a better error message if a request times out.
- CIL-508: CLI should be able to list all clients for a given admin. In the admin module, this is the
list_clients command.
- CIL-512: Support for LIGO Robot DNs added
- CIL-513: HTTP headers claim source should be configurable to ignore certain returned claims, since in a proxying
situation, these may be for the proxy, not for the requesting client.
- CIL-517: Requests to the service using POST should be refused unless the encoding is only form URL.
- CIL-519: Client Management should return an uploaded cfg object when querying the client's attributes.
4.0.1
This is a major upgrade and rewrite of the OA4MP system and is the result of a great deal of feedback and
experience.
- CIL-332: Error esponses should be JSON format with HHTP status 400.
- CIL-365: Setting scope = org.cilogon.userinfo should return an oidc claim if there is one.
- CIL-408: OAuth 1 command line client should not look for admin client stores on startup.
- CIL-417: Set subject claim to EPPN in certain cases
- CIL-422: Restrict access based on group membership.
- CIL-425: More flexible scope handling
- CIL-435: Return group number with group information
- CIL-436: LSST isMemberOf validation endpoint. See the doc here
- CIL-443: CILogon isMemberOf should parse the NCSA's LDAP information into a standard format
- CIL-448: Odd claims from surge. This requires checking eppn by domain and restricting access accordingly.
- CIL-460: Admin service rejects attempts by clients to update themselves.
- CIL-462: Get acr claim and return in id token
- CIL-464: Allow for customizing identifier scheme via configuration.
- CIL-467: Eliminate init endpoint for OIDC version.
- CIL-477: Set voPersonExternalID. This may be done with server-side scripting now.
- CIL-479: Issue isMemberOf claim based on IDP and SAML attributes.
- CIL-494: Allow public clients to access user information endpoint. The response is trivial since they are only
allowed the openid scope.
- CIL-498: After error on cleitn registration page, no scopes displayed.
- github #10: Allow CLI to edit scopes
- Support for functors
in client configurations.
Many updates, including the introduction of functor-based scripting. There is also a document relating to CIL-436 and
a JWT token parsing
endpoint.
The major change is allowing for a full scripting language to configure client behaviors. This is what effectively
solved
most of the above issues.
The command line interface (CLI) now supports exporting and importing records from a file with the serialize and
deserialize
commands. For SQL stores, there is also a new search function that allows for limited but very useful searches. Most
of the unit
tests have been improved or rewritten.
3.5.1
- CIL-430: Credentials sent in authorization header are to be URL encoded.
3.5
Release date 2017-11-29.
- Support for public clients.
- CIL-409: Missing cert request in OIDC getcert call causes empty certificate to be returned.
- CIL-414: Bug prevented accurately counting number of pending approvals.
- CIL-426: Send admins an email when there are too many pending approvals.
- CIL-427: Improve handling of approvals so that unapproved, pending and revoked approvals can be tracked.
Release Notes
Public clients are supported. It is assumed that the identifier is published publicly so that, for instance
a user can get a refresh token and then access tokens. No secret is needed to use a public client, however
access by a public client is severely restricted, almost exclusively to the openid scope for a user.
3.4
Release date 2017-08-28.
- OAUTH-203: Clients may request supported scopes at registration time.
- OAUTH-212: PEM encodings broken by change to Apache base 64 codec.
- OAUTH-213: Make TLS version configurable in the SSL configuration.
- OAUTH-217: Added discovery, in a server/.well-known/openid_configuration.
- CIL-339: EPTID mismatch handled as a separate case.
- CIL-344: Client management API created. Sample scripts created as well.
- CIL-356: Clients may have individual LDAP configurations.
- CIL-371: added claim for cert_subject_dn to be returned for the org.cilogon.userinfo scope.
- CIL-378: Clients with same creation timestamp are not all displayed in CLI.
- CIL-388: Server wars now include more meta information in the META-INF/MANIFEST.MF file about the build.
- CIL-396: More client information in email notification at registration for OIDC clients.
- CIL-404: Errors in the getCert servlet should throw an exception.
- CIL-405: Default for all new clients at registration is to enable ID token signing.
- Java object serialization issue: Updated dependencies on Apache commons-collections to 3.2.2.
- Removed legacy unused Java object serialization from backend file store.
3.4 Release notes
Note that in this release of OA4MP there are two new tables that are required if the server uses SQL -based storage.
One for admin clients and another for permissions. If the user (i.e., as defined in the configuration file that
accesses the data) has create permission in the database, then the tables will be automatically created. If not,
then
you must create them manually using one of the scripts found
here.
You must also create signing keys for OIDC. This is done with the
command line tool
Signing of ID tokens is now the default on the server. However, since older clients may not support this, the default
is to
disable signing of ID tokens for all clients. Older OA4MP clients will break if signing is enabled and they
are
at an earlier version (3.3 and before). Also, some installations of the mod_auth_openidc
client that cache the .well-known file have been known to break when talking to a 3.4 server. Please upgrade the
.well-known file to
the latest version on the server.
3.3
Release date 2016-09-22.
- CIL-252: Scope handler which queries LDAP for user attributes.
- CIL-264: Document examples using the cURL command.
- CIL-268: Added sample OA4MP OIDC configuration to web documentation.
- CIL-273: LDAP support for OA4MP.
- CIL-286: Failed client registration not cleaned up.
- CIL-299: "Max retries exceeded" message from MariaDB connection pool. This was because the
method in question was only partially synchronized.
- CIL-309: Refresh token fixes and improvements.
- CIL-312: Null pointer exception when parsing URIs.  This is now being handled better to prevent this.
- CIL-317: exception setting transaction state if use waits to finish exchange until after initial grant has
expired and garbage collected.
- CIL-319: Indicate in DN if the user is from and InCommon or eduGain IDP.
- CIL-320: DB Service fix to get information to resolve CIL-319.
- CIL-324: Attempting to send many email notifications at once causes failures.
- CIL-359: ID tokens must be signed by the server.
- OAUTH-189: Invalid nonce causes reloadof authorization page to fail.
- OAUTH-191: Defer connecting to MyProxy until the getCert call, if possible.
- OAUTH-194: OIDC token endpoint should return error with status of 400.
- OAUTH-196: Documentation needs updating after file name change internally.
- OAUTH-197: Testing from the command line documentation shows sending the secret to the authorization endpoint,
which
is not in the specification.
- OAUTH-198: Pass the HTTPServletRequest to the basic scope handler. This allows implementors more flexibility.
- OAUTH-199: Pass HttpServlet request to custom scope handlers.
- OAUTH-200: Connection pooling does not clean out stale connections.
- OAUTH-201: Username incorrectly flagged as the primary key for the asset table, causing and error on updates.
- OAUTH-202: Tomcat 6 is not supported for this release of OA4MP. You must have at least version 7 or higher.
- OAUTH-206: Refresh token lifetime limited. A logic bug made the lifetime of refresh tokens decrease on refresh,
eventually yielding invalid refresh tokens. All refresh tokens now are valid for the full requested time.
- OAUTH-208: Remove dependeny on one-jar plug in for building executable jars, since it is no longer supported.
- OAUTH-209: Remove dependency on Google Code's maven repository.
- OAUTH-215: default secret key length for new OIDC clients set to 512 bytes.
- Added new command line
client for testing purposes.
3.2.1
Release date 2016-01-28.
- CIL-101: (reopened with an additional parameter for the overloaded myproxy username)
- CIL-210: Return CILogon specific claims fromthe getUserInfo endpoint.
- CIL-211: New attributes for the user, affiliation, display name and organizational unit.
- CIL-227: Refresh token lifetimes should be ignored if not enabled on the server.
- CIL-231: EPPN and EPTID no longer omitted from X509v3 extension.
- CIL-234: Fermi National Lab specific distinguished names, along with a configuration option for the server to
disable generation of these.
- CIL-240: update for items from command line not working.
- CIL-257: Unwanted serial string changes on user updates
- CIL-258: Allow OGS CA to omit versio number from certification requests since MyProxy accepts these.
- CIL-260: Allow for restoring archived users from command line.
- OAUTH-184:Additional claims returned from the getToken endpoint.
- OAUTH-192: Enabling use of the remote user header from an external authorization module could allow a user to
change their name.
- OAUTH-193: Empty responses to cert request.
3.2
Release date 2015-09-14.
- OAUTH-181: Updated server walkthrough.
- OAUTH-183: Update documentation for using remote user.
- OAUTH-184: Plugin capability for additional IODC claims.
- OAUTH-185: Support for custom scopes and additional claims.
- OAUTH-188: Fixed broken links in the getting-started page.
- CIL-194: Searching for MyProxy servers in CILogon now uses standard OA4MP libraries.
- CIL-196: ServerDN option in configuration now can be over-ridden in the MyProxy tag.
- CIL-197: Propagating MyProxy changes to CILogon.
- Added PKCS 7 encoding support to the certificate utility
3.1.1
Released 2015-08-18
- OAUTH-180: Support OIDC servers that do not use a nonce.
- CIL-101: Add setTransaction state call.
- CIL-136: Documenting the OAuth 2.0 authorized servlet.
- CIL-141: Improve pinging servers
- CIL-170, CIL-171: Missing log4j properties restored.
- CIL-172: Multiple LIGO IdPs supported.
- CIL-173: Fix handling of incorrect password.
3.1.0
Release date 2015-08-15.
- CIL-194: CILogon server only returns cert from last Myproxy server
- CIL-196: server DN override in myproxy configuration not read.
3.1
Release date 2015-06-18
3.0
Release date 2015-04-08.
- Java 8 support: Due to internal changes to Java, this release requires Java 8 and will not work with
previous versions of Java.
- OAUTH-164: Support for id_tokens in OAuth 2 module
- OAUTH-165: Passing the skin parameter in with the initial request.
- OAUTH-168: Making OA4MP for OAuth 2.0 spec. compliant.
- OAUTH-169: Removed "error url" from the OAuth 2 registration page
- OAUTH-170: Typo in online documentation. Examples had tags corrected to <service>
- OAUTH-171: MyProxy Logon now supports setting the socket timeout.
- OAUTH-172: Expose MyProxy socket timeout in OA4MP configuration.
- OAUTH-173: Improved error message on session timeout.
- OAUTH-174: Error handling in OAuth 2 component.
- OAUTH-175: Possible concurrency issue with MariaDB connections.
- OAUTH-176: Specify DN (distinguished name) for MyProxy server(s).
- OAUTH-177: Documentation for the new server DN option.
1.3
- OAUTH-162: Client secret must be sent on access token request but not on authorization request.
- OAUTH-163: State must be returned in OAuth 2 component with authorization response callback.
1.2.1
Release date 2014-04-11.
- OAUTH-127: MyProxyLogon website updated to point to current release.
- OAUTH-129: Sorting entries with the the CLI ls command. Before there was no sorting,
now it is done by client ID or date, where applicable.
- OAUTH-134: Updating documentation on how to run a monitor.
- OAUTH-154: Removed possible redundant/conflicting maven dependencies.
- OAUTH-156: Turn off default logging for MyProxyLogon. This permits use of the MyProxyLogon
module as a library without getting logging messages to the console (the previous default).
- OAUTH-157: Client registration page not saving client secret under OAuth 1.0a protocol.
- OAUTH-158: Updated links on generic client registration page to current documentation.
- OAUTH-159: Update documentation for this release.
- OAUTH-160: Regularize and improve version reporting at component (CLI, client, server) startup.
1.2
Release date 2014-10-29.
- OAUTH-131: Improved client registration for OAuth 2 servers.
- OAUTH-149: Remove support for MyProxyLogon to use SSL version 3. (This mitigates the POODLE attack.)
- OAUTH-152: Do not show detailed MyProxy error message if authorization fails.
- OAUTH-153: Improved logging for MyProxy errors and successes.
- OAUTH-155: Updated documentation to explain new OAuth 2 client registration process.
1.1.3
Release date 2014-09-30.
- OAUTH-139: CLI might return an incorrect list of items after several updates.
- OAUTH-140: MyProxy component didn't quite log completely to the configured log file.
- OAUTH-141: Improved client/server walkthough. This is documentation that permits an administrator
to deploy both a client and server locally with a self-signed cert for testing purposes.
- OAUTH-143: Enabling the Globus DN option should have had better documentation pointing at the
server requirements for JGlobus.
- OAUTH-144: Jetty version was incorrect, causing certain build issues. This was standardized on version
6.1.26 to ensure consistent builds.
- OAUTH-147: Potential cleanup thread failure with a filestore. If a filestore is used and one of the
files is corrupted (e.g. due to a system crash at the time of writing it) then the cleanup thread
would fail to start. Now such corrupted files are simply logged in catalina.out and ignored otherwise.
- OAUTH-148: Maria DB support added.
1.1.2
Release date 2014-07-31.
- OAUTH-112: Servlet initialization is injected now, decoupling it more from Tomcat startup.
- OAUTH-113: MyProxy does not handle PAM challenges. The documentation has been updated with a link to the
appropriate page
on the MyProxy website where this is discussed.
- OAUTH-117: Server install walkthrough updated and improved to reflect changes (in particular, it now makes us of
the resolution of OAUTH-110).
- OAUTH-118. Build error in maven caused OAuth2 command line tools to issue an NPE in certain cases.
- OAUTH-119: Loading objects into the CLI that do not have identifiers caused an NPE. This could only arise really
if someone directly edited an entry in a text editor (e.g. if the installation was backed by a filestore). In
that
case it would not be possible to load any objects from that store into the CLI, preventing editing of them.
- OAUTH-120: The new -component flag allows an administrator to start the CLI with the named component as
an
argument. E.g. rather than start the CLI and use the approval component, just issue
./oa4mp-cli -component approvals
- OAUTH-125: "About" and "Overview" links on website were broken.
- OAUTH-126: Website now lists the version number with the "latest" link.
- OAUTH-130: Documentation amended to clarify which version of OA4MP (based on OAuth 1.0a or OAuth 2.0)
to use.
- OAUTH-133: Configuration option to convert standard DN to (legacy) Globus identifiers. This is mostly
useful for installations that have been using Globus for a very long time.
- OAUTH-135: Failure in authentication were not displaying the correct message. They should route the user
back to the login page for another attempt.
1.1.1
- OAUTH-105:Added support for file includes to configuration files.
- OAUTH-105: Added checks to prevent cycles in aliases and files
- OAUTH-106: Adding fully qualified host name to client approval notifications.
1.1
- OAUTH-47 Now supports building with maven 3.0+ There was an issue with earlier an pom version
that prevented this.
- Support for OAuth 2 protocol. This includes full server and client support as well as
various supported stores (mysql, postgres, files) and admin tools.
- OAUTH-94: Fix for passthrough of Shibboleth attributes.
A username transformation interface has been
created.
This will be invoked immediately before the call to MyProxy.
Users that wish to customize this may do so by implementing the interface and setting it in the environment
at server startup.
- OAUTH-96: Check for a bad PKCS10 CSR (missing version number which must be set to 0) created by pyOpenSSL is
now in place and an informative message is now
issued. Earlier the Bouncy Castle code allowed for this, Sun does not.
- OAUTH-99: Old documentation at Science Gateway Security site removed. Everything is redirected to this site
now.
- OAUTH-102: No username returned with cert in certain cases. Fixed.
1.0.7
Release date 2013-08-16.
- Added support to make using log 4j optional. It had been disabled which interfered with some installations.
- Fixed bug OAUTH-90.
- Fixed bug OAUTH-94. This adds a configuration option to
return the DN of the user's cert as the username.
- All new command line tools that allow for managing clients and approvals.
- Changed client index page to be more up to date.
- Removed all explicit references to Bouncy Castle. This should prevent future jar pollution from
incompatible versions. JGlobus still uses this though....
- Set mysql and postgres jars to be provided rather than included in the release so that projects that
need only a single type of storage are not required to install both of these.
1.0.6
Release date 2012-08-31
- Version number is now printed to the console whenever the server starts up.
- Support for authentication using the REMOTE_USER (or any other) header.
- Improved error handling on the server, especially in cases where the MyProxyLogon client encounters a runtime
exception.
- OAUTH-80: errors resulting from JGlobus broken build will be resolved by their conforming to standard maven
practices
- Fix for OAUTH-83 documentation error in configuring mail addresses
- OAUTH-84 failure to return a complete certificate chain from MyProxy in a certain case
- OAUTH-85 failure to configure logging could result in an error. Default is to dump everything into the tomcat
logs.
- Use of new JGlobus release 2.0.5.
- Bouncy Castle version set to 1.43 to support JGlobus release 2.0.5.
- Added signatures for the lastest downloadable war.
1.0.5
- Support for limited proxy generation. Allows the server to generate a public/private keypair and issue a limited
proxy. The result is a certificate chain.
- Deny HTTP header. This sets the HTTP header to "deny" which prevents clickjacking attacks.
- Added logging support. Standard Java logging is now available and configurable.
- Default MyProxy server on localhost. If no MyProxy server is specified, one is assumed to be running on
localhost.
- Improved admin tools. In particular, improved the CLI to give more readable messages.
- Improved SQL install scripts.
- Links in the documentation to the latest versions of these scripts.
- More and better documentation.


We Always Need More Tacos!!
A study of Ruby Classes
Note: This blog post is in honor of the exciting new taco emoji!
Objects are the organizing elements in Object-Oriented Programming, and in Ruby Programming, we use Classes to organize Objects. Classes give you, the programmer, the power to group behaviors into clusters, so that you can quickly create multiple new objects of a class that have the same behaviors and attributes.
Since we always need more tacos, let's use that as an example! In this case, I have created a class called Taco, and assigned it two attributes: the filling and the type of shell. To simplify the code, I used the attr_accessor method on the attributes to give them reader and writer capabilities. There may be a time that we want to access the instance variables in this class, and the attr_accessor method allows us to do so. I then initialize the attributes with the initialize method, assigning them variables with the same name as the attribute and an @ sign as the start of a variable name. This indicates that these are instance variable, i.e. they are only accessible in the Taco class. The next step is to create methods that can be called on any instance of the Taco class. In this case, I create the make_taco method, with a statement of the order to be processed.Once the class is created, we can make as many tacos as we want! By creating a new variable called taco1 and assigning it a new instance of the Taco class, we can call the method within the Taco class on the new instance. We can create as many of these as we want, with various inputs for the type of filler and shell. Tacos for all!


Universiti Tun Hussein Onn Malaysia
Bachelor of Information Technology (JPA Scolarship)
CGPA: 3.40
Course Taken
- BIT10203 Introduction to Information Technology
- BIT10303 Computer Programming
- BIT11003 Discrete Structure
- BIT10403 Introduction to Multimedia
- BIT10703 Data Structure and Algorithm
- BIT11603 Statistics
- BIT20303 Computer Architecture
- BIT10503 Cyber Entrepreneurship
- BIT10803 Information Technology Skills
- BIT20103 System Analysis and Design
- BIT20403 Operating System
- BIT20603 Object Oriented Programming
- BIT10103 Software Engineering
- BIT20703 Network and Data Communication
- BIT20803 Database System
- BIT31003 Information Technology Application
- BIT33803 Java Programming
- BIT20203 Graphic Programming
- BIT33403 Project Research Methodology
- BIT20502 Creativity and Innovation
- BIT21002 Computer, Ethics and Social
- BIT33503 Degree Project (Food Stall Evaluation System)
- BIT40112 Industrial Training
- BIT20903 Artificial Intelligence
- BIT30303 Decision Support System
- BIT30403 Project Management
- BIT30503 Enterprise Resource Planning
- BIT30803 Management Information System
- BIT33603 Data Mining
- BPK10403 Basic Accounting
- BPK20502 Principles of Management
- BPK20802 Entrepreneurship
- BPK30702 Environmental and Occupational Safety


The Beauty of Visual Art
Below are them
{%for results in imggal%}
{{results.imgtitle}}
{{results.imgdesc}}
{%endfor%}


The code is in reverse_1.cpp:
#include <iostream> #include <list> using namespace std; main() { list <string> lines; list <string>::iterator lit; string s; while (getline(cin, s)) lines.push_front(s); for (lit = lines.begin(); lit != lines.end(); lit++) { cout << *lit << endl; } } |
A few things -- you declare an empty list just like you declare an empty vector. In fact, the code to create the list is very much like the code to create a vector, except we are using push_front() to prepend each string to the front of the list.
To traverse the list, we use an iterator, which is a special type defined by the template library. The for loop is typical -- you start with the first element of the list, obtained with the begin() method, and traverse until you are one element beyond the end of the list (signified by the end() method). To go from one element to the next, you increment the iterator. I don't like this usage of overloading, but it wasn't up to me.
Then, to access the element in the list, you use pointer indirection (the asterisk). When you get used to seeing this code, it reads nicely. It does take a little acclimation though. Regardless, it works:
UNIX> cat input.txt Born in the night She would run like a leopard That freaks at the sight Of a mind close beside herself UNIX> reverse_1 < input.txt Of a mind close beside herself That freaks at the sight She would run like a leopard Born in the night UNIX>
#include <iostream> #include <list> using namespace std; main() { list <string> lines; list <string>::reverse_iterator lit; string s; while (getline(cin, s)) lines.push_back(s); for (lit = lines.rbegin(); lit != lines.rend(); lit++) { cout << *lit << endl; } } |
We've created the list with push_back(), and we change lit to be a reverse_iterator. The iteration proceeds from rbegin(), which is the last element of the list, to rend(), which is one element before the first element of the list. Note, we still increment lit -- is that natural? You be the judge.
UNIX> reverse_2 < input.txt Of a mind close beside herself That freaks at the sight She would run like a leopard Born in the night UNIX>
The program reverse_3.cpp implements reversal by inserting each element at the front and traversing the list in the forward direction:
#include <iostream> #include <list> using namespace std; main() { list <string> lines; list <string>::iterator lit; string s; while (getline(cin, s)) lines.insert(lines.begin(), s); for (lit = lines.begin(); lit != lines.end(); lit++) { cout << *lit << endl; } } |
It works like the others:
UNIX> reverse_3 < input.txt Of a mind close beside herself That freaks at the sight She would run like a leopard Born in the night UNIX>
#include <iostream> #include <vector> using namespace std; main() { vector <string> lines; vector <string>::iterator lit; string s; while (getline(cin, s)) lines.insert(lines.begin(), s); for (lit = lines.begin(); lit != lines.end(); lit++) { cout << *lit << endl; } } |
I call this ill-judged because when you perform an insertion such as v.insert(v.begin(), x), the STL basically does the following:
v.resize(v.size()+1); for (i = v.size(); i > 0; i--) v[i] = v[i-1]; v[0] = x; |
In other words, it copies all of the elements of the vector to make room for the new element at v[0]. This is expensive, and makes reverse_4.cpp above run in O(n2) time.
To illustrate, input-2.txt is an input file with 10,000 lines, and input-3.txt is one with 40,000 lines. Look at the difference in speed between reverse_3 and reverse_4:
UNIX> wc input-2.txt 10000 10000 80000 input-2.txt UNIX> wc input-3.txt 40000 40000 320000 input-3.txt UNIX> time reverse_3 < input-2.txt > /dev/null 0.012u 0.000s 0:00.01 100.0% 0+0k 0+0io 0pf+0w UNIX> time reverse_3 < input-3.txt > /dev/null 0.024u 0.008s 0:00.03 66.6% 0+0k 0+0io 0pf+0w UNIX> time reverse_4 < input-2.txt > /dev/null 0.452u 0.000s 0:00.45 100.0% 0+0k 0+0io 0pf+0w UNIX> time reverse_4 < input-3.txt > /dev/null 7.008u 0.012s 0:07.04 99.5% 0+0k 0+0io 0pf+0w UNIX>As you can see, reverse_3 is very fast (0.012 and 0.024 seconds on one of our hydra machines in 2014), while reverse_4 is painfully slow (0.45 and 7 seconds). This is is important, and you should take care that it doesn't happen to you.
A good rule of thumb is to use a vector as an array and not a list. Don't use iterators -- use integer indices. Then you're ok.
#include <iostream> #include <deque> using namespace std; main() { deque <string> lines; int i; string s; while (getline(cin, s)) lines.push_front(s); for (i = 0; i < lines.size(); i++) cout << lines[i] << endl; } |
Unlike the vector version, this one runs very fast:
UNIX> reverse_5 < input.txt Of a mind close beside herself That freaks at the sight She would run like a leopard Born in the night UNIX> time reverse_5 < input-2.txt > /dev/null 0.004u 0.004s 0:00.01 0.0% 0+0k 0+0io 0pf+0w UNIX> time reverse_5 < input-3.txt > /dev/null 0.032u 0.000s 0:00.03 100.0% 0+0k 0+0io 0pf+0w UNIX>
#include <iostream> #include <list> using namespace std; main() { list <string> lines; list <string>::iterator lit; string s; while (getline(cin, s)) { lines.push_back(s); if (lines.size() > 10) lines.erase(lines.begin()); } for (lit = lines.begin(); lit != lines.end(); lit++) { cout << *lit << endl; } } |
Works fine:
UNIX> mytail_list < input-2.txt 9991 9992 9993 9994 9995 9996 9997 9998 9999 10000 UNIX> mytail_list < input-3.txt 39991 39992 39993 39994 39995 39996 39997 39998 39999 40000 UNIX>As with the previous example, we can port the code directly to vectors and to deques, since they both implement an erase() method. As with the other example, we see that the vector implemention performs worse, since it copies all of the remaining elements upon deletion (the shell scripts make them do more work so that you can see the difference):
UNIX> time sh big_mytail_list.sh 0.411u 0.013s 0:00.42 100.0% 0+0k 0+0io 0pf+0w UNIX> time sh big_mytail_deque.sh 0.370u 0.012s 0:00.38 100.0% 0+0k 0+0io 0pf+0w UNIX> time sh big_mytail_vector.sh 0.507u 0.012s 0:00.52 98.0% 0+0k 0+1io 0pf+0w UNIX>The difference isn't huge, but it is there. Were we to keep the last 100 lines instead of the last 10, the difference would be much more pronounced (we did this in class).
They give a few examples:
| String | Number of diamonds |
| "><<><>>><" | 3 |
| ">>>><<" | 0 |
| "<<<<<<<<<>>>>>>>>>" | 9 |
| "><<><><<>>>><<>><<><<>><<<>>>>>><<<" | 14 |
This implementation works directly from the problem statement, using the find() method of strings to find a diamond, and then using substr() to remove the diamond:
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; class DiamondHunt { public: int countDiamonds(string mine); }; int DiamondHunt::countDiamonds(string mine) { int nd, i; nd = 0; while (1) { i = mine.find("<>"); if (i == string::npos) return nd; nd++; mine = mine.substr(0, i) + mine.substr(i+2); } } main() { DiamondHunt d; string s; while (cin >> s) { cout << d.countDiamonds(s) << endl; } exit(0); } |
When we test it out, it works fine:
UNIX> g++ -o DiamondHunt1 DiamondHunt1.cpp UNIX> DiamondHunt1 <> 1 >< 0 ><<><>>>< 3 >>>><< 0 <<<<<<<<<>>>>>>>>> 9 ><<><><<>>>><<>><<><<>><<<>>>>>><<< 14 UNIX>Although this solution works, think about its running time. In particular, think about the "<<<<<<<<<>>>>>>>>>" input. It has to scan nine characters before finding the diamond. Then the next time it has to scan 8, then 7, etc. In other words, if you have a string of n less-than signs followed by n greater-than signs, you will have to perform n2 scans to find the diamonds. When n is small (25 in the topcoder constraints), that doesn't make a difference. However, it can matter. The program make_bad_diamond.cpp is a very simple C++ program that takes n on the command line and produces a string with n less-than signs followed by n greater-than signs. See what happens when we call it with successively larger values and time the output:
UNIX> time sh -c "make_bad_diamond 10 | DiamondHunt1" 10 0.000u 0.000s 0:00.00 0.0% 0+0k 0+0io 0pf+0w UNIX> time sh -c "make_bad_diamond 100 | DiamondHunt1" 100 0.010u 0.000s 0:00.00 0.0% 0+0k 0+0io 0pf+0w UNIX> time sh -c "make_bad_diamond 1000 | DiamondHunt1" 1000 0.010u 0.000s 0:00.01 100.0% 0+0k 0+0io 0pf+0w UNIX> time sh -c "make_bad_diamond 10000 | DiamondHunt1" 10000 0.800u 0.000s 0:00.79 101.2% 0+0k 0+0io 0pf+0w UNIX> time sh -c "make_bad_diamond 100000 | DiamondHunt1" 100000 79.350u 0.010s 1:19.66 99.6% 0+0k 0+0io 0pf+0w UNIX>When the input size is increased by a factor of 10, the running time is increased by a factor of 100. That's not good.
Instead, DiamondHunt2.cpp uses a list. It copies the elements of mine to a list, and then uses three iterators on the list:
#include <iostream> #include <cstdio> #include <cstdlib> #include <list> using namespace std; class DiamondHunt { public: int countDiamonds(string mine); }; int DiamondHunt::countDiamonds(string mine) { int nd, i; list <char> l; list <char>::iterator left, right, newleft; for (i = 0; i < mine.size(); i++) l.push_back(mine[i]); nd = 0; left = l.begin(); while (left != l.end()) { if (*left == '>') { left++; // If left is not the beginning of a diamond, move on. } else { right = left; right++; if (right == l.end()) return nd; if (*right == '<') { // If right is not the end of a diamond, move on left++; } else { // Otherwise, we've found a diamond. We need to nd++; // increment nd, and set newleft to point to the previous // char, or if left is at the beginning, to the next one. if (left == l.begin()) { newleft = right; newleft++; } else { newleft = left; newleft--; } l.erase(left); // Now erase left and right, and set left to newleft. l.erase(right); left = newleft; } } } return nd; } main() { DiamondHunt d; string s; while (cin >> s) { cout << d.countDiamonds(s) << endl; } exit(0); } |
It works on the examples as before:
UNIX> g++ -o DiamondHunt2 DiamondHunt2.cpp UNIX> DiamondHunt2 <> 1 >< 0 ><<><>>>< 3 >>>><< 0 <<<<<<<<<>>>>>>>>> 9 ><<><><<>>>><<>><<><<>><<<>>>>>><<< 14 UNIX>However, it is much faster than the previous version because we don't traverse the list on each iteration as we did with m.find():
UNIX> time sh -c "make_bad_diamond 1000 | DiamondHunt2" 1000 0.020u 0.000s 0:00.00 0.0% 0+0k 0+0io 0pf+0w UNIX> time sh -c "make_bad_diamond 10000 | DiamondHunt2" 10000 0.020u 0.000s 0:00.00 0.0% 0+0k 0+0io 0pf+0w UNIX> time sh -c "make_bad_diamond 100000 | DiamondHunt2" 100000 0.040u 0.010s 0:00.04 125.0% 0+0k 0+0io 0pf+0w UNIX> time sh -c "make_bad_diamond 1000000 | DiamondHunt2" 1000000 0.470u 0.000s 0:00.44 106.8% 0+0k 0+0io 0pf+0w UNIX>As we increase the string by a factor of 10, we increase the running time by a factor of ten. That's much better than DiamondHunt1.
It's important for you to understand the code in DiamondHunt2.cpp. To help you, here's an example when we call it on the string: "<<>><<>": I will draw every iteration of the while() loop. Here are the list and the iterators in the first iteration:
I'm drawing the list with two sentinel nodes at each end. Before the first node is a sentinel node for l.rend(), and after the last node is a sentinel node for l.end(). We start with left equaling l.begin(), and since it points to a less-than character, we set right to be the next node. Since right also points to a less-than node, there is no diamond -- we increment left and go to the next iteration of the while() loop:
Now left points to a less-than and right points to a greater-than. So, we increment nd and then set newleft to be the node before left. That is pictured below:
We then erase left and right, and set left to newleft before going back to the top of the while() loop. Here's what happens in the next iteration:
The two erased nodes are gone from the picture, and left and right point to a diamond. Thus, nd is incremented, and since left is equal to l.begin(), we set newleft to be the node after right. That is the state pictured above. We then erase left and right, and set left to newleft before going back to the top of the while() loop. Here's what happens in the fourth iteration:
This is the same case as the first iteration -- no diamond. We increment left and move on:
We have a diamond. We first increment nd. Next, since left is not equal to l.begin(), we set newleft to point to the node before left. That is depicted above. We then erase, set left to newleft and reach the last iteration of the while() loop:
Since right equals l.end(), we return 3, and we're done. It's important that you step through this example until you understand it. You may even want to step through what happens when the string is we call it on the string "<<>>><>". The execution is very similar, except the fourth and sixth iterations look a little different.
After creating the list of lists, we traverse it an print out each bottom level list on one line:
#include <iostream> #include <list> using namespace std; typedef list <int> intlist; main() { list <intlist *> numlists; list <intlist *>::iterator nlit; intlist *il; intlist::iterator ilit; int i, j; for (j = 0; j < 100; j += 10) { il = new intlist; numlists.push_back(il); for (i = 0; i < 10; i++) { il->push_back(i+j); } } for (nlit = numlists.begin(); nlit != numlists.end(); nlit++) { il = *nlit; for (ilit = il->begin(); ilit != il->end(); ilit++) cout << *ilit << " " ; cout << endl; } } |
The typedef makes the code cleaner, so that you don't have nested list declarations.
This code runs nicely, and as you'd expect:
UNIX> list_o_list_1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 UNIX>You have undoubtedly noticed the fact that our bottom level list is a pointer to a list, which we create using new. Why do we do this? The answer is that if we don't use pointers, we expose ourselves to problems with making copies of things. Let's see what happens if we try to avoid pointers.
A first straightforward try is in list_o_list_2.cpp, which just takes out the new and changes pointers to non-pointers:
#include <iostream> #include <list> using namespace std; typedef list <int> intlist; main() { list <intlist> numlists; list <intlist>::iterator nlit; intlist il; intlist::iterator ilit; int i, j; for (j = 0; j < 100; j += 10) { numlists.push_back(il); for (i = 0; i < 10; i++) { il.push_back(i+j); } } for (nlit = numlists.begin(); nlit != numlists.end(); nlit++) { il = *nlit; for (ilit = il.begin(); ilit != il.end(); ilit++) cout << *ilit << " " ; cout << endl; } } |
When we run it, we get some icky results:
UNIX> list_o_list_2 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 UNIX>What's going on? Well, first, you are always inserting il into each top-level list. When you do that, it makes a copy of il, and then does not insert the integers into the copy, but into il. This is why il keeps growing, and why the first line is blank -- we are printing an empty list.
We can fix this by getting rid of il and accessing the list elements directly. A solution is in list_o_list_3.cpp:
#include <iostream> #include <list> using namespace std; typedef list <int> intlist; main() { list <intlist> numlists; list <intlist>::iterator nlit; intlist il; intlist::iterator ilit; int i, j; for (j = 0; j < 100; j += 10) { numlists.resize(numlists.size()+1); for (i = 0; i < 10; i++) { numlists.back().push_back(i+j); /* Yuck */ } } for (nlit = numlists.begin(); nlit != numlists.end(); nlit++) { il = *nlit; for (ilit = il.begin(); ilit != il.end(); ilit++) cout << *ilit << " " ; cout << endl; } } |
That's an awful line of code, isn't it? Spend some time reading it to make sure you understand it. It seems to work fine:
UNIX> list_o_list_3 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 UNIX>However, there is a bug. That is the line
il = *nlit; |
This line makes a copy of *nlit, which makes a copy of the list. As I said in class, it makes one pine for C, which doesn't let you make copies so wantonly. To fix this, remove il completely (list_o_list_4.cpp):
#include <iostream> #include <list> using namespace std; typedef list <int> intlist; main() { list <intlist> numlists; list <intlist>::iterator nlit; intlist il; intlist::iterator ilit; int i, j; for (j = 0; j < 100; j += 10) { numlists.resize(numlists.size()+1); for (i = 0; i < 10; i++) { numlists.back().push_back(i+j); } } for (nlit = numlists.begin(); nlit != numlists.end(); nlit++) { for (ilit = nlit->begin(); ilit != nlit->end(); ilit++) cout << *ilit << " " ; cout << endl; } } |
Again, I find that code unreadable -- in fact, this code is so ugly, you may as well put it all on one line (list_o_list_5.cpp):
#include <iostream> #include <list> using namespace std; typedef list <int> intlist; main() { list <intlist> numlists; list <intlist>::iterator nlit; intlist il; intlist::iterator ilit; int i, j; for (j = 0; j < 100; j += 10) { numlists.resize(numlists.size()+1); for (i = 0; i < 10; i++) { numlists.back().push_back(i+j); } } for (nlit = numlists.begin(); nlit != numlists.end(); nlit++) { for (ilit = nlit->begin(); ilit != nlit->end(); ilit++) cout << *ilit << " " ; cout << endl; } } |
For the record, I don't advocate doing this -- it's just that list_o_list_4.cpp is so unreadable it may as well be on one line.


http://www.speakers-podium.com/susangranger.
Susan Granger's review of "FOR LOVE OF THE GAME" (Universal Pictures)
It's Kevin Costner's third time at bat with a baseball movie ("Bull Durham," "Field of Dreams") and, once again, he's got a real winner in this romantic sports drama. Costner plays Billy Chapel, a aging Detroit Tigers pitching ace who's caught in a personal and professional dilemma as he pitches what may be his finest - and last - game at New York's Yankee Stadium. He's 40 years old, arm-weary and aching, and he's just discovered that the Tigers have been sold and the new owners plan to trade him. Plus, his long-time girl-friend, Kelly Preston, is about to leave him, reasoning: "You don't need me. You and the ball and the diamond - you're perfect together." As his buddy/catcher (John C. Reilly) says, "Billy, this ain't your day." During the game, as he pitches to different hitters, Billy replays - in flashback - the vignettes that led up to this pivotal moment in his 19-year career. Based on Michael Shaara's novel from which the contrived, predictable plot was lifted, Dana Stevens has written a character-driven, well-crafted, if overly serious, screenplay, and director Sam Raimi ("A Simple Plan") smoothly blends nostalgia with suspenseful action. His intricate meshing of crisp sound and intense silence is superb. Kevin Costner is heart-wrenching, imbuing Chapel with texture and intensity, giving one of the best performances of his career. Unfortunately, his pairing with Preston totally lacks chemistry - and Preston's character is frustratingly underwritten and indecisive - but young Jena Malone, as her funky daughter, is vibrant and impressive. On the Granger Movie Gauge of 1 to 10, "For Love of the Game" is a relentlessly entertaining, All-American 8. On a personal note, I'm not a baseball fan - but I was on the edge of my seat, ready to cheer out loud during the final inning.
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


|
Unity-SCORM Integration Kit
1.0
Integrate Unity3d Projects with your LMS via SCORM
|
cmi.interactions.n.X datatype More...
Public Attributes | |
| string | id |
| cmi.interactions.n.id More... | |
| InteractionType | type |
| cmi.interactions.n.type More... | |
| DateTime | timeStamp |
| cmi.interactions.n.timestamp More... | |
| float | weighting |
| cmi.interactions.n.weighting More... | |
| string | response |
| cmi.interactions.n.learner_response More... | |
| float | latency |
| cmi.interactions.n.latency More... | |
| string | description |
| cmi.interactions.n.description More... | |
| ResultType | result |
| cmi.interactions.n.result More... | |
| float | estimate |
| cmi.interactions.n.estimate More... | |
| List< LearnerInteractionObjective > | objectives |
| cmi.interactions.n.objectives.n.X More... | |
| List< LearnerInteractionCorrectResponse > | correctResponses |
| cmi.interactions.n.correct_responses.n.X More... | |
cmi.interactions.n.X datatype
| List<LearnerInteractionCorrectResponse> StudentRecord.LearnerInteractionRecord.correctResponses |
cmi.interactions.n.correct_responses.n.X
| string StudentRecord.LearnerInteractionRecord.description |
cmi.interactions.n.description
Brief informative description of the interaction. Commonly the question text.
| float StudentRecord.LearnerInteractionRecord.estimate |
cmi.interactions.n.estimate
if the result is intended to be a real number, set the result type to ResultType.estimate, and then set the float value here. When a SetValue is called to the LMS, the float value is stored.
| string StudentRecord.LearnerInteractionRecord.id |
cmi.interactions.n.id
Label for objectives associated with the interaction. You do not need to set this when creating a new LearnerInteractionRecord. The ScormManager class automatically creates a unique identifier for you.
| float StudentRecord.LearnerInteractionRecord.latency |
cmi.interactions.n.latency
Time elapsed between the time the interaction was made available to the learner for response and the time of the first response. Stored in seconds. It is converted to the ISO601 Duration format used in SCORM (see https://en.wikipedia.org/?title=ISO_8601#Durations) before being set to the LMS
| List<LearnerInteractionObjective> StudentRecord.LearnerInteractionRecord.objectives |
cmi.interactions.n.objectives.n.X
| string StudentRecord.LearnerInteractionRecord.response |
cmi.interactions.n.learner_response
Data generated when a learner responds to an interaction.
| ResultType StudentRecord.LearnerInteractionRecord.result |
cmi.interactions.n.result
Judgment of the correctness of the learner response.
| DateTime StudentRecord.LearnerInteractionRecord.timeStamp |
cmi.interactions.n.timestamp
Point in time at which the interaction was first made available to the learner for learner interaction and response. It is converted to the ISO601 Times format used in SCORM (see https://en.wikipedia.org/?title=ISO_8601#Times) before being set to the LMS
| InteractionType StudentRecord.LearnerInteractionRecord.type |
cmi.interactions.n.type
Which type of interaction is recorded.
| float StudentRecord.LearnerInteractionRecord.weighting |
cmi.interactions.n.weighting
Weight given to the interaction relative to other interactions


The world wide web is a collection of HTML documents. HTML stands for HyperText Markup Language
and is the basis for almost every webpage. Hyperlinks are links between pages making the "world wide web" weblike.
HTML is the "heart of the web" and is the text content that makes up a webpage. HTML is the language that arranges the
content found on a webpage, it allows for the webpage to reference other content on the website and allows for the website to
have links to other pages.
HTML is largely composed of elements i.e.
<.name.>content
<./name.>. An element is composed of a opening and closing
elements that tells the computer what to do with the content found in between the elements.
HTML elements are can be split into two subtypes, a) inline elements and b) block elements. Inline elements will display content
within the same line if space is avalible, while block elements segregate content into its own box and into its own line.
3)URLs
Urls are unique specifiers of the location of a webpage found within a computer network. Links contain URLs to other websites.
4) HTTPs
When the end user requests a webpage through their internet browser, the request is sent as HyperText Transfer Protocol to the server.
The server then retrieves the desired document and sends it to the browser in HTML format.


Plot the coefficient paths generated by elastic net / lasso.
Generates something similar to R pairs()
Plots a heatmap of argument val over wafer coordinates.
This method plots y predicted vs. y actual on a 45-degree chart.
Enter search terms or a module, class or function name.


Home
Tv Shows
Movies
New & Popular
List
Money Heist
Play
My List
To carry the biggest heist in history, a mysterious man called The Professor recruits a band of eight robbers who have a single characteristic: n...
NETFLIX ORIGINALS
Trending Now
Top Rated
Action Movies
Comedy Movies
Horror Movies
Horror Movies
Romance Movies
Documentaries


The Malice Striker Distortion
𓆙The Malice Striker is a RAT-and-DRV-inspired distortion pedal with a Baxandall tone stack. Schematic files can be found on my
Github.
I designed the Malice Striker primarily for the bass guitar. Filters at each buffer or amplifier stage are designed to allow lower frequencies than many other distortion pedals. There is an internal voltage doubler in the Malice Striker, which drives 5 op-amps - an input buffer, the RAT-inspired clipping amplifier, another buffer, the inverting op-amp for the tone control, and a final inverting op-amp.
Figure 1
Malice Striker v2 schematic


@* * Copyright 2023 HM Revenue & Customs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *@ @import includes.cancelLink @import uk.gov.hmrc.govukfrontend.views.html.components.{FormWithCSRF, _} @import uk.gov.hmrc.govukfrontend.views.html.components.implicits._ @import uk.gov.hmrc.tai.model.domain.income.IncomeSource @this(main: MainTemplate, form: FormWithCSRF, govukRadios: GovukRadios, govukButton: GovukButton, govukErrorSummary: GovukErrorSummary) @(payslipDeductionsForm: Form[uk.gov.hmrc.tai.forms.income.incomeCalculator.PayslipDeductionsForm], employer: IncomeSource)(implicit request: Request[_], messages: Messages, user: controllers.auth.AuthedUser) @main( pageTitle = Some(Messages("tai.currentYearSummary.heading")), title = messages("tai.payslipDeductions.heading"), authedUser = Some(user), backLinkId = "backLink", backLinkContent = Some(Messages("tai.back-link.upper")), backLinkUrl = Some(controllers.income.estimatedPay.update.routes.IncomeUpdatePayslipAmountController.payslipAmountPage().url), formForErrorSummary = Some(payslipDeductionsForm) ){


ROM::Kafka
Apache Kafka support for Ruby Object Mapper on top of poseidon driver.
Installation
Add this line to your application's Gemfile:
# Gemfile
gem "rom-kafka"
Then execute:
bundle
Or add it manually:
gem install rom-kafka
Usage
See the corresponding Guide on rom-rb.org.
Before v0.1.0
the gem is in alpha stage.
Compatibility
Compatible to ROM 2.0+, Apache Kafka 0.8+.
Tested under rubies supported by ROM.
Uses RSpec 3.0+ for testing and hexx-suit dev/test tools collection.
Contributing
- Fork the project
- Create your feature branch (
git checkout -b my-new-feature
) - Add tests for it
- Run
rubocop
andinch --pedantic
to ensure the style and inline docs are ok - Run
rake mutant
orrake exhort
to ensure 100% mutant-proof coverage - Commit your changes (
git commit -am '[UPDATE] Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request
License
See the MIT LICENSE.


please enter intials
Think you know the Shrek movies? Test your knowledge with this quiz! Answer the questions to the best of your ability. If you answer a question incorrectly, your time will decrease by 15 seconds. Click start to enter the SWAMP If you dare.
description of question
please enter intials


ARGENT SYSTEMS BUSINESS
Argent Linux Group is the romanian group which started the development of Gentoo-based distributions and as well as any technology related to them.
Our group envisions the development of linux distributions with Gentoo technology, projects called Argent Workstation and Argent Server.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Molestias, expedita, saepe, vero rerum deleniti beatae veniam harum neque nemo praesentium cum alias asperiores commodi.


|
MoveToCode
|
This class manages the 'rotating circle of dots' effect that is used as a Progress Indicator effect. More...
Public Member Functions | |
| async Task | OpenAsync () |
| Opens the progress indicator before loading begins.Method is async to allow for animation to begin before loading. More... | |
| async Task | CloseAsync () |
| Closes the progress indicator after loading is finished.Method is async to allow for animation to complete. More... | |
| async Task | AwaitTransitionAsync () |
| Returns after progress indicator completes its opening or closing transition. More... | |
| void | StopOrbs () |
Public Attributes | |
| float | rotationSpeedRawDegrees = -200f |
| float | spacingDegrees = 22f |
| float | acceleration = 1.4f |
| int | revolutions = 3 |
| bool | testStop = false |
| bool | hasAnimationFinished = false |
Properties | |
| Transform | MainTransform [get] |
| ProgressIndicatorState | State [get] |
| float | Progress [set] |
| string | Message [set] |
| Properties inherited from Microsoft.MixedReality.Toolkit.UI.IProgressIndicator | |
| Transform | MainTransform [get] |
| The progress indicator's main transform. More... | |
| ProgressIndicatorState | State [get] |
| Used to determine whether it's appropriate to use this indicator. More... | |
| string | Message [set] |
| The message to display during loading. More... | |
| float | Progress [set] |
| Loading progress value from 0 (just started) to 1 (complete) More... | |
This class manages the 'rotating circle of dots' effect that is used as a Progress Indicator effect.
| async Task Microsoft.MixedReality.Toolkit.UI.ProgressIndicatorOrbsRotator.AwaitTransitionAsync | ( | ) |
Returns after progress indicator completes its opening or closing transition.
Implements Microsoft.MixedReality.Toolkit.UI.IProgressIndicator.
| async Task Microsoft.MixedReality.Toolkit.UI.ProgressIndicatorOrbsRotator.CloseAsync | ( | ) |
Closes the progress indicator after loading is finished.Method is async to allow for animation to complete.
Implements Microsoft.MixedReality.Toolkit.UI.IProgressIndicator.
| async Task Microsoft.MixedReality.Toolkit.UI.ProgressIndicatorOrbsRotator.OpenAsync | ( | ) |
Opens the progress indicator before loading begins.Method is async to allow for animation to begin before loading.
Implements Microsoft.MixedReality.Toolkit.UI.IProgressIndicator.
| void Microsoft.MixedReality.Toolkit.UI.ProgressIndicatorOrbsRotator.StopOrbs | ( | ) |
| float Microsoft.MixedReality.Toolkit.UI.ProgressIndicatorOrbsRotator.acceleration = 1.4f |
| bool Microsoft.MixedReality.Toolkit.UI.ProgressIndicatorOrbsRotator.hasAnimationFinished = false |
| int Microsoft.MixedReality.Toolkit.UI.ProgressIndicatorOrbsRotator.revolutions = 3 |
| float Microsoft.MixedReality.Toolkit.UI.ProgressIndicatorOrbsRotator.rotationSpeedRawDegrees = -200f |
| float Microsoft.MixedReality.Toolkit.UI.ProgressIndicatorOrbsRotator.spacingDegrees = 22f |
| bool Microsoft.MixedReality.Toolkit.UI.ProgressIndicatorOrbsRotator.testStop = false |
|
get |
|
set |
|
set |
|
get |


Lorem ipsum dolor sit amet, consectetur adipiscing elit.
"Curabitur vitae libero in ipsum porttitor consequat. Aliquam et commodo lectus, nec consequat neque. Sed non accumsan urna. Phasellus sed consequat ex. Etiam eget magna laoreet, efficitur dolor consequat, tristique ligula."
COURSES
Web development, Mobile Development, iOT,APIs
COURSES
Imaging & Design, Web Design, Motion Graphics & Visual effects, Computer Animation
COURSES
User Experience design, User Research, Visual Design
COURSES
Data Science, Big Data, SQL, Data visualization
COURSES
Product Development, Business Development, Startup
COURSES
Analytics, Content Marketing, Mobile Marketing
Designer showcase of new prototype product
Research study about New York
"Curabitur vitae libero in ipsum porttitor consequat. Aliquam et commodo lectus, nec consequat neque. Sed non accumsan urna. Phasellus sed consequat ex. Etiam eget magna laoreet, efficitur dolor consequat, tristique ligula."


Issue: DISASSEMBLE-SIDE-EFFECTReferences: DISASSEMBLE (p. 439), COMPILE (p. 439)
Category: CLARIFICATION
Edit history: Version 2 by Pierson 12/30/87
Version 3 by Pierson 1/21/88
Version 4 by Pierson 6/10/88 correct VAX Lisp practice
Status: Ready For Release?
Problem description:
The definition of DISASSEMBLE says that "if the relevant function is
not a compiled function, it is first compiled.". The definition of
COMPILE says that "If name is a non-nil symbol, then the
compiled-function is installed as the global function definition of
the symbol...". Several implementations have taken this to mean that
if DISASSEMBLE is passed a symbol which has an uncompiled function
definition, then it has the side-effect of (COMPILE 'symbol).
Proposal (DISASSEMBLE-SIDE-EFFECT:DO-NOT-INSTALL):
Clarify that when DISASSEMBLE compiles a function, it will never
install the newly compiled function.
Test Cases/Examples:
(EQ (SYMBOL-FUNCTION 'F)
(PROGN (DISASSEMBLE 'F)
(SYMBOL-FUNCTION 'F)))
This code will return T if this proposal is adopted. Some current
implementations will return T, some will return NIL.
Rationale:
Several current implementations of DISASSEMBLE have surprising side
effects, especially for new users.
Current practice:
Allegro CL installs the compiled definition. Lucid, Symbolics, Xerox,
VAX Lisp, and KCL don't install it.
Cost to Implementors:
Some implementations will have to make a simple change.
Cost to Users:
Very little. DISASSEMBLE is really part of the environment and is
probably not called by much, if any user code.
Cost of non-Adoption:
DISASSEMBLE will continue to surprise less experienced users.
Benefits:
DISASSEMBLE will become the predictable debugging function it was
meant to be.
Aesthetics:
Some who worried that DISASSEMBLE was supposed to install the compiled
function may find that the language has become a little cleaner.
Discussion:
DISASSEMBLE is an environment feature; some question has been raised
as to the place and force of environment features in the standard.
However, this proposal stands if DISASSEMBLE is part of the standard
language.


CH. Staghorn's Jimmy Hollywood (Jimmy)
(Staghorn's Black Plaid X BISS AM GR/CAN CH Ghoststone's Otterly
Fantastic Hollywood Kid JH RN CGC TDI WCI)
D.O.B. October 31, 2013
OFA Hips Excellent, Elbows Normal, Cerf Clear,
EIC Clear,
Optigen Clear
Our lovely yellow boy has matured nicely, just a great speciman of a Labrador. A proven sire to champion get, he's producing extremely nicely and many Breeders are very happy with their litters from him and returning to use him again. A lot like his uncle Stewie, Jim is a joy to live with, soft mouthed, happy, happy happy!


Footage Shows Crackdown On Iranian Protests
by APAP released undated footage from protests in Iran on November 24. The videos were shot by anonymous Internet users. Protesters in Shiraz were seen running away from heavy gunfire. In Kerman, security forces on motorbikes were seen chasing protesters. In Kermanshah, men in plainclothes -- some armed with batons -- were seen dragging a man away.


| DOSE: |
240 mg |
oral |
DXM |
(pill / tablet) |
| |
32 ug |
oral |
Chlorpheniramine Maleate |
(pill / tablet) |
All right, I have done a lot of researching on the internet about DXM and stuff, so one night I decided to go down to our fry's and get some. I had done Robitussin and stuff before, but I couldn't handle the taste. I remembered somewhere it said one of the products was really bad for you but I couldn't remember; I thought it was the Contac cold tabs. So I got the Coricidin cause it had 30 mg of DXM in it. So I wait till 12 and pop 8 of them. I figure since I've had doses of about 200 mg of DXM before that this would just be like a tipsy, fun experience. I was wrong.
It didn't start to kick in till about 2 in the morning. I started to lose concentration while on the computer. I couldn't focus on anything for a long period of time. Then I went to go get a drink of water, and when I got up it still felt like I was sitting down. When I walked down the hall everything around me was just one big blur except for the object I was looking at ahead of me. So right now I'm thinking, ‘Hell yeah, this is pretty cool.’
Eventually the trip was beginning to get more and more intense. Suddenly my heart beat jumps up to twice it's rate, and my breathing is so heavy. Right there I thought I was gonna die. I tried to calm down by listening to some light music, but that only helped for a couple minutes. I needed to go to the bathroom really bad so I got up, and I still felt like I was sitting down. I walked to the bathroom, and I almost passed out. Everything got really fuzzy, and when I was standing, I heard this loud POP! I didn't know what it was. It sounded real, but it sounded fake. I kept hearing these metallic sounds, and by now I was freaked out. So I went back to the computer and was telling my friends how freaked out this was. By now I was at the peak of my trip and it was about 4 in the morning. I eventually calmed down a little bit, and thought I could sleep. So I told my friend I was all right, and I went to bed. I kept waking up, and then my room started to shake, and my mind was going insane.
I said I can't handle this and got back on the computer. My friend was still on, and I asked him how long I was asleep for. He said 5 minutes. I was like what the hell! Now I couldn't even move thinking that if I did, it would mess with something in my body and I would die.  My room is really dark because I put aluminum foil over the windows to keep it cool, so at 5 AM I decided I would go out and get some water even though I thought I would die because I would pass out and stop breathing. So when I went out of my room it was light out, and that all of a sudden made me calm. Like I was out of a bad dream. My heart still hurt but I made it to bed. It's 3 days after I did that and my heart still hurts, and it hurts when I take big breaths.
My advice to anyone is don't mess with Coricidin. DXM is fine in other forms, just don't go crazy with it. It seriously isn't worth it at all. The whole time I wasn't enjoying my high at all. I was worrying if I was gonna die. I hope that my body isn't really messed up because of that. I've read all the bad trips about the Coricidin before I did this, and I thought, ‘Oh, their body just reacted bad.’ Everybody that I've known that has done that brand has the same story. My one friend thought he was dead. Stick to Robitussin and Vicks or whatever. DON'T DO CORICIDIN.
Thanks. Be safe and have fun.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


There are people who make things happen, there are people who watch things happen, and there are people who wonder what happened. To be successful, you need to be a person who makes things happen.
Keep your feet on the ground, but let your heart soar as high as it will. Refuse to be average or to surrender to the chill of your spiritual environment.
 That's what your soul was put on this Earth to be. Find that truth, live that truth and everything else will come.


Microsoft brings skype on TV
Get all the family together on your big screen – no matter what device they’re using Skype on.
See more with a wide-angle, HD view** – no more crowding around the computer.
Share life’s special moments and have regular catch-ups with friends and family.


Javascript First-letter Mystery
I was working on producing something that had to look like this:
I though I’d be clever and avoid having to wrap the ! in a span by using the pseudo-element first-letter to grab that initial exclamation point. first-element selects the first letter of the block it used
on. Sounds perfect, right? Well, when I tried it I got:
This was not at all what I wanted! It looked not only odd but clearly wrong - first doesn’t mean first and second! I tried playing with spacing and a few other things, and finally produced the following jsfiddle to simply illustrate the problem:
With the jsfiddle at hand, I tweeted my confusion:
In moments, I received a dual barrage of twitter responses: half reponding in amazement/surprise, and half with the actual specification of first-letter and the reason for what I was seeing.
It turns out that, though odd, the behavior I was seesing was reasonably to spec. “Punctuation (i.e, characters defined in Unicode in the “open” (Ps), “close” (Pe), “initial” (Pi). “final” (Pf) and “other” (Po) punctuation classes), that precedes or follows the first letter should be included.”[1] It really is less obvious then I’d thought: see https://developer.mozilla.org/En/CSS/::first-letter for a whole discussion of first-letter subtleties: But browsers must be a little confused too: they all act a little bit different in this situation:
Chrome
(Note the blue ! and O)
Firefox
(Note that neither the ! or O are blue)
IE something
(Note that the ! is blue, but the O is not - what I actually wanted!)
Opera
(Interestingly, Opera matches IE here.)
In summary, I’ve learned that css is a little weirder than I had thought, and when they say letter, they really mean letter. Mostly. Sorta.


Create new or update activity
Name
Price
Duration (h)
Website
Street name
Number
Postal code
City
Description
Choose categories
Sport
Culture
Cuisine
Music
History
Nightlife
Shopping
Relaxation
Adventure
Family


Alternative Table Shows How Premier League Would Look This Season Without VAR
by Robbie CopelandVAR hasn't been particularly well-received in the Premier League to say the least, but at the top of the league, it seems it isn't having as much of an impact as you would think.
That's according to an alternative Premier League table, anyway, which calculates the hypothetical points totals across the division's 240 games so far this season - taking the technology out of the picture.
Liverpool have been labelled LiVARpool by social media's resident banter-merchants, an homage to the apparent favourable treatment they've received from the officials in the VAR room. The algorithm, however - as devised by Paddy Power Games - predicts that their 34-point total would remain unchanged.
Their lead over Manchester City would be cut to just seven points, however, since City would be two points better off if the technology wasn't in play - so perhaps the Cityzens do have a case against it after all.
In this alternative universe, Chelsea and Leicester continue to make up the remainder of the top four, but with four points between them - since Chelsea would be a point better off, while the Foxes would lose four.
Leicester's -4 point swing is the largest recorded, although Everton would move up as many as six places into ninth, with the single point that VAR has allegedly cost them so far.
Spurs would be facing a relegation battle meanwhile, two points worse off than they are now in 16th, while Crystal Palace drop five places into 17th, just behind them.
The only teams unmoved outside of the current top four are Sheffield United, who have been done out of as many as three points, and Watford, who would be no better or worse off.
Below is the entire table, if that's your sort of thing.
| Position | Team | Points | Points Change | Position Change |
| 1 | Liverpool | 34 | 0 | 0 |
| 2 | Manchester City | 27 | +2 | +2 |
| 3 | Chelsea | 27 | +1 | 0 |
| 4 | Leicester | 23 | -4 | -2 |
| 5 | Sheffield United | 20 | +3 | 0 |
| 6 | Wolves | 18 | +2 | +2 |
| 7 | Arsenal | 16 | +1 | -1 |
| 8 | Manchester United | 17 | -1 | -1 |
| 9 | Everton | 15 | +1 | +6 |
| 10 | Bournemouth | 15 | +1 | -1 |
| 11 | Burnley | 15 | 0 | -1 |
| 12 | Newcastle | 15 | 0 | +1 |
| 13 | West Ham | 15 | +2 | +3 |
| 14 | Brighton | 15 | 0 | -3 |
| 15 | Aston Villa | 13 | +2 | +2 |
| 16 | Tottenham | 12 | -2 | -2 |
| 17 | Crystal Palace | 12 | -3 | -5 |
| 18 | Watford | 8 | 0 | 0 |
| 19 | Norwich | 7 | +2 | +1 |
| 20 | Southampton | 5 | -3 | -1 |
For more from Robbie Copeland, follow him on Twitter!


MediCure
AI
Dashboard
Donor
Doctor Appointment
First Aid
Deep Scan
Symptoms
Symptoms
Medicure BMI
Username
Profile
Logout
Body Mass Index Calculator
Enter your height:
metres
inches
Enter your weight:
kilograms
pounds
Your BMI is:
______
This means you are:
_____
Ready to Leave?
×
Select "Logout" below if you are ready to end your current session.


About Me
Hello! I'm Shobhit Sharma, a software developer with 5 years of experience specializing in the backend development. I have worked at a few startups the recent most being Coverfox where I worked on major development of the retail product, CRM, marketing and analytics for the organization.
Until recently, I led the tech team for Coverfox, a fintech startup focused on providing the technological solutions to the insurance process. At Coverfox I was focused on developing the product for the organization. Before this I worked at Wisecells LLP, a SaSS based B2B e-learning platform.


|
QuantLib: a free/open-source library for quantitative finance
Fully annotated sources - version 1.30
|
#include <ql/experimental/processes/klugeextouprocess.hpp>
Public Member Functions | |
| KlugeExtOUProcess (Real rho, ext::shared_ptr< ExtOUWithJumpsProcess > kluge, ext::shared_ptr< ExtendedOrnsteinUhlenbeckProcess > extOU) | |
| Size | size () const override |
| returns the number of dimensions of the stochastic process More... | |
| Size | factors () const override |
| returns the number of independent factors of the process More... | |
| Array | initialValues () const override |
| returns the initial values of the state variables More... | |
| Array | drift (Time t, const Array &x) const override |
| returns the drift part of the equation, i.e., \( \mu(t, \mathrm{x}_t) \) More... | |
| Matrix | diffusion (Time t, const Array &x) const override |
| returns the diffusion part of the equation, i.e. \( \sigma(t, \mathrm{x}_t) \) More... | |
| Array | evolve (Time t0, const Array &x0, Time dt, const Array &dw) const override |
| ext::shared_ptr< ExtOUWithJumpsProcess > | getKlugeProcess () const |
| ext::shared_ptr< ExtendedOrnsteinUhlenbeckProcess > | getExtOUProcess () const |
| Real | rho () const |
| Public Member Functions inherited from StochasticProcess | |
| ~StochasticProcess () override=default | |
| virtual Array | expectation (Time t0, const Array &x0, Time dt) const |
| virtual Matrix | stdDeviation (Time t0, const Array &x0, Time dt) const |
| virtual Matrix | covariance (Time t0, const Array &x0, Time dt) const |
| virtual Array | apply (const Array &x0, const Array &dx) const |
| virtual Time | time (const Date &) const |
| void | update () override |
| Public Member Functions inherited from Observer | |
| Observer ()=default | |
| Observer (const Observer &) | |
| Observer & | operator= (const Observer &) |
| virtual | ~Observer () |
| std::pair< iterator, bool > | registerWith (const ext::shared_ptr< Observable > &) |
| void | registerWithObservables (const ext::shared_ptr< Observer > &) |
| Size | unregisterWith (const ext::shared_ptr< Observable > &) |
| void | unregisterWithAll () |
| virtual void | update ()=0 |
| virtual void | deepUpdate () |
| Public Member Functions inherited from Observable | |
| Observable () | |
| Observable (const Observable &) | |
| Observable & | operator= (const Observable &) |
| virtual | ~Observable ()=default |
| void | notifyObservers () |
Private Attributes | |
| const Real | rho_ |
| const Real | sqrtMRho_ |
| const ext::shared_ptr< ExtOUWithJumpsProcess > | klugeProcess_ |
| const ext::shared_ptr< ExtendedOrnsteinUhlenbeckProcess > | ouProcess_ |
Additional Inherited Members | |
| Public Types inherited from Observer | |
| typedef set_type::iterator | iterator |
| Protected Member Functions inherited from StochasticProcess | |
| StochasticProcess ()=default | |
| StochasticProcess (ext::shared_ptr< discretization >) | |
| Protected Attributes inherited from StochasticProcess | |
| ext::shared_ptr< discretization > | discretization_ |
This class describes a correlated Kluge - extended Ornstein-Uhlenbeck process governed by
\[ \begin{array}{rcl} P_t &=& \exp(p_t + X_t + Y_t) \\ dX_t &=& -\alpha X_tdt + \sigma_x dW_t^x \\ dY_t &=& -\beta Y_{t-}dt + J_tdN_t \\ \omega(J) &=& \eta e^{-\eta J} \\ G_t &=& \exp(g_t + U_t) \\ dU_t &=& -\kappa U_tdt + \sigma_udW_t^u \\ \rho &=& \mathrm{corr} (dW_t^x, dW_t^u) \end{array} \]
References: B. Hambly, S. Howison, T. Kluge, Modelling spikes and pricing swing options in electricity markets, http://people.maths.ox.ac.uk/hambly/PDF/Papers/elec.pdf
Definition at line 56 of file klugeextouprocess.hpp.
| KlugeExtOUProcess | ( | Real | rho, |
| ext::shared_ptr< ExtOUWithJumpsProcess > | kluge, | ||
| ext::shared_ptr< ExtendedOrnsteinUhlenbeckProcess > | extOU | ||
| ) |
Definition at line 28 of file klugeextouprocess.cpp.
|
overridevirtual |
returns the number of dimensions of the stochastic process
Implements StochasticProcess.
Definition at line 38 of file klugeextouprocess.cpp.
|
overridevirtual |
returns the number of independent factors of the process
Reimplemented from StochasticProcess.
Definition at line 42 of file klugeextouprocess.cpp.
|
overridevirtual |
returns the initial values of the state variables
Implements StochasticProcess.
Definition at line 46 of file klugeextouprocess.cpp.
returns the drift part of the equation, i.e., \( \mu(t, \mathrm{x}_t) \)
Implements StochasticProcess.
Definition at line 55 of file klugeextouprocess.cpp.
returns the diffusion part of the equation, i.e. \( \sigma(t, \mathrm{x}_t) \)
Implements StochasticProcess.
Definition at line 64 of file klugeextouprocess.cpp.
returns the asset value after a time interval \( \Delta t \) according to the given discretization. By default, it returns
\[ E(\mathrm{x}_0,t_0,\Delta t) + S(\mathrm{x}_0,t_0,\Delta t) \cdot \Delta \mathrm{w} \]
where \( E \) is the expectation and \( S \) the standard deviation.
Reimplemented from StochasticProcess.
Definition at line 76 of file klugeextouprocess.cpp.
| ext::shared_ptr< ExtOUWithJumpsProcess > getKlugeProcess | ( | ) | const |
Definition at line 90 of file klugeextouprocess.cpp.
| ext::shared_ptr< ExtendedOrnsteinUhlenbeckProcess > getExtOUProcess | ( | ) | const |
Definition at line 94 of file klugeextouprocess.cpp.
| Real rho | ( | ) | const |
Definition at line 98 of file klugeextouprocess.cpp.
|
private |
Definition at line 76 of file klugeextouprocess.hpp.
|
private |
Definition at line 76 of file klugeextouprocess.hpp.
|
private |
Definition at line 77 of file klugeextouprocess.hpp.
|
private |
Definition at line 78 of file klugeextouprocess.hpp.


October 11-14, 2017
Raleigh, North Carolina, USA
September 4-7, 2016
Cambridge, UK
October 18-22, 2015
Atlanta, Georgia, USA
July 28 - August 1, 2014
Melbourne, Australia
September 15-19, 2013
San Jose, California, USA
September 30 - October 4, 2012
Innsbruck, Austria
September 18-22, 2011
Pittsburgh, Pennsylvania, USA
September 21-25, 2010
Leganés, Comunidad de Madrid, Spain
September 20-24, 2009
Corvallis, Oregon, USA
September 20-24, 2008
Herrsching am Ammersee, Germany
September 4-8, 2007
Coeur d’Alène, Idaho, USA
September 4-8, 2006
Brighton, United Kingdom
September 20-24, 2005
* Dallas, Texas, USA
September 26-29, 2004
Rome, Italy
October 28-31, 2003
* Auckland, New Zealand
September 2-6, 2001
Arlington, Virginia, USA
September 5-8, 2001
Stresa, Italy
September 10-14, 2000
Seattle, Washington, USA


I do believe in magic.
The only difference is mine happens on a LED screen.
Self-motivated fresher seeking for an opportunity to work in a challenging environment and achieve my career goals. Challenge excites me.
Get Started!Full Stack, Android, iOS
Data Structures, Database Management
Data Science, Cryptography
Blockchain, Drones
Call me in for collaborations. Let's build something together...


We buy networks!
- visualize web-enabled synergies
- implement granular markets
- empower real-time ROI
- envisioneer proactive initiatives
- scale virtual e-services
- evolve dot-com systems
- optimize B2B communities
- benchmark viral e-business
- recontextualize global architectures
- strategize efficient infrastructures
- transform vertical action-items
- extend dot-com eyeballs