Google Search Appliance software version 6.0+
Connector software version 2.0+
Posted August 2010
This document is for Google Search Appliance administrators who want to set up and manage the Google Enterprise Connector for SalesForce. As prerequsites, the reader my want to familiarize themselves with the following documents:
This document gives an overview of how connectors work and describes the configuration steps common to all the connectors.
This document describes SalesForce API thats used to retrieve arbitrary data from SalesForce. Of particular importance is the Query Language and Object Relationships described in this document.
These pages describe connector independent configuration parameters available in the Connector Administration pages of the admin console.
This document is for SalesForce Server administrators and administrators who install and configure the Google Search Appliance. If you are working with the Google Enterprise Connector for SalesForce and you are not familiar with SalesForce, work closely with a SalesForce system administrator to determine the correct values for installing and configuring the connector.
The Google Enterprise Connector for SalesForce
enables the Google Search Appliance to
traverse documents/objects in SalesForce. Instances of the connector
fetch data directly from SalesForce via the SOAP API ( http://wiki.developerforce.com/index.php/Web_Services_API#API)
and transforms it into content feeds for the Google Search Appliance.
This connector is supported on the following SalesForce versions:
The Google Enterprise Connector for SalesForce is supported on the same operating systems as the Connector Manager 1.3.2 and 2.0
http://code.google.com/p/google-enterprise-connector-manager/
The SalesForce connector uses the SalesForce WebService APIs to construct object summary documents. Data is retrieved from SalesForce using its proprietory Query language over the WebService APIs. Once the connector has data describing a SalesForce object in its entireity, it will transform it into a content feed for the connector-manager (an ultimately the GSA).
When you configure a SalesForce connector, you provide a SOQL query describing the main object and its related objects
which will retrieve the data.
http://www.salesforce.com/us/developer/docs/api/Content/sforce_api_calls_soql.htm
The SOQL query must already have all the Parent-Child relationships defined in Salesforce such that all the data required is available in the Query response stream. The connector does not support nested queries so all the objects and related data must be available through one SQL statement.
Once the data describing a SalesForce object is retrieved, it will get transformed into a content feed with meta-data and a single-page HTML representation of the of the query object.
For example, if a connector is just supposed to index the CaseNumber and Description fields then the SOQL query could be like:
The SOAP query response would be an XML resultset of the data requested and this XML is transformed into a feed XML by a user-provided XSLT. The connector feed then gets indexed by the GSA and served. After indexing, the user can search for a case number or keywords in the description field on the GSA. The URL Link the result could point directly to the Case URL in SalesForce (because the ID field itself defines the object URL in SalesForce) while the cached copy on the GSA would represent the summary of object.
The SalesForce connector can retrieve any object and all its related data if its available as fields in one Query. That is, if the connector is to index Case or Account objects, all the fields associated with that object that needs to be searchable needs to be available via one query. The connector cannot use the resultset from one query to iteratively submit another one to retrive all the data.
As in the example from the previous section, if a Case object is unrelated to some other object, a single query for the connector could not retrieve field values from the unrelated field. The SalesForce administrator must define parent-child/child-parent and other relationships such that one query can be used to retrieve all the data that needs to get indexed. A query like the following would demonstrate the parent/child and child/parent relationships which can get defined to retrieve the needed data in one query:
The above query uses a defined parent-child relationship to retrieve the CommentBody field on the CaseComment object thats associated with the Case object.
The follwoing link describe generating the relationship objects in SalesForce: http://www.salesforce.com/us/developer/docs/api/Content/sforce_api_calls_soql_relationships.htm
The two sections that follow describe how security is supported during the serve process and during the traversal and indexing processes.
At crawl time, the username/password the Connector uses to acquire data from salesforce must have atleast read access to all the fields requested in the select query to get the data.
Each time the Quartz scheduler gets invoked, the connector logs into SalesForce and acquires a new sessionID to do that traversal set.
At serve time, the Google Search Appliance supports document-level authorization for each search user such that only those documents a given user can view normally in SalesForce gets shown in the GSA results.
A connector fed document will get classified as public or secure by setting the PROPNAME_ISPUBLIC field in the Response XSLT . After a document is indexed, the secure/public flag will remain in that state until the document is reindexed with a new SPI parameter.
The salesforce connector supports various mechanisms to verify a users identity and authorize documents:
If a document is marked secure, when a user performs a secure search on the GSA, the user is prompted to enter the username/password for SalesForce. The connector connects to SalesForce and attempts to login with the provided username and passowrd. Upon successful login, the sessionID for the user is used by the Connector to create an authorization query to determine if the documents matching the query response are visible to the user.
The connectormanager will ask SalesForce to see if a set of documents (doc1, doc2, doc3...doc10) is visible to the user given the session he/she has with SalesForce. At that time, the connector submits an authorization query such as select c.ID, c.Number, c.Description from case c where case.ID in (doc1, doc2, doc3...doc10). If a user is not allowed to see a document, the authorziation query will not return that document in the reply and consequently will not get authorized for viewing.
The authorization query could select arbitrary data and the authroized document set needs to get processed by the connector in a generic way. To achieve this, the configurable authorizaiton query needs to get coupled with an XSLT which transform the arbitrary SOAP response into a canonical/processable XML form the connector can understand.
The full flow for the Authorization process would be:
NOTE: In Salesforce, the doucment ID is unique and is considered to be the primary key embedded in the URL. That is, no matter what query is used the 'ID' field must be retrieved (eg select case.ID from... or select account.ID from ...) and used as the docID in the XLST.
The Default Authentication/Authorization modules are loaded and used automatically if the startup JVM arguments to override them are not used.
User-defined modules allows customers to create custom classes the salesforce connector will use for authentication and authorization. That is, the a customer can write a java class which the connector can delegate authentication and authorization to. Once the custom classes are written and Tomcat is started with the correct settings, when the connector is asked to authenticate a user or authorize a document collection, the custom class will get loaded by the connector and delegate authentication and/or authorization.
Custom Authentication modules must implement the com.google.enterprise.connector.salesforce.security.IAuthenticationModule
Interface. The GSA will forward
the username and password to this custom class implementation.
Custom Authorization modules must implement the com.google.enterprise.connector.salesforce.security.IAuthorizationModule
Interface. The GSA will forward
the username and a list of documents to authorize to this custom class implementation.
The salesforce connector comes built-in with two custom/loadable modules as examples: PermissiveAuthentication and PermissiveAuthorization. These two class implementations are in the com.google.enterprise.connector.salesforce.security module and will authentication and authorize any user and document.
Once the customer authentication or authorization class is written, it should get placed inside the connector-manager/WEB-INF/lib folder or directly complied into the salesforce connector. Placing the compiled custom class into the WEB-INF/lib folders allows the JVM classloader to find the custom class.
Finally, Tomcat must get started with startup arguments specifying the which custom class to load per instance. For example, if a connector instnace name is myinstance, the
following CATALINA_OPTS
settings will load and enable these the built-in Permissive modules (modules that authenticate all users and authorize all documents):
CATALINA_OPTS="-DAUmodule_myinstance=com.google.enterprise.connector.salesforce.security.PermissiveAuthentication"
CATALINA_OPTS="-DAZmodule_myinstance=com.google.enterprise.connector.salesforce.security.PermissiveAuthorization"
The SalesForce connector basically runs two independent threads of operation: the connector-manager traversal checkpoint and the SalesForce Connector Quartz scheduler. These two independent processes all runs within the connector-manager and connector and together feeds documents into the GSA. The connector-manager thread constantly polls the connector for new document sets (response batches) that got downloaded from SalesForce after checkpoint state date. The state file for the connector which describe the last batch it read can be found at /WEB-INF/connectors/salesforce-connector/connectorname/connectorname_state.txt
The Quartz scheduler thread is basically a cron scheduled job which gets invoked periodically. Once invoked,
the connector will login to salesforce and attempt to retrieve all the documents that has changed after the last time the quartz scheduler ran. So if the quartz scheduler
runs and finds a set of documents, it will write them to the store (a file) and later on a separate thread, the connector-manager will read the store (file),
transform it and use that as a feed into the GSA.
http://www.opensymphony.com/quartz/
ConnectorManager Thread:
Quartz Thread:
Both ConnectorManager and Quartz Threads:
The SOAP response XML documents downloaded from SalesForce by the Quartz Thread can be stored in several different ways. The StoreTypes are configurable per connector and are used to optionally save the documents for later use by another GSA or for failure recovery.
The various StoreTypes available:
One consequence of using the FileStore (if mounted on NFS or SAN) and JDBCStore is that a group of GSA's can share the same store data. That is, if a cluster of 3 GSA's all need to serve the same SalesForce Data, one GSA's quartz can run and write data to a shared filesystem. The other two GSAs can read the sharedfiles and process them as they arrive. Effectively, all three GSAs are in sync but only one GSA actually ever traverses SalesForce (the quartz on the other two are disabled).
The DBStore also provides clustering and high availability in some respects with Quartz. If the connector detects a DBStore, in addition to creating the connector instance tables, Quartz clustering tables are also generated. This means the JobStore for quartz (scheduling, etc) is saved to a database. If two separate GSAs share the same database and have the same connector instance name, they will share the same JobStore and quartz will loadbalance and perform automatic failover of triggers. Its imperative that both GSA's use different connector managers (both pointing to the same database) and that the connector instance names configured on them are identical (the xslt can be different but the connector name must be the same). If one connector-manager is offline, Quartz will schedule jobs on the remaining one. If both are up, the quartz triggers will loadbalance and fire only on one. Since the connector instance database is the same both GSA's will be implicitly in sync.
Additional documentation about Quartz clustering can be found here.
If two or more connector-managers are utilizing Quartz Clustering, both connector-managers must use the same java user.timezone
setting if the connector managers run in different zones.
Tomcat setting to specify the timezone on startup is (for example) CATALINA_OPTS="-Duser.timezone=America/Los_Angeles"
.
Finally, the data that is stored in the StoreTypes is the raw SOAP response which means a GSA reading the store can transform it with any stylesheet. For example, if two GSAs are running
whereby one is for a company's Engineering department and the other is for HR, the two GSAs can index and show different cached copies to each group. The data in the StoreType
is the same but the XSLT to feed it to the connector-manager could be different: the engineering look+feel could be different and even include the GSA-specific googleon/googleoff
tags
(http://code.google.com/apis/searchappliance/documentation/46/admin_crawl/Preparing.html#pagepart)
This section describes the installation prerequisites and installation process for the Google Enterprise Connector for SalesForce
To install the connector manually on Apache Tomcat, follow the instructions given below:
The distribution salesforce connector is compiled with 1.6 compatilbity. To compile against any other newer version, edit the build.xml javac target and rebuild locally.
This section describes tasks you must perform on the Google Search Appliance Admin Console to configure the connector and the crawl patterns required by the connector. A sample screenshot of the GSA configuration is shown here.
Ensure that you complete all of the tasks described in the following sections:
The first step in using the SalesForce connector is to run the APEX Explorer to derive the Query for the connector.
To run the TestClient and just get the XML returned, edit the sample init.properties
file downloaded from the SalesForce Connector webiste (link) and run the
following in the folder where you downloaded: (replace ':' with ';' for Windows and use SUN java 6+)
java -cp .:salesforceconnector-(version)-all.jar com.google.enterprise.connector.salesforce.TestUtility init.properties
The raw SOAP response (and transform, if specified) will get created per cursor in timestamp-based folders in the current directory.
You may have to reset and append a new SecurityToken if the TestClient is run from an IP that isn't trusted by SalesForce. A new token can be acquired by logging into
SalesForce and navigating to "Setup-->My Personal Information-->Reset Security Token". The new token will get emailed to the address associated with the account.
The new password for the TestClient will be the combination of the oldpassword and new security token together.
<!ELEMENT content ( #PCDATA ) > <!ATTLIST content encoding (none|base64|base64binary) "none" #IMPLIED > <!ELEMENT document ( spiheaders, metadata, content ) > <!ELEMENT documents ( document+ ) > <!ELEMENT meta ( #PCDATA ) > <!ATTLIST meta name NMTOKEN #REQUIRED > <!ELEMENT metadata ( meta+ ) > <!ELEMENT spiheader ( #PCDATA ) > <!ATTLIST spiheader name NMTOKEN #REQUIRED > <!ELEMENT spiheaders ( spiheader+ ) >
For example:
<documents>
<document>
<spiheaders>
<spiheader name="DEFAULT_MIMETYPE">text/html</spiheader>
<spiheader name="PROPNAME_ACTION">add</spiheader>
<spiheader name="PROPNAME_CONTENTURL">https://cs2.salesforce.com/5003300005jZ8uAAE</spiheader>
<spiheader name="PROPNAME_DISPLAYURL">https://cs2.salesforce.com/50033000005jZ8uAAE</spiheader>
<spiheader name="PROPNAME_DOCID">500330000005jZ8uAAE</spiheader>
<spiheader name="PROPNAME_ISPUBLIC">true</spiheader>
<spiheader name="PROPNAME_LASTMODIFIED">2009-04-21T00:25:11.000Z</spiheader>
<spiheader name="PROPNAME_MIMETYPE">text/html</spiheader>
<spiheader name="PROPNAME_SEARCHURL"/>
<spiheader name="PROPNAME_SECURITYTOKEN"/>
</spiheaders>
<metadata>
<meta name="METANAME1">METAVALUE1</meta>
<meta name="METANAME2">METAVALUE2</meta>
<meta name="METANAME3">METAVALUE3</meta>
<meta name="METANAME4">METAVALUE4</meta>
</metadata>
<content encoding="none"><![CDATA[
<html>
<title>Title of the doc</title>
<body>
document text here
</body>
</html> ]]></content>
</document>
...
<document>
...
...
</document>
</documents>
Then run the TextClient against the XSLT created:
java -cp .:salesforceconnector.jar com.google.enterprise.connector.salesforce.TestUtility init.properties XLSTFile.xsl
The query+transform result should show up in the log file and console and should comply with the DTD for the connector-manager.
The following link describes the SPI constants and what they do in the connector:
http://code.google.com/apis/searchappliance/documentation/connectors/110/connector_dev/cdg_traversing.html#SpiConstants
The meta-tags can be any name-value pair that the GSA could make searchable as meta-tag values.
http://code.google.com/apis/searchappliance/documentation/60/xml_reference.html#request_meta
The content the the HTML form of the object that will be searchable and displayed as the cache: copy in the results.
Finally, if there are sections of the Response XML the administrator wishes to suppress from feeding into a particular GSA, the admin could add on the Google Search Appliance
specific 'google-on/google-off' tags. This could be done to suppress/not index seleted sections of a response document (see section above regarding different GSAs serving
results to different groups)
See: http://code.google.com/apis/searchappliance/documentation/60/admin_crawl/Preparing.html#pagepart
Use the instructions in Administering Connectors to register the newly-installed connector manager on the Admin Console.
Enter the username the salesforce connector will use to login to SalesForce and download the required data. This user must have access to all the objects and related objects specified in the crawl query.
Enter the password the salesforce connector will use to login to SalesForce and download the required data. If the connector is going to run from an untrusted IP range, its possible SalesForce will reject the login attempt unless the latest SecurityToken is sent in. The SecurityToken can get reset by Logging into SalesForce as the connector user and navigating to "Setup-->My Personal Information-->Reset Security Token".
This parameter sets (and displays) the last time the Quartz Thread ran. When a connector is first created, this field will be blank and could be set to any previous date in numeric format: eg: theis param can be set to:<PHONE_NUMBER>0405 (Jan 2st 2000 3:04:05am)
This parameter can get reset at anytime to force the connector to recrawl of SalesForce data that changed since the entered date.
This parameter specifies the Login server to use for SalesForce. The loginServers are different depending on if the production or sandbox enviornments and API version thats used.
http://www.salesforce.com/us/developer/docs/api/Content/implementation_considerations.htm
sandbox API 10: https://test.salesforce.com/services/Soap/c/10.0
production API 10: https://www.salesforce.com/services/Soap/c/10.0
sandbox API 17: https://test.salesforce.com/services/Soap/c/17.0
production API 17: https://www.salesforce.com/services/Soap/c/17.0
This parameter specifies the cron Schedule the Quartz Scheduler should run as. For example, the following will run qurartz every :15 and :45 past the hour, every hour: 0 15,45 * ? * *
http://www.opensymphony.com/quartz/api/org/quartz/CronTrigger.html
This parameter quite critical to the operation of the connector. It defines what data to retrieve from SalesForce and feeds that into the XLST transform for the connector.
The Query should be derived from the APEX explorer and must include all the data to index in the response. Working with the previous example, if you want to index
the Case information in Saleforce, the following query would return it select c.ID, c.CaseNumber, c.Description from Case c LIMIT 100. That one query
should return the associated records and data that the connector should index. If the requirement is to index the assoicated Acccount for that Case, the query must get
altered to add on Account information.
As described in the Objects that are Included section, you may have to define Parent-Child or Child-Parent relationships between object such that
a single query will retrieve all the assoicated data that needs to get indexed.
Note: in SaleForce, the 'ID' field is unique and part of the URL field pointing directly to the object itself. For example, in select c.ID, c.CaseNumber, c.Description from Case c LIMIT 100 suppose c.ID field is<PHONE_NUMBER>jZ8uAAE and the SalesForce URL is https://cs2.salesforce.com, then the URL https://cs2.salesforce.com/5003300005jZ8uAAE will give direct access to the object. The object ID parameter is required and should always get selected as "PROPNAME_DOCID" SPI parameter (the primary document ID for the feed).
Finally, connector uses a reserved parameter in the query called $LAST_SYNC_DATE which will always return the last time the Quartz scheduler invoked a crawl in SalesForce.
For example, if the LastSync parameter is set to<PHONE_NUMBER>0405 and the following query is run at June 8th 2009, 7:22pm:
select ID,CaseNumber, Description from case where LastModifiedDate>$LAST_SYNC_DATE LIMIT 100
then the effective query becomes
select ID,CaseNumber, Description from case where LastModifiedDate>2000-01-02T03:04:05Z LIMIT 100
The connector will save the LAST_SYNC_TIME property to file with an updated value of<PHONE_NUMBER>220000.
The next time the quartz scheduler is
run, the new query will be:
select ID,CaseNumber, Description from case where LastModifiedDate>2009-06-08T18:22:00Z LIMIT 100
It is strongly recommended adding in this reserved wildcard in the final query for the connector configuration. The use of this reserved term will minimize recrawling of content that hasn't changed in SalesForce. The SPI header for th eprimary docID is PROPNAME_DOCID. See Response XSLT section below for documentation on the various SPI parameters
This parameter defines the BASE54 Encoded form of the XST used to transform the SOAP response from SalesForce into the documentList format that the Connector-Manager can process. The XLST here can get generated using any tool the user is familiar with as long as it complies with the DTD for the connector manager expects. The previous section on TestClient describes how the TestClient can run a query and transform the results given an XSLT. Instead of running the TestClient repeatedly to refine the XSLT, the expectation is the user can copy-paste the SOAP response and use an XSLT editor to finalize the transform
If the data that the connector instance is transmitting to the GSA is an encoded binary (eg PDF, .doc, .ppt, etc), set
the attribute for the
Once the XSLT is finalized, the entire XSLT needs to get Base64 encoded (without linebreaks) and then entered into the connector configuration screen. The following link proves Base64 transforms without linebreaks http://base64-encoder-online.waraxe.us/
The SPI values defines for the DOCID and DISPLAY/URL should include the primay key identfying the object in SalesForce (eg. case.ID or account.ID:
http://code.google.com/apis/searchappliance/documentation/connectors/110/connector_dev/cdg_traversing.html#SpiConstants
A sample XLST for the Response transform is referenced at the end of this article. It demonstrates SPI headers, custom meta-tags and custom implementation-specific fields.
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sf="urn:sobject.enterprise.soap.sforce.com" version="1.0"> <xsl:output method="xml" omit-xml-declaration="no" /> <xsl:variable name="doctype">Case</xsl:variable> <xsl:variable name="queue">Enterprise</xsl:variable> <xsl:variable name="sf_url">https://cs2.salesforce.com/</xsl:variable> <!-- http://code.google.com/apis/searchappliance/documentation/connectors/110/connector_dev/cdg_traversing.html#mp DEFAULT_MIMETYPE Specifies the default type of file that a connector acquires from a content management system. PROPNAME_ACTION Enables a connector to delete a document from the index of the search appliance. PROPNAME_CONTENT Indicates the content for a document. PROPNAME_CONTENTURL Indicates the URL for the content of a document. This property is reserved for future use. PROPNAME_DISPLAYURL Indicates the URL that appears in the search results. PROPNAME_DOCID Identifies a document in the content management system. PROPNAME_ISPUBLIC Indicates whether a document is publicly readable or is a controlled-access document. PROPNAME_LASTMODIFIED Identifies when a document in the content management system was last modified. PROPNAME_MIMETYPE Specifies the type of file that a connector acquires from a content management system. PROPNAME_SEARCHURL Identifies the URL location of a document in the content management system for metadata-and-URL feed. This property is not used by content feed. PROPNAME_SECURITYTOKEN --> <xsl:template match="/"> <documents xsl:exclude-result-prefixes="sf soapenv"> <xsl:for-each select="/soapenv:Envelope/soapenv:Body/*[namespace-uri()='urn:enterprise.soap.sforce.com' and (local-name()='queryResponse' or local-name()='queryMoreResponse') ]/*[namespace-uri()='urn:enterprise.soap.sforce.com' and local-name()='result']/*[namespace-uri() ='urn:enterprise.soap.sforce.com' and local-name()='records']"> <document> <!-- SPIValues --> <spiheaders> <spiheader name="DEFAULT_MIMETYPE">text/html</spiheader> <spiheader name="PROPNAME_ACTION">add</spiheader> <spiheader name="PROPNAME_CONTENTURL"> <xsl:copy-of select="$sf_url"/><xsl:value-of disable-output-escaping="no" select="sf:Id"/> </spiheader> <spiheader name="PROPNAME_DISPLAYURL"> <xsl:copy-of select="$sf_url"/><xsl:value-of disable-output-escaping="no" select="sf:Id"/> </spiheader> <spiheader name="PROPNAME_DOCID"> <xsl:value-of disable-output-escaping="no" select="sf:Id"/> </spiheader> <spiheader name="PROPNAME_ISPUBLIC">true</spiheader> <spiheader name="PROPNAME_MIMETYPE">text/html</spiheader> <spiheader name="PROPNAME_SEARCHURL"></spiheader> <spiheader name="PROPNAME_SECURITYTOKEN"></spiheader> </spiheaders> <metadata> <xsl:if test="sf:CaseNumber[.!='']"> <meta name="CaseNumber"> <xsl:value-of disable-output-escaping="no" select="sf:CaseNumber"/> </meta> </xsl:if> <xsl:if test="sf:Id[.!='']"> <meta name="Id"> <xsl:value-of disable-output-escaping="no" select="sf:Id"/> </meta> </xsl:if> </metadata> <!-- if the content data is base64 encoded (eg. a .pdf, .ppt, .doc), set encoding="base64binary' otherwise, default is non encoded --> <content encoding="none"> <xsl:text disable-output-escaping="yes"><![CDATA[<![CDATA[ ]]></xsl:text> <html> <title>Case: <xsl:value-of disable-output-escaping="yes" select="sf:CaseNumber"/> - <xsl:value-of disable-output-escaping="yes" select="sf:Subject"/> </title> <body> <h2><a name="summary">Case Summary</a></h2> <table width="100%" border-width="3px" border="3" border-style="ridge" bgcolor="#CCFFFF" bordercolor="green" bordercollapse="separate" background-color="#fff5ee"> <tr> </tr> <tr> <td><b>CaseNumber:</b> <xsl:value-of disable-output-escaping="yes" select="sf:CaseNumber"/> </td> </tr> </table> <br/> <p> <h3>Description:</h3> <div STYLE="word-wrap: break-word" > <pre width="100%"> <xsl:value-of disable-output-escaping="yes" select="sf:Description"/> </pre> </div> </p> <hr/> <br/> </body> </html> <xsl:text disable-output-escaping="yes"> <![CDATA[]]]]><![CDATA[>]]></xsl:text> </content> </document> </xsl:for-each> </documents> </xsl:template> </xsl:stylesheet>
The salesforce connector provies several utility Date/Time conversion routines to translate the SalesForce default GMT time to local and the compressed 'numeric time' used for checkpoints. See javadocs for com.google.enterprise.connector.salesforce.Util. For example, the folowing XSLT rountines are used in the date conversions:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sf="urn:sobject.enterprise.soap.sforce.com" xmlns:java="http://xml.apache.org/xslt/java" xmlns:sfeeder="com.google.enterprise.connector.salesforce.Util" version="1.0"> <xsl:template name="convertdate"> <xsl:param name="sfdate"/> <xsl:value-of select="sfeeder:convertSF_GMTToLocalTime($sfdate)"/> </xsl:template> <xsl:template name="formatlmDate"> <xsl:param name="sfdate"/> <xsl:value-of select="sfeeder:formatlmDate($sfdate)"/> </xsl:template>
If the XSLT used in a connector has the ISPUBLIC SPI header set to 'false', the the documents will get considered secure and the Authentication/Authorization (AU/AZ)
process will get enabled. See the section on Serve Time User Authorization and Document Access Control
This section describes the authorization query using the Default Authorization Module the connector will run using the users sessionID with salesforce. This query can be as simple as
select case.ID from case where case.ID in ($DOCIDS) depending on the documents in context for the connector.
The $DOCIDS is a special wildcard reserved term that the connector uses to substitute the list of documentIDs the connector needs to authorize. If a user is allowed to see
all documents in SalesForce with any valid login, then the Authorization query isn't necessary (but its still run).
The Authorization query must return the primary key (docIDs) for only those documents the user is authorized for. The authorized documents identifiers
returned must be a subset of the list submitted. For example, for the query above, the GSA asks the connector if a
user is authorized to see documents<PHONE_NUMBER>jZ8uAAE,6003300005jZ67ABE,7003300005qY5uACE,8003300005qY5uADE). The select
query will return only those documentID the user is able to see. If the query returns<PHONE_NUMBER>jZ8uAAE,6003300005jZ67ABE,7003300005qY5uACE), then
the connetor knows the user is not allowed to see case.iD==documentID of<PHONE_NUMBER>qY5uADE).
The other wildcard defined is $USERID which is the username for the session in context. The Authorization query can use both $DOCID and $USERID in the Authorization Query.
NOTE: The Authorization Query is used by the Default Authorization module only. Even if other modules are loaded and enabled, this parameter is requred (but not used).
The AuthorizationXSLT setting is used in conjunction with the Authorization Query (which is needed for the Default Authorization Module). Since the Authorization query can return arbitrary data (because its dependent on the implementation and connector configuation), the SOAP response needs to get transformed into a canonical form that the connector an process in a general way. That is, an XSLT stylesheet is applied to the Authorization response to translate the arbitrary implementation-specific response back into a form the connector can process. The end output of the XLST must be in the form
<azdecisions> <docID>5003300005jZ8uAAE</docID> <docID>6003300005jZ67ABE</docID> <docID>7003300005qY5uACE</docID> </azdecisions>
Sample Authorization XSLT:
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sf="urn:sobject.enterprise.soap.sforce.com" xmlns:java="http://xml.apache.org/xslt/java" version="1.0"> <xsl:output method="xml" omit-xml-declaration="no" /> <xsl:variable name="xsltype">https://cs2.salesforce.com/</xsl:variable> <xsl:template match="/"> <azdecisions xsl:exclude-result-prefixes="sf soapenv java"> <xsl:for-each select="/soapenv:Envelope/soapenv:Body/*[namespace-uri()='urn:enterprise.soap.sforce.com' and (local-name()='queryResponse' or local-name()='queryMoreResponse') ]/*[namespace-uri()='urn:enterprise.soap.sforce.com' and local-name()='result']/*[namespace-uri()='urn:enterprise.soap.sforce.com' and local-name()='records']"> <docID><xsl:value-of disable-output-escaping="no" select="sf:Id"/></docID> </xsl:for-each> </azdecisions> </xsl:template> </xsl:stylesheet>
NOTE: The Authorization XLST is used by the Default Authorization module only. Even if other modules are loaded and enabled, this parameter is requred (but not used).
The configuration section for each connector instance under "Connector Schedule". defines the times in which the connector manager will poll the connector for documents. This is the time in which the Connector Thread is active and has nothing to do with the Quartz Thread which actually goes to SalesForce to retrieve data.
Normally this setting should not be altered and only the Quartz Scheduler should determine when to traverse SalesForce.
Note that a connector scheduled to run from 12 a.m. to 12 a.m. always runs. Any other schedule with the same beginning and ending time never runs, either for a connector or for the Google Search Appliance's standard crawl function.
The "Traversal Rate" section for the connector instance actually specifies the largest batch of documents that connector manager will push to the GSA per iteration.
This parameter should be set relatively high (3000).
However, see http://code.google.com/p/google-enterprise-connector-manager/issues/detail?id=67 which will cause the connector manager to only process 100 docs at a time. This means until the salesforce connector is deployed within a release after 1.3.2, the Request Query must return less that 100 records per response. That is, each query response or queryMore response (cursor) must contain less than 100 records.
After you complete configuring the connector on the Admin Console, restart Tomcat.
After you restart the connector, verify on the Admin Console that the Google Search Appliance is receiving feeds and verify on the Crawl Diagnostics page that there are indexed URLs.
Before initiating a crawl of SalesForce, remember to set the "Follow and Crawl Only URLs with the Following Patterns:" pattern to include the SalesForce connector. For example, the following pattern would include all connectors ^googleconnector://
Under some circumstances, you might need to force a complete recrawl of content either on SalesForce or on the StoreType.
Recrawl content on SalesForce (Quartz Thread last_sync_date): In this situation, the administrator wants to recrawl content on SalesForce itself. The connector will login to SalesForce and download and feed in all the content defined in the Query. The administrator may want to do this if there is some new field that needs to get indexed; the query will select this field and a new Stylesheet with transform it into a feed. These documents that get fed into the GSA will reflect the new stylesheet and field. If the administrator is using the $LAST_SYNC_DATE in the query, if that param is reset to a previous date, the connector will select all documents modified since and feed that in (incremental crawl)
Recrawl content on FileStore (ConnectorManager Thread checkpoint): The connector can also recrawl some content that is on a persistent store (like FileStore or JDBCStore). The administrator may want to do this after an index reset on the GSA or if a new stylesheet needs to get applied to the feed. The documents saved on a persistent store is actually the raw SOAP response from the QuartzThread so if a new sytlesheet is applied, the documents reindexed will show updated stylesheet info. There is no need in this case to go to SalesForce to acquire the content as the content itself has not changed; just the stylesheet presentation has. To upate the checkpoint file for a connector:
For example, suppose the FileStore has 10 files (one per day) ranging in number from<PHONE_NUMBER>01 (Jan 1st 1:01am) and the checkpoint files date is<PHONE_NUMBER>01 (Jan 10th). To force the connector to reload/retransform all the documents in the store since Jan5th, simply set the checkpoint state to<PHONE_NUMBER>01
To delete documents in the GSA, the transform XSLT can be used with to detect any add/delete flag from the response query and set the SPI header appropriately.
For example, suppose the select query includes the 'isDeleted' flag as in select ID,CaseNumber, Description, isDeleted from case where LastModifiedDate>$LAST_SYNC_DATE LIMIT. Then
the XSLT can look to see if isDeleted is set and set the appropriate SPI Property.
<xsl:choose> <xsl:when test ="sf:IsDeleted[.='true']"> <spiheader name="PROPNAME_ACTION">delete</spiheader> </xsl:when> <xsl:otherwise> <spiheader name="PROPNAME_ACTION">add</spiheader> </xsl:otherwise> </xsl:choose>
The Apache Ant buildfile (build.xml)
is provided. Use Sun Java 6+ and just run 'ant' on the build.xml file (first set JAVA_HOME= to jdk1.6+). The default target is 'dist' and will compile the source and create
the salesforce connector jar file in the dist folder. To recompile against any other version of a JDK, edit <javac nowarn="true" target="1.6" srcdir="${src}" destdir="${tempbin}">
and set the target
appropriately.
This section provides information on troubleshooting the Google Enterprise Connector for SalesForce:
Logging is a useful technique for recording information about how your installation is operating. You can use the information logged for troubleshooting the operations of the connector, the Google Search Appliance, and SalesForce.
The connector manager and connectors use the java.util.logging package for logging. The installer installs a logging mechanism for the connector and starts the logging process automatically. The default logging configuration is defined in the logging.properties file.
To customize the configuration, navigate to
$CATALINA_HOME/webapps/connector-manager/WEB-INF/classes
and edit the logging.properties file there.
The following line in the file sets the default logging level for the SalesForce connector:
com.google.enterprise.connector.salesforce.level = INFO
This property is in the Global section of the logging.properties file. The logging
level of INFO applies to all handlers, for example, to the File and Console handlers,
unless you specify a higher level of logging for a particular handler. The value
of the property also sets the logging level for all classes inside the package
com.google.enterprise.connector.salesforce
.
The default logging level for most packages and output destinations (handlers)
is INFO
. To enable debugging at a finer level of granularity, you
can change the package-specific settings to ALL
or FINER
. For example, you might
change the logging level as follows:
com.google.enterprise.connector.salesforce.level = ALL
The possible values of the level
property are OFF
, SEVERE
, WARNING
, INFO
, CONFIG
, FINE
, FINER
, FINEST
,
and ALL
.
Particular handler settings work together with package-level settings. If you change the logging level for a package, you might need to change the logging levels at the handler level. The handler logging level must be set to at least the output level of the package logging level.
For example, if you set the logging level of com.google.enterprise.connector.salesforce.level
to ALL and the FileHandler level
is set to INFO, logging to the FileHandler fails because the package logging
level is higher than the handler logging level. In that situation, change the
FileHandler logging level to ALL
:
java.util.logging.FileHandler.level = ALL
The output from the ConsoleHandler
appears in the CATALINA_HOME/logs
directory. On Windows, the output appears in the stdout_date.log file,
and on Unix the output appears in the catalina.out file.
The output from the FileHandler
appears in the $CATALINA_HOME/logs
directory. The output appears in the google-connectors.connector_typesequence.log
file, where sequence is a series of numbers starting with 0 and incremented
by 1 on each occurrence (0, 1, 2, 3...n).
After editing the logging.properties file, restart Tomcat.
This section describes some commonly encountered error messages and their likely solutions.
You see this message when a user-provided Crawl URL does not match patterns specified under "Include URLs Matching the Following Patterns". Simply add (^googleconnector://) to the follow pattern on the GSA admin console
Fields marked with an asterisk (*) on the Configuring Connector Instances form are required. You must provide appropriate values for these fields.
You must provide appropriate values for all the mandatory fields on configuring connector instances.
The connector was unable to transform the response SOAP object into the canoncial
Note : All other error messages are available in the Tomcat log file.


This example demonstrates using range and focus charts to scroll an ordinal bar chart with too many items. Instead of filtering, the brush only changes the view; bars are clickable as in an ordinary ordinal bar chart.
Since ordinal-scale charts are not ordinarily brushable or zoomable, the example maps the ordinal values to integers, and then maps the integers back to the values for the axis ticks.


Welcome to My-SearchEngine.net, a leading resource for website
promotion on the Internet since 1994. Complement your search
engine submission process by clicking on "add url".
By submitting your link with our web site directory, you'll
improve your search engine ranking and gain more customers.
|
| Adult |
| Image
Galleries, Regional,
Shopping |
| |
| Arts |
| Movies, Music, Television,
Literature,
Crafts |
| |
| Business |
| E-Commerce,
Automotive,
Investing,
Real Estate |
| |
| Computers |
| Internet,
Software,
Hardware,
Systems |
| |
| Games |
| Gambling, Puzzles, Miniatures,
Roleplaying |
| |
| Health |
| Fitness, Beauty, Medicine, Alternative |
| |
| Home |
| Personal
Finance, Gardens, Cooking |
| |
| Kids and Teens |
| Arts, School
Time, Teen
Life, International |
| |
| News |
| Newspapers,
Online
Archives, Current
Events |
|
| Recreation |
| Travel, Humor, Outdoors,
Collecting |
| |
| Reference |
| Maps, Education,
Libraries,
Encyclopedias |
| |
| Regional |
| United
States, Canada, Europe, UK,
Asia |
| |
| Science |
| Astronomy,
Math, Physics, Biology |
| |
| Shopping |
| Electronics,
Clothing, Gifts, Food, Sports |
| |
| Society |
| People, Religion,
Issues, Crime, Law |
| |
| Sports |
| Golf, Football, Baseball, Tennis |
| |
| World |
| Japanese, Deutsch, Espa˝ol,
Franšais |
|
|
|


☰
If you only live once, what difference are you making?
WHO WE ARE
We are a small team of entrepreneurs, leaders, and consultants focused on bringing change to East Africa regions with the greatest needs.
WHY WE STARTED
Right now as you read this, there are people in East Africa suffering. We believe we have found a solution. Our WHY comes from our belief that as human beings, it is our duty to give our resources, knowledge, and experience to help those in need.
WHAT WE DO
We invest in crisis relief, micro loans, and larger investments that solve very specific problems and sparks self-sustaining income and solutions to the needs of the communities. Through investing, consulting, and mentoring we coach local leaders and empower them to run the self-sustaining relief efforts, businesses, and projects.
HOW YOU CAN HELP
The only way to see our vision fulfilled and our mission completed is by people, like yourself, coming together and sharing our resources, time, and knowledge. If we try to do it alone, we will fail.
Click below to learn more or see how you can get involved.


audio-director
Manage browser audio sources and playback
Install
npm install audio-director
Documentation
https://lab.miguelmota.com/audio-director
Classes
Objects
- Player :
object
Class reprensenting a Player
Player
Kind: global class
- Player
- new Player()
- instance
- .on(eventName, callback)
- .getCurrentUrl() ⇒
String
- .emptyQueue() ⇒
Promise
- .enqueue(source) ⇒
Promise
- .deque() ⇒
Promise
- .play() ⇒
Promise
- .playQueue() ⇒
Promise
- .stop() ⇒
Promise
- .pause() ⇒
Promise
- .replay() ⇒
Promise
- .playBlob(blob) ⇒
Promise
- .playAudioBuffer(audioBuffer) ⇒
Promise
- .getCurrentAudioBuffer() ⇒
AudioBuffer
- .playUrl(url) ⇒
Promise
- .getAudioDataFromUrl(url) ⇒
Promise
- .next() ⇒
Promise
- .previous() ⇒
Promise
- .setRandom(enabled) ⇒
Promise
- .setRepeat(enabled) ⇒
Promise
- .hasNext() ⇒
Boolean
- .hasPrevious() ⇒
Boolean
- .setPlaybackRate(playbackRate) ⇒
Promise
- .getPlaybackRate() ⇒
Number
- .setVolume(volume) ⇒
Promise
- .getVolume() ⇒
Number
- .setMaxVolume(maxVolume) ⇒
Promise
- .getMaxVolume() ⇒
Number
- .setMuted(enabled) ⇒
Promise
- .getCurrentTime() ⇒
Number
- .seekTo(seconds) ⇒
Promise
- .getDuration() ⇒
Number
- .getCurrentState() ⇒
String
- static
- .EventTypes ⇒
Object
- .EventTypes ⇒
new Player()
Create a Player
player.on(eventName, callback)
Listen for player events
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| eventName | String |
name of even |
| callback | function |
called when the event occurs |
Example
player.on(Player.EventTypes.PLAY, () => {
})
Example
player.on(Player.EventTypes.PLAYBACK_RATE, () => {
})
player.getCurrentUrl() ⇒ String
Get currently playing audio source url
Kind: instance method of Player
Example
const url = player.getCurrentUrl()
player.emptyQueue() ⇒ Promise
Empties queue
Kind: instance method of Player
Example
player.emptyQueue()
player.enqueue(source) ⇒ Promise
Enqueues an audio source to play
Kind: instance method of Player
| Param | Type | Description | ||||
|---|---|---|---|---|---|---|
| source | DataView \ |
Uint8Array \ |
AudioBuffer \ |
ArrayBuffer \ |
String |
an audio source to play |
Example
const url = 'https://example.com/audio.mp3'
player.enqueue(url)
Example
player.enqueue(audioBuffer)
Example
player.enqueue(arrayBuffer)
Example
player.enqueue(blob)
player.deque() ⇒ Promise
Deques an audio source from queue
Kind: instance method of Player
Example
player.deque()
player.play() ⇒ Promise
Plays current audio source in queue
Kind: instance method of Player
Example
player.play()
player.playQueue() ⇒ Promise
Start playing audio sources in queue
Kind: instance method of Player
Example
player.playQueue()
player.stop() ⇒ Promise
Stop playing current audio source
Kind: instance method of Player
Example
player.stop()
player.pause() ⇒ Promise
Pause playing current audio source
Kind: instance method of Player
Example
player.pause()
player.replay() ⇒ Promise
Replay current audio source
Kind: instance method of Player
Example
player.replay()
player.playBlob(blob) ⇒ Promise
Play an audio Blob
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| blob | Blob |
audio blob |
Example
const blob = new Blob([dataView], {
type: 'audio/wav'
})
player.playBlob(blob)
player.playAudioBuffer(audioBuffer) ⇒ Promise
Play an AudioBuffer
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| audioBuffer | AudioBuffer |
an AudioBuffer |
Example
player.playAudioBuffer(audioBuffer)
player.getCurrentAudioBuffer() ⇒ AudioBuffer
Return current audio buffer playing
Kind: instance method of Player
Example
player.getCurrentAudioBuffer()
player.playUrl(url) ⇒ Promise
Play an MP3 url
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| url | String |
MP3 url |
Example
const url = 'https://example.com/audio.mp3'
player.playUrl(url)
player.getAudioDataFromUrl(url) ⇒ Promise
Get the binary audio data from an audio source url in ArrayBuffer form
Kind: instance method of Player
Returns: Promise
- arrayBuffer
| Param | Type | Description |
|---|---|---|
| url | String |
audio source url |
Example
const url = 'https://example.com/audio.mp3'
player.getAudioDataFromUrl()
.then(arrayBuffer => {
})
player.next() ⇒ Promise
Play next audio source in queue
Kind: instance method of Player
Example
player.next()
player.previous() ⇒ Promise
Play previous audio source in queue
Kind: instance method of Player
Example
player.previous()
player.setRandom(enabled) ⇒ Promise
Enable to disable random playback
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| enabled | Boolean |
boolean to enable random playback |
Example
player.setRandom(true)
player.setRepeat(enabled) ⇒ Promise
Enable to disable repeat mode. Repeat mode replays the audio sources once the entire queue has finished playing.
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| enabled | Boolean |
boolean to enable repeat mode |
Example
player.setRepeat(true)
player.hasNext() ⇒ Boolean
Return true if there's an audio source to play next in queue
Kind: instance method of Player
Returns: Boolean
- hasNext
Example
const hasNext = player.hasNext()
player.hasPrevious() ⇒ Boolean
Return true if there's a previous audio source in queue
Kind: instance method of Player
Returns: Boolean
- hasPrevious
Example
const hasPrevious = player.hasPrevious()
player.setPlaybackRate(playbackRate) ⇒ Promise
Set the plaback rate speed, range 0.75-2
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| playbackRate | Number |
new playback rate |
Example
player.setPlaybackRate(2)
player.getPlaybackRate() ⇒ Number
Get the current plaback rate speed
Kind: instance method of Player
Returns: Number
- playback rate speed
Example
const playbackRate = player.getPlaybackRate()
player.setVolume(volume) ⇒ Promise
Set volume, range 0-1
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| volume | Number |
volume value |
Example
player.setVolume(0.9)
player.getVolume() ⇒ Number
Get current volume value
Kind: instance method of Player
Returns: Number
- volume - current volume value
Example
player.getVolume()
player.setMaxVolume(maxVolume) ⇒ Promise
Set the maximum volume limit. For example if max volume is set to 0.6, then when volume is scaled from 0-0.6, meaning that volume level at 1 will play at 0.6
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| maxVolume | Number |
max volume, range 0-1 |
Example
player.setMaxVolume(0.8)
player.getMaxVolume() ⇒ Number
Get max volume value
Kind: instance method of Player
Returns: Number
- maxVolume - max volume value
Example
player.getMaxVolume()
player.setMuted(enabled) ⇒ Promise
Set volume level to muted
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| enabled | Boolean |
boolean to enable mute |
Example
player.setMuted(true)
player.getCurrentTime() ⇒ Number
Return elapsed time in seconds since the audio source started playing
Kind: instance method of Player
Returns: Number
- time - current time
Example
player.getCurrentTime()
player.seekTo(seconds) ⇒ Promise
Seek to a specified time in audio source
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| seconds | Number |
number of seconds to seek to |
Example
const seconds = 45
player.seekTo(seconds)
player.getDuration() ⇒ Number
Get duration of audio source
Kind: instance method of Player
Returns: Number
- duration - duration of audio source
Example
player.getDuration()
player.getCurrentState() ⇒ String
Get current state of player
Kind: instance method of Player
Returns: String
- - current state
Example
const currentState = player.getCurrentState()
console.log(currentState) // 'playing'
Player.EventTypes ⇒ Object
Return event types
Kind: static property of Player
Returns: Object
- eventTypes - all player event types
Example
const EventTypes = Player.EventTypes
{
LOG: 'log',
ERROR: 'error',
READY: 'ready',
PLAY: 'play',
REPLAY: 'replay',
PAUSE: 'pause',
STOP: 'pause',
NEXT: 'next',
PREVIOUS: 'previous',
RANDOM: 'random',
REPEAT: 'repeat',
PLAYBACK_RATE: 'playbackRate',
VOLUME: 'volume',
MAX_VOLUME: 'maxVolume',
MUTED: 'muted',
ENDED: 'ended',
ENQUEUE: 'enqueue',
DEQUE: 'deque',
EMPTY_QUEUE: 'emptyQueue',
STATE_CHANGE: 'stateChange'
}
Player : object
Class reprensenting a Player
Kind: global namespace Example
const player = new Player()
- Player :
object
- new Player()
- instance
- .on(eventName, callback)
- .getCurrentUrl() ⇒
String
- .emptyQueue() ⇒
Promise
- .enqueue(source) ⇒
Promise
- .deque() ⇒
Promise
- .play() ⇒
Promise
- .playQueue() ⇒
Promise
- .stop() ⇒
Promise
- .pause() ⇒
Promise
- .replay() ⇒
Promise
- .playBlob(blob) ⇒
Promise
- .playAudioBuffer(audioBuffer) ⇒
Promise
- .getCurrentAudioBuffer() ⇒
AudioBuffer
- .playUrl(url) ⇒
Promise
- .getAudioDataFromUrl(url) ⇒
Promise
- .next() ⇒
Promise
- .previous() ⇒
Promise
- .setRandom(enabled) ⇒
Promise
- .setRepeat(enabled) ⇒
Promise
- .hasNext() ⇒
Boolean
- .hasPrevious() ⇒
Boolean
- .setPlaybackRate(playbackRate) ⇒
Promise
- .getPlaybackRate() ⇒
Number
- .setVolume(volume) ⇒
Promise
- .getVolume() ⇒
Number
- .setMaxVolume(maxVolume) ⇒
Promise
- .getMaxVolume() ⇒
Number
- .setMuted(enabled) ⇒
Promise
- .getCurrentTime() ⇒
Number
- .seekTo(seconds) ⇒
Promise
- .getDuration() ⇒
Number
- .getCurrentState() ⇒
String
- static
- .EventTypes ⇒
Object
- .EventTypes ⇒
new Player()
Create a Player
player.on(eventName, callback)
Listen for player events
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| eventName | String |
name of even |
| callback | function |
called when the event occurs |
Example
player.on(Player.EventTypes.PLAY, () => {
})
Example
player.on(Player.EventTypes.PLAYBACK_RATE, () => {
})
player.getCurrentUrl() ⇒ String
Get currently playing audio source url
Kind: instance method of Player
Example
const url = player.getCurrentUrl()
player.emptyQueue() ⇒ Promise
Empties queue
Kind: instance method of Player
Example
player.emptyQueue()
player.enqueue(source) ⇒ Promise
Enqueues an audio source to play
Kind: instance method of Player
| Param | Type | Description | ||||
|---|---|---|---|---|---|---|
| source | DataView \ |
Uint8Array \ |
AudioBuffer \ |
ArrayBuffer \ |
String |
an audio source to play |
Example
const url = 'https://example.com/audio.mp3'
player.enqueue(url)
Example
player.enqueue(audioBuffer)
Example
player.enqueue(arrayBuffer)
Example
player.enqueue(blob)
player.deque() ⇒ Promise
Deques an audio source from queue
Kind: instance method of Player
Example
player.deque()
player.play() ⇒ Promise
Plays current audio source in queue
Kind: instance method of Player
Example
player.play()
player.playQueue() ⇒ Promise
Start playing audio sources in queue
Kind: instance method of Player
Example
player.playQueue()
player.stop() ⇒ Promise
Stop playing current audio source
Kind: instance method of Player
Example
player.stop()
player.pause() ⇒ Promise
Pause playing current audio source
Kind: instance method of Player
Example
player.pause()
player.replay() ⇒ Promise
Replay current audio source
Kind: instance method of Player
Example
player.replay()
player.playBlob(blob) ⇒ Promise
Play an audio Blob
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| blob | Blob |
audio blob |
Example
const blob = new Blob([dataView], {
type: 'audio/wav'
})
player.playBlob(blob)
player.playAudioBuffer(audioBuffer) ⇒ Promise
Play an AudioBuffer
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| audioBuffer | AudioBuffer |
an AudioBuffer |
Example
player.playAudioBuffer(audioBuffer)
player.getCurrentAudioBuffer() ⇒ AudioBuffer
Return current audio buffer playing
Kind: instance method of Player
Example
player.getCurrentAudioBuffer()
player.playUrl(url) ⇒ Promise
Play an MP3 url
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| url | String |
MP3 url |
Example
const url = 'https://example.com/audio.mp3'
player.playUrl(url)
player.getAudioDataFromUrl(url) ⇒ Promise
Get the binary audio data from an audio source url in ArrayBuffer form
Kind: instance method of Player
Returns: Promise
- arrayBuffer
| Param | Type | Description |
|---|---|---|
| url | String |
audio source url |
Example
const url = 'https://example.com/audio.mp3'
player.getAudioDataFromUrl()
.then(arrayBuffer => {
})
player.next() ⇒ Promise
Play next audio source in queue
Kind: instance method of Player
Example
player.next()
player.previous() ⇒ Promise
Play previous audio source in queue
Kind: instance method of Player
Example
player.previous()
player.setRandom(enabled) ⇒ Promise
Enable to disable random playback
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| enabled | Boolean |
boolean to enable random playback |
Example
player.setRandom(true)
player.setRepeat(enabled) ⇒ Promise
Enable to disable repeat mode. Repeat mode replays the audio sources once the entire queue has finished playing.
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| enabled | Boolean |
boolean to enable repeat mode |
Example
player.setRepeat(true)
player.hasNext() ⇒ Boolean
Return true if there's an audio source to play next in queue
Kind: instance method of Player
Returns: Boolean
- hasNext
Example
const hasNext = player.hasNext()
player.hasPrevious() ⇒ Boolean
Return true if there's a previous audio source in queue
Kind: instance method of Player
Returns: Boolean
- hasPrevious
Example
const hasPrevious = player.hasPrevious()
player.setPlaybackRate(playbackRate) ⇒ Promise
Set the plaback rate speed, range 0.75-2
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| playbackRate | Number |
new playback rate |
Example
player.setPlaybackRate(2)
player.getPlaybackRate() ⇒ Number
Get the current plaback rate speed
Kind: instance method of Player
Returns: Number
- playback rate speed
Example
const playbackRate = player.getPlaybackRate()
player.setVolume(volume) ⇒ Promise
Set volume, range 0-1
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| volume | Number |
volume value |
Example
player.setVolume(0.9)
player.getVolume() ⇒ Number
Get current volume value
Kind: instance method of Player
Returns: Number
- volume - current volume value
Example
player.getVolume()
player.setMaxVolume(maxVolume) ⇒ Promise
Set the maximum volume limit. For example if max volume is set to 0.6, then when volume is scaled from 0-0.6, meaning that volume level at 1 will play at 0.6
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| maxVolume | Number |
max volume, range 0-1 |
Example
player.setMaxVolume(0.8)
player.getMaxVolume() ⇒ Number
Get max volume value
Kind: instance method of Player
Returns: Number
- maxVolume - max volume value
Example
player.getMaxVolume()
player.setMuted(enabled) ⇒ Promise
Set volume level to muted
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| enabled | Boolean |
boolean to enable mute |
Example
player.setMuted(true)
player.getCurrentTime() ⇒ Number
Return elapsed time in seconds since the audio source started playing
Kind: instance method of Player
Returns: Number
- time - current time
Example
player.getCurrentTime()
player.seekTo(seconds) ⇒ Promise
Seek to a specified time in audio source
Kind: instance method of Player
| Param | Type | Description |
|---|---|---|
| seconds | Number |
number of seconds to seek to |
Example
const seconds = 45
player.seekTo(seconds)
player.getDuration() ⇒ Number
Get duration of audio source
Kind: instance method of Player
Returns: Number
- duration - duration of audio source
Example
player.getDuration()
player.getCurrentState() ⇒ String
Get current state of player
Kind: instance method of Player
Returns: String
- - current state
Example
const currentState = player.getCurrentState()
console.log(currentState) // 'PLAYING'
Player.EventTypes ⇒ Object
Return event types
Kind: static property of Player
Returns: Object
- eventTypes - all player event types
Example
const EventTypes = Player.EventTypes
{
LOG: 'log',
ERROR: 'error',
READY: 'ready',
PLAY: 'play',
REPLAY: 'replay',
PAUSE: 'pause',
STOP: 'pause',
NEXT: 'next',
PREVIOUS: 'previous',
RANDOM: 'random',
REPEAT: 'repeat',
PLAYBACK_RATE: 'playbackRate',
VOLUME: 'volume',
MAX_VOLUME: 'maxVolume',
MUTED: 'muted',
ENDED: 'ended',
ENQUEUE: 'enqueue',
DEQUE: 'deque',
EMPTY_QUEUE: 'emptyQueue',
STATE_CHANGE: 'stateChange'
}
Usage
Standard audio player
const {Player} = require('audio-director')
const player = new Player()
// add audio source(s) to play queue. Converts input to AudioBuffer.
player.enqueue(dataView|typedArray|arrayBuffer|url)
.then(audioBuffer => {
player.play()
})
YouTube player
const {YoutubePlayer} = require('audio-director')
const player = new YoutubePlayer()
const url = 'https://www.youtube.com/watch?v=_5joTyy3CCo&list=RDQMc4l8l2aQrNo'
player.enqueue(url)
.then(() => player.play())
Example
Source
https://github.com/miguelmota/audio-director
License
MIT


org.jasypt.web.pbeconfig
Class WebPBEInitializationContextListener
Object
org.jasypt.web.pbeconfig.WebPBEInitializationContextListener
- All Implemented Interfaces:
- java.util.EventListener, javax.servlet.ServletContextListener
public class WebPBEInitializationContextListener
- extends Object
- implements javax.servlet.ServletContextListener
ContextListener which takes a WebPBEInitializer
implementation
class name as a parameter (<context-param>) and calls its
initializeWebPBEConfigs() method to allow the webapp to
create its PBE encryptors and declare their associated WebPBEConfig
objects.
An example web.xml fragment:
<context-param>
<param-name>webPBEInitializerClassName</param-name>
<param-value>myapp.MyWebPBEInitializer</param-value>
</context-param>
<listener>
<listener-class>
org.jasypt.web.pbeconfig.WebPBEInitializationContextListener
</listener-class>
</listener>
Important: If the web application uses Spring Framework, WebPBEConfig
objects are declared as beans in the Spring context and this Spring context
is initialized at application deploy time
(with Spring's ContextLoaderListener), the use
of this context listener will become unnecessary.
- Since:
- 1.3
- Author:
- Daniel Fernández
| Methods inherited from class Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
INIT_PARAM_INITIALIZER_CLASS_NAME
public static final String INIT_PARAM_INITIALIZER_CLASS_NAME
- See Also:
- Constant Field Values
WebPBEInitializationContextListener
public WebPBEInitializationContextListener()
contextDestroyed
public void contextDestroyed(javax.servlet.ServletContextEvent sce)
- Specified by:
contextDestroyed
in interface javax.servlet.ServletContextListener
contextInitialized
public void contextInitialized(javax.servlet.ServletContextEvent sce)
- Specified by:
contextInitialized
in interface javax.servlet.ServletContextListener
Copyright © 2008 The JASYPT team. All Rights Reserved.


In the universe where everything works the way it common-sensically ought to, everything about the study of Artificial General Intelligence is driven by the one overwhelming fact of the indescribably huge effects: initial conditions and unfolding patterns whose consequences will resound for as long as causal chains continue out of Earth, until all the stars and galaxies in the night sky have burned down to cold iron, and maybe long afterward, or forever into infinity if the true laws of physics should happen to permit that. To deliberately thrust your mortal brain onto that stage, as it plays out on ancient Earth the first root of life, is an act so far beyond “audacity” as to set the word on fire, an act which can only be excused by the terrifying knowledge that the empty skies offer no higher authority.
Eliezer Yudkowsky, Above-Average AI Scientists


Represents a lexical block. SBFunction contains SBBlock(s).
|
|
|
|
|
|
|
|
|
|
|
__init__(self,
*args)
__init__(lldb::SBBlock self) -> SBBlock __init__(lldb::SBBlock
self, SBBlock rhs) -> SBBlock |
source code
|
|
|
|
__swig_destroy__(...)
delete_SBBlock(SBBlock self) |
|
|
|
|
|
|
|
|
|
|
|
|
|
IsValid(self)
IsValid(SBBlock self) -> bool |
source code
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GetNumRanges(self)
GetNumRanges(SBBlock self) -> uint32_t |
source code
|
|
|
|
GetRangeStartAddress(self,
*args)
GetRangeStartAddress(SBBlock self, uint32_t idx) -> SBAddress |
source code
|
|
|
|
GetRangeEndAddress(self,
*args)
GetRangeEndAddress(SBBlock self, uint32_t idx) -> SBAddress |
source code
|
|
|
|
GetRangeIndexForBlockAddress(self,
*args)
GetRangeIndexForBlockAddress(SBBlock self, SBAddress block_addr)
-> uint32_t |
source code
|
|
|
|
GetDescription(self,
*args)
GetDescription(SBBlock self, SBStream description) -> bool |
source code
|
|
|
|
GetVariables(self,
*args)
GetVariables(SBBlock self, SBFrame frame, bool arguments, bool
locals, bool statics, lldb::DynamicValueType use_dynamic) ->
SBValueList GetVariables(SBBlock self, SBTarget target, bool
arguments, bool locals, bool statics) -> SBValueList |
source code
|
|
|
|
|
|
|
get_ranges_access_object(self)
An accessor function that returns a ranges_access() object which
allows lazy block address ranges access. |
source code
|
|
|
|
get_ranges_array(self)
An accessor function that returns an array object that contains all
ranges in this block object. |
source code
|
|
|
|
|
|
|
|
|
Inherited from object :
__delattr__ ,
__format__ ,
__getattribute__ ,
__hash__ ,
__new__ ,
__reduce__ ,
__reduce_ex__ ,
__sizeof__ ,
__subclasshook__
|
|
|
call_site
A read only property that returns a lldb.declaration object that
contains the inlined call site file, line and column.
|
|
|
first_child
A read only property that returns the same result as GetFirstChild().
|
|
|
inlined_block
A read only property that returns the same result as
GetContainingInlinedBlock().
|
|
|
name
A read only property that returns the same result as
GetInlinedName().
|
|
|
num_ranges
A read only property that returns the same result as GetNumRanges().
|
|
|
parent
A read only property that returns the same result as GetParent().
|
|
|
range
A read only property that allows item access to the address ranges
for a block by integer (range = block.range[0]) and by
lldb.SBAdddress (find the range that contains the specified
lldb.SBAddress like "pc_range =
lldb.frame.block.range[frame.addr]").
|
|
|
ranges
A read only property that returns a list() object that contains all
of the address ranges for the block.
|
|
|
sibling
A read only property that returns the same result as GetSibling().
|
|
Inherited from object :
__class__
|


Before Change
Returns:
batch_gen: a generator, that iterates through the part (defined by data_type) of dataset
raise NotImplementedError("Batch generator must be implemented for Dataset class!")
def iter_all(self):
rIterate through all data. It can be used for building dictionary or
After Change
data = self.data[data_type]
data_len = len(data)
order = list(range(data_len))
random.shuffle(order)
for i in range((data_len - 1) // batch_size + 1):
yield list(zip(*[data[o] for o in order[i*batch_size:(i+1)*batch_size]]))
def iter_all(self, data_type: str = "train") -> Generator:
rIterate through all data. It can be used for building dictionary or


RootXMLNode()
Syntax
Result = RootXMLNode(#XML)Description
Returns the root node of the XML tree. This node is always present. It represents the XML document itself. The text contained in this node represents the whitespace outside of any XML node (there can be no text outside of nodes). The children of this node are the main node and any comments outside the main node. The type of this node is #PB_Xml_Root.
Parameters
#XML The XML to use.
Return value
Always returns a valid XML node if #XML is an existing XML tree.
See Also
XMLNodeType(), MainXMLNode()
Supported OS
All


{% extends 'base.html' %} {% load static %} {% block body %} About Us We never dreamt of success. We worked for it About Us {{result.aboutus}} Our Achievements {% for data in result.achievements %} {{data.title}} {{data.achievements}} {% endfor %} Our Team {{result.aboutteam}} {% for data in result.team %} {{data.name}} {{data.designation}} {% endfor %} {% endblock %}
We never dreamt of success. We worked for it
{{result.aboutus}}
{{data.achievements}}
{{result.aboutteam}}


The ghananians naming system is as follows:
Many Ghanananians are born each day and fail to know their akan names as per their culture.This website will help you identify
your akan name without any difficulty.
Just fill the form below to get your beautiful akan name.


Next: Use of Double Semicolon, Previous: Notes about Style for Semicolon, Up: Semicolon
Comments that begin with a single semicolon are all aligned to the same column at the right (sometimes called the "comment column"). The text of such a comment generally applies only to the line on which it appears. Occasionally two or three contain a single sentence together; this is sometimes indicated by indenting all but the first with an additional space (after the semicolon).


The sales of Salmon Cookies can be found in this page. Salmon fish is a publicly traded organization and we have an sales and internal data in this page.


Inline vs Inline-block
What does it mean to display inline vs inline blocks?
To explain what this means and what the difference is, I think we first need to understand the basic rules of three display property types: block, inline, and inline-block.
Block elements respect margins of other elements, meaning that this can and will move them around the page depending on the margin settings. They also force line break so that no other element can sit beside them, only above or below. Examples of block elements are paragraphs, headings, and lists.
An inline element means that the element will allow other elements to sit beside it on the left or right - inline. The inline elements respect left and right margins, but top and bottom margins are ignored. They can not have a width or height set, they just are how they are - the width depending on the content inside. Examples of inline elements are spans, inputs, and labels.
Inline-block elements are a sort of combination of the two; the best of both worlds in a sense, depending on the intended use. We must set this property, and it gives us a way to adjust the width and height on elements that otherwise we couldn’t. This also will let us put boxes side by side and wrap them if there is adequate space in the container, because they do not force a line break unlike a regular block element. So, essentially it is the same as a inline element except we can set te width and height. It is literally an inline block element, hence the name.
In the image below you can see some examples of elements with each of the above display properties, which should give an idea about how they appear on a page:


--- title: 'Welcome to Kinicart Example' date: '2018-11-19T11:28:01Z' description: 'Registration completion page for new users who have been invited to join an account by an Administrator' tags: [] categories: [] menu: "" noindex: 'true' theme: brand footercta: false ---


Search
Atlas exposes search over the metadata in two ways:
- Search using DSL
- Full-text search
Search DSL Grammar
The DSL exposes an SQL like query language for searching the metadata based on the type system. The grammar for the DSL is below.
queryWithPath: query ~ opt(WITHPATH)
query: rep1sep(singleQuery, opt(COMMA))
singleQuery: singleQrySrc ~ opt(loopExpression) ~ opt(selectClause)
singleQrySrc = FROM ~ fromSrc ~ opt(WHERE) ~ opt(expr ^? notIdExpression) |
WHERE ~ (expr ^? notIdExpression) |
expr ^? notIdExpression |
fromSrc ~ opt(WHERE) ~ opt(expr ^? notIdExpression)
fromSrc: identifier ~ AS ~ alias | identifier
loopExpression: LOOP ~ (LPAREN ~> query <~ RPAREN) ~ opt(intConstant <~ TIMES) ~ opt(AS ~> alias)
selectClause: SELECT ~ rep1sep(selectExpression, COMMA)
selectExpression: expr ~ opt(AS ~> alias)
expr: compE ~ opt(rep(exprRight))
exprRight: (AND | OR) ~ compE
compE:
arithE ~ (LT | LTE | EQ | NEQ | GT | GTE) ~ arithE |
arithE ~ (ISA | IS) ~ ident |
arithE ~ HAS ~ ident |
arithE
arithE: multiE ~ opt(rep(arithERight))
arithERight: (PLUS | MINUS) ~ multiE
multiE: atomE ~ opt(rep(multiERight))
multiERight: (STAR | DIV) ~ atomE
atomE: literal | identifier | LPAREN ~> expr <~ RPAREN
identifier: rep1sep(ident, DOT)
alias: ident | stringLit
literal: booleanConstant |
intConstant |
longConstant |
floatConstant |
doubleConstant |
stringLit
Grammar language: {noformat} opt(a) => a is optional ~ => a combinator. 'a ~ b' means a followed by b rep => zero or more rep1sep => one or more, separated by second arg. {noformat}
Language Notes:
- A SingleQuery expression can be used to search for entities of a Trait or Class.
Entities can be filtered based on a 'Where Clause' and Entity Attributes can be retrieved based on a 'Select Clause'.
- An Entity Graph can be traversed/joined by combining one or more SingleQueries.
- An attempt is made to make the expressions look SQL like by accepting keywords "SELECT",
"FROM", and "WHERE"; but these are optional and users can simply think in terms of Entity Graph Traversals.
- The transitive closure of an Entity relationship can be expressed via the Loop expression. A
Loop expression can be any traversal (recursively a query) that represents a
Path that ends in an Entity of the same
Type as the starting Entity.
- The WithPath clause can be used with transitive closure queries to retrieve the Path that
connects the two related Entities. (We also provide a higher level interface for Closure Queries see scaladoc for 'org.apache.metadata.query.ClosureQuery')
- There are couple of Predicate functions different from SQL:
- is or isacan be used to filter Entities that have a particular Trait.
- has can be used to filter Entities that have a value for a particular Attribute.
DSL Examples
- from DB
- DB where name="Reporting" select name, owner
- DB has name
- DB is JdbcAccess
- Column where Column isa PII
- Table where name="sales_fact", columns
- Table where name="sales_fact", columns as column select column.name, column.dataType, column.comment
Full-text Search
Atlas also exposes a lucene style full-text search capability.


Tue Jul 29, 2003
Well, now I don’t feel like writing a long update. I’ll make sure this entry is peppered with links for those who wish to learn more and expand their knowledge-bases. Let’s see…Two Sundays ago I went to the Sodaemun Prison Hall. This was a Japanese prison camp for political prisoners and activists during their occupation of Korea. All the original buildings remain, including the execution chamber and various torture devices, which you can try out if you are so inclined. I wasn’t inclined.  It was quite nightmarish, especially for kids I would think. The place felt very, very haunted.
Sometime last week was “International day” and after much deliberation I chose Ireland as the country our class was going to be. I had to dress them up and invent a dance. As it turned out the outfit looked like a cross between Peter Pan and a leprechaun. We wore all green with green hats, four leaf clovers painted on our faces and I wore a green kilt. The dance I taught them was what I imagined an Irish jig would be, although the kids interpreted the kicking as a chance to display their martial arts skills, so they looked more like perverse Ninja leprechauns than anything remotely resembling the Irish nation.
On Friday I tried this great dish called “Sang Ge Tang”, a kind of chicken soup with Ginseng. It’s supposed to give you lots of energy. What it did was drugged me into a deep sleep, whereupon I woke up at three-thirty in the morning and decided to do my laundry. I don’t usually engage in such bizarre behaviour, so I’m fairly sure it was the soup. Alice is so sweet, even though her English is, well, muddled. After the soup, she asked me quite sincerely, “Are you very delicious?”, I replied quite ernestly in the affirmative, although I was privately quite amused.
Last Sunday I visited the National Museum of Korea, which has the most extensively boring collection of pottery I’ve ever seen. I breathed a sigh of relief when I came upon these magnificent Buddhist statues hidden away deep in the bowels of the museum basement. Afterwards I visited Technomart, I rather impressive monument to technological gadgetry, and a jarring contrast to all the Paleolithic pottery shards and flakes I’d been looking at. Sometimes I’m surprised to find myself living in the future.
Yesterday, I met the foreign teachers from our direct competition - Kang’s language school. They’re an older South African couple from Durban, really nice people.  They have a car so maybe I can convince them to go on a braaivleis in a Paju rice paddy sometime. Why not celebrate South African culture, regardless of the geographic and social context? Who would have thought so many South Africans would be teaching in Korea. I guess it makes sense though. The guy, Brian, is an IT expert so I’m hoping he can help me buy my laptop sometime. I was going to get Debbie to help me but she doesn’t know much about computers. Well, that’s all I have time for, I am on vacation after all!


Calculate Hash
Check Authenticity
About
Check file authenticity in 3 simple steps
Step 1. Upload file upto 80MB.
Browse
Step 2. Select a hashing method
Select hash method.
Default
SHA-1
SHA-2
SHA-3
MD5
Step 3. Enter the file hash you got from the file provider.
Enter File verification hash.
Please check for the following
1. Upload a valid file (size less than 250MB)
2. Choose a hashing method.
3. Enter file verification hash.
Check Now!


How to use Angular IOS Toggle Switch
Toggle Switch for Angular by Zain Zafar .
Installation
and then from your Angular
AppModule
:
Usage
Default
Code
Switch Value:
{{value|json}}
Demo
Switchery with different states
You can enable/disable states by adding
disabled
property and specifying appropriate value to switchery control
Demo
Switchery colors
Code
You can change the default color of the switch to fit your design perfectly. According to the color system, any of its color can be applied to the switchery.
Demo
Switchery Sizes
Code
You can choose one of 4 main Switch sizes - large (
.switchery-lg
), default, small (
.switchery-sm
) and mini (
.switchery-xs
). Just add proper size as input.
Demo
Switchery Label
Code
Switchery can be used with single label or with multiple labels. For single label use
onLabel="Single Label"
, for double specify an extra property
offLabel="Double Label"
Demo
Switchery sticked to right
Code
Sometimes it's very useful to have switches on the right side of the container. Just add
[sticked]="true"
to the Switchery


The Deyyam Labyrinth utilizes HTML, JavaScript, and CSS coding to fully immerse a participant in auditory, visual, and action-based puzzle solving. There are a multitude of arrays and complex loops to enhance the game-play experience with rapidly evolving obstacles at every turn. Event listeners are enlisted for movement throughout an intricate layer of looping sound effects via audio tag mingled with horrific imagery while animations are at play.
Click 'Start Perilous Game' to Enter
Navigate using your keyboard with the 'W' 'A' 'S' 'D' Keys
Press 'Space Bar' to stay still while Monsters move a tile
Lockers are designated 'Safe'
Monsters cannot navigate through Locker Safe Tiles
Monsters veer away when the players turn is spent inside a Locker
Hint: Monsters prefer a 'Down' 'Right' 'Up' 'Left' motion sequence


The counterpart to SubjectPresent. This constraint requires that a user isn't present (i.e. no-one is logged in).
SubjectNotPresent(new MyDeadboltHandler) { Action { Ok(accessOk()) } }
SubjectNotPresent(new MyUserlessDeadboltHandler) { Action { Ok(accessOk()) } }


Name of AWS EC2 auto scaling group used for managing instances in the selected ECS cluster.
Assuming the instances of your ECS cluster are associated with an auto scaling group, this
plugin can automatically scale your ECS cluster in and out (and thus prevent you paying for
idle EC2 instances). If you leave the autoscaling group empty (by selecting the blank/first
item in the dropdown list), autoscaling will not be enabled.
To make use of the auto scaling feature:
- Create an auto scaling group with a minimum of 0 instances and maximum of M instances (with M >= 1)
- Make sure the launch configuration associated with your auto scaling group correctly configures the ECS agent (new instances need to register with the ECS cluster; more info here)
- Make sure the configured IAM credentials for this plugin have permission to use the AWS auto scaling service
How does scale out work?
- When a job with a label matching an ECS template in your ECS cloud is added to the build queue, this plugin will check the ECS cluster for sufficient resources (memory + cpu as defined in your ECS cloud templates)
- If a running instance is found with sufficient resources, an ECS task will be started to run your job in a fresh docker based jenkins slave
- If no running instances have sufficient free resources (but the auto scaling group has less instances running than the maximum allowed), this plugin will launch an additional instance in your auto scaling group, wait until it's registered in your ECS cluster and launch an ECS task to execute your job.
- If no running instances have sufficient free resources and the auto scaling group is at it's maximum capacity, this plugin will sleep for a while and look again for free resources.
How does scale in work?
- Every ECS cloud defined will be actively monitored for idle instances (once per minute)
- When a running ECS instance is detected which is close to the next billing hour and this instance is currently idle (not running any ECS tasks), it will be put in ECS draining state (that means the ECS scheduler will not launch new tasks on this instance).
- A draining ECS instance will be terminated and removed from the auto scaling group; the amount of desired instances in the auto scaling group will be decreased by one.


ecosystem
population trends from
January
February
March
April
May
June
July
August
September
October
November
December
to
January
February
March
April
May
June
July
August
September
October
November
December


Arroyo Tapiado Mud Caves
The mud caves had been on my radar for quite some time, but it’s the kind of place that should only be visited in cool weather and when there is no recent or pending rainfall.
Those conditions were met one early spring weekend and so we headed out to the wondrous Anza Borrego desert. We arrived at sunset and it felt as if we had landed on another planet.
Once the sun was completely down it enhanced the sensation of clear stars combined with absolute silence. The stunning ancient mounds held the promise of untold secrets.
Making our camp here became a truly memorable and unique experience. The boys had a beat-box and flute jam session inside one of the caves during candlelight, while I watched and filmed.
The night was cold and windy but that didn’t stop us from exploring what truly felt like Mars or some other desert planet. Within the silence and solitude we were aware of the presence of mysticism and spirituality.
After all, these caves have been around for millions of years, and spent many of those years under sea!
We started the next day with a delicious cook-off which should be part of every camping trip in my opinion. I’m a firm believer that the best experiences touch on all senses! Once we were nourished we began exploring.
I will let the page speak for the caves mostly as I have already posted about them in detail. I will just say that if you do head out here, be safe, be overly-prepared for any type of scenario that can happen in the desert and be respectful of this land, leaving it for others as you found it.
Jacob’s Cave
This spot made it onto the list because of the journey, not the destination. What seemed like a mere 10 minute hike ended up being a 1 hour hike, with us blindingly attempting to track what we had seen from the highway through brush and no trail.
We did not prepare correctly for this trip and had no water for the hike back. It was just grueling. But lo and behold, we found a cave that is said to date back to the Kumeyaay days and was used for shelter.
We found a much easier way back, so who knows, maybe we’ll journey back another day and have a picnic!


About
The objective of a scientific production profile is to provide a bibliometric analysis of the scientific performance of regions. The scientific production profiles are generally based on a selected set of bibliometric indicators that aim to compare scientific performance across geographies (regions, but also countries).Scientific profiles and regional benchmarking of these profiles are important for the analysis of the context of a region as it facilitates a comparison of all aspects of a region’s performance in relation to science, main fields of science and specialisation patterns of regional academic systems. When benchmarked to other regions, it can be a valuable tool to identify weaknesses and strengths, and link them to overall regional performance.The elaboration of scientific profiles is based on Publication data.
The logical steps of the application, based on its methodological description are:
- Step 1. Visit Scopus to search for the publications within a city, region or country.
- Step 2. Extraction of the selected data in .csv format using the tools provided by Scopus.
- Step 3. Repeat Step 1 and Step 2 to download the data for all the regions the user is interested in.
- Step 4. Upload the previously extracted data to the Scientific Production Profile Application.
- Step 5. Report synthesis and regional scientific production profile overview.


Here is a little back ground. I am an electrical engineering technologist student who is doing the home energy monitor for my senior project, based on the design from the open energy monitor website. I chose to go with the emonTX and the nanode-RF base station, due to the limits of our schools production abilities needing to be through hole. The nanode-RF is going to be purchased from this website but due to the rules of my project i need to make one of the PCB boards and order the parts on my own. The PCB layout and parts are provided here http://solderpad.com/openenergymon/emontx/, however can someone help me with a more detailed parts list. For example what wattage rating is the resistors for the emonTX and any other pertinent information needed to order the right parts.
Re: Parts list for emonTX
As a electrical engineering student, can't you determine the component wattage/voltage etc yourself via the schematic (Ohms Law)??
Paul
Re: Parts list for emonTX
Engineering is all about foreseeing problems and planning. You need to get your engineering brain working and check that your chosen parts will fit mechanically too.
Re: Parts list for emonTX
Hi Paul, thanks for the reply. I would like to point out that I am a technologist student (2 year course) in Canada, not sure what the equivalent is in the UK or the rest of the world. That being said i am very familiar with Ohms law. Maybe the resistor wattage was not the best example. I would say it's a 1/4 W just based on the size. What i am looking for is serial numbers so I can make for certain that the parts i order will be exactly what was used in the design.
Re: Parts list for emonTX
The capacitors and resistors shouldn't be a problem. Things like the 2.1mm Power Socket and 3.5mm Jack Sockets would be helpful.
Re: Parts list for emonTX
I've assembled several emonTx V2.2 PCBs with oddball components from different sources, and they've all worked!
Re: Parts list for emonTX
Well surely the 2.1mm Power Socket and 3.5mm Jack Sockets will depend upon your PCB layout (which only you know - you are making it), as the main consideration with those 2 items is the mechanical, not electrical characteristics as per the post above from Robert.
Last post from me!
Paul
Re: Parts list for emonTX
Okay thank you all for the quick responses and support.


{{compound.code}}
| SMILES | {{compound.smiles}} |
|---|---|
| Molecular Weight | {{compound.mol_wt| floatformat:2 }} Da |
| TPSA | {{compound.tpsa | floatformat:2}} Å |
| LogP | {{compound.log_p | floatformat:2}} |
| Heavy Atom Count | {{compound.heavy_atom_count }} |
| Heavy Atom Molecular Weight | {{compound.heavy_atom_mol_wt | floatformat:2 }} Da |
| Number of NHs or OHs | {{compound.nhoh_count }} |
| Number of Nitrogens and Oxygens | {{compound.no_count }} |
| Number of Hydrogen Bond Acceptors | {{compound.num_h_acceptors }} |
| Number of Hydrogen Bond Donors | {{compound.num_h_donors }} |
| Number of Heteroatoms | {{compound.num_het_atoms }} |
| Number of Rotatable Bonds | {{compound.num_rot_bonds }} |
| Number of Valence Electrons | {{compound.num_val_electrons }} |
| Number of Rings | {{compound.ring_count }} |
| Locations: | {% for location in compound.locations.all %}
{% if location.library_plate.library.public%}
{{location.library_plate.library.name }}: {% if location.library_plate.name %}{{ location.library_plate.name }}{%endif%} ({{location.library_plate.barcode}}) : {{location.well}}
{%if not location.active %}(unavailable){% endif %} {% endif %} {%endfor%} |


Toggle navigation
Next Decade of SN-Cosmo
Home
Direction
Report
Participants
Agenda
Report of the Conference
To Be Done


cubeventures wiki
watch out for these baddies!!!
go home
landmines
Tanks
ufos
Turrets
sharks
bosses
Ready for a challenge?
The King landmine


Trap Damge Calculator
STATS
Base LV
Total INT
Total DEX
ATK
Refine ATK
SKILLS
Claymore
Landmine
Detonator
Trap Mastery
Trump Tamer
Result
Claymore
Claymore*
Claymore* x2
Claymore* x3
Claymore* x4
*With Detonate
Result
Landmine
Landmine*
Landmine* x2
*With Detonate


Information
This visualization displays pairwise relationships between samples depending on their percentage of
matching core clusters. This percentage threshold can be controlled via the slider to the left.
Upon changing the slider, hit the Update button to re-render the chart.
Use your mouse cursor to drag the network plot around, or your scroll-wheel to zoom in or out.
Holding your cursor down anywhere on the force plot will apply a slight force.


--- title: "Hello R Markdown" author: "Frida Gomam and Julien Colomb" date: 2015-07-23T21:13:14-05:00 categories: ["R"] tags: ["R Markdown", "plot", "regression"] ---
blog entries use the bookdown package, based on RMarkdown, itself using the markdown synthax. Some functions (like figure numbering) will only be available while building/serving the website, not when knitting the document.
This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.
You can embed an R code chunk like this:
summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
fit <- lm(dist ~ speed, data = cars)
fit
##
## Call:
## lm(formula = dist ~ speed, data = cars)
##
## Coefficients:
## (Intercept) speed
## -17.579 3.932
You can also use python code, using the reticulate package:
# This program adds two numbers
num1 = 1.5
num2 = 6.3
# Add two numbers
sum1 = float(num1) + float(num2)
# Display the sum
print('The sum of {0} and {1} is {2}'.format(num1, num2, sum1))
## The sum of 1.5 and 6.3 is 7.8
Note that values are kept from one R chunk to the next, but cannot be ported from python chunk into r chunks:
exists("fit")
## [1] TRUE
exists("sum1")
## [1] FALSE
You can also embed plots. See Figure 1 for example:
par(mar = c(0, 1, 0, 1))
pie(
c(280, 60, 20),
c('Sky', 'Sunny side of pyramid', 'Shady side of pyramid'),
col = c('#0292D8', '#F7EA39', '#C4B632'),
init.angle = -50, border = NA
)
This post is distributed over a CC0 license


|
SDLXX
1.0.0
Modern C++17 wrapper for SDL
|
SDLXX is a library that implements a modern C++17 interface to the widely used SDL library and its addons: SDL_image, SDL_mixer, SDL_net, SDL_ttf. It is designed to provide a type-safe low-level access to audio, keyboard, mouse, joystick, network and graphics hardware.
Here is an example of the game created using SDLXX:
There are some other projects on Github that aim to provide a similar functionality. Here are some examples:
Install IDE (VSCode or CLion preferred), Git, CMake 3.15+, vcpkg
1) Clone the repository, open it in VSCode and install all suggested extensions.
2) Go to VSCode preferences and set these parameters filling the vcpkg path:
3) Open CMake menu, right-click SDLXX/app/testgame/SDLXX_game and choose "Run in terminal".
1) Clone the repository, open it in CLion.
2) Go to CLion settings -> Build -> CMake
and add to CMake options:
-DCMAKE_TOOLCHAIN_FILE=PATH_TO_VCPKG_CMAKE_TOOLCHAIN_HERE
Copyright (C) 2019 Egor Makarenko
This software is provided 'as-is', without any express or implied warranty. See our LICENSE file for more information.


Good morning, Kitchener!
Colder today
by KitchenerToday StaffSunny.
Becoming a mix of sun and cloud near noon.
Our high is -4C (-19 in the morning with the wind chill and -10 in the afternoon).
Tonight, clear with a low of -9C.
Don't forget to check out the latest gas prices, which are also listed on this page.