| Contents | Previous | Next | Java Management Extensions (JMX) Technology Tutorial |
The Java Management Extensions (JMX) specification defines three bindings to lookup services, using existing lookup technologies, as described in the following sections:
The lookup services allow JMX technology clients to find and connect to connector servers that have registered with the lookup services.
As shown simply in Section "Accessing Standard and Dynamic MBeans via the RMI Connector", if you are using remote method invocation (RMI) connectors, you can choose to use an external directory to register the connector server stubs you want to look up. The following cases are presented in the lookup service examples relating to RMI connectors:
If you choose to register the RMI connector stubs in an external directory, some initial configuration is required, to set up your RMI registry, CORBA naming service or LDAP server. If you do not use an external directory, the RMI connector stub is encoded into the JMX service URL.
The following sections describe the external directories that you can use in conjunction with the lookup service examples that use RMI connectors. These external directories are referred to when running the three examples of lookup services that are given in the subsequent sections in this chapter.
To register the RMI connector server stubs in an external RMI registry, for use by connectors implementing the JRMP transport, perform the following actions:
As was the case in Chapter 3, "JMX Connectors", the RMI registry is used to store the RMI connector stubs for RMI connectors implementing the JRMP transport.
$
rmiregistry 9999 &
To shorten the commands that you will type when
you run the examples, set the service URL for the RMI registry as
an environment variable, jndirmi
. In
these examples, the service URL is given in JNDI form. See the API
documentation for the javax.management.remote.rmi
package for an
explanation of JNDI form. If you want to run the external
directories on a machine other than the local machine, you must
specify that machine’s host name instead of localhost.
$
jndirmi="rmi://localhost:9999"
To register the RMI connector server stubs in an external CORBA naming service, for use by connectors implementing the IIOP transport, perform the following actions:
RMI connectors that implement the IIOP transport can use CORBA naming to identify the RMI connector stub.
$
orbd -ORBInitialPort 7777 &
To shorten the commands that you type when you run the examples, set the service URL for the CORBA naming service as an environment variable, jndiiiop. In these examples, the service URL is given in JNDI form. If you want to run the external directories on a machine other than the local machine, you must specify that machine’s host name instead of localhost.
$
jndiiiop="iiop://localhost:7777"
To register the RMI connector server stubs in an external LDAP registry, for use by connectors implementing either of the JRMP or IIOP transports, perform the following actions:
The LDAP server you use is your choice, although the schema for representing Java objects in an LDAP directory must be known to the server. See the relevant Request For Comments (RFC) document for details:
http://www.ietf.org/rfc/rfc2713.txt
These examples require that you create the following domain component suffix:
dc=Test
See the documentation accompanying your LDAP server for details of how to configure the server and create this suffix.
These variables are used to shorten the commands you type when starting the Server and Client classes in the lookup service examples that register RMI connector stubs in the external LDAP server.
$
ldaphost=ldap_host
$
ldapport=ldap_port
$
principal=”cn=Directory Manager”
Supply the password for your LDAP server.
$
credentials=your_ldap_password
In this example, the service URL for the LDAP server is given in JNDI form and is identified by the variable jndildap.
$
jndildap="ldap://$ldaphost:$ldapport"
The JMX technology specifies how to register RMI connectors with the SLP lookup service.
The purpose of this example is to demonstrate how a JMX Remote API connector client can find and connect to a connector server that has registered with the SLP lookup service. This example performs the following operations:
This example assumes that you are already familiar
with SLP
technology. The code provided for this example conforms to Sun
Microsystems’ implementation of SLP, as defined by RFC 2614
(see http://www.ietf.org/rfc/rfc2614.txt).
Sun Microsystems’ implementation of SLP is available in the
Solaris operating environment in the directory/usr/share/lib/slp
. If you are not running the
Solaris operating environment, you must obtain a version of SLP
that is compliant with RFC 2614, section 5. You can download the
OpenSLP Java implementation from http://www.openslp.org/.
The SLP lookup example is contained in the
directory work_dir/jmx_examples/Lookup/slp
.
/jmx_examples/Lookup/slp
.
Inside this directory, you will find the following files:
*.java
files in a text
editor.
These classes will be analyzed in the following sections.
The following sections analyze each of the classes used in the SLP lookup example, and explain how they perform the operations described above.
Server.java
and Client.java
to import your version of the SLP Java
classes instead of the com.sun.slp
package. See RFC 2614, section 5.
Due to its size, the SLP lookup service
Server.java
class is shown as a series
of code excerpts. For explanations of the SLP code used in this
example, see RFC 2614 and the API documentation for SLP.
public class Server { public final static int JMX_DEFAULT_LEASE = 300; public final static String JMX_SCOPE = "DEFAULT"; private final MBeanServer mbs; public Server() { mbs = MBeanServerFactory.createMBeanServer(); } [...]
CODE EXAMPLE 4-1 sets the
default SLP lease JMX_DEFAULT_LEASE
to a
default lease of 300 seconds, corresponding to the length of time
the URL will be registered, and shows the initial creation of the
MBean server mbs
.
In code that is not shown here, you then define an
SLP advertiser slpAdvertiser
, and an SLP
service URL url
. The slpAdvertiser
is used to register the service URL in
the SLP lookup service. The SCOPE
and
the agentName
are registered in SLP as
lookup attributes.
[...] public static void register(JMXServiceURL jmxUrl, String name) throws ServiceLocationException { ServiceURL serviceURL = new ServiceURL(jmxUrl.toString(), JMX_DEFAULT_LEASE); debug("ServiceType is: " + serviceURL.getServiceType()); Vector attributes = new Vector(); Vector attrValues = new Vector(); attrValues.add(JMX_SCOPE); ServiceLocationAttribute attr1 = new ServiceLocationAttribute("SCOPE", attrValues); attributes.add(attr1); attrValues.removeAllElements(); attrValues.add(name); ServiceLocationAttribute attr2 = new ServiceLocationAttribute("AgentName", attrValues); attributes.add(attr2); final Advertiser slpAdvertiser = ServiceLocationManager.getAdvertiser(Locale.US); slpAdvertiser.register(serviceURL, attributes); } [...]
CODE EXAMPLE 4-2 shows the registration of the JMX connector server’s URL with the SLP lookup service.
The JMX service URL jmxUrl
is the address of the connector server, and
is obtained by a call to the getAddress()
method of JMXConnectorServer
when the connector server is
started.
The SLP lookup attributes, namely the scope and
the agent name under which the connector server address is to be
registered (name
), are then specified by
the SLP class ServiceLocationAttribute
.
The AgentName
attribute is mandatory,
but other optional attributes, such as ProtocolType
, AgentHost
,
and Property
can also be registered in
the SLP lookup service.
Finally, the JMX connector server address is
registered in the SLP service with a call to the register()
method of the Advertiser
interface, with the serviceURL
and the attributes
passed in as parameters.
[...] public JMXConnectorServer rmi(String url) throws IOException, JMException, NamingException, ClassNotFoundException, ServiceLocationException { JMXServiceURL jurl = new JMXServiceURL(url); final HashMap env = new HashMap(); // Environment map attributes [...] JMXConnectorServer rmis = JMXConnectorServerFactory.newJMXConnectorServer(jurl, env, mbs); final String agentName = System.getProperty("agent.name", "DefaultAgent"); start(rmis, agentName); return rmis; } [...]
CODE EXAMPLE 4-3 shows the
creation of an RMI connector server. The JMX service URL
jurl
is constructed from the string
url
that is
included in the command used to launch the Server
at the command line. An RMI connector server
named rmis
is then created with the
system properties defined by the environment map
and the address jurl
.
The connector server is then started, and the RMI
connector server address is registered in the SLP lookup service
under the name agentName
.
[...] public void start(JMXConnectorServer server, String agentName) throws IOException, ServiceLocationException { server.start(); final JMXServiceURL address = server.getAddress(); register(address,agentName); } [...]
CODE EXAMPLE 4-4 shows the
launching of the connector server server
and the registration of server
in the
SLP lookup service with the given address address
.
The SLP lookup service Client.java
class is shown in CODE EXAMPLE 4-1, CODE EXAMPLE 4-2, and
CODE EXAMPLE 4-3:
public class Client { public final static String JMX_SCOPE = "DEFAULT"; public static Locator getLocator() throws ServiceLocationException { final Locator slpLocator = ServiceLocationManager.getLocator(Locale.US); return slpLocator; } public static List lookup(Locator slpLocator, String name) throws IOException, ServiceLocationException { final ArrayList list = new ArrayList(); Vector scopes = new Vector(); scopes.add(JMX_SCOPE); String query = "(&(AgentName=" + ((name!=null)?name:"*") + "))"; ServiceLocationEnumeration result = slpLocator.findServices(new ServiceType("service:jmx"), scopes, query); while(result.hasMoreElements()) { final ServiceURL surl = (ServiceURL) result.next(); JMXServiceURL jmxUrl = new JMXServiceURL(surl.toString()); try { JMXConnector client = JMXConnectorFactory.newJMXConnector(jmxUrl,null); if (client != null) list.add(client); } catch (IOException x ) { [...] } } } return list; }
CODE EXAMPLE 4-1 first of all
obtains the SLP service Locator
by
calling the getLocator
method of the SLP
class ServiceLocationManager
.
Client
then retrieves all the connector
servers registered in the SLP service under a given agent name, or
under agent names that match a certain pattern. If no agent name is
specified when the Client
is started,
all agent names will be considered.
A JMX technology service URL, jmxUrl
, is generated for each of the agents
retrieved by SLP, with each agent’s SLP service URL,
surl
, passed as a parameter into the
JMXServiceURL
instance. The URL
jmxUrl
is then passed to the
newJMXConnector()
method of JMXConnectorFactory
, to create a new connector
client named client
for each agent that
is registered in the SLP service.
The connector clients retrieved are stored in an
array list called list
.
public static void listMBeans(MBeanServerConnection server) throws IOException { final Set names = server.queryNames(null,null); for (final Iterator i=names.iterator(); i.hasNext(); ) { ObjectName name = (ObjectName)i.next(); System.out.println("Got MBean: "+name); try { MBeanInfo info = server.getMBeanInfo((ObjectName)name); MBeanAttributeInfo[] attrs = info.getAttributes(); if (attrs == null) continue; for (int j=0; j<attrs.length; j++) { try { Object o = server.getAttribute(name,attrs[j].getName()); System.out.println("\t\t" + attrs[j].getName() + " = "+o); } catch (Exception x) { System.err.println("JmxClient failed to get " + attrs[j].getName() + x); x.printStackTrace(System.err); } } }
In CODE EXAMPLE 4-2, a reference
to the MBeanServerConnection
is
retrieved for every connector client that is created from the
connector server address stored in the SLP service. A list of all
the MBeans and their attributes is retrieved.
public static void main(String[] args) { try { final String agentName = System.getProperty("agent.name"); final Locator slpLocator = getLocator(); List l = lookup(slpLocator,agentName); int j = 1; for (Iterator i=l.iterator();i.hasNext();j++) { JMXConnector c1 = (JMXConnector) i.next(); if (c1 != null) { try { c1.connect(env); } catch (IOException x) { System.err.println ("Connection failed: " + x); x.printStackTrace(System.err); continue; } MBeanServerConnection conn = c1.getMBeanServerConnection(); try { listMBeans(conn); } catch (IOException x) { x.printStackTrace(System.err); } try { c1.close(); } catch (IOException x) { x.printStackTrace(System.err); } } } } catch (Exception x) { x.printStackTrace(System.err); } }
In CODE EXAMPLE 4-3, the
agent.name
property is retrieved by
calling the getProperty()
method of the
System
class, and the SLP lookup service
is found by calling the getLocator()
method of Locator
.
All the agents named agentName
are then looked up, and connections are
made to the agents discovered. If no agent is specified, then all
agents are lookup up. Connections are made to the MBean server
created by Server
, and all the MBeans in
it are listed, before the connection is closed down.
In addition to the actions you performed in Section "Initial Configuration", before you can run the lookup service examples that use the SLP, you must perform some further initial actions that are specific to this example. You can then start looking up connectors using SLP in conjunction with the two connectors supported by the JMX technology.
When you run the examples, to help you keep track
of which agent has been created with which transport, the agent
names include a letter suffix that is the same as the lettering of
the corresponding section. For example, the agent from Section a. "RMI connector over JRMP,
without an external directory" is called
example-server-a
.
The following steps are required by all of the different transports you can run in this example.
In addition to the common environment variables that were set in Section "Initial Configuration", you need to add the path to the SLP service. If you are using the Solaris operating environment, add the following variable:
$
SLPLIB=/usr/share/lib/slp
If you are using another platform, set
SLPLIB
appropriately for the platform
you are using.
classp
environment variable.
This example requires a classpath that includes the Java archive (JAR) files for SLP.
$
classp=$SLPLIB/slp.jar
Client
and
Server
classes.
Type the following command:
$
javac -d . -classpath $classp Server.java
Client.java
If you are using the Solaris operating environment, type the following command, which requires you to know your super user password:
$
su root -c "java -cp $SLPLIB/slpd.jar
com.sun.slp.slpd &"
Password:
[type superuser
password]
If you are not running a Solaris system, start the SLP daemon according to the implementation of SLP you are using.
This example demonstrates the use of the SLP lookup service to look up RMI connector servers that use RMI’s default transport, JRMP, as well as the IIOP transport. In addition, as described in Section "Initial Configuration", different external directories are used to register the RMI connector stubs.
The combinations of transports and external directories demonstrated here are:
Perform the following steps to run the example:
Server
.
The command you use to start the Server
varies according to which external directory
you are using. You can start one or more of the following instances
of Server
with different transports and
external registries before starting the Client
.
Start Server
by typing
the following command:
$ java -classpath .:$classp -Ddebug=true \ -Dagent.name=example-server-a \ -Durl ="service:jmx:rmi://" \ slp.Server &
In this command:
debug
is set to true to provide more
complete screen output when the Server
runsexample-server-a
When Server is launched, you will see confirmation of the creation of the RMI connector, and the registration of its URL in the SLP service.
Start Server
by typing
the following command:
$ java -classpath .:$classp -Ddebug=true \ -Dagent.name=example-server-b \ -Durl="service:jmx:rmi:///jndi/${jndirmi}/server" \ slp.Server &
In this command:
example-server-b
When Server
is
launched, you will see confirmation of the creation of the RMI
connector, and the registration of its URL in the SLP service.
Start Server
by typing
the following command:
$ java -classpath .:$classp -Ddebug=true \ -Dagent.name=example-server-c \ -Durl="service:jmx:rmi:///jndi/${jndildap}/cn=x,dc=Test" \ -Djava.naming.security.principal="$principal" \ -Djava.naming.security.credentials="$credentials" \ slp.Server &
In this command:
example-server-c
jndildap
in Section
"Initial Configuration".Test
domain component in the LDAP server.principal
and password credentials
are given to
gain access to the LDAP server.When Server
is
launched, you will see confirmation of the creation of the RMI
connector, and the registration of its URL in the SLP service under
the agent name example-server-c
.
Start Server
by typing
the following command:
$ java -classpath .:$classp -Ddebug=true \ -Dagent.name=example-server-d \ -Durl="service:jmx:iiop://" \ slp.Server &
In this command:
example-server-d
When the Server
is
launched, you will see confirmation of the creation of the RMI
connector, and the registration of its automatically generated URL
in the SLP service.
Start Server
by typing
the following command:
$ java -classpath .:$classp -Ddebug=true \ -Dagent.name=example-server-e \ -Durl="service:jmx:iiop:///jndi/${jndiiiop}/server" \ slp.Server &
In this command:
example-server-e
server
is stored is the CORBA naming
service you identified as jndiiiop
in
Section "Initial
Configuration"When Server
is
launched, you will see confirmation of the creation of the RMI
connector, and the registration of its URL in the SLP service under
the name example-server-e
.
Start Server
by typing
the following command:
$ java -classpath .:$classp -Ddebug=true \ -Dagent.name=example-server-f \ -Durl="service:jmx:iiop:///jndi/${jndildap}/cn=x,dc=Test" \ -Djava.naming.security.principal="$principal" \ -Djava.naming.security.credentials="$credentials" \ slp.Server &
In this command:
example-server-f
jndildap
in Section
"Initial Configuration".Test
domain component in the LDAP server.principal
and password credentials
are given to
gain access to the LDAP server.When Server
is launched, you will see confirmation of the creation of the RMI
connector, and the registration of its URL in the SLP service under
the agent name example-server-f
.
Client
.After starting the Server
using the transport and external directory of
your choice, start the Client
:
$
java -classpath .:$classp -Ddebug=true \
-Djava.naming.security.principal="$principal" \
-Djava.naming.security.credentials="$credentials" \
slp.Client
You will see output confirming the detection of
the agents created by the Server
and
registered in the lookup service. You will also see the
identification and confirmation of the connection made to the
agents.
To look up a specific agent, type the following command:
$ java -classpath .:$classp -Ddebug=true \ -Djava.naming.security.principal="$principal" \ -Djava.naming.security.credentials="$credentials" \ -Dagent.name="agentName" \ slp.Client
In the command shown above, agentName is the name of the agent you want to
look up. You can also specify a partial agent name by using
*
; for example, x*
for all agent names beginning with the letter
x.
The purpose of this example is to demonstrate how a JMX technology connector client can find and connect to a connector server that has registered with the Jini lookup service. This example performs the following operations:
The Jini lookup service example is contained in
the directory work_dir/jmx_examples/Lookup/jini
.
/jmx_examples
/Lookup/jini
directory.
Inside this directory, you will find the following files:
These classes will be analyzed in the following sections.
The following sections analyze each of the classes used in the Jini lookup service example, and explain how they perform the operations described above.
Due to its size, the Jini lookup service
Server.java
class is shown as a series
of code excerpts.
public class Server { private final MBeanServer mbs; private static boolean debug = false; public Server() { mbs = MBeanServerFactory.createMBeanServer(); } [...]
CODE EXAMPLE 4-1 shows the
creation of an MBean server mbs
. As was
the case for the SLP examples, the JMX service URL and the agent
name are passed to Server
when it is
launched at the command line.
[...] public JMXConnectorServer rmi(String url) throws IOException, JMException, ClassNotFoundException { JMXServiceURL jurl = new JMXServiceURL(url); final HashMap env = new HashMap(); // Environment map attributes [...] JMXConnectorServer rmis = JMXConnectorServerFactory.newJMXConnectorServer(jurl, env, mbs); final String agentName = System.getProperty("agent.name", "DefaultAgent"); start(rmis,env,agentName); return rmis; } [...]
CODE EXAMPLE 4-2 shows the
creation of an RMI connector server named rmis
, using the system properties defined by the
environment map env
and the address
jurl
.
The RMI connector server rmis
is started. The RMI connector server address is
registered in the Jini lookup service under the name agentName
.
[...] public void start(JMXConnectorServer server, Map env, String agentName) throws IOException, ClassNotFoundException { server.start(); final ServiceRegistrar registrar=getRegistrar(); final JMXConnector proxy = server.toJMXConnector(env); register(registrar,proxy,agentName); } public static ServiceRegistrar getRegistrar() throws IOException, ClassNotFoundException, MalformedURLException { final String jurl = System.getProperty("jini.lookup.url","jini://localhost"); final LookupLocator lookup = new LookupLocator(jurl); final ServiceRegistrar registrar = lookup.getRegistrar(); if (registrar instanceof Administrable) debug("Registry is administrable."); return registrar; } public static ServiceRegistration register(ServiceRegistrar registrar, JMXConnector proxy, String name) throws IOException { Entry[] serviceAttrs = new Entry[] { new net.jini.lookup.entry.Name(name) }; System.out.println("Registering proxy: AgentName=" + name ); debug("" + proxy); ServiceItem srvcItem = new ServiceItem(null, proxy, serviceAttrs); ServiceRegistration srvcRegistration = registrar.register(srvcItem, Lease.ANY); debug("Registered ServiceID: " + srvcRegistration.getServiceID().toString()); return srvcRegistration; } [...]
CODE EXAMPLE 4-3 shows the
creation of a connector server named server
with the environment map env
and the service URL jurl
. The connector server instance server then gets
a pointer to the Jini lookup service by calling the Jini lookup
service method LookupLocator.getRegistrar()
.
The connector server is registered in the Jini
lookup service in the form of a proxy, using the Jini lookup
service locator registrar
and the agent
name under which the connector server will be registered. The proxy
is in fact a client stub for the connector server, obtained by a
call to the toJMXConnector()
method of
JMXConnectorServer
.
The registration itself is performed by a call to
the register()
method of the Jini lookup
service class ServiceRegistrar
, with an
array of service items.
The Jini lookup service example class Client.java
is shown in CODE EXAMPLE 4-1.
public class Client { private static boolean debug = false; public static ServiceRegistrar getRegistrar() throws IOException, ClassNotFoundException, MalformedURLException { final String jurl = System.getProperty("jini.lookup.url","jini://localhost"); final LookupLocator lookup = new LookupLocator(jurl); final ServiceRegistrar registrar = lookup.getRegistrar(); if (registrar instanceof Administrable) debug("Registry is administrable."); return registrar; } public static List lookup(ServiceRegistrar registrar, String name) throws IOException { final ArrayList list = new ArrayList(); final Class[] classes = new Class[] {JMXConnector.class}; final Entry[] serviceAttrs = new Entry[] { new net.jini.lookup.entry.Name(name) }; ServiceTemplate template = new ServiceTemplate(null,classes,serviceAttrs); ServiceMatches matches = registrar.lookup(template, Integer.MAX_VALUE); for(int i = 0; i < matches.totalMatches; i++) { debug("Found Service: " + matches.items[i].serviceID); if (debug) { if (matches.items[i].attributeSets != null) { final Entry[] attrs = matches.items[i].attributeSets; for (int j = 0; j < attrs.length ; j++) { debug("Attribute["+j+"]=" + attrs[j]); } } } if(matches.items[i].service != null) { JMXConnector c = (JMXConnector)(matches.items[i].service); debug("Found a JMXConnector: " + c); list.add(c); } } return list; } [...]
CODE EXAMPLE 4-1 shows how
the connector client obtains a pointer to the Jini lookup service
with a call to lookup.getRegistrar()
.
The client then obtains the list of the connectors registered as
entries in the Jini lookup service with the agent name name
. Unlike in the SLP example, the agent name you
pass to Client
when it is launched must
be either an exact match of an existing agent name, or null, in
which case the Jini lookup service will look up all the agents.
Once the list of connectors has been obtained, in
code that is not shown here, the client connects to the MBean
server started by Server
, and retrieves
the list of all the MBeans registered in it.
The java.policy
file is
a Java technology security policy file, configured for this
example.
A template Jini networking technology properties
file, to be configured for this example. Change
@INSTALL_HOME_FOR_JINI@ and rename the file to jini.properties
.
In addition to the actions you performed in Section "Initial Configuration", before you can run the lookup service examples that use the Jini lookup service, you must perform some further initial actions that are specific to this example. You can then start looking up connectors using the Jini network technology, in conjunction with the connector supported by the JMX technology.
When you run the examples, to help you keep track
of which agent has been created with which transport, the agent
names include a letter suffix that is the same as the lettering of
the corresponding section. For example, the agent from Section a. "RMI connector over JRMP,
without an external directory." is called
example-server-a
.
The following steps are required by all of the different transports you can run in this example.
In addition to the common environment variables that you set in Section "Initial Configuration" you can add the path to the Jini lookup service. The directory where you have installed the Jini networking technology is referred to as jini_dir.
$
JINI_HOME=jini_dir
$
JINILIB=$JINI_HOME/lib
classp
environment
variable.
This example requires the JAR files for the Jini lookup services core and extensions.
$
classp=$JINILIB/jini-core.jar:$JINILIB/jini-ext.jar
jini.properties
file.
A properties file for Solaris, Linux, or Mac OS X platforms is provided in the same directory as the classes for this example. If you are not running a Solaris, Linux, or Mac OS X platform, you can obtain a properties file for your platform in the following directory:
$JINI_HOME/example/launcher/jini12_<platform>.properties
jini.properties
file.
You must complete the file to include all the necessary paths, host names and port numbers for your system. Even if you are not running a Solaris, Linux, or Mac OS X platform, you can use the template provided as a guide.
StartService
.
$
java -cp $JINILIB/jini-examples.jar
com.sun.jini.example.launcher.StartService &
This will open the StartService
graphical user interface.
jini.properties
file into
StartService
.
Click on ‘File’, ‘Open Property
File’ and then select your properties file from within
work_dir/jmx_examples
/Lookup/jini.
Start the required Jini lookup services by clicking on the ‘Run’ tab and then pressing the ‘START’ button for each of the following:
You will see confirmation that the services are running.
Client
and Server
classes.
Type the following command:
$
javac -d . -classpath $classp Server.java
Client.java
This example demonstrates the use of the Jini lookup service to look up RMI connector servers that use RMI’s default transport, JRMP, as well as the IIOP transport. In addition, as described in Section "Initial Configuration", different external directories are used to register the RMI connector stubs.
The combinations of transports and external directories demonstrated here are:
Server
.
The command you use to start the Server
varies according to which external directory
you are using. You can start one or more of the following instances
of Server
with different transports and
external registries before starting the Client
.
Start Server by typing the following command:
$ java -classpath .:$classp -Ddebug=true \ -Dagent.name=example-server-a \ -Durl="service:jmx:rmi://" \ -Djava.security.policy=java.policy \ jini.Server &
In this command:
debug
is set to true
to provide more complete screen output when the
Server
runs.example-server-a
.When Server
is
launched, you will see confirmation of the creation of the RMI
connector, and the registration of its URL in the Jini lookup
service.
Start Server by typing the following command:
$ java -classpath .:$classp -Ddebug=true \ -Dagent.name=example-server-b \ -Durl="service:jmx:rmi:///jndi/${jndirmi}/server" \ -Djava.security.policy=java.policy \ jini.Server &
In this command:
example-server-b
.server
, is stored is the RMI registry
you identified as jndirmi
in Section
"Initial Configuration".When Server
is
launched, you will see confirmation of the creation of the RMI
connector, and the registration of its URL in the Jini lookup
service.
Start Server
by typing
the following command:
$ java -classpath .:$classp -Ddebug=true \ -Dagent.name=example-server-c \ -Durl="service:jmx:rmi:///jndi/${jndildap}/cn=x,dc=Test" \ -Djava.security.policy=java.policy \ -Djava.naming.security.principal="$principal" \ -Djava.naming.security.credentials="$credentials" \ jini.Server &
In this command:
example-server-c
.The service URL specifies the
chosen connector as RMI over JRMP, and the external directory in
which the RMI connector stub is stored is the LDAP server you
identified as jndildap
in Section
"Initial Configuration".Test
domain component in the LDAP server.principal
and password credentials
are given to
gain access to the LDAP server.When Server
is
launched, you will see confirmation of the creation of the RMI
connector, and the registration of its URL in the Jini lookup
service under the agent name example-server-c
.
Start Server
by typing
the following command:
$ java -classpath .:$classp -Ddebug=true \ -Dagent.name=example-server-d \ -Durl="service:jmx:iiop://" \ -Djava.security.policy=java.policy \ jini.Server &
In this command:
example-server-d
When the Server
is
launched, you will see confirmation of the creation of the RMI
connector, and the registration of its automatically generated URL
in the Jini lookup service.
Start Server
by typing
the following command:
$ java -classpath .:$classp -Ddebug=true \ -Dagent.name=example-server-e \ -Durl="service:jmx:iiop:///jndi/${jndiiiop}/server" \ -Djava.security.policy=java.policy \ jini.Server &
In this command:
example-server-e
.server
, is stored is the CORBA naming
service you identified as jndiiiop
in
Section "Initial
Configuration".When Server
is
launched, you will see confirmation of the creation of the RMI
connector, and the registration of its URL in the Jini lookup
service under the name example-server-e
.
Start Server by typing the following command:
$ java -classpath .:$classp -Ddebug=true \ -Dagent.name=example-server-f \ -Durl="service:jmx:iiop:///jndi/${jndildap}/cn=x,dc=Test" \ -Djava.security.policy=java.policy \ -Djava.naming.security.principal="$principal" \ -Djava.naming.security.credentials="$credentials" \ jini.Server &
In this command:
example-server-f
.jndildap
in Section
"Initial Configuration".Test
domain component in the LDAP server.principal
and password credentials
are given to
gain access to the LDAP server.When Server
is launched, you will see confirmation of the creation of the RMI
connector, and the registration of its URL in the Jini lookup
service under the agent name example-server-f
.
Client
.After starting the Server
using the transport and external directory of
your choice, start the Client
:
You will see output confirming the detection of
the agents created by the Server
and
registered in the lookup service. You will also see the
identification and confirmation of the connection made to the
agents.
To look up a specific agent, you can do so by typing the following command:
$ java -classpath .:$classp -Ddebug=true \ -Djava.security.policy=java.policy \ -Dagent.name=agentName \ jini.Client
In the command shown above, agentName is the name of the agent you want to
look up. You can also specify a partial agent name by using
*
; for example, x*
for all agent names beginning with the letter
x
.
JMX technology allows you to register RMI connectors with a JNDI lookup service using an LDAP registry as a back end. This example performs the following operations:
The JNDI/LDAP lookup example is contained in the
directory work_dir/jmx_examples/Lookup/ldap
.
/jmx_examples/Lookup/ldap
directory.
Inside this directory, you will find the following files:
These classes will be analyzed in the following sections.
The following sections analyze each of the classes used in the JNDI/LDAP lookup service example, and explain how they perform the operations described above.
Due to its size, the JNDI/LDAP lookup service
Server.java
class is shown as a series
of code excerpts.
[...] public class Server { public final static int JMX_DEFAULT_LEASE = 60; private static boolean debug = false; private final MBeanServer mbs; public Server() { mbs = MBeanServerFactory.createMBeanServer(); } public static DirContext getRootContext() throws NamingException { final Hashtable env = new Hashtable(); final String factory = System.getProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); final String ldapServerUrl = System.getProperty(Context.PROVIDER_URL); final String ldapUser = System.getProperty(Context.SECURITY_PRINCIPAL, "cn=Directory Manager"); final String ldapPasswd = System.getProperty(Context.SECURITY_CREDENTIALS); debug(Context.PROVIDER_URL + "=" + ldapServerUrl); debug(Context.SECURITY_PRINCIPAL + "=" + ldapUser); if (debug) { System.out.print(Context.SECURITY_CREDENTIALS + "="); final int len = (ldapPasswd==null)?0:ldapPasswd.length(); for (int i=0;i<len;i++) System.out.print("*"); System.out.println(); } env.put(Context.INITIAL_CONTEXT_FACTORY,factory); env.put(Context.SECURITY_PRINCIPAL, ldapUser); if (ldapServerUrl != null) env.put(Context.PROVIDER_URL, ldapServerUrl); if (ldapPasswd != null) env.put(Context.SECURITY_CREDENTIALS, ldapPasswd); InitialContext root = new InitialLdapContext(env,null); return (DirContext)(root.lookup("")); } [...]
CODE EXAMPLE 4-1 shows the
initial creation of an MBean server mbs
,
and the obtention of a pointer to the root context of the LDAP
directory tree in which the connector server address is to be
registered. All the relevant LDAP access variables, such as the
provider URL, the LDAP user name and the security credentials, are
given here and passed into the environment map env
. The environment map env
is then passed as a parameter into a call to
InitialLdapContext
, from which the
initial LDAP context is obtained.
Code that is omitted from CODE EXAMPLE 4-1 retrieves the agent name under which the connector will be registered in the LDAP server.
[...] public static void register(DirContext root, JMXServiceURL jmxUrl, String name) throws NamingException, IOException { final String mydn = System.getProperty("dn","cn="+name); debug("dn: " + mydn ); Object o = null; try { o = root.lookup(mydn); } catch (NameNotFoundException n) { Attributes attrs = new BasicAttributes(); Attribute objclass = new BasicAttribute("objectClass"); objclass.add("top"); objclass.add("javaContainer"); objclass.add("jmxConnector"); attrs.put(objclass); attrs.put("jmxAgentName", name); o = root.createSubcontext(mydn,attrs); } if (o == null) throw new NameNotFoundException(); final Attributes attrs = root.getAttributes(mydn); final Attribute oc = attrs.get("objectClass"); if (!oc.contains("jmxConnector")) { final String msg = "The supplied node [" + mydn + "] does not contain the jmxConnector objectclass"; throw new NamingException(msg); } final Attributes newattrs = new BasicAttributes(); newattrs.put("jmxAgentName",name); newattrs.put("jmxServiceURL",jmxUrl.toString()); newattrs.put("jmxAgentHost",InetAddress.getLocalHost().getHostName()); newattrs.put("jmxProtocolType",jmxUrl.getProtocol()); newattrs.put("jmxExpirationDate", getExpirationDate(JMX_DEFAULT_LEASE)); root.modifyAttributes(mydn,DirContext.REPLACE_ATTRIBUTE,newattrs); } [...]
CODE EXAMPLE 4-2 shows the
registration of JMX connector server service URL in the LDAP
directory. The DN where the URL will be registered can be passed on
the command line through the dn
System
property, that is, -Ddn=
mydn (see later the commands used start the
server). If the dn
System property is
not specified, then you can use the DN: cn=
name where name is the agentName
.
Naturally, this is not mandatory. The location where the URL is
registered does not really matter, because the client code never
uses that DN directly, but instead performs an LDAP search to find
the nodes which have an auxiliary jmxConnector
ObjectClass
.
What is important here is that each URL is registered in its own
LDAP node. How to name these nodes is left to the LDAP
administrator, who in this case is you. In this example, it is
assumed that you have configured your LDAP server by creating a
root
context under which the node
cn=
name can
be created, and that this root
context
has been passed to the LDAP initial context through the
Context.PROVIDER_URL
property (see
CODE EXAMPLE 4-1).
The code shown in CODE EXAMPLE 4-2 checks
whether the node in which you will register the server URL already
exists. If it does not, you try to create it (this will fail if the
parent node does not exist). Since the jmxConnector
ObjectClass
is a simple auxiliary class, you will use the javaContainer ObjectClass
as structural class if you
need to create a new context. Once again, this is completely
optional. Any structural class to which the jmxConnector
auxiliary class could be added would be
acceptable. It then checks whether the node in which you will
register the server already has the jmxConnector
auxiliary class. If not, an exception
is thrown.
At this point you are sure that the node in which
you will register the URL exists, and has the appropriate
jmxConnector
auxiliary class. So you
need only to replace the values of the attributes defined by JMX
Remote API for LDAP lookup (see jmx-schema.txt
):
jmxServiceUrl
: contains the
String
form of the server URL, as
obtained from server.getAddress()
after
the server was startedjmxAgentName
: contains the JMX agent
namejmxProtocolType
: contains the JMX
protocol type, as returned by jmxUrl.getProtocolType()
jmxAgentHost
: contains the name of
the agent hostjmxExpirationDate
: contains the date
at which the URL will be considered obsolete.[...] public JMXConnectorServer rmi(String url) throws IOException, JMException, NamingException, ClassNotFoundException { JMXServiceURL jurl = new JMXServiceURL(url); final HashMap env = new HashMap(); // Prepare the environment Map [...] JMXConnectorServer rmis = JMXConnectorServerFactory.newJMXConnectorServer(jurl, env, mbs); final String agentName = System.getProperty("agent.name", "DefaultAgent"); start(rmis,env,agentName); return rmis; } [...]
In CODE EXAMPLE 4-3, a new RMI
connector server named rmis
is created
with the JMX service URL jurl
and the
appropriate LDAP properties passed to its environment map
env
. The connector server rmis
is launched by calling JMXConnectorServer.start()
and is registered in the
LDAP server.
[...] public void start(JMXConnectorServer server, Map env, String agentName) throws IOException, NamingException { server.start(); final DirContext root=getRootContext(); final JMXServiceURL address = server.getAddress(); register(root,address,agentName); } [...]
CODE EXAMPLE 4-4 shows the
creation of a JMX connector server server
, the obtention of a pointer to the LDAP
server root directory root
and the
creation of a URL for server
named
address
. The root directory, the URL and
an agent name are passed as parameters to register()
and are registered in the LDAP
server.
The JNDI/LDAP lookup service Client.java
class is shown in CODE EXAMPLE 4-1.
[...] public class Client { private static boolean debug = false; public static void listAttributes(DirContext root, String dn) throws NamingException { final Attributes attrs = root.getAttributes(dn); System.out.println("dn: " + dn); System.out.println("attributes: " + attrs); } public static DirContext getRootContext() throws NamingException { final Hashtable env = new Hashtable(); // Prepare environment map [...] InitialContext root = new InitialLdapContext(env,null); return (DirContext)(root.lookup("")); } // Confirm URL has not expired [...] public static List lookup(DirContext root, String protocolType, String name) throws IOException, NamingException { final ArrayList list = new ArrayList(); String queryProtocol = (protocolType==null)?"":"(jmxProtocolType="+protocolType+")"; String query = "(&" + "(objectClass=jmxConnector) " + "(jmxServiceURL=*) " + queryProtocol + "(jmxAgentName=" + ((name!=null)?name:"*") + "))"; SearchControls ctrls = new SearchControls(); ctrls.setSearchScope(SearchControls.SUBTREE_SCOPE); final NamingEnumeration results = root.search("", query, ctrls); while (results.hasMore()) { final SearchResult r = (SearchResult) results.nextElement(); debug("Found node: " + r.getName()); final Attributes attrs = r.getAttributes(); final Attribute attr = attrs.get("jmxServiceURL"); if (attr == null) continue; final Attribute exp = attrs.get("jmxExpirationDate"); if ((exp != null) && hasExpired((String)exp.get())) { System.out.print(r.getName() + ": "); System.out.println("URL expired since: " + exp.get()); continue; } final String urlStr = (String)attr.get(); if (urlStr.length() == 0) continue; debug("Found URL: "+ urlStr); final JMXServiceURL url = new JMXServiceURL(urlStr); final JMXConnector conn = JMXConnectorFactory.newJMXConnector(url,null); list.add(conn); if (debug) listAttributes(root,r.getName()); } return list; } }
In CODE EXAMPLE 4-1, the
Client
firstly returns a pointer
root
to the LDAP directory DirContext
, then it searches through the directory
for object classes of the type jmxConnector
. The service URL and expiry date
attributes, attr
and exp
respectively, for the jmxConnector
object classes are obtained,
exp
is checked to make sure that the URL
has not expired and a call is made to JMXConnectorFactory
to create a new connector
conn
. The connector conn
is added to the list of connectors and is used
to access the MBeans in the MBean server created by Server
.
The jmx-schema.txt
file
is the LDAP schema file for the JMX Remote API.
The 60jmx-schema.ldif
file is an ldif
file corresponding to
the LDAP schema file, jmx-schema.txt
,
for JMX technology. If you are using Sun ONE Directory Server, this
file can be copied directly to the config/schema
directory of the Sun ONE Directory
Server (see Section "Setting up the JNDI/LDAP
Lookup Service Example").
In addition to the actions you performed in Section "Initial Configuration", before you can run the lookup service examples that use the JNDI/LDAP lookup service, you must perform some further initial actions that are specific to this example. You can then start looking up connectors using the JNDI/LDAP network technology, in conjunction with the two connectors supported by the JMX technology.
When you run the examples, to help you keep track
of which agent has been created with which transport, the agent
names include a letter suffix that is the same as the lettering of
the corresponding section. For example, the agent from Section a. "RMI connector over JRMP,
without an external directory." is called
example-server-a
.
The following steps are required by all of the different connector/transport combinations you can run in this example.
Do this according to the type of LDAP server you are using.
schema
directory.
For example, if you are using Sun ONE Directory Server 5.0, you would type:
$
cp 60jmx-schema.ldif
/var/ds5/slapd-<hostname>/config/schema
Otherwise, do this according to the type of LDAP server you are using.
Do this according to the type of LDAP server you are using.
Server
will register its service URL.
You must provide the Server
with the path to the domain component suffix
dc=Test
that you created in Section
"Initial Configuration".
$
provider="ldap://$ldaphost:$ldapport/dc=Test"
Client
and Server
classes.
$
javac -d . Server.java
Client.java
This example demonstrates the use of the JNDI/LDAP lookup service to look up RMI connector servers that use RMI’s default transport, JRMP, as well as the IIOP transport. In addition, as described in Section "Initial Configuration", different external directories are used to register the RMI connector stubs.
The combinations of transports and external directories demonstrated here are:
Server
.
The command you use to start the Server
varies according to which external directory
you are using. You can start one or more of the following instances
of Server
with different transports and
external registries before starting the Client
.
Start Server
by typing
the following command:
$ java -classpath . -Ddebug=true \ -Dagent.name=example-server-a \ -Durl="service:jmx:rmi://" \ -Djava.naming.provider.url="$provider" \ -Djava.naming.security.principal="$principal" \ -Djava.naming.security.credentials="$credentials" \ jndi.Server &
In this command:
debug
is set to true to provide more
complete screen output when the Server
runs.example-server-a
.provider
, that points to
the domain component suffix in which the agent will be registered,
is given.principal
and password credentials
are given to
gain access to the LDAP server.When Server is launched, you will see confirmation of the creation of the RMI connector, and the registration of its URL in the JNDI/LDAP lookup service.
Start Server
by typing
the following command:
$ java -classpath . -Ddebug=true \ -Dagent.name=example-server-b \ -Durl="service:jmx:rmi:///jndi/${jndirmi}/server" \ -Djava.naming.provider.url="$provider" \ -Djava.naming.security.principal="$principal" \ -Djava.naming.security.credentials="$credentials" \ jndi.Server &
In this command:
example-server-b
.provider
, that points to
the domain component suffix in which the agent will be registered,
is given.principal
and password credentials
are given to
gain access to the LDAP server.server
, is stored is the RMI registry
you identified as jndirmi
in Section
"Initial Configuration".When Server
is
launched, you will see confirmation of the creation of the RMI
connector, and the registration of its URL in the JNDI/LDAP lookup
service.
Start Server
by typing
the following command:
$ java -classpath . -Ddebug=true \ -Dagent.name=example-server-c \ -Durl="service:jmx:rmi:///jndi/${jndildap}/cn=x,dc=Test" \ -Djava.naming.provider.url="$provider" \ -Djava.naming.security.principal="$principal" \ -Djava.naming.security.credentials="$credentials" \ jndi.Server &
In this command:
example-server-c
.provider
, that points to
the domain component suffix in which the agent will be registered,
is given.principal
and password credentials
are given to
gain access to the LDAP server.jndildap
in Section
"Initial Configuration".When Server
is
launched, you will see confirmation of the creation of the RMI
connector, and the registration of its URL in the JNDI/LDAP lookup
service under the agent name example-server-c
.
Start Server
by typing
the following command:
$ java -classpath . -Ddebug=true \ -Dagent.name=example-server-d \ -Durl="service:jmx:iiop://" \ -Djava.naming.provider.url="$provider" \ -Djava.naming.security.principal="$principal" \ -Djava.naming.security.credentials="$credentials" \ jndi.Server &
In this command:
example-server-d
.provider
, that points to
the domain component suffix in which the agent will be registered,
is given.principal
and password credentials
are given to
gain access to the LDAP server.When the Server
is
launched, you will see confirmation of the creation of the RMI
connector, and the registration of its automatically generated URL
in the JNDI/LDAP lookup service.
Start Server
by typing
the following command:
$ java -classpath . -Ddebug=true \ -Dagent.name=example-server-e \ -Durl="service:jmx:iiop:///jndi/${jndiiiop}/server" \ -Djava.naming.provider.url="$provider" \ -Djava.naming.security.principal="$principal" \ -Djava.naming.security.credentials="$credentials" \ jndi.Server &
In this command:
example-server-e
.provider
, that points to
the domain component suffix in which the agent will be registered,
is given.principal
and password credentials
are given to
gain access to the LDAP server.jndiiiop
in Section
"Initial Configuration".When Server
is
launched, you will see confirmation of the creation of the RMI
connector, and the registration of its URL in the JNDI/LDAP lookup
service under the name example-server-e
.
Start Server
by typing
the following command:
$ java -classpath . -Ddebug=true \ -Dagent.name=example-server-f \ -Durl="service:jmx:iiop:///jndi/${jndildap}/cn=x,dc=Test" \ -Djava.naming.provider.url="$provider" \ -Djava.naming.security.principal="$principal" \ -Djava.naming.security.credentials="$credentials" \ jndi.Server &
In this command:
example-server-f
.provider
, that points to
the domain component suffix in which the agent will be registered,
is given.principal
and password credentials
are given to
gain access to the LDAP server.jndildap
in Section
"Initial Configuration".When Server
is launched, you will see confirmation of the creation of the RMI
connector, and the registration of its URL in the JNDI/LDAP lookup
service under the agent name example-server-f
.
Client
.After starting the Server
using the transport and external directory of
your choice, start the Client
:
$ java -classpath . -Ddebug=true \ -Djava.naming.provider.url="$provider" \ -Djava.naming.security.principal="$principal" \ -Djava.naming.security.credentials="$credentials" \ jndi.Client
You will see output confirming the detection of
the agents created by the Server
and
registered in the lookup service. You will also see the
identification and confirmation of the connection made to the
agents.
To look up a specific agent, type the following command:
$
java -classpath .  You can also specify a partial agent name by using *; for example, x* for all agent names beginning with the letter x.


Planet Sick-Boy: http://www.sick-boy.com "We Put the SIN in Cinema"
© Copyright 2001 Planet Sick-Boy. All Rights Reserved.
Films adapted from comic books have had plenty of success, whether they're about superheroes (Batman, Superman, Spawn), or geared toward kids (Casper) or the arthouse crowd (Ghost World), but there's never really been a comic book like From Hell before. For starters, it was created by Alan Moore (and Eddie Campbell), who brought the medium to a whole new level in the mid '80s with a 12-part series called The Watchmen. To say Moore and Campbell thoroughly researched the subject of Jack the Ripper would be like saying Michael Jackson is starting to look a little odd. The book (or "graphic novel," if you will) is over 500 pages long and includes nearly 30 more that consist of nothing but footnotes. In other words, don't dismiss this film because of its source.
If you can get past the whole comic book thing, you might find another stumbling block in From Hell's directors, Albert and Allen Hughes. Getting the Hughes brothers to direct this seems almost as ludicrous as casting Carrot Top in, well, anything, but riddle me this: Who better to direct a film that's set in the ghetto and features really violent street crime than the mad geniuses behind Menace II Society? The ghetto in question is, of course, Whitechapel in 1888 London's East End. It's a filthy, sooty place where the whores (called "unfortunates") are starting to get a little nervous about this mysterious psychopath who has been carving through their profession with surgical precision.
When the first stiff turns up, copper Peter Godley (Robbie Coltrane, The World is Not Enough) calls in Inspector Frederick Abberline (Johnny Depp, Blow) to crack the case. Abberline, a widower, has prophetic dreams he unsuccessfully tries to quell with copious amounts of absinthe and opium. Upon arriving in Whitechapel, he befriends an unfortunate named Mary Kelly (Heather Graham, Say It Isn't So) and proceeds to investigate the horribly gruesome crimes that even the police surgeon can't stomach.
I don't think anyone needs to be briefed on Jack the Ripper, so I won't go into the particulars here, other than to say Moore and Campbell have a unique and interesting theory about both the identity of the killer and the reasons he chooses to slay. In the comic, they don't bother cloaking the identity of the Ripper, but screenwriters Terry Hayes (Vertical Limit) and Rafael Yglesias (Les Misérables) do a good job of keeping him hidden from viewers until the very end. It's funny to watch the locals blindly point the finger of blame at Jews and Indians because, after all, an Englishman could never be capable of committing such ghastly acts. And From Hell's ending had me whistling the Stonecutters song from The Simpsons for days ("Who holds back the electric car/who made Steve Guttenberg a star?"). Don't worry - it'll all make sense when you see it.
Now onto From Hell's appearance: It's certainly dark and bleak enough, and it's surprising to see how much more it looks like a Tim Burton film than Planet of the Apes did (at times, it seems like Sleepy Hollow 2). The print I saw wasn't completely finished (both color and music had not been finalized, so no comments about Marilyn Manson), but cinematographer Peter Deming (Don't Say a Word) ably captures the dreariness of Victorian-era London and helped make the flashy killing scenes remind me of the crazy flashbacks in Twin Peaks, even though the violence in the film pales in comparison to that in the black-and-white comic. Oscar winner Martin Childs' (Shakespeare in Love) production design turns the original Prague surroundings into one creepy place.
Even the acting in From Hell is solid, with the dreamy Depp turning in a typically strong performance and deftly handling a British accent. Ians Holm (Joe Gould's Secret) and Richardson (102 Dalmatians) log in great supporting roles, but the big surprise here is Graham. I cringed the first time she opened her mouth, imagining her attempt at an Irish accent, but it actually wasn't half bad. The film, however, is all good.
2:00 - R for strong violence/gore, sexuality, language and drug content
========== X-RAMR-ID: 29590 X-Language: en X-RT-ReviewID: 251241 X-RT-TitleID: 1110176 X-RT-SourceID: 595 X-RT-AuthorID: 1146 X-RT-RatingText: 9/10
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Vanilla is a flavor derived from orchids. Pre-Columbian Mesoamerican people cultivated the vine of the vanilla orchid, called tlilxochitl by the Aztecs, and Spanish conquistador Hernan Cortes is credited with introducing both vanilla and chocolate to Europe in the 1520s.


The Texas Tribune and the Beaumont Enterprise partnered for a project looking at the 2005 evacuation of Southeast Texas ahead of Hurricane Rita and whether a similar catastrophe can be avoided when the next big storm hits. This website was developed and designed by Ryan Murphy and Ben Hasson.


| DOSE: |
1 tablet |
oral |
MDMA |
(pill / tablet) |
One Summers night out of work, me and my girlfriend got in a car with this couple we knew and headed out for a weekend camping.
Sitting silent on the back seat staring out the window, looking for reassurance in the passing scenery, individually contemplating the journey ahead.
My anxiety was natural, it was the product of an unnatural life. Seperated from myself just after birth, I'd ended up working in a mindless, faceless corporate sweat shop, processing processes. I wanted, needed, a reunion, my only misgivings were wether what I had planned was going to aggrevate the schism.
We arrived at seven, pitched our tents, ate dinner.
An hour later I took one pill.
We went down by the riverside, sat down on cooling earth, the smell of chlorophyll and sweat, like when I was a kid.
Within 20 minutes I was feeling the beginnings.After 30 I was siezed by panic and it was evident from my sweating and cracked grin that I was struggling. Thankfully my friends left me alone.
Whilst they carried on their conversations I sat trying to come to terms with my condition, all I could do was stare out over the river. Slowly, over a few minutes my heart rate dropped, my sweat dried,cooling my skin. Staring at the river, the reflections, the persistent gentle flow, the greatest calmness I have ever felt descended on me,like all sense away from man revealed an endless coming into being.
(I spent the rest of the evening with my girlfriend).
I get angry at the unthinking, knee jerk, demonising critics of MDMA who seem unconcerned at the truly demonic aspects of a ruanway society with it's excessive demands, it's lonliness, it's greed, where we are all mentally ill, in an acceptable way. I suggest that this is a neccessary tool to combat the mental hardship inflicted on us by the unreasonable demands of a society which we can not control and which is, in fact, controlling us with threats.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


Product & Interaction Designer at Microsoft.
I love conceptualizing and executing products that solve real problems.
Leading the product, designing and coordinating the engineering team.
People discover new events based on purchases from friends and other interesting people, avoiding editorial content.
Designing at the biggest social network in Spain with 14 million users. Including Web, iOS, Android, Windows Phone and PSP. Real-time messages, photos and more, share life with your friends.
Defining product and designing an online payment integrated browser solution. Complex deffered payment the easy way: decide when do you wan to pay. Mobile, tablet and Desktop.


Flyer Design for Private Selection Presents Patrcia
Flyer Design for Private Selection Presents DJ Qu
Hand Drawn 3D typeface
12" center label design for Private Selection Records
Misc Isometric Sketch, 2015
Misc Isometric Sketch, 2015
Flyer Design for Private Selection NYE with Delivery
Obey Men's Clothing Design for SS16
Obey Men's Clothing Design for SS16
Obey Men's Clothing Design for SS16
Obey Men's Clothing Design for SS16
Obey Women's Clothing Design for SS16
Obey Women's Clothing Design for SS15
Misc Isometric Sketch, 2015


#
# Copyright (c) 2017 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import copy
from enum import Enum
from typing import Tuple, List
import numpy as np
from rl_coach.core_types import Episode, Transition
from rl_coach.memories.episodic.episodic_experience_replay import EpisodicExperienceReplayParameters, \
EpisodicExperienceReplay
from rl_coach.memories.non_episodic.experience_replay import MemoryGranularity
from rl_coach.spaces import GoalsSpace
class HindsightGoalSelectionMethod(Enum):
Future = 0
Final = 1
Episode = 2
Random = 3
class EpisodicHindsightExperienceReplayParameters(EpisodicExperienceReplayParameters):
def __init__(self):
super().__init__()
self.hindsight_transitions_per_regular_transition = None
self.hindsight_goal_selection_method = None
self.goals_space = None
@property
def path(self):
return 'rl_coach.memories.episodic.episodic_hindsight_experience_replay:EpisodicHindsightExperienceReplay'
[docs]class EpisodicHindsightExperienceReplay(EpisodicExperienceReplay):
"""
Implements Hindsight Experience Replay as described in the following paper: https://arxiv.org/pdf/1707.01495.pdf
"""
def __init__(self, max_size: Tuple[MemoryGranularity, int],
hindsight_transitions_per_regular_transition: int,
hindsight_goal_selection_method: HindsightGoalSelectionMethod,
goals_space: GoalsSpace):
"""
:param max_size: The maximum size of the memory. should be defined in a granularity of Transitions
:param hindsight_transitions_per_regular_transition: The number of hindsight artificial transitions to generate
for each actual transition
:param hindsight_goal_selection_method: The method that will be used for generating the goals for the
hindsight transitions. Should be one of HindsightGoalSelectionMethod
:param goals_space: A GoalsSpace which defines the base properties of the goals space
"""
super().__init__(max_size)
self.hindsight_transitions_per_regular_transition = hindsight_transitions_per_regular_transition
self.hindsight_goal_selection_method = hindsight_goal_selection_method
self.goals_space = goals_space
self.last_episode_start_idx = 0
def _sample_goal(self, episode_transitions: List, transition_index: int):
"""
Sample a single goal state according to the sampling method
:param episode_transitions: a list of all the transitions in the current episode
:param transition_index: the transition to start sampling from
:return: a goal corresponding to the sampled state
"""
if self.hindsight_goal_selection_method == HindsightGoalSelectionMethod.Future:
# states that were observed in the same episode after the transition that is being replayed
selected_transition = np.random.choice(episode_transitions[transition_index+1:])
elif self.hindsight_goal_selection_method == HindsightGoalSelectionMethod.Final:
# the final state in the episode
selected_transition = episode_transitions[-1]
elif self.hindsight_goal_selection_method == HindsightGoalSelectionMethod.Episode:
# a random state from the episode
selected_transition = np.random.choice(episode_transitions)
elif self.hindsight_goal_selection_method == HindsightGoalSelectionMethod.Random:
# a random state from the entire replay buffer
selected_transition = np.random.choice(self.transitions)
else:
raise ValueError("Invalid goal selection method was used for the hindsight goal selection")
return self.goals_space.goal_from_state(selected_transition.state)
def _sample_goals(self, episode_transitions: List, transition_index: int):
"""
Sample a batch of goal states according to the sampling method
:param episode_transitions: a list of all the transitions in the current episode
:param transition_index: the transition to start sampling from
:return: a goal corresponding to the sampled state
"""
return [
self._sample_goal(episode_transitions, transition_index)
for _ in range(self.hindsight_transitions_per_regular_transition)
]
def store_episode(self, episode: Episode, lock: bool=True) -> None:
# generate hindsight transitions only when an episode is finished
last_episode_transitions = copy.copy(episode.transitions)
# cannot create a future hindsight goal in the last transition of an episode
if self.hindsight_goal_selection_method == HindsightGoalSelectionMethod.Future:
relevant_base_transitions = last_episode_transitions[:-1]
else:
relevant_base_transitions = last_episode_transitions
# for each transition in the last episode, create a set of hindsight transitions
for transition_index, transition in enumerate(relevant_base_transitions):
sampled_goals = self._sample_goals(last_episode_transitions, transition_index)
for goal in sampled_goals:
hindsight_transition = copy.copy(transition)
if hindsight_transition.state['desired_goal'].shape != goal.shape:
raise ValueError((
'goal shape {goal_shape} already in transition is '
'different than the one sampled as a hindsight goal '
'{hindsight_goal_shape}.'
).format(
goal_shape=hindsight_transition.state['desired_goal'].shape,
hindsight_goal_shape=goal.shape,
))
# update the goal in the transition
hindsight_transition.state['desired_goal'] = goal
hindsight_transition.next_state['desired_goal'] = goal
# update the reward and terminal signal according to the goal
hindsight_transition.reward, hindsight_transition.game_over = \
self.goals_space.get_reward_for_goal_and_state(goal, hindsight_transition.next_state)
hindsight_transition.n_step_discounted_rewards = None
episode.insert(hindsight_transition)
super().store_episode(episode)
def store(self, transition: Transition):
raise ValueError("An episodic HER cannot store a single transition. Only full episodes are to be stored.")


More Website Templates @ TemplateMonster.com - January 27, 2014!
Our Sources
This origin of chloroplasts was first suggested by the Russian biologist Konstantin Mereschkowski in 1905 after Andreas Schimper observed in 1883 that chloroplasts closely resemble cyanobacteria. Chloroplasts are only found in plants, algae, and the amoeboid Paulinella chromatophora.
more
Chloroplasts work to convert light energy of the Sun into sugars that can be used by cells. The entire process is called photosynthesis and it all depends on the little green chlorophyll molecules in each chloroplast. Plants are the basis of all life on Earth.
more


Robust predictions of changes in climate that result from AIC rely to a large degree on the ability to transfer the process understanding outlined above into models that are not capable of treating the formation stage explicitly due to a lack of spatial or temporal resolution. This goal can be reached by allying findings from observations with local scale, process-oriented models. While first attempts have been made to devise simulations addressing formation stage processes prior to IPCC 1999 (ref. 4), refined models have become available only in recent years 29– 32, 37– 39.
Together with observations, process models point to exhaust soot particles as the most important source of contrail ice crystals for current propulsion technology 5, 37– 40. The ice nucleation process in contrails has been simulated assuming that the kinetics of water droplet and ice crystal formation are not affected by turbulent plume mixing and in which supersaturation is not resolved at scales (≈0.1–1 cm) below which molecular diffusion removes spatial gradients of water vapour and temperature. Water droplet formation followed by homogeneous freezing defines a minimal microphysical framework. By invoking a heterogeneous (solid surface assisted) ice nucleation mode involving bare exhaust soot particles, it is possible to tune these nucleation rates to trigger rapid formation of copious ice crystals preventing water supersaturation from occurring. However, this violates the water saturation constraint.
Figure 3 shows the dependence of nucleated contrail ice crystal numbers as a function of soot particle emissions studied systematically by one process model based on the minimal framework 37 (Fig. 2). The trends shown are generic and basically consistent with other parcel models 38, 39, 41. In soot-rich exhaust, ice crystal and soot particle numbers increase nearly in proportion. Near the contrail threshold, only few ice crystals form, since low plume supersaturation diminishes water activation of soot particles. Ice crystal numbers decrease about 100-fold from soot-rich to soot-poor conditions, approaching constant low values set by the number of particles in the contrail environment. Ice crystal numbers increase at low ambient temperatures in soot-poor exhaust due to water activation and subsequent freezing of abundant aqueous plume particles (Box 1). While one observational case study is consistent with those predictions 42, uncertainties in aircraft measurements of ice supersaturation and ice crystal number concentrations in fresh contrails have prevented direct verification of these results 28. Simulations of soot-poor contrails remain unconstrained by observations, since current soot emission levels are high.
Nucleation of ice crystals in jet aircraft exhaust plumes. Ice crystal number emission index (per kilogram of fuel burnt) in the jet regime as a function of the number emission index of emitted soot particles simulated by a parcel model 37. Two results are shown for an ambient temperature, T, close to a contrail formation threshold temperature, Θ ≈ 225 K, frequently found in extratropical cruise conditions, and a rather low temperature 12 K below this value. At intermediate ambient temperatures, nucleated ice crystal numbers increase due to enhanced water activation of either soot or ultrafine aqueous plume particles (Box 1). An approximate range of current in-flight soot emission indices is indicated (hatched area). In soot-rich exhaust, the number of soot particles that can be water-activated and freeze increases with decreasing ambient temperature that in turn increases plume cooling rates and levels of plume supersaturation over liquid water. As T approaches Θ in soot-poor exhaust, ambient aerosol particles mixed into exhaust plumes are the only source of contrail ice crystals, as increasingly fewer plume particles can be activated owing to diminishing plume supersaturation; the number concentrations of ambient particles are much lower in contrails than current soot emission levels. The plume cooling rate determines the time of water activation of entrained ambient particles, hence, the number of ice crystals derived from them. In soot-poor exhaust, ultrafine aqueous plume particles are formed in large numbers in the fresh exhaust, if the fuel contains sufficient amounts of condensable vapours besides water vapour. Those small particles are predicted to contribute significantly to ice crystal formation at low ambient temperatures well below average values at cruise levels ( T ≈ 218 K in the extratropics and T ≈ 228 K in the tropics). If the formation of ultrafine particles cannot be avoided, ice crystal numbers are lowest in an intermediate range of soot emissions, 10 13–10 14 (kg-fuel) −1
Computational fluid dynamics simulations are capable of predicting contrail properties past ice crystal formation in greater detail within limited spatial domains. While it is computationally too expensive to treat ice nucleation explicitly in large-eddy simulation (LES) codes, they have been employed to study effects of aircraft wake development on ice crystals. In this regard, LES have provided valuable insights into systematic dependencies of ice crystal losses on aircraft-dependent and atmospheric variables.
Figure 4 illustrates ice crystal sublimation losses as a function of assumed nucleated ice crystal number and their dependence on ambient ice supersaturation derived from one set of LES 43, in which initial conditions of ice supersaturation and nucleated ice crystal properties in jet exhaust plumes have been prescribed. The more ice crystals nucleate, the larger the sublimation losses which decrease with increasing supersaturation. Observations confirm a reduction in ice crystal numbers in descending aircraft wakes 35, 36, 42. First steps towards a unified description of these trends across different LES models have been taken 43, but sublimation loss factors and ice crystal number concentrations remain uncertain until measurements become available providing tight links between soot emissions and ice crystal numbers across the entire formation stage.
Sublimation-induced ice crystal losses in aircraft wakes. Dependence of the fraction of ice crystals escaping complete sublimation during the vortex regime versus nucleated ice crystal number emission index taken from LES simulations for a large aircraft at cruise and low (0.1), medium (0.2) and high (0.3) ambient ice supersaturation (Table A2 Block 4 in ref. 43). The magnitude of sublimation losses depends on aircraft engine thrust settings affecting soot particle numbers as well as on aircraft weight affecting the vertical depth of the wake; ambient conditions including ice supersaturation, air temperature and its vertical gradient and turbulence levels; and level of plume ice supersaturation and number, mean size and spread of the contrail ice crystal size distribution in the late jet regime. Substantial losses have been attributed to the Kelvin effect 31, marking an increase in supersaturation over the surfaces of small particles relative to ambient values. Although this increase is very small (0.001–0.1) for µm-sized ice crystals, it becomes important in aircraft wake vortices for high ice crystal number concentrations causing rapid sublimation rates 42
Advances in research in the last two decades do not abrogate the need to measure more accurately physical and chemical properties of aerosol particles and ice crystals in the size range 1–1000 nm and to re-examine model predictions of ice crystal size distributions in and vertical extensions of contrails with better informed models at the end of the formation stage. These variables serve as initial conditions of AIC in the spreading stage and have important repercussions regarding the transition of contrails into contrail cirrus. It is important to ascertain model predictions by which sublimation decreases differences in nucleated ice crystal numbers induced by changes in soot emissions.


The Jawa Perak was unveiled last year with a price tag of Rs 1.89 lakh ex-showroom. This time around, the Bobber has been launched in the country with the price tag of Rs 1.94 lakh ex-showroom pan India, which is a hike of Rs 5,500. The Jawa Perak will be available in select dealerships from tomorrow for test rides. The bookings for the same will commence from January 1, 2020, and the deliveries will begin from April 2, 2020.
At this pricing, the Perak is the most affordable bobber in the country and has carved a niche for itself in the market.


Yes: A typical town hall meeting is provided. A speech given by politicians can be seen.
Yes: A close-up view of the audience who expresses the opinions actively. This is particularly seen in a town hall meeting.
No: This is a class in a large classroom. The audience is college students, much younger in general than the attendees in a town hall meeting.
Yes: The attendees react strongly to the speaking officials. This typically characterizes a town hall meeting.


public final class OperationUtils
extends java.lang.Object
| Modifier and Type | Method and Description |
|---|---|
static boolean |
areReceiversComplete(java.util.concurrent.locks.Lock finalLock,
MessageReceiver finalReceiver,
java.util.concurrent.locks.Lock partialLock,
MessageReceiver partialReceiver)
Progress the receivers and return true if needs further progress
|
static java.util.Map<java.lang.Integer,java.util.List<java.lang.Integer>> |
getIntegerListMap(InvertedBinaryTreeRouter router,
LogicalPlan instancePlan,
int destination) |
static java.lang.String |
printStackTrace(java.lang.StackTraceElement[] elements) |
static boolean |
progressReceivers(ChannelDataFlowOperation delegate,
java.util.concurrent.locks.Lock lock,
MessageReceiver finalReceiver,
java.util.concurrent.locks.Lock partialLock,
MessageReceiver partialReceiver)
Progress the receivers and return true if needs further progress
|
static void |
shuffleArray(java.util.Random random,
int[] array) |
static void |
swap(int[] array,
int i,
int j) |
public static boolean areReceiversComplete(java.util.concurrent.locks.Lock finalLock, MessageReceiver finalReceiver, java.util.concurrent.locks.Lock partialLock, MessageReceiver partialReceiver)
finalLock
- lock for final receiverfinalReceiver
- final receiverpartialLock
- lock for partial receiverpartialReceiver
- partial receiverpublic static boolean progressReceivers(ChannelDataFlowOperation delegate, java.util.concurrent.locks.Lock lock, MessageReceiver finalReceiver, java.util.concurrent.locks.Lock partialLock, MessageReceiver partialReceiver)
delegate
- the channel dataflow opeationlock
- lock for final receiverfinalReceiver
- final receiverpartialLock
- lock for partial receiverpartialReceiver
- partial receiverpublic static java.util.Map<java.lang.Integer,java.util.List<java.lang.Integer>> getIntegerListMap(InvertedBinaryTreeRouter router, LogicalPlan instancePlan, int destination)
public static void shuffleArray(java.util.Random random, int[] array)
public static void swap(int[] array, int i, int j)
public static java.lang.String printStackTrace(java.lang.StackTraceElement[] elements)


CLEARENV
Section: Linux Programmer's Manual (3)
Updated: 2014-08-19
Index
Return to Main Contents
NAME
clearenv - clear the environment
SYNOPSIS
#include <stdlib.h>
int clearenv(void);
Feature Test Macro Requirements for glibc (see
feature_test_macros(7)):
clearenv():
_SVID_SOURCE || _BSD_SOURCE
DESCRIPTION
The
clearenv()
function clears the environment of all name-value
pairs and sets the value of the external variable
environ
to NULL.
RETURN VALUE
The
clearenv()
function returns zero on success, and a nonzero
value on failure.
VERSIONS
Available since glibc 2.0.
CONFORMING TO
Various UNIX variants (DG/UX, HP-UX, QNX, ...).
POSIX.9 (bindings for FORTRAN77).
POSIX.1-1996 did not accept
clearenv()
and
putenv(3),
but changed its mind and scheduled these functions for some
later issue of this standard (cf. B.4.6.1).
However, POSIX.1-2001
adds only
putenv(3),
and rejected
clearenv().
NOTES
Used in security-conscious applications.
If it is unavailable
the assignment
environ = NULL;
will probably do.
The DG/UX and Tru64 man pages write: If
environ
has been modified by anything other than the
putenv(3),
getenv(3),
or
clearenv()
functions, then
clearenv()
will return an error and the process environment will remain unchanged.
SEE ALSO
getenv(3),
putenv(3),
setenv(3),
unsetenv(3),
environ(7)
Index
- NAME
-
- SYNOPSIS
-
- DESCRIPTION
-
- RETURN VALUE
-
- VERSIONS
-
- CONFORMING TO
-
- NOTES
-
- SEE ALSO
-
This document was created by
man2html,
using the manual pages.
Time: 02:55:16 GMT, September 18, 2014


click on Login and enter usernamr as<EMAIL_ADDRESS>and a random password
In this portfolio the first page deals with the bootstrap, Html and CSS.
When you click on Login then the following page also built with HTML5, CSS3, Javascript.
When you enter userName as<EMAIL_ADDRESS>then it redirects us to an Angular JS single page application with static JSON file as a service object and with sample directives and Controllers.


emissions beef production climate GWP GHG footprints different systems GTP metric impact individual impacts footprint cattle gas metrics studies Fig. fed total {border-style assessment px;} used #ffffff;} agricultural review Sci. relative significant using carbon conversion data gases greenhouse single (), alternative environmental lower result =., cycle dioxide factors food given important non-grass Environ. Fuglestvedt change equivalence global livestock methane temperature time values -year Assessment IPCC Myhre Reisinger atmospheric based disaggregated emission grass life multiple resulting study Carbon Global Greenhouse choice comparing efficiency emissions, energy equivalent footprints, grass-fed liveweight number reported reporting use . kg Allen GHGs LCA Vries footprint. large metric, px; radiative recent systems, warming wider {font-family years Beef Clean. Comparing J.S. Pierrehumbert Prod. Shine considered dairy font-size greater harmonised included paper papers potential p = ., range types value (CH (e.g. Agric. Chang. Clark Clim. Emissions FDR However, Impact K.P. Potential Syst. adj. aggregated apparent available changing clear differences double; dynamics example, farm following forcing including land means nitrous possible research results reviews sustainable systematic kg (or Cherubini Climate Lett. Levasseur Life New Res. Table Tilman activity border-color border-width case current demonstrated emissions. emitted expressed increase increased intensity literature meat oil organic oxide policy product production, products relatively separate solid; specific standard standardise studies, systems: time-horizon variants variation {font-style {font-weight τ = ., (CO AR, Buratti Cycle Environmental Gasser Jolliet Meat RE, Relationships Report S.J. SD = .) SD = .; Systematic Z = ., assessments associated balance bold boundaries combined combustion commonly compare compared complete context correlation courier; crude data, defined depending described details dietary differ effect em; especially factors, finished focus footprinting fully gases. generally here, highly horizon implications increases lifetime methane, methods modelling output paper's presented proportion pt;} rank recorded, report review, ruminant short-lived significantly specified suggest systems. typically used. useful


--- layout: post date: 2011-07-22 time: "09:00:00" authors: ["Greg Wilson"] title: Software Carpentry in HPCWire tags: ["Noticed"] ---
HPCWire has run an interview with me about Software Carpentry (a follow-up to one they did several years ago). Regular readers will have seen the main points before, but I hope it's a good summary of the current state of play, and of what's wrong with equating "scientific computing" and "high performance computing".


THE TRIAL A film review by Steve Rhodes Copyright 1996 Steve Rhodes
RATING (0 TO ****): ** 1/2
First, let me confess that I have never read much Kafka other than collecting some of his classic quotes (see appendix). Based on what I do know, THE TRIAL appears to be quintessential Kafka.
THE TRIAL starts with the arrest of what we would call a Senior Vice President of a large bank, but it is set in Prague before the turn of the century so he is call a chief clerk (pronounced "clark" in true British fashion) of the bank. The clerk is played excellently by Kyle MacLachlan. Although arrested, he is free to go and is never told the charges.
The clerk is arrogant and tells everyone how ridiculous this all is. But in a world of non-Euclidean geometry, everything that seems right isn't. Slowly the clerk begins to realizes the trouble he is in. When he goes to the court he sees long lines of people who are accused. No one actually goes on trial. Everyone waits.
Finally, he gets the court painter to explain to him that he has only three chances: actual acquittal, ostensible acquittal, and perpetual postponement. The first has never happened, the second has the side effect that you can always be brought up again for the same charge, and the last means you must spend all of your waking hours making sure that you case never advances. From there, his plight gets worse.
Other than Kafka's story and MacLachlan's acting, the high point is the screen play by Harold Pinter. Pinter has a style most typified by the movie Betrayal, of a highly verbal almost Shakespearean style that has the actors taking every word very seriously with constant ripostes between each other.
The direction, settings, and especially the dramatic brass symphonic music are all good. I give the movie ** 1/2, and recommend it.
Now, as promised, here are my 3 favorite Kafka quotes:
I have the true feeling of myself only when I am unbearably unhappy.
-Franz Kafka
You are free and that is why you are lost.
-Franz Kafka
People become obsessed with the patterns they create. In a Kafka story the salesman wakes up one morning and finds he has been transformed into a huge ugly bug. What does he do? Does he contemplate this awful change in himself? Nope. He worries about how he's going to turn his clumsy new body over and get out of bed, how he's going to be late to the office, and what his boss will think.
-Richard O'Mara
**** = One of the top few films of this or any year. A must see film. *** = Excellent show. Look for it. ** = Average movie. Kind of enjoyable. * = Poor show.  Totally unbearable.
REVIEW WRITTEN ON: May 6, 1994
Opinions expressed are mine and not meant to reflect my employer's.
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


ExMinimatch
ExMinimatch
Globbing paths without walking the tree! Elixir and Erlang provide wildcard
functions in the stdlib. But these will walk the directory tree. If you simply
want to test whether a file path matches a glob, ExMinimatch is for you.
Quick examples:
iex> import ExMinimatch
nil
iex> match("**/*{1..2}{a,b}.{png,jpg}", "asdf/pic2a.jpg")
true
iex> match("*.+(bar|foo)", "bar.foo")
true
iex> ["me.jpg", "images/me.png", "images/you.svg"] |> filter("**/*.{png,jpg}")
["me.jpg", "images/me.png"]
Compiled forms below allows us to cache the %ExMinimatcher{} struct when used against large number of files repeated.
iex> compile("**/*{1..2}{a,b}.{png,jpg}") |> match("asdf/pic2a.jpg")
true
iex> ["me.jpg", "images/me.png", "images/you.svg"] |> filter(compile("**/*.{png,jpg}"))
["me.jpg", "images/me.png"]
ExMinimatch is a port of the minimatch javascript project. It is a close port but not exactly the same. See "Comparison to minimatch.js" section below.
Glob Patterns
Supports these glob features:
- Brace Expansion
- Extended glob matching
- "Globstar" ** matching
See:
- man sh
- man bash
- man 3 match
- man 5 gitignore
Options
compile
, match
, and filter
all have forms that take an options argument (as a map %{}).
The following are the explanations. By default, all fo these are false.
log
Possible values are :info
, and :debug
. If set, will dump information into
repl. :debug
dumps more.
nobrace
Do not expand {a,b}
and {1..3}
brace sets.
noglobstar
Disable **
matching against multiple folder names.
dot
Allow patterns to match filenames starting with a period, even if the pattern does not explicitly have a period in that spot.
Note that by default, a/**/b
will not match a/.d/b
, unless dot is set, e.g.
match("a/**/b", "a/.d/b", %{dot: true})
noext
Disable "extglob" style patterns like +(a|b)
.
nocase
Perform a case-insensitive match.
match_base
If set, then patterns without slashes will be matched against the basename of
the path if it contains slashes. For example, a?b
would match the path
/xyz/123/acb
, but not /xyz/acb/123
.
nocomment
Suppress the behavior of treating #
at the start of a pattern as a comment.
nonegate
Suppress the behavior of treating leading !
character as negation.
Comparison to minimatch.js
minimatch.js
converts a glob into a list of regular expressions. However, when
it comes to matching, one can choose to use minimatch.match
or use the complete
regular expression generated by minimatch.makeRe
to test it against a file
pattern. Unfortunately, the 2 approaches are inconsistent. Notably the full regular
expression based approach has a few important pieces missing. Therefore, here
we implement the first approach. For detail, take a look at ExMinimatcher.Matcher
.
Summary↑
| compile(glob) | Return a compiled %ExMinimatcher{} struct, which can be used in conjunction
with |
| compile(glob, options) | |
| filter(files, matcher) | return a list of files that match the given pattern. This is a convenience function |
| filter(files, pattern, options) | |
| match(exminimatcher, file) | Return true if the file matches the glob. This is a convenience function that
is literally |
| match(glob, file, options) |
Functions
Return a compiled %ExMinimatcher{} struct, which can be used in conjunction
with match/2
, 'match/3', or filter/2
to match files.
This purpose of this function is to save time by precompiling the glob pattern.
For possible glob patterns and available options, please refer to moduledoc.
return a list of files that match the given pattern. This is a convenience function
For possible glob patterns and available options, please refer to moduledoc.
Examples
iex> filter(["qwer.png", "asdf/qwer.png"], "**/*.png")
["qwer.png", "asdf/qwer.png"]
iex> filter(["qwer/pic1a.png", "qwer/asdf/pic2a.png", "asdf/pic2c.jpg"], "**/*{1..2}{a,b}.{png,jpg}")
["qwer/pic1a.png", "qwer/asdf/pic2a.png"]
Return true if the file matches the glob. This is a convenience function that
is literally glob |> compile(options) |> match(file)
Use this for one off matching, as the glob is recompiled every time this is called.
For possible glob patterns and available options, please refer to moduledoc.
Examples
iex> match("**/*.png", "qwer.png")
true
iex> match("**/*.png", "qwer/qwer.png")
true


Justin Timberlake Photographed Holding Hands With Another Woman Without His Wedding Ring On!
by Ricki MathersJustin Timberlake was spotted holding hands with another woman that is not his wife Jessica Biel. Onlookers say things got very flirty but the latest reports claim that the two are nothing more than friends.
Raising Dion star Alisha Wainwright was seen stroking the pop star’s knee and smiling before they held hands under the table of a New Orleans bar while on break from shooting a movie where they will play love interests.
Witnesses claim that Timberlake was drunk and couldn’t walk straight. Although other cast and crew were at the same bar, The Sun originally reported that they were alone on The Absinthe House balcony for over half an hour and then left at the rear exit.
Immediately after the pictures were released, social media started talking. Some feel that it could have been innocent while others feel that no matter what the situation was — a married man shouldn’t behave that way with another woman.
The 38-year-old was wearing his ring earlier last week but it was absent from the photos, This could be because of the movie role.
A rep for Alisha stated: ‘There is no validity to this speculation. They are currently working on a project together. Members of the cast and crew were all together.’
Another source backed the statement claiming: ‘The video may look a way, but literally it was nothing. It was some friends, members of the team, crew and people like that. They all know each other and were hanging. Like come on, they’re on an open balcony in New Orleans and he’s famous. It was nothing.’
The latest spotting of Jessica and Justin was on Halloween when she dressed up as the singer from his boy band days.
Last month, he gushed to Entertainment Tonight about his marriage with the actress where he said that once you find ‘your person’ you can’t ‘go back.’


Home |
Presidents |
Senators |
Congressmen |
Athletes |
Actors |
Singers |
Celebrities |
Congressman Mike Honda
Congressman Mike Honda
Congressman Mike Honda
Congressman Mike Honda
Congressman Mike Honda
Congressman Mike Honda
Congressman Mike Honda
Congressman Mike Honda
Congressman Mike Honda
Congressman Mike Honda


3. Install first management¶
First step is to install first management node manually.
We will then learn how to use Ansible, and then only focus on the stack itself.
3.1. Install operating system¶
Install Centos 7 or 8 using parameters you need.
The following parameters are recommended:
>= 2 CPU/vCPU
>= 2 Gb RAM
>= 16Gb HDD
And the following parameters are the strict minimal if you wish to test the stack in VMs:
>= 1 vCPU
>= 512 Mb RAM
>= 6Gb HDD
In this last configuration, DVD iso will be mounted from /dev/cdrom instead of being copied to save space.
It is recommended to only choose minimal install during packages selection (core or minimal server). Also, it is recommended to let system in English, and only set your keyboard and time zone to your country.
3.2. Prepare for Ansible¶
3.2.1. Repositories¶
Once system is installed and rebooted, login, and disable firewall. Firewall will optionally be reactivated later.
systemctl stop firewalld
systemctl disable firewalld
Then prepare boot images and packages repositories.
Boot images include the installer system which starts the deployment after PXE boot, while packages repositories include the software that will be installed on the systems.
Boot images and packages repositories structure follows a specific pattern, which defaults to the major release version in the path:
Distribution Version Architecture Repository
+ + + +
| +--+ | |
+-----------+ | | +----------+
| | | |
v v v v
/var/www/html/repositories/centos/7/x86_64/os/
Note: this pattern parameters (distribution, version, architecture) must match the one provided in the equipment_profile file seen later.
Note: we recommend to use the same directory path to later sync the Errata published by upstream operating system vendor.
<IP_ADDRESS>. Operating system¶
Download:
Centos 7 Everything DVD iso from http://isoredirect.centos.org/centos/7/isos/x86_64/ . Iso name is CentOS-7-x86_64-Everything-1810.iso.
Or Centos 8 DVD 1 iso from http://isoredirect.centos.org/centos/8/isos/x86_64/ . Iso name is CentOS-8-x86_64-1905-dvd1.iso.
If on standard system:
Mount iso and copy content to web server directory: (replace centos/7 by centos/8, redhat/8, redhat/7, etc depending of your system)
mkdir -p /var/www/html/repositories/centos/7/x86_64/os/
mount CentOS-7-x86_64-Everything-1810.iso /mnt
cp -a /mnt/* /var/www/html/repositories/centos/7/x86_64/os/
restorecon -Rv /var/www/html/repositories/centos/7/x86_64/os
If in test VM:
Simply mount iso from /dev/cdrom to save space:
mkdir -p /var/www/html/repositories/centos/7/x86_64/os/
mount /dev/cdrom /var/www/html/repositories/centos/7/x86_64/os/
Now, create first repository manually. Procedure is different between Centos 7 and 8.
Centos/RHEL 7:
Create file /etc/yum.repos.d/os.repo with the following content:
[os]
name=os
baseurl=file:///var/www/html/repositories/centos/7/x86_64/os/
gpgcheck=0
enabled=1
Centos/RHEL 8:
Create file /etc/yum.repos.d/BaseOS.repo with the following content:
[BaseOS]
name=BaseOS
baseurl=file:///var/www/html/repositories/centos/8/x86_64/os/BaseOS/
gpgcheck=0
enabled=1
Then create file /etc/yum.repos.d/AppStream.repo with the following content:
[AppStream]
name=AppStream
baseurl=file:///var/www/html/repositories/centos/8/x86_64/os/AppStream/
gpgcheck=0
enabled=1
Both:
If you don’t need the DVD iso anymore, umount it:
umount /mnt
Now ensure repository is available:
yum repolist
<IP_ADDRESS>. BlueBanquise¶
Download BlueBanquise rpms from official repository.
Go to https://bluebanquise.com, go to repositories/download, and get the content of the whole directory corresponding to your distribution and architecture.
Then copy this content into /var/www/html/repositories/centos/7/x86_64/bluebanquise/ locally.
mkdir -p /var/www/html/repositories/centos/7/x86_64/bluebanquise/
cp -a /root/bluebanquise_from_web/* /var/www/html/repositories/centos/7/x86_64/bluebanquise/
restorecon -Rv /var/www/html/repositories/centos/7/x86_64/bluebanquise
And create file /etc/yum.repos.d/bluebanquise.repo with the following content:
[bluebanquise]
name=bluebanquise
baseurl=file:///var/www/html/repositories/centos/7/x86_64/bluebanquise/
gpgcheck=0
enabled=1
3.2.2. Install Ansible¶
Time to install Ansible.
Install epel first, to get Ansible:
yum install epel-release
yum repolist
Then install Ansible:
yum install ansible
And check Ansible is working:
ansible --version
It must be >= 2.8.2 .
It is now time, if you do not know how Ansible works, to learn basis of Ansible.
If you already know Ansible, or want to skip this recommended training, directly go to the Configure BlueBanquise section.


Unfortunately your web browser doesn't appear to support WebRTC which is required for this application. Please try another web browser.
Create a channel by entering a channel name in the field below and clicking 'Connect'.If the server requires a password enter it below, otherwise leave blank.
Negotiating connection...


COLOR COORDINATED
select colors in style
Instructions: Select a color you would like to find colors that coordinate. The colors are listed in alphabetical order. Click the sumbit button to see your results.


Study
Bergin 2011
Christensen 2015 ——_
Cheng 2017
Zhao 2017
Overall (I-squared = 85.0%, p = 0.000)
P=0.118
NOTE: Weights are from random effects analysis
WMD (95% Cl)
0.60 (—-0.06, 1.26)
—0.60 (—1.10, —0.10)
—0.17 (—0.34, 0.00)
—0.50 (—0.60, —0.40)
—0.26 (—0.58, 0.06)
Weight
14.28
19.00
32.30
34.42
100.00
T 1.26


First name is required.
Last name is required.
Email address is required.
Email address is invalid.
Username is required.
Please enter a valid username: 3+ characters long, non restricted word, characters "_-.", no consecutive dots, does not begin or end with dots, letters a-z and numbers 0-9.
Password is required.
{{passwordError}}


Scrawl.js
- demonstration 120
Frame-based selector panel
Extensions: animation, images, frame, path, factories
Scenario:
text
Actions:
Known browser issues:
text
Result images: