Nigerians react to Social Media Bill, mock lawmakers over similarity with Singapore
by Fakoyejo OlalekanNigerians have begun to protest against the Social Media Bill as it passed second reading. The Bill, which was reintroduced in the first week of November 2019, reportedly has the same contents with the Protection from Online Falsehood Bill of Singapore. The similarities have made some Nigerians mock the lawmakers for allegedly copying the Singapore Bill.
The Nigerian bill is titled, ‘Protection from Internet Falsehood and Manipulations Bill, 2019’ and was reportedly sponsored by Mohammed Sani Musa, Senator representing Niger East Senatorial District. The bill seeks to regulate social media use in Nigeria and tame hate speech, but it seems some Nigerians are not in support.
The belief among some Nigerians is that the passage of the Social Media Bill is the government’s method of turning the country into an authoritarian state, but Senator Mohammed said in a Nairametrics’ report that the legislation was needful because it would protect the country’s “fragile unity”.
Why Nigerians are angry
Government defines what’s false: The Social Media Bill doesn’t have well-defined guidelines as to what’s false and true. This gives the government prerogative to determine which statement – written or spoken – is false or true.
In the Nigerian bill, “A person must not do any act in or outside Nigeria in order to transmit in Nigeria a statement knowing or having reason to believe that;
- it is false statement of fact, and the transmission of the statements in Nigeria is likely to be prejudicial to the security of Nigeria or any part of Nigeria. Also, be prejudicial to public health and public safety.
[READ MORE: Buhari signs Production Sharing Contract (PSC) Amendment Bill into law]
This makes Nigerians believe the bill gives the government authority to act as judge & jury at the same time in a matter against the state. The author of a statement adjudged to be false is liable to a monetary fine depending on the level of offence or 3-years imprisonment or both.
Right to block access to internet: In the bill, there is ‘Access Blocking Order’. The Nigerian government, through the law enforcement department, can block any citizen from accessing the internet. The Nigerian Communication Commission (NCC) will be ordered by law enforcement department to switch internet access off.
This means if a group of people is believed to be transmitting what the government defines as a false statement, the NCC will instruct the network providers, on behalf of security forces, to disable access to the internet of the group or region. Telecommunications companies which don’t comply with government’s order risk N10 million fine for every day.
This section of the bill scares Nigerians because shutting down the internet has been one of the weapons used by some African leaders who did not find comment against them favourable. In 2018, the Cameroonian government had shut down internet connection in its anglophone region (Cameroon is divided into two regions; Anglophone; English speaking region and francophone; French-speaking region) on two separate occasions for total 240 days within two years.
Process of getting back internet: For those whose access to the internet is cut off, they are expected to take their grievance to the High Court, but that’s after they have applied to the Law Enforcement Department to vary or cancel the block out.
Copy & Paste of Singapore bill: The Nigerian lawmakers are being mocked for copying the same content on Singapore’s ‘Protection from Online Falsehoods and Manipulation Act 2019’. Some Nigerians believe that this is an act of plagiarism.
What Nigerians are saying
The social media bill content violates the human right to freedom of speech and information access.
On Singapore similarities
[READ ALSO: Buhari proposes sweeping changes to tax laws in 2019 Finance Bill]


Introduction
In the original days of computing, rsh/rlogin were used to connect to remote computers and execute commands. These commands had the problem that the passwords and commands were sent in the clear. To solve this problem, the SSH protocol was created. Twisted Conch implements the second version of this protocol.
Using an SSH Command Endpoint
If your objective is to execute a command on a remote host over an SSH
connection, then the easiest approach may be to
use twisted.conch.endpoints.SSHCommandClientEndpoint
.
If you haven't used endpoints before, first take a look
at the endpoint howto to
get an idea of how endpoints work in general.
Conch provides an endpoint implementation which establishes an SSH connection, performs necessary authentication, opens a channel, and launches a command in that channel. It then associates the output of that command with the input of a protocol you supply, and associates output from that protocol with the input of that command. Effectively, this lets you ignore most of the complexity of SSH and just interact with a remote process as though it were any other stream-oriented connection - such as TCP or SSL.
Conch also provides an endpoint that is initialized with an already established SSH connection. This endpoint just opens a new channel on the existing connection and launches a command in that.
Using the SSHCommandClientEndpoint
is about as simple as using any
other stream-oriented client endpoint. Just create the endpoint defining
where the SSH server to connect to is and a factory defining what kind of
protocol to use to interact with the command and let them get to work
using the endpoint's connect
method.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
#!/usr/bin/env python # Copyright (c) Twisted Matrix Laboratories. # See LICENSE for details. if __name__ == '__main__': import sys import echoclient_ssh from twisted.internet.task import react react(echoclient_ssh.main, sys.argv[1:]) import os, getpass from twisted.python.filepath import FilePath from twisted.python.usage import Options from twisted.internet.defer import Deferred from twisted.internet.protocol import Factory, Protocol from twisted.internet.endpoints import UNIXClientEndpoint from twisted.conch.ssh.keys import EncryptedKeyError, Key from twisted.conch.client.knownhosts import KnownHostsFile, ConsoleUI from twisted.conch.endpoints import SSHCommandClientEndpoint class EchoOptions(Options): optParameters = [ ("host", "h", "localhost", "hostname of the SSH server to which to connect"), ("port", "p", 22, "port number of SSH server to which to connect", int), ("username", "u", getpass.getuser(), "username with which to authenticate with the SSH server"), ("identity", "i", None, "file from which to read a private key to use for authentication"), ("password", None, None, "password to use for authentication"), ("knownhosts", "k", "~/.ssh/known_hosts", "file containing known ssh server public key data"), ] optFlags = [ ["no-agent", None, "Disable use of key agent"], ] class NoiseProtocol(Protocol): def connectionMade(self): self.finished = Deferred() self.strings = ["bif", "pow", "zot"] self.sendNoise() def sendNoise(self): if self.strings: self.transport.write(self.strings.pop(0) + "\n") else: self.transport.loseConnection() def dataReceived(self, data): print "Server says:", data self.sendNoise() def connectionLost(self, reason): self.finished.callback(None) def readKey(path): try: return Key.fromFile(path) except EncryptedKeyError: passphrase = getpass.getpass("%r keyphrase: " % (path,)) return Key.fromFile(path, passphrase=passphrase) class ConnectionParameters(object): def __init__(self, reactor, ui, host, port, username, password, keys, knownHosts, agent): self.reactor = reactor self.ui = ui self.host = host self.port = port self.username = username self.password = password self.keys = keys self.knownHosts = knownHosts self.agent = agent @classmethod def fromCommandLine(cls, reactor, argv): config = EchoOptions() config.parseOptions(argv) ui = ConsoleUI(lambda: open("/dev/tty", "r+")) keys = [] if config["identity"]: keyPath = os.path.expanduser(config["identity"]) if os.path.exists(keyPath): keys.append(readKey(keyPath)) knownHostsPath = FilePath(os.path.expanduser(config["knownhosts"])) if knownHostsPath.exists(): knownHosts = KnownHostsFile.fromPath(knownHostsPath) else: knownHosts = None if config["no-agent"] or "SSH_AUTH_SOCK" not in os.environ: agentEndpoint = None else: agentEndpoint = UNIXClientEndpoint( reactor, os.environ["SSH_AUTH_SOCK"]) return cls( reactor, ui, config["host"], config["port"], config["username"], config["password"], keys, knownHosts, agentEndpoint) def endpointForCommand(self, command): return SSHCommandClientEndpoint.newConnection( self.reactor, command, self.username, self.host, port=self.port, keys=self.keys, password=self.password, agentEndpoint=self.agent, knownHosts=self.knownHosts, ui=self.ui) def main(reactor, *argv): parameters = ConnectionParameters.fromCommandLine(reactor, argv) endpoint = parameters.endpointForCommand(b"/bin/cat") factory = Factory() factory.protocol = NoiseProtocol d = endpoint.connect(factory) d.addCallback(lambda proto: proto.finished) return d
For completeness, this example includes a lot of code to support different
styles of authentication, reading (and possibly updating) existing
known_hosts files, and parsing command line options. Focus on
the latter half of the main
function to see the code that is
most directly responsible for actually doing the necessary SSH connection
setup. SSHCommandClientEndpoint
accepts quite a few options, since
there is a lot of flexibility in SSH and many possible different server
configurations, but once the endpoint object itself is created, its use is
no more complicated than the use of any other endpoint: pass a factory to
its connect
method and attach a callback to the
resulting Deferred
to do something with the protocol
instance. If you use an endpoint that creates new connections, the connection
attempt can be cancelled by calling cancel()
on this
Deferred
.
In this case, the connected protocol instance is only used to make the
example wait until the client has finished talking to the server, which
happens after the small amount of example data has been sent to the server
and bounced back by the /bin/cat
process the
protocol is interacting with.
It is also possible to run commands (one or more) over an
already-established connection. This is done using the alternate
constructor SSHCommandClientEndpoint.existingConnection
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
#!/usr/bin/env python # Copyright (c) Twisted Matrix Laboratories. # See LICENSE for details. if __name__ == '__main__': import sys import echoclient_shared_ssh from twisted.internet.task import react react(echoclient_shared_ssh.main, sys.argv[1:]) from twisted.internet.task import cooperate from twisted.internet.defer import Deferred, gatherResults from twisted.internet.protocol import Factory, Protocol from twisted.conch.endpoints import SSHCommandClientEndpoint from echoclient_ssh import ConnectionParameters class PrinterProtocol(Protocol): def dataReceived(self, data): print "Got some data:", data, def connectionLost(self, reason): print "Lost my connection" self.factory.done.callback(None) def main(reactor, *argv): parameters = ConnectionParameters.fromCommandLine(reactor, argv) endpoint = parameters.endpointForCommand(b"/bin/cat") done = [] factory = Factory() factory.protocol = Protocol d = endpoint.connect(factory) def gotConnection(proto): conn = proto.transport.conn for i in range(50): factory = Factory() factory.protocol = PrinterProtocol factory.done = Deferred() done.append(factory.done) e = SSHCommandClientEndpoint.existingConnection( conn, b"/bin/echo %d" % (i,)) yield e.connect(factory) d.addCallback(gotConnection) d.addCallback(lambda work: cooperate(work).whenDone()) d.addCallback(lambda ignored: gatherResults(done)) return d
Writing a client
In case the endpoint is missing some necessary functionality, or in case you want to interact with a different part of an SSH server - such as one of its subsystems (for example, SFTP), you may need to use the lower-level Conch client interface. This is described below.
Writing a client with Conch involves sub-classing 4 classes: twisted.conch.ssh.transport.SSHClientTransport
, twisted.conch.ssh.userauth.SSHUserAuthClient
, twisted.conch.ssh.connection.SSHConnection
, and twisted.conch.ssh.channel.SSHChannel
. We'll start out
with SSHClientTransport
because it's the base
of the client.
The Transport
1 2 3 4 5 6 7 8 9 10 11 12 13 14
from twisted.conch import error from twisted.conch.ssh import transport from twisted.internet import defer class ClientTransport(transport.SSHClientTransport): def verifyHostKey(self, pubKey, fingerprint): if fingerprint != 'b1:94:6a:c9:24:92:d2:34:7c:62:35:b4:d2:61:11:84': return defer.fail(error.ConchError('bad key')) else: return defer.succeed(1) def connectionSecure(self): self.requestService(ClientUserAuth('user', ClientConnection()))
See how easy it is? SSHClientTransport
handles the negotiation of encryption and the verification of keys
for you. The one security element that you as a client writer need to
implement is verifyHostKey()
. This method
is called with two strings: the public key sent by the server and its
fingerprint. You should verify the host key the server sends, either
by checking against a hard-coded value as in the example, or by asking
the user. verifyHostKey
returns a twisted.internet.defer.Deferred
which gets a callback
if the host key is valid, or an errback if it is not. Note that in the
above, replace 'user' with the username you're attempting to ssh with,
for instance a call to os.getlogin()
for the
current user.
The second method you need to implement is connectionSecure()
. It is called when the
encryption is set up and other services can be run. The example requests
that the ClientUserAuth
service be started.
This service will be discussed next.
The Authorization Client
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
from twisted.conch.ssh import keys, userauth # these are the public/private keys from test_conch publicKey = 'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEArzJx8OYOnJmzf4tfBEvLi8DVPrJ3\ /c9k2I/Az64fxjHf9imyRJbixtQhlH9lfNjUIx+4LmrJH5QNRsFporcHDKOTwTTYLh5KmRpslkYHR\ ivcJSkbh/C+BR3utDS555mV' privateKey = """-----BEGIN RSA PRIVATE KEY----- MIIByAIBAAJhAK8ycfDmDpyZs3+LXwRLy4vA1T6yd/3PZNiPwM+uH8Yx3/YpskSW 4sbUIZR/ZXzY1CMfuC5qyR+UDUbBaaK3Bwyjk8E02C4eSpkabJZGB0Yr3CUpG4fw vgUd7rQ0ueeZlQIBIwJgbh+1VZfr7WftK5lu7MHtqE1S1vPWZQYE3+VUn8yJADyb Z4fsZaCrzW9lkIqXkE3GIY+ojdhZhkO1gbG0118sIgphwSWKRxK0mvh6ERxKqIt1 xJEJO74EykXZV4oNJ8sjAjEA3J9r2ZghVhGN6V8DnQrTk24Td0E8hU8AcP0FVP+8 PQm/g/aXf2QQkQT+omdHVEJrAjEAy0pL0EBH6EVS98evDCBtQw22OZT52qXlAwZ2 gyTriKFVoqjeEjt3SZKKqXHSApP/AjBLpF99zcJJZRq2abgYlf9lv1chkrWqDHUu DZttmYJeEfiFBBavVYIF1dOlZT0G8jMCMBc7sOSZodFnAiryP+Qg9otSBjJ3bQML pSTqy7c3a2AScC/YyOwkDaICHnnD3XyjMwIxALRzl0tQEKMXs6hH8ToUdlLROCrP EhQ0wahUTCk1gKA4uPD6TMTChavbh4K63OvbKg== -----END RSA PRIVATE KEY-----""" class ClientUserAuth(userauth.SSHUserAuthClient): def getPassword(self, prompt = None): return # this says we won't do password authentication def getPublicKey(self): return keys.Key.fromString(data = publicKey).blob() def getPrivateKey(self): return defer.succeed(keys.Key.fromString(data = privateKey).keyObject)
Again, fairly simple. The SSHUserAuthClient
takes care of most
of the work, but the actual authentication data needs to be
supplied. getPassword()
asks for a
password, getPublicKey()
and getPrivateKey()
get public and private keys,
respectively. getPassword()
returns
a Deferred
that is called back with
the password to use. getPublicKey()
returns the SSH key data for the public key to use. keys.Key.fromString()
will take
a key in OpenSSH or LSH format as a string, and convert it to the
required format. Alternatively, keys.Key.fromFile()
can be used instead, which
will take the filename of a key in OpenSSH and LSH format, and
convert it to the required format.
getPrivateKey()
returns a Deferred
which is
called back with the key object (as used in PyCrypto) for
the private key. getPassword()
and getPrivateKey()
return Deferreds
because they may need to ask the user
for input.
Once the authentication is complete, SSHUserAuthClient
takes care of starting the code
SSHConnection
object given to it. Next, we'll
look at how to use the SSHConnection
The Connection
1 2 3 4 5 6
from twisted.conch.ssh import connection class ClientConnection(connection.SSHConnection): def serviceStarted(self): self.openChannel(CatChannel(conn = self))
SSHConnection
is the easiest,
as it's only responsible for starting the channels. It has
other methods, those will be examined when we look at SSHChannel
.
The Channel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
from twisted.conch.ssh import channel, common class CatChannel(channel.SSHChannel): name = 'session' def channelOpen(self, data): d = self.conn.sendRequest(self, 'exec', common.NS('cat'), wantReply = 1) d.addCallback(self._cbSendRequest) self.catData = '' def _cbSendRequest(self, ignored): self.write('This data will be echoed back to us by "cat."\r\n') self.conn.sendEOF(self) self.loseConnection() def dataReceived(self, data): self.catData += data def closed(self): print 'We got this from "cat":', self.catData
Now that we've spent all this time getting the server and
client connected, here is where that work pays off. SSHChannel
is the interface between you and the
other side. This particular channel opens a session and plays with the
'cat' program, but your channel can implement anything, so long as the
server supports it.
The channelOpen()
method is
where everything gets started. It gets passed a chunk of data;
however, this chunk is usually nothing and can be ignored.
Our channelOpen()
initializes our
channel, and sends a request to the other side, using the
sendRequest()
method of the SSHConnection
object. Requests are used to send
events to the other side. We pass the method self so that it knows to
send the request for this channel. The 2nd argument of 'exec' tells the
server that we want to execute a command. The third argument is the data
that accompanies the request.
common.NS
encodes
the data as a length-prefixed string, which is how the server expects
the data. We also say that we want a reply saying that the process has a
been started. sendRequest()
then returns a
Deferred
which we add a callback for.
Once the callback fires, we send the data. SSHChannel
supports the
twisted.internet.interfaces.ITransport
interface, so
it can be given to Protocols to run them over the secure
connection. In our case, we just write the data directly. sendEOF()
does not follow the interface,
but Conch uses it to tell the other side that we will write no
more data. loseConnection()
shuts
down our side of the connection, but we will still receive data
through dataReceived()
. The closed()
method is called when both sides of the
connection are closed, and we use it to display the data we received
(which should be the same as the data we sent.)
Finally, let's actually invoke the code we've set up.
The main() function
1 2 3 4 5 6 7 8 9 10
from twisted.internet import protocol, reactor def main(): factory = protocol.ClientFactory() factory.protocol = ClientTransport reactor.connectTCP('localhost', 22, factory) reactor.run() if __name__ == "__main__": main()
We call connectTCP()
to connect to
localhost, port 22 (the standard port for ssh), and pass it an instance
of twisted.internet.protocol.ClientFactory
.
This instance has the attribute protocol
set to our earlier ClientTransport
class. Note that the protocol attribute is set to the class ClientTransport
, not an instance of
ClientTransport
! When the connectTCP
call completes, the protocol will be
called to create a ClientTransport()
object
- this then invokes all our previous work.
It's worth noting that in the example main()
routine, the reactor.run()
call never returns.
If you want to make the program exit, call
reactor.stop()
in the earlier
closed()
method.
If you wish to observe the interactions in more detail, adding a call
to log.startLogging(sys.stdout, setStdout=0)
before the reactor.run()
call will send all
logging to stdout.


{% extends "tutorial.html" %} {% block head %} {% endblock %} {% block html5badge %} {% endblock %} {% block iscompatible %} return true; {% endblock %} {% block content %}
Hello! My name is Michael Chang and I work with the Data Arts Team at Google. Recently, we completed 100,000 Stars, a Chrome Experiment visualizing nearby stars. The project was built with THREE.js and CSS3D. In this case study I will outline the discovery process, share some programming techniques, and finish with some thoughts for future improvement.
The topics discussed here will be fairly broad, and require some knowledge of THREE.js, though it is my hope that you can still enjoy this as a technical post-mortem. Feel free to jump to an area of interest using the table of contents button on the right. First, I'll show the rendering portion of the project, followed by shader management, and finally how to use CSS text labels in combination with WebGL.
Shortly after we finished Small Arms Globe, I was experimenting with a THREE.js particle demo with depth of field. I noticed that I could change the interpreted "scale" of the scene by adjusting the amount of the effect applied. When the depth of field effect was really extreme, distant objects became really blurry similar to the way tilt-shift photography works on giving one the illusion of looking at a microscopic scene. Conversely, turning down the effect made it appear as if you were staring into deep space.
I began hunting for data I could use to inject particle positions with, a path that lead me to astronexus.com's HYG database, a compilation of the three data sources (Hipparcos, Yale Bright Star Catalog, and Gliese/Jahreiss Catalog) accompanied by pre-calculated xyz Cartesian coordinates. Let's begin!
It took about an hour to hack together something that placed the star data in 3D space. There are exactly 119,617 stars in the data set, so representing each star with a particle is not a problem for a modern GPU. There are also 87 individually identified stars, so I created a CSS marker overlay using the same technique I described in Small Arms Globe.
During this time I had just finished the Mass Effect series. In the game the player is invited to explore the galaxy and scan various planets and read about their completely fictional, wikipedia-sounding history: what species had thrived on the planet, its geological history, and so forth.
Knowing the wealth of actual data that's out there about stars, one could conceivably present real information about the galaxy in the same way. The ultimate goal for this project would be to bring to life this data, allow the viewer to explore the galaxy à la Mass Effect, to learn about stars and their distribution, and hopefully inspire a sense of awe and wonder about space. Phew!
I should probably preface the rest of this case-study by saying that I am by no means an astronomer, and that this is the work of amateur research supported by some advice from external experts. This project should definitely be construed as an artist interpretation of space.
My plan was to procedurally generate a model of the galaxy that can put the star data in context -- and hopefully give an awesome view of our place in the Milky Way.
To generate the Milky Way, I spawned 100,000 particles and placed them in a spiral by emulating the way galactic arms are formed. I wasn't too worried about the specifics of spiral arm formation because this would be a representational model rather than a mathematical one. However I did try to get the number of spiral arms more or less correct, and spinning in the "right direction."
In later versions of the Milky Way model I de-emphasized the use of particles in favor of a planar image of a galaxy to accompany the particles, hopefully giving it a more of a photographic appearance. The actual image is of spiral galaxy NGC 1232 roughly 70 million light years away from us, image-manipulated to look like the Milky Way.
I decided early on to represent one GL unit, basically a pixel in 3D, as one light year -- a convention that unified placement for everything visualized, and unfortunately gave me serious precision issues later on.
Another convention I decided was to rotate the entire scene rather than moving the camera, something I've done in a few other projects. One advantage is that everything is placed onto a "turntable" so that mouse-dragging left and right rotates the object in question, but zooming in is only a matter of changing camera.position.z.
Field of view (or FOV) for the camera is also dynamic. As one pulls outwards, the field of view widens, taking in more and more of the galaxy. The opposite is true when moving inwards towards a star, the field of view narrows. This allows the camera to view things that are infinitesimal (in comparison to the galaxy) by squishing the FOV down to something of a god-like magnifying glass without having to deal with near-plane clipping issues.
From here I was able to "place" the Sun at some number of units away from the galactic core. I was also able to visualize the relative size of the solar system by mapping out the radius of the Kuiper Cliff (I eventually chose to visualize the Oort Cloud) instead. Within this model solar system, I could also visualize a simplified orbit of Earth, and the actual radius of the Sun in comparison.
The Sun was difficult to render. I had to cheat with as many real-time graphics techniques as I knew. The surface of the Sun is a hot froth of plasma and needed to pulse and change over time. This was simulated via a bitmap texture of an infrared image of the solar surface. The surface shader makes a color look-up based on the grayscale of this texture and performs a look-up in a separate color ramp. When this look-up is shifted over time it creates this lava-like distortion.
A similar technique was used for the corona of the Sun, except that it would be a flat sprite card that always faces the camera using THREE.Gyroscope();.
The solar flares were created via vertex and fragment shaders applied to a torus, spinning just around the edge of the solar surface. The vertex shader has a noise function causing it to weave in a blob-like fashion.
It was here that I was starting to experience some z-fighting issues due to GL precision. All of the variables for precision were pre-defined in THREE.js, so I couldn't realistically bump up the precision without a huge amount of work. Precision issues were not as bad near the origin. However, once I started modeling other star systems, this became an issue.
There were a few hacks I employed to mitigate z-fighting. THREE's Material.polygonoffset is a property that allows polygons to be rendered at a different perceived location (as far as I understand). This was used to force the corona plane to always render on top of the Sun's surface. Below this, a Sun "halo" was rendered to give sharp light rays moving away from the sphere.
A different problem related to precision was that the star models would begin jittering as the scene zoomed in. To fix this I had to "zero out" the scene rotation and separately rotate the star model and environment map to give the illusion that you are orbiting the star.
Space visualizations are where I feel like I can get away with excessive use of lensflare. THREE.LensFlare serves this purposes, all I needed to do was throw in some anamorphic hexagons and a dash of JJ Abrams. The snippet below shows how to construct them in your scene.
// This function retuns a lesnflare THREE object to be .add()ed to the scene graph function addLensFlare(x,y,z, size, overrideImage){ var flareColor = new THREE.Color( 0xffffff ); lensFlare = new THREE.LensFlare( overrideImage, 700, 0.0, THREE.AdditiveBlending, flareColor ); // we're going to be using multiple sub-lens-flare artifacts, each with a different size lensFlare.add( textureFlare1, 4096, 0.0, THREE.AdditiveBlending ); lensFlare.add( textureFlare2, 512, 0.0, THREE.AdditiveBlending ); lensFlare.add( textureFlare2, 512, 0.0, THREE.AdditiveBlending ); lensFlare.add( textureFlare2, 512, 0.0, THREE.AdditiveBlending ); // and run each through a function below lensFlare.customUpdateCallback = lensFlareUpdateCallback; lensFlare.position = new THREE.Vector3(x,y,z); lensFlare.size = size ? size : 16000 ; return lensFlare; } // this function will operate over each lensflare artifact, moving them around the screen function lensFlareUpdateCallback( object ) { var f, fl = this.lensFlares.length; var flare; var vecX = -this.positionScreen.x * 2; var vecY = -this.positionScreen.y * 2; var size = object.size ? object.size : 16000; var camDistance = camera.position.length(); for( f = 0; f < fl; f ++ ) { flare = this.lensFlares[ f ]; flare.x = this.positionScreen.x + vecX * flare.distance; flare.y = this.positionScreen.y + vecY * flare.distance; flare.scale = size / camDistance; flare.rotation = 0; } }
For the "spatial orientation plane", a gigantic THREE.CylinderGeometry() was created and centered on the Sun. To create the "wave of light" fanning outwards, I modified its texture offset over time like so:
mesh.material.map.needsUpdate = true; mesh.material.map.onUpdate = function(){ this.offset.y -= 0.001; this.needsUpdate = true; }
'map' is the texture belonging to the material, which get an onUpdate function you can over-write. Setting its offset causes the texture to be "scrolled" along that axis, and spamming needsUpdate = true would force this behavior to loop.
Each star has a different color based on a "color-index" that astronomers have assigned them. In general, red stars are cooler and blue/purple stars are hotter. A band of white and intermediate orange colors exist in this gradient.
When rendering the stars I wanted to give each particle its own color based on this data. The way to do this was with "attributes" given to the shader material applied to the particles.
var shaderMaterial = new THREE.ShaderMaterial( { uniforms: datastarUniforms, attributes: datastarAttributes, /* ... etc */ });
var datastarAttributes = { size: { type: 'f', value: [] }, colorIndex: { type: 'f', value: [] }, };
Filling up the colorIndex array would give each particle its unique color in the shader. Normally one would pass in a color vec3, but in this instance I'm passing in a float for the eventual color ramp look-up.
The color ramp looked like this, however I needed to access its bitmap color data from JavaScript. The way I did this was to first load the image onto DOM, draw it into a canvas element, then access the canvas bitmap.
// make a blank canvas, sized to the image, in this case gradientImage is a dom image element gradientCanvas = document.createElement('canvas'); gradientCanvas.width = gradientImage.width; gradientCanvas.height = gradientImage.height; // draw the image gradientCanvas.getContext('2d').drawImage( gradientImage, 0, 0, gradientImage.width, gradientImage.height ); // a function to grab the pixel color based on a normalized percentage value gradientCanvas.getColor = function( percentage ){ return this.getContext('2d').getImageData(percentage * gradientImage.width,0, 1, 1).data; }
This same method is then used for coloring individual stars in the star model view.
Throughout the project I discovered that I needed to write more and more shaders to accomplish all of the visual effects. I wrote a custom shader loader for this purpose because I was tired of having shaders live in index.html.
// list of shaders we'll load var shaderList = ['shaders/starsurface', 'shaders/starhalo', 'shaders/starflare', 'shaders/galacticstars', /*...etc...*/]; // a small util to pre-fetch all shaders and put them in a data structure (replacing the list above) function loadShaders( list, callback ){ var shaders = {}; var expectedFiles = list.length * 2; var loadedFiles = 0; function makeCallback( name, type ){ return function(data){ if( shaders[name] === undefined ){ shaders[name] = {}; } shaders[name][type] = data; // check if done loadedFiles++; if( loadedFiles == expectedFiles ){ callback( shaders ); } }; } for( var i=0; i<list.length; i++ ){ var vertexShaderFile = list[i] + '.vsh'; var fragmentShaderFile = list[i] + '.fsh'; // find the filename, use it as the identifier var splitted = list[i].split('/'); var shaderName = splitted[splitted.length-1]; $(document).load( vertexShaderFile, makeCallback(shaderName, 'vertex') ); $(document).load( fragmentShaderFile, makeCallback(shaderName, 'fragment') ); } }
The loadShaders() function takes a list of shader file names (expecting .fsh for fragment and .vsh for vertex shaders), attempts to load their data, and then just replaces the list with objects. The end result is in your THREE.js uniforms you could pass shaders to it like so:
var galacticShaderMaterial = new THREE.ShaderMaterial( { vertexShader: shaderList.galacticstars.vertex, fragmentShader: shaderList.galacticstars.fragment, /*...*/ });
I probably could have used require.js although that would have needed some code reassembling just for this purpose. This solution, while much easier, could be improved upon I think, perhaps even as a THREE.js extension. If you have suggestions or ways to do this better, please let me know!
On our last project, Small Arms Globe, I toyed with making text labels appear on top of a THREE.js scene. The method I was using calculates the absolute model position of where I want the text to appear, then resolves the screen position using THREE.Projector(), and finally uses CSS "top" and "left" to place the CSS elements at the desired position.
Early iterations on this project used this same technique, however I've been itching to try this other method described by Luis Cruz.
The basic idea: match the CSS3D's matrix transform to THREE's camera and scene, and you can "place" CSS elements in 3D as if it were on top of THREE's scene. There are limitations to this though, for example you won't be able to have text go underneath a THREE.js object. This is still much faster than trying to perform layout using "top" and "left" CSS attributes.
You can find the demo (and code in view source) for this here. However I did find that the matrix order has since changed for THREE.js. The function I've updated:
/* Fixes the difference between WebGL coordinates to CSS coordinates */ function toCSSMatrix(threeMat4, b) { var a = threeMat4, f; if (b) { f = [ a.elements[0], -a.elements[1], a.elements[2], a.elements[3], a.elements[4], -a.elements[5], a.elements[6], a.elements[7], a.elements[8], -a.elements[9], a.elements[10], a.elements[11], a.elements[12], -a.elements[13], a.elements[14], a.elements[15] ]; } else { f = [ a.elements[0], a.elements[1], a.elements[2], a.elements[3], a.elements[4], a.elements[5], a.elements[6], a.elements[7], a.elements[8], a.elements[9], a.elements[10], a.elements[11], a.elements[12], a.elements[13], a.elements[14], a.elements[15] ]; } for (var e in f) { f[e] = epsilon(f[e]); } return "matrix3d(" + f.join(",") + ")"; }
Since everything is transformed, the text no longer faces the camera. The solution was to use THREE.Gyroscope() which forces an Object3D to "lose" its inherited orientation from the scene. This technique is called "billboarding", and Gyroscope is perfect for doing this.
What's really nice is that all of the normal DOM and CSS still played along, like being able mouse-over a 3D text label and have it glow with drop shadows.
When zooming in I found the scaling of typography was causing issues with positioning. Perhaps is this due to the kerning and padding of the text? Another problem was that the text became pixelated when zoomed into since the DOM renderer treats the rendered text as a textured quad, something to be aware of when using this method. In retrospect, I could have just used gigantic font-sized text, and perhaps this is something for future exploration. In this project I also used the "top/left" CSS placement text labels, described earlier, for really small elements that accompany planets in the solar system.
The piece of music played during Mass Effect's 'Galactic Map' was by Bioware composers Sam Hulick and Jack Wall, and it had the kind of emotion I wanted the visitor to experience. We wanted some music in our project because we felt it was an important part of the atmosphere, helping create that sense of awe and wonderment we were trying to aim for.
Our producer Valdean Klump contacted Sam who had a bunch of "cutting floor" music from Mass Effect that he very graciously let us use. The track is titled "In a Strange Land".
I used the audio tag for music playback, however even in Chrome the "loop" attribute was unreliable -- sometimes it would just fail to loop. In the end this dual audio tag hack was used to check for end of playback and cycling to the other tag for playing. What was disappointing was that this *still* was not perfectly looping all the time, alas I feel like this was the best that I could do.
var musicA = document.getElementById('bgmusicA'); var musicB = document.getElementById('bgmusicB'); musicA.addEventListener('ended', function(){ this.currentTime = 0; this.pause(); var playB = function(){ musicB.play(); } // make it wait 15 seconds before playing again setTimeout( playB, 15000 ); }, false); musicB.addEventListener('ended', function(){ this.currentTime = 0; this.pause(); var playA = function(){ musicA.play(); } // otherwise the music will drive you insane setTimeout( playA, 15000 ); }, false); // okay so there's a bit of code redundancy, I admit it musicA.play();
After having worked with THREE.js for a while, I feel like I've gotten to the point where my data was mixing too much with my code. For example when defining materials, textures, and geometry instructions in-line, I was essentially "3D modeling with code". This felt really bad, and is an area where future endeavors with THREE.js could greatly improve upon, for example defining material data in a separate file, preferably viewable and tweakable in some context, and can be brought back into the main project.
Our colleague Ray McClure also spent some time creating some awesome generative "space noises" which had to be cut due to the web audio API being unstable, crashing Chrome every so often. It's unfortunate... but it definitely got us thinking more in the sound space for future work. As of this writing I'm informed that the Web Audio API has been patched so it's possible this is working now, something to look out for in the future.
Typographical elements paired with WebGL still remains to be a challenge, and I'm not 100% sure what we're doing here is the correct way. It still feels like a hack. Perhaps future versions of THREE, with its up and coming CSS Renderer, can be used to better join the two worlds.
Thanks to Aaron Koblin for letting me go to town with this project. Jono Brandel for the excellent UI design + implementation, type treatment, and tour implementation. Valdean Klump for giving the project a name and all of the copy. Sabah Ahmed for clearing the metric ton of use-rights for the data and image sources. Clem Wright for reaching out to the right people for publication. Doug Fritz for technical excellence. George Brower for teaching me JS and CSS. And of course Mr. Doob for THREE.js.


We use Playfair Display for headings, Open Sans for body copy and Montserrat for documentation and the footer.
(Note: Hopefully we will consolidate Montserrat and Open Sans in the future!)
Open Sans
Playfair Display
Montserrat


Using Faust with VCV Rack
VCV Rack is virtual modular synthesizer, allowing thousands of separated developed modules to be connected in patches to synthesize and process sounds. A large community of developers are providing tons of modules to be installed in the application as libraries, and a lot of them are developed as open-source projects on GitHub.
In this tutorial, we'll show how to use the Faust language to generate monophonic or polyphonic modules:
- either using the Faust aware programmable VCV Prototype to edit/compile/test Faust DSP code
- or using the faust2vcvrack tool with allows to generate standalone modules
- to introduce module development, a quick introduction on using C++ to develop modules will be done first.
Installation
Get the binary version for your OS here.
Install the VCV Rack SDK
From Plugin Development Tutorial page and the SDK itself for your OS.
Don't forget to setup the RACK_DIR variable: export RACK_DIR=<Rack SDK folder>
.
Compiling the VCV Prototype module Faust version
The Faust compiler can be embedded in applications or plugins using libfaust, and DSP code can be edited and JIT compiled on the fly.
You'll have to clone and compile the GitHub project. Be use to use the faust
branch and follow the explanations given.
Then you should be ready for this workshop !
The modular principle
VCV Rack follows the Modular synthesizers principe explained on this Wikipedia article:
Modular synthesizers are synthesizers composed of separate modules of different functions. The modules can be connected together with patch cords, a matrix patching system, or switches by the user to create a patch. The output (voltages) from the modules may function as (audio) signals, control voltages, or logic/timing conditions. Typical modules are oscillators (operate on frequency), filters (spectrum), amplifiers/gates (amplitude) and Envelope generators (dynamic control).
To do that, control signals (CV) run at audio rate, and so the entire patch is triggered with audio buffers of only one sample. When described as CV signals, parameters can thus be changed in real-time by other signals coming from any module, just by connecting them. So a kind of blur between audio and control signals is part in this model and signals can be connected anywhere.
Since software modules mimic real physical ones, they somewhat follow the same conventions to represent signal range, typically with [-5v...5v] or [0v..10v] values, or 1V/octave for MIDI signals. Read the voltage standard page for a more complete description.
Control parameters can also be changed from the module GUI using switches, knobs.etc...
Modules can be monophonic or polyphonic (up to 16 channels), where each cable actually transport several (usually related) signals. The polyphonic model is obviously used for instruments, but can also be used for effects. Polyhonic modules have thicker cables in the GUI.
Developing C++ Modules
Before using Faust to develop modules, let's have a look at the standard procedure. Modules are usually created with C++ using the VCV Rack SDK that gives developers several tools to start with. Following the tutorial here, a template project can be created:
Generating a template
./helper.py createplugin MyPlugin
The created folder contains a Makefile that can be used to compile and install the module in your (previously installed) VCV Rack application:
make && make install
GUI description using SVG
The module GUI is done using SVG. Developers will classically prepare the background layer with Inkscape or a similar tool, with special conventions to describe audio or CV inputs/outputs, UI items (knobs, lights, custom widgets... ). Here a example of a basic SVG template with a light, a param (like knob), an audio or CV input, and an audio or CV output:
Inside the module project, the following command will decode the SVG file and generate template C++ code to create the various widget:
../helper.py createmodule MyModule res/MyModule.svg src/MyModule.cpp
Adding DSP code
Then C++ code will be added to implement as simple oscillator in the process
function:
float phase = 0.f;
float freq = 440.f;
void process(const ProcessArgs &args) override {
// Accumulate the phase
phase += freq * args.sampleTime;
if (phase >= 0.5f)
phase -= 1.f;
// Compute the sine output
float sine = std::sin(2.f * M_PI * phase);
// Audio signals are typically +/-5V
outputs[SINE_OUTPUT].setVoltage(5.f * sine);
}
The following line in plugin.cpp has to be uncommented:
p->addModel(modelMyModule);
and well as in plugin.hpp:
extern Model* modelMyModule;
And compilation and installation of the module has to be done again:
make && make install
Programming using the Faust aware VCV Prototype module
The VCV Prototype module runs scripting languages for prototyping, learning, and live coding. It can currently be programmed using JavaScript, Lua, Vult, or PureData. A generic GUI with 6 inputs/outputs (either audio or CV signals), 6 knobs, 6 lights (RGB LEDs) or 6 switches (with RGB LEDs) is defined.
Note that only monophonic examples can be coded with the prototype.
Faust support thanks to libfaust embedding the Interpreter backend has been added. It allows to edit/compile/execute DSP programs on the fly, with acceptable performances (even if using the LLVM JIT would allow to generate faster code, but as the expense of a much more complicated installation procedure).
Editing/compiling/executing DSP files
Faust DSP files have to be loaded in VCV Prototype and edited in a external editor (Visual Studio Code, Atom...). Each time the file is saved, it will be recompiled and executed. To possibly save compilation time, the DSP machine code is saved in a cache, and possibly restored the next time the session will be loaded.
The 6 audio inputs/outputs can be accessed in order in the Faust DSP which can thus use up to 6 channels.
The 6 switches, knobs as well as the lights and switchLights can be connected to UI controllers using metadata:
[switch:N]
(with N from 1 to 6) has to be used in abutton
orcheckbox
item to connect it to the prototype interface switch number N[knob:N]
(with N from 1 to 6) has to be used in avslider
,hslider
ornentry
item to connect it to the prototype interface knob number N. The knob [0..1] range will be mapped to the slider/nentry [min..max] range[light_red:N|light_green:N|light_blue:N]
(with N from 1 to 6) has to be used in avbargraph
orhbargraph
item to connect it to the prototype interface light number N[switchlight_red:N|switchlight_green:N|switchlight_blue:N]
(with N from 1 to 6) has to be used in avbargraph
orhbargraph
to connect it to the prototype interface switchLight number N
So a button or checkbox UI item can use the [switch:N]
metadata to be associated with the corresponding GUI switch, which color can be controlled using the switchlight_xx:N
metadata. For instance:
gate = button("gate [switch:1") : hbargraph("[switchlight_red:1]", 0, 1);
can be written to describe a button which become red when pressedcheck = checkbox("check [switch:2]") : vbargraph("[switchlight_red:2]", 0, 1) : vbargraph("[switchlight_green:2]", 0, 1) : vbargraph("[switchlight_blue:2]", 0, 1);
can be written to describe a checkbox which become white when checked
Other metadata:
[scale:lin|log|exp]
metadata is implemented.
The rack.lib Faust library contains usefull functions to convert CV signals, and can be enriched if needed.
Note that only monophonic DSP programs can be described.
DSP examples
Here is a simple example showing how oscillators can be controlled by GUI items, associated with metadata in the DSP code:
import("stdfaust.lib");
// UI controllers connected using metadata
freq = hslider("freq [knob:1]", 200, 50, 5000, 0.01);
gain = hslider("gain [knob:2]", 0.5, 0, 1, 0.01);
gate = button("gate [switch:1]");
// DSP processor
process = os.osc(freq) * gain * 5, os.sawtooth(freq) * gain * gate * 5;
Following the VCV Prototype model, note that audio outputs are multipled by 5 to follow the [-5v..5v] range convention.
The VCV Prototype standard examples ported to Faust can be seen in the examples folder:
- gain.dsp shows how switches and knobs can be connected using metadata , and even change color when pressed or moved:
// Simplest possible script using all variables
import("stdfaust.lib");
// Switch button, highlight in red
switch(i) = button("switch%i [switch:%i]") : hbargraph("[switchlight_red:%i]", 0, 1);
// Gain slider, highlight in red
gain(i) = hslider("gain%i [knob:%i]", 0.1, 0, 1, 0.01) : hbargraph("[light_red:%i]", 0, 1);
process = si.bus(6) : par(i, 6, *(gain(i+1)) * (1-switch(i+1)));
- vco.dsp shows an oscillator with frequency controlled by a knob and a CV pich signal (following the 1V/octave convention):
// Voltage-controlled oscillator example
import("stdfaust.lib");
// Create a phasor with a given frequency
phasor(freq) = freq/ma.SR : (+ : decimal) ~ _ with { decimal(x) = x-int(x); };
// Pitch to freq conversion (also included in the rack.lib library)
cv_pitch2freq(cv_pitch) = 440 * 2 ^ (cv_pitch - 0.75);
gain = hslider("gain [knob:1]", 0.1, 0, 1, 0.01) * 10 - 5;
pitch(x) = x + gain;
process(x) = sin(2 * ma.PI * phasor(cv_pitch2freq(pitch(x)))) * 5;
Some additional examples:
-
synth.dsp demonstrates how to use all different VCV Prototype UI items
-
organ.dsp demonstrates a MIDI controllable additive synthesis based organ
-
physicalmodel.dsp demonstrates a modal synthesis based bell connected to a reverb
Using faust2vcvrack
The faust2vcvrack tool compiles a Faust DSP program in a folder containing the VCV Rack plugin C++ source code and a Makefile to compile it. By default the resulting C++ code is compiled and installed in the VCV Rack application:
faust2vcvrack [-soundfile] [-source] [-nvoices <num>] [additional Faust options (-vec -vs 8...)] <file.dsp>
The tool is now part of the master-dev branch on GitHub, or can be used with Faust IDE, and by selecting the appropriate export targets (vcvrack, vcvrack-poly8, or vcvrack-poly16).
Here are the available options:
-soundfile when compiling a DSP using the 'soundfile' primitive, add required resources
-source to only create the source folder
-nvoices <num> to produce a polyphonic self-contained DSP with <num> voices, ready to be used with MIDI
Faust DSP code classically produces audio signals in the [-1..1] range. Since VCV expects audio signals in the [-5v..5v] range, they are automatically converted in the architecture file. CV control in the [0v..10v] volts range will be mapped to the controllers [min..max] range.
Polyphony support
Polyphonic modules can be created using the -nvoices <num>
parameter up to 16 voices. The freq/gate/gain
convention can be used in the DSP code. VCV Rack follows the 1V/octave convention for MIDI pitch values, so the MIDI signals are automatically converted to freq
using this convention. Gain and gates signals (using the [0v..10v] range) are converted to [0..1] values.
Note that creating polyphonic effects also make sense in VCV Rack. For instance a reverb connected to a polyphonic instrument would need to be polyphonic. Thus the -nvoices <num>
parameter can also be used in this case.
Metadata
Controllers (typically buttons, sliders, nentry or bargraph) will be automatically transformed in GUI items (like switches, knobs or lights). But they can alternatively be connected to CV inputs/outputs using a metadata:
[CV:N]
can be used in input (typically sliders or nentry) or output (typically bargraph) controllers to connect them to CV instead of regular GUI parameters.
DSP examples
Here is a simple example showing how oscillators can be controlled by UI items. One switch, one button and two knobs will be created in the GUI:
import("stdfaust.lib");
freq = hslider("freq", 200, 50, 5000, 0.01);
gain = hslider("gain", 0.5, 0, 1, 0.01);
gate = button("gate");
check = checkbox("check");
// DSP processor
process = os.osc(freq) * gain * gate, os.sawtooth(freq) * gain * check;
A polyphonic instrument with freq/gate/gain
controllers associated with VC MIDI inputs, using the [CV:N]
metadata, to be compiled with the -nvoices <num>
option:
import("stdfaust.lib");
// control variables
master = hslider("master", 0.3, 0, 2, 0.01);
pan = hslider("pan", 0.5, 0, 1, 0.01);
freq = nentry("freq [CV:1]", 440, 20, 20000, 1);
gate = button("gate [CV:2]");
gain = nentry("gain [CV:3]", 0.3, 0, 10, 0.01);
// relative amplitudes of the different partials
amp(1) = hslider("amp1", 1.0, 0, 3, 0.01);
amp(2) = hslider("amp2", 0.5, 0, 3, 0.01);
amp(3) = hslider("amp3", 0.25, 0, 3, 0.01);
// panner function
panner(pan, x) = x*sqrt(1-pan), x*sqrt(pan);
// additive synth: 3 sine oscillators with adsr envelop
partial(i) = amp(i+1)*os.osc((i+1)*freq);
process = sum(i, 3, partial(i))
* (gate : vgroup("1-adsr", en.adsr(0.05, 0.1, 0.1, 0.1)))
* gain : vgroup("2-master", *(master) : panner(pan));
This polyphonic instrument can then be connected to a polyphonic reverb, to be also compiled with the -nvoices <num>
option:


1.Clemons, J., Jandu, A., Stein, B. & Chary, M. Efficacy of lipid emulsion therapy in treating cardiotoxicity from diphenhydramine ingestion: a review and analysis of case reports. Clinical Toxicology60, 550–558 (2022).
2.Chary, M. Is Telehealth Better Used to Treat Patients or Help Other Physicians Treat Patients? An Agent-Based Modeling Study of Healthcare Provision. in Proceedings of the 55th Hawaii International Conference on System Sciences 1–10 (2022).
3.Chary, M. A. et al. COVID-19 Therapeutics: Use, Mechanism of Action, and Toxicity (Xenobiotics). Journal of Medical Toxicology 1–11 (2022).
4.Gong, J. J., Chen, C.-C., Lebaron, J. & Chary, M. A. Translator use not associated with longer time to pain medication in initial evaluation of low-severity geriatric trauma. The American Journal of Emergency Medicine60, 62–64 (2022).
5.Clemons, J., Jandu, A., Stein, B. & Chary, M. Authors’ reply to comment on “Efficacy of lipid emulsion therapy in treating cardiotoxicity from diphenhydramine ingestion.” Clinical Toxicology 1–2 (2022).
6.O’Brien, M. E. et al. Successful use of ECMO and lipid emulsion for massive bupropion overdose: a case report. Toxicology Communications5, 85–87 (2021).
7.Clemons, J., Jandu, A., Stein, B. & Chary, M. A. Early intravenous lipid emulsion therapy for diphenhydramine overdose: a case report. Toxicology Communications5, 15–18 (2021).
8.Chary, M., Boyer, E. W. & Burns, M. M. Diagnosis of Acute Poisoning using explainable artificial intelligence. Computers in Biology and Medicine134, 104469 (2021).
9.Chary, M. A., Manini, A. F., Boyer, E. W. & Burns, M. The Role And Promise Of Artificial Intelligence In Medical Toxicology. Journal Of Medical Toxicology 1–7 (2020).
10.Chary, M. A., Overbeek, D. L., Papadimoulis, A., Sheroff, A. & Burns, M. M. Geospatial correlation between COVID-19 health misinformation and poisoning with household cleaners in the Greater Boston Area. Clinical Toxicology0, 1–6 (2020).
11.Chary, M. & Burns, M. Using Artificial Intelligence To Understand Recreational Drug Usage And Toxicity From Internet Forums. in clinical Toxicology vol. 58 547–548 (Taylor & Francis Ltd 2-4 Park Square, Milton Park, Abingdon Or14 4rn, Oxon …, 2020).
12.Chary, M. A., Barbuto, A. F., Izadmehr, S., Hayes, B. D. & Burns, M. M. Covid-19: Therapeutics And Their Toxicities. J Med Toxicol16, 10–1007 (2020).
13.Chary, M., Ellango, K. & Burns, M. Patterns Of 2, 4-Dinitrophenol Use As Discussed On Social Media. MedRXiv (2020).
14.Chary, M. A. & Chai, P. R. Tweetchats, Disseminating Information, And Sparking Further Scientific Discussion With Social Media. (2020).
15.Chary, M., Burns, M. & Boyer, E. Tak: The Computational Toxicological Machine. in clinical Toxicology vol. 57 482–482 (Taylor & Francis Ltd 2-4 Park Square, Milton Park, Abingdon Or14 4rn, Oxon …, 2019).
16.O’Brien, M. et al. Successful Use Of ECMO And Lipid Emulsion For Massive Bupropion Overdose. in clinical Toxicology vol. 57 968–969 (Taylor & Francis Ltd 2-4 Park Square, Milton Park, Abingdon Or14 4rn, Oxon …, 2019).
17.Chary, M., O’brien, M., Hayes, B. & Burns, M. Pharmacokinetics Is Toxicokinetics In A Massive Buproprion Ingestion. in Clinical Toxicology vol. 57 1000–1000 (Taylor & Francis Ltd 2-4 Park Square, Milton Park, Abingdon Or14 4rn, Oxon …, 2019).
18.Whitehill, J. M. et al. Incidence Of Pediatric Cannabis Exposure Among Children And Teenagers Aged 0 To 19 Years Before And After Medical Marijuana Legalization In Massachusetts. JAMA Network Open2, e199456–e199456 (2019).
19.Chary, M., Parikh, S., Manini, A. F., Boyer, E. W. & Radeos, M. A Review Of Natural Language Processing In Medical Education. Western Journal Of Emergency Medicine20, 78 (2019).
20.Chary, M., Yi, D. & Manini, A. F. Candyflipping And Other Combinations: Identifying Drug–Drug Combinations From An Online Forum. Frontiers In Psychiatry9, 135 (2018).
21.Lui, A., Chary, M., Yoneda, N. & Parikh, S. Tracking Resident Cognitive Maturation With Natural Language Processing. Western Journal Of Emergency Medicine: Integrating Emergency Care With Population Health19, (2018).
22.Chary, M. & Manini, A. Creating SUDO, The Substance Use Disorder Ontology, To Automatically Synthesize And Disseminate Substance Use Disorder Research. Annals Of Emergency Medicine72, s129–s130 (2018).
23.Desai, P., Vortsman, E., Shaukat, N. & Chary, M. Always Cook Your Boba. Emergency Medicine (2017).
24.Chary, M.et al. Epidemiology From Tweets: Estimating Misuse Of Prescription Opioids In The Usa From Social Media. journal Of Medical Toxicology 1–9 (2017).
25.Chary, M., Leuthauser, A., Hu, K. & Hexom, B. Differences In Self-expression Reflect Formal Evaluation In A Fourth-Year Emergency Medicine Clerkship. Western Journal Of Emergency Medicine18, 174 (2017).
26.Chary, M. & Manini, A. Linguistic Differences Between Spanish And English Tweets That Mention Opioids. in clinical Toxicology vol. 55 427–428 (taylor & Francis Ltd 2-4 Park Square, Milton Park, Abingdon Or14 4rn, Oxon …, 2017).
27.Lee, S., Salehi, I., Chary, M., Schiano, T. & Mascarenhas, J. O. “Irony” Of Managing Refractory Anemia With Transfusional Support In Hemophagocytic Lymphohistiocytosis. Transfusion And Apheresis Science55, 105–108 (2016).
28.Chu, K., Leuthauser, A., Chary, M. & Hexom, B. Do Reflective Students Learn More In The Emergency Department? annals Of Emergency Medicine66, s30 (2015).
29.Chary, M. On The Effect Of Cocaine On The Population Dynamics Of The Lateral Habenula. (Icahn School Of Medicine At Mount Sinai, 2015).
30.Lee, S., Salehi, I., Chary, M., Schiano, T. & Mascarenhas, J. “Irony” Of Managing Refractory Anemia With Transfusional Support In Hemophagocytic Lymphohistiocytosis. Pediatric Blood & Cancer62, (2015).
31.Devraj, N. & Chary, M. How Do Twitter, Wikipedia, And Harrison’s Principles Of Medicine Describe Heart Attacks? in proceedings Of The 6th Acm Conference On Bioinformatics, Computational Biology And Health Informatics 610–614 (acm, 2015).
32.Lee, S., Chary, M., Petersen, B. & Mascarenhas, J. Paraneoplastic Orthostatic Hypotension Associated With Acute Myeloid Leukemia With Trisomy 8. in journal Of Investigative Medicine vol. 63 688–689 (Lippincott Williams & Wilkins Two Commerce Sq, 2001 Market St, Philadelphia …, 2015).
33.Lee, S., Chary, M., Salehi, I. & Bansal, R. Immune-mediated Adalimumab-induced Thrombocytopenia For The Treatment Of Ulcerative Colitis. Int J Pharm Pharm Sci7, 456–8 (2015).
34.Lee, S. & Chary, M. Irony Of Transfusional Support For Refractory Anemia In Hemophagocytic Lymphohistiocytosis. in journal Of Investigative Medicine vol. 63 675–676 (Lippincott Williams & Wilkins Two Commerce Sq, 2001 Market St, Philadelphia …, 2015).
35.Lee, S., Chary, M., Petersen, B. & Mascarenhas, J. Paraneoplastic Orthostatic Hypotension Associated With Acute Myeloid Leukemia. eur Rev Med Pharmacol Sci19, 2934–2937 (2015).
36.Chary, M.et al. Estimating Nonmedical Use Of Prescription Opioids In The USA From Social Media. in Clinical Toxicology vol. 53 371–372 (Informa Healthcare 52 Vanderbilt Ave, New York, Ny 10017 Usa, 2015).
37.Holloway, T. et al. Operator Experience Determines Performance In A Simulated Computer-Based Brain Tumor Resection Task. international Journal Of Computer Assisted Radiology And Surgery10, 1853–1862 (2015).
38.Leuthauser, A., Chary, M., Hexom, B. & Hu, K. Does The Extent Of Medical Student Reflection Correlate With Their Grade In An Emergency Medicine Clerkship? western Journal Of Emergency Medicine: Integrating Emergency Care With Population Health16, (2015).
39.Chary, M. & Kopell, B. Why Does Deep Brain Stimulation Do The Same Thing In The STN And GPi? A Computational Study Of Deep Brain Stimulation In The Basal Ganglia. Stereotact. Funct. Neurosurg.92, 1–75 (2014).
40.Chary, M., Genes, N. & Manini, A. F. Using Twitter To Measure Underage Alcohol Usage. in Clinical Toxicology vol. 52 304–304 (Informa Healthcare 52 Vanderbilt Ave, New York, Ny 10017 Usa, 2014).
41.Chary, M.et al. Signs & Symptoms Of Dextromethorphan Exposure From Youtube. PLoS One9, (2014).
42.Chary, M. & Kaplan, E. Synchrony Can Destabilize Reward-Sensitive Networks. Frontiers In Neural Circuits8, 44 (2014).
43.Genes, N., Chary, M. & Chason, K. Analysis Of Twitter Users’ Sharing Of Official New York Storm Response Messages. Medicine 2.03, (2014).
44.Genes, N., Chary, M. & Chason, K. W. An Academic Medical Center’s Response To Widespread Computer Failure. Am J Disaster Med8, 145–50 (2013).
45.Mascitelli, J. R. et al. An Update To The Raymond Classification Of Intracranial Aneurysms. in Journal Of Neurosurgery vol. 119 a568–a568 (Amer Assoc Neurological Surgeons 5550 Meadowbrook Drive, Rolling Meadows, Il …, 2013).
46.Chary, M., Genes, N., Mckenzie, A. & Manini, A. F. Leveraging Social Networks For Toxicovigilance. Journal Of Medical Toxicology9, 184–191 (2013).
47.Chary, M., Genes, N. & Manini, A. Characteristics Of Twitter Conversations On Illicit Drug Use. in Clinical Toxicology vol. 51 349–349 (Informa Healthcare 52 Vanderbilt Ave, New York, Ny 10017 Usa, 2013).
48.Genes, N., Chary, M. & Chason, K. Analysis Of Twitter Users’ Sharing Of Official New York City Preparedness Messages During The Sandy Storm: 652. academic Emergency Medicine20, (2013).
49.Andrew, M. et al. Towards An Analysis Of YouTube Comments On Drug Health Effects. in amia (2013).
50.Chary, M. A Computational Model Of The Effects Of Drug Addiction On Neural Population Dynamics. ArXiv Preprint Arxiv:1209.3411 (2012).


Hi dere
testing...
col1
col2
foo
bar
Click meee
baz
wha
Whee
D&D 4e
DM
Current crit leader
3 crits
and 1 crit fail
Kacey
1 crit and 0 crit fails
Jason Scott Bob
1 crit and 0 crit fails
Oh snap!
Failed to save. Try again.
well... here's some text. there.


Caspar J. Justin Solicitors 86 Market Place, Mansfield NG10 7HR,United Kingdom Tel: +44-701-114-9174 Fax: +44-871-264-3736 Email<EMAIL_ADDRESS>Dear, Re: Next of Kin I am Caspar J. Justin an Attorney at Law, a South African national practicing here in the UK. I am writing to notify you of the TESTAMENT of one or our Client who unfortunately lost his life in the Madrid bomb blast on March 11, 2004, killing over two hundred people including tourists in Spain. He was a prominent business leader who had been in Spain for vacation with his wife and their only daughter. The deceased who was residing in the United States of America before his death made a deposit of Fifteen Million Five Hundred Thousand United States Dollars (US$15,500,000.00) in Amsterdam Netherlands, his effort to avoid the obligatory payment of income tax in the United States of America. However, I was mandated by our team of professionals to search for the relatives of the deceased regarding his deposit as the holding financial institution wants him to come forward for the endorsement of the reinvestments documents on interest accrued. Since we got information about his death, we have been expecting his Next of Kin or relatives to come over to sign the reinvestment documents or claim his deposit because the financial institution cannot release these funds unless a formal application is made which is in line with the Royal Dutch law on inheritance claim. Regrettably, I learnt that his supposed Next of Kin, which could be his spouse or his only daughter died along with him in the ugly Madrid Bomb Blast leaving nobody with the knowledge of this huge deposit except me as the personal lawyer attached to monitor his deposit. It is in this regard that I and my colleagues decided to solicit your assistance by presenting you as the next of kin to the deceased. Although, we have agreed on the following sharing ratios: 25% for your assistance and 75% for me and my colleagues but it is still negotiable. NB: This transaction is very confidential and 100% risk free as I have a copy of his LAST WILL AND TESTAMENT which I can present your name as the TRUSTEE & EXECUTOR. This transaction shall be executed under legitimate and legal procedures that will protect you from any breach of the Law. Therefore, do not hesitate to revert back to me, either via fax or email, with the following details if my proposal interests you: A signed copy of this letter, your address and your telephone and fax numbers. Best regards, Caspar J. Justin Attorney At Law (Principal)


{% extends "instructions/Page.html" %}
{% load staticfiles otree %}
{% block title %}
INSTRUCTIONS - PART 1
POINTS (continued)
{% endblock %}
{% block content %}
The exact amounts of points you can earn will change in each round, depending on the version of the game you are playing.
There are two versions of this game, called Game A and Game B.
There will be 30 rounds for each game, but the exact sequence of games will be random.
The following tables show you the actual amounts of points you can earn in each game.
The only difference between game A and B is the payoff a type X player receives if he does not form a partnership.
GAME A
Points if you form a partnership:
| Partner's Type |
X |
Y |
Z |
| Your Points |
160 |
80 |
40 |
Points if you do not form a partnership:
| Your Type |
X |
Y |
Z |
| Your Points |
100 |
75 |
25 |
GAME B
Points if you form a partnership:
| Partner's Type |
X |
Y |
Z |
| Your Points |
160 |
80 |
40 |
Points if you do not form a partnership:
| Your Type |
X |
Y |
Z |
| Your Points |
80 |
75 |
25 |
{% next_button %}
{% endblock %}
{% block styles %}
{% endblock %}


Contact Information
We’re ready to book your party today! For a quote, or if you have any questions on our services, simply send an email to<EMAIL_ADDRESS>with the date of your party, venue, and any other details you’d like to include. We look forward to hearing from you!


Paul Pogba planning to quit Man United and join Real Madrid in January
- Paul Pogba could finally join Real Madrid this winter
- The Frenchman is said to be plotting to force a move away from Manchester United
- Pogba has been linked with a move to join Los Blancos in the past months
Manchester United record signing Paul Pogba is reportedly planning to force his way out of Old Trafford in January.
The Frenchman has been endlessly linked with a move to Real Madrid but the deal was blocked by the Premier League side last summer.
Although the 2018 FIFA World Cup star has been out of action since September after picking an injury in the Red Devils 1-1 draw against Arsenal.
Pogba, who is currently recovering from the knock was spotted in Maimi spending time with rapper Pharrell Williams and NBA star Jimmy Butler in between gym sessions.
It was however stated by the Mirror that the trip was part of move to get him ready for the move to join Los Blancos in the winter.
Liverpool eye mega move for Super Eagles star also wanted by Real Madrid and Barcelona
READ ALSO: NAIJ.com upgrades to Legit.ng
Reports from Old Trafford claims boss Ole Gunnar Solskjaer might consider allowing Pogba leave in January, having tried stopping the midfielder from leaving last summer.
Meanwhile, the Premier League giants will not entertain any deal less than £130 million from the Spanish club if they want his services.
Since he was sidelined from action in September, Man United have lost just two matches in ten appearances across competitions.
PAY ATTENTION: Install Pitch Football App for FREE to get the latest football News & Scores
And they currently sit ninth on the English topflight table with 17 points from 13 matches after failing to beat Sheffield United in Sunday's tough clash.
And if the reports from Spain prove true, it could well be the case that Pogba may have played his last game for Solskjaer at United.
Legit.ng earlier reported that Manchester United star Paul Pogba has shown interest in rejoining Italian champions Juventus instead of Real Madrid.
Out of favour Super Eagles striker set to join Turkish champions in January on 1 condition
The Frenchman was linked with an exit at Old Trafford before the start of the ongoing Premier League season after Manchester United failed to qualify for the Champions League.
But United chiefs were able to convince the World Cup winner to stay at Old Trafford under new manager Ole Gunnar Solskjaer.
Abu Azeez: Meet the only Nigerian rated among top 50 beach soccer players worldwide | Legit TV


WITNESS LIST Human Services Committee April 9, 2001-2:00P SB 54 Registering, but not testifying: For: Chatelle, Melody (United Ways of Texas) Jones, Susan (Texas Hospital Association) Marshall, Susan (The Arc of Texas) On: Brady, Denise (Early Childhood Intervention) Cohen, Sharon L. (Texas Department of Health) Spicer, PhD., Serie (Texas Department of Mental Health and Mental Retardation Children's Services) SB 159 Registering, but not testifying: For: Carter, Candice (AARP) Graves, Tim (Texas Health Care Association) Rushing, Linda (Texas Conference of Catholic Health Facilities) SB 665 Registering, but not testifying: For: Brumby, Kathy (Texas Association for the Education of Young Children) Chatelle, Melody (United Ways of Texas) Horton, Colleen (Texas Advocates Supporting Kids with Disabilities) Murphree, Susan (Advocacy, Inc.) On: Brady, Denise (Early Childhood Intervention) Cohen, Sharon L. (Texas Department of Health) O'Hanlon, Mary Beth (Health and Human Services Commission) SB 691 On: Gold, Marc (Texas Department of Human Services) Registering, but not testifying: For: Carter, Candice (AARP) Mathews, Carl E. (Self and Texas Organization of Residential Care Homes and Texas Assisted Living Association)


These are a the activities offered to our guests at no extra charge:
These activities are offered for an additional fee:


|
Android
|
Handles the tabbed "Whatsapp" look. More...
Public Member Functions | |
| SectionsPagerAdapter (Context context, FragmentManager fm) | |
| Constructor for SectionsPagerAdapter. More... | |
| Fragment | getItem (int position) |
| Return the Fragment associated with a specified position. More... | |
| CharSequence | getPageTitle (int position) |
| Called by ViewPager to obtain title for page. More... | |
| int | getCount () |
| Total pages. More... | |
Private Attributes | |
| final Context | mContext |
| Holder of Activity context reference. More... | |
Static Private Attributes | |
| static final int[] | TAB_TITLES = new int[]{R.string.tab_text_1, R.string.tab_text_2, R.string.tab_text_3} |
| Integer references to String resources. More... | |
Handles the tabbed "Whatsapp" look.
Class that extends FragmentPagerAdapter. Implementation of PagerAdapter that represents each page as a Fragment that is persistently kept in the fragment manager as long as the user can return to the page.
Definition at line 22 of file SectionsPagerAdapter.java.
| com.example.choturemote.ui.main.SectionsPagerAdapter.SectionsPagerAdapter | ( | Context | context, |
| FragmentManager | fm | ||
| ) |
Constructor for SectionsPagerAdapter.
Used to create an instance of SectionsPagerAdapter from an Activity. The super() method initializes the parent class FragmentPagerAdapter by calling its default constructor. The FragmentManager object passed to this constructor is passed along to the constructor of the base class.
| context | Reference to the Activity where the SectionsPagerAdapter object instance is created |
| fm | FragmentManager passed from the Activity where the SectionsPagerAdapter object instance is created. ?? |
Definition at line 43 of file SectionsPagerAdapter.java.
References com.example.choturemote.ui.main.SectionsPagerAdapter.mContext.
| int com.example.choturemote.ui.main.SectionsPagerAdapter.getCount | ( | ) |
Total pages.
Returns the number of views available
Definition at line 87 of file SectionsPagerAdapter.java.
| Fragment com.example.choturemote.ui.main.SectionsPagerAdapter.getItem | ( | int | position | ) |
Return the Fragment associated with a specified position.
| position | Integer for position |
Definition at line 57 of file SectionsPagerAdapter.java.
| CharSequence com.example.choturemote.ui.main.SectionsPagerAdapter.getPageTitle | ( | int | position | ) |
Called by ViewPager to obtain title for page.
This method is called by the ViewPager to obtain a title string to describe the specified page. This method may return null indicating no title for this page. The default implementation returns null.
| position | The position of the title requested |
@Nullable
denotes that a value can be null. Definition at line 77 of file SectionsPagerAdapter.java.
References com.example.choturemote.ui.main.SectionsPagerAdapter.mContext, and com.example.choturemote.ui.main.SectionsPagerAdapter.TAB_TITLES.
|
private |
Holder of Activity context reference.
Context refers to the activity where the adapter is created. It is helps you with accessing system services and resources in case you need them. mContext will store the reference to the Activity where the SectionsPagerAdapter object instance is created.
Definition at line 35 of file SectionsPagerAdapter.java.
Referenced by com.example.choturemote.ui.main.SectionsPagerAdapter.getPageTitle(), and com.example.choturemote.ui.main.SectionsPagerAdapter.SectionsPagerAdapter().
|
staticprivate |
Integer references to String resources.
Integer Array consisting of references to String resources. @StringRes
identifies the integers as String references.
Definition at line 29 of file SectionsPagerAdapter.java.
Referenced by com.example.choturemote.ui.main.SectionsPagerAdapter.getPageTitle().


KCR_CoolTip extension template
The KCR_CoolTip template adds a CoolTips control to the window.
| Don't apply at all | Disables code generation when checked. |
| Use Ballooon Tips | Check this option to display balloon style tooltips if the users version of comctl32.dll supports them. |
| Replace regular tip | Check this option to automatically replace all regular tips on controls with Cooltips. |
| Selected Controls | This button takes you to the following screen where you can specify the details for the controls you want tool tips for. |
Pressing the Insert or Properties buttons, displays the tooltip detail for the control:
| Multi-Line Tip | Check this option for multi-line tool tips. Separate individual lines with crlf '<13,10>' | ||
| ToolTip Text | Choose one of the options for the source of the ToolTip text: | ||
| Use Tip Text | This option will use the tip text you specified in the IDE | ||
| Use Local Data Variable | This option will allow you to select a local data variable to be use as the source for the tip text. | ||
| Use Global Data Variable | This option will allow you to select a global data variable to be use as the source for the tip text. | ||
| Specify Text | This option will allow you to specify the tip text. | ||
| Title Options | |||
| Title Text | Enter the text to use for the tip title. This will be displayed in bold font at the top of the balloon tooltip. | ||
| Icon | Select the icon to display to the left of the title. | ||
| Font Options | |||
| Select Font | Displays the windows standard Font dialog. Only the FontName and FontSize are used. |


Paced Breathing is a technique that can help to activate stress reduction mechanisms in the body by promoting a harmonious state between your respiration system and your heart. This website follows a four seconds in, six seconds out breathing pattern recommended by my mom :)


|
MOTS Finder
Find non-star-shaped MOTSs
|
Functions for plotting in 3D, e.g. 2-dimensional surfaces via plot_2d(). More...
Functions | |
| def | prepare_grid (fun, space_x, space_y) |
Evaluate fun to build X, Y, Z arrays usable for plotting with Axes3D.plot_surface . More... | |
| def | plot_scatter (points, s=20, c='b', plot_kw=None, show=True, close=False, kw) |
| Create a scatter plot of 3D points. More... | |
| def | plot_2d (f, domain=None, rel_range=((0, 1),(0, 1)), points=30, lw=.4, c='w', ec='k', cmap=None, absolute=False, zoffset=0, zlog=False, plot_kw=None, show=True, close=False, kw) |
Plot a surface parameterized as z = f(x, y) . More... | |
| def | plot_tri (points, triangles=None, lw=.4, c='w', ec='k', facecolors=None, cmap=cm.jet, colorbar=True, plot_kw=None, show=True, close=False, kw) |
| Create a 3D surface plot with manual triangulation. More... | |
| def | _plane_intersection (p1, p2) |
| Return the point at which the line between two points crosses the x-y-plane. More... | |
| def | plot_tri_cut (points, triangles=None, figsize=(4, 4), kw) |
| Plot the intersection curve of a triangle surface and the x-y-plane. More... | |
Functions for plotting in 3D, e.g. 2-dimensional surfaces via plot_2d().
|
private |
Return the point at which the line between two points crosses the x-y-plane.
If the line does not cross the x-y-plane, None
is returned.
| def motsfinder.ipyutils.plotting3d.plot_2d | ( | f, | |
domain = None , |
|||
rel_range = ((0, 1), (0, 1)) , |
|||
points = 30 , |
|||
lw = .4 , |
|||
c = 'w' , |
|||
ec = 'k' , |
|||
cmap = None , |
|||
absolute = False , |
|||
zoffset = 0 , |
|||
zlog = False , |
|||
plot_kw = None , |
|||
show = True , |
|||
close = False , |
|||
| kw | |||
| ) |
Plot a surface parameterized as z = f(x, y)
.
Parameters not described here are described in plot_scatter() or plot_1d().
| f | Function to plot. Should take a 2-tuple/list/array and return a floating type. Alternatively, this may be a (NumPy) matrix which will be plotted as f(i, j) = mat[i, j] , where i and j run over the full shape (i.e. ranges and points arguments are ignored). |
| domain | Domain to plot f on as ((x1, x2), (y1, y2)) . If not given, the function's domainX and domainY attributes are queried. If these don't exist, the interval (0,1) is used. |
| rel_range | Similar as rel_range in plot_1d(), but containing the relative range to plot for both axes. |
| points | Number of samples to take in each direction. The function will be evaluated on a grid of points*points points. May also be a 2-tuple/list with a resolution for each axis. Default is 30 . |
| lw | Line width for drawing the edges of the 3D mesh. Default is 0.4 . |
| c | Color of the mesh surfaces. Default is white, i.e. 'w' . |
| ec | Edge color. Default is black, i.e. 'k' . |
| cmap | Optional color map to indicate height of the surface. |
| absolute | If True , uses the absolute of the values returned by f . |
| zoffset | Value to add to the values returned by f . |
| zlog | Whether to plot the base-10 logarithm of the function values. |
| def motsfinder.ipyutils.plotting3d.plot_scatter | ( | points, | |
s = 20 , |
|||
c = 'b' , |
|||
plot_kw = None , |
|||
show = True , |
|||
close = False , |
|||
| kw | |||
| ) |
Create a scatter plot of 3D points.
Options are similar to the ones of plot_1d() with the below additions.
| points | Iterable of 3D points to plot. |
| s | Size of the individual point markers. Default is 20 . |
| c | Color of the markers. Default is blue, i.e. 'b' . |
| zlim | Optional interval of the z-axis to show. Default is automatic. |
| zscilimits | As the xscilimits parameter but for the z-axis. |
| ztick_spacing | As xtick_spacing but for the z-axis. |
| zlabel | Label for the z-axis |
| azim | Azimuthal angle used for the 3D projection. Default is -60 . |
| elev | Elevation angle used for the 3D projection. Default is 32 . |
| dist | Custom "distance" to the plotted area. Modifies perspective and can help in cases where important parts are cropped off the image. |
| def motsfinder.ipyutils.plotting3d.plot_tri | ( | points, | |
triangles = None , |
|||
lw = .4 , |
|||
c = 'w' , |
|||
ec = 'k' , |
|||
facecolors = None , |
|||
cmap = cm.jet , |
|||
colorbar = True , |
|||
plot_kw = None , |
|||
show = True , |
|||
close = False , |
|||
| kw | |||
| ) |
Create a 3D surface plot with manual triangulation.
Options not described here are similar to the ones of plot_2d().
| points | Vertex points of the mesh |
| triangles | List of 3-tuples indicating which vertices form triangles. If not given, points will be interpreted as an object with a surface() method returning the actual points and triangles. |
| lw | (float, optional) Linewidth of the triangle edges. Default is .4 . |
| c | (color, optional) Color of the triangle faces. May be overridden by facecolors . |
| ec | (color, optional) Edge color for the triangle edges. Set to None to not draw the wire. |
| facecolors | (iterable of floats, optional) A value assigned to each "face" (i.e. triangle). The values will be associated with colors of the colormap specified via cmap . |
| cmap | (colormap, optional) A colormap (e.g. one of the matplotlib.cm properties) to use for the face colors. Has no effect without facecolors . |
| colorbar | (boolean, optional) Whether to show a color bar indicating the values associated with colors of the cmap . Has no effect without facecolors . |
| def motsfinder.ipyutils.plotting3d.plot_tri_cut | ( | points, | |
triangles = None , |
|||
figsize = (4, 4) , |
|||
| kw | |||
| ) |
Plot the intersection curve of a triangle surface and the x-y-plane.
The options are the same as for plot_data().
| def motsfinder.ipyutils.plotting3d.prepare_grid | ( | fun, | |
| space_x, | |||
| space_y | |||
| ) |
Evaluate fun
to build X, Y, Z arrays usable for plotting with Axes3D.plot_surface
.


Variable
| Static Public Summary | ||
| public |
BackboneProxy: {backbone: null} Defines a proxy Object to hold a reference of the Backbone object instantiated.
|
|
| public |
Exports the Collection class.
|
|
| public |
Exports the Model class.
|
Static Public
public BackboneProxy: {backbone: null} source
import BackboneProxy from 'backbone-es6/src/BackboneProxy.js'
Defines a proxy Object to hold a reference of the Backbone object instantiated.
public collection: Collection source
import collection from 'backbone-es6/src/Collection.js'
Exports the Collection class.


chef-shell
- Interactive Chef Console
chef-shell [named configuration] (options)
-S
, --server CHEF_SERVER_URL
-z
, --client
-c
, --config CONFIG
-j
, --json-attributes JSON_ATTRIBS
-l
, --log-level LOG_LEVEL
-s
, --solo
-a
, --standalone
-v
, --version
-h
, --help
When no --config option is specified, chef-shell attempts to load a default configuration file:
chef-shell
is an irb(1) (interactive ruby) session customized for Chef.
chef-shell
serves two primary functions: it provides a means to
interact with a Chef Server interactively using a convenient DSL; it
allows you to define and run Chef recipes interactively.
chef-shell uses irb's subsession feature to provide multiple modes of
interaction. In addition to the primary mode which is entered on start,
recipe
and attributes
modes are available.
The following commands are available in the primary session:
help
version
recipe
recipe
modeattributes
attributes
moderun_chef
reset
echo :on|:off
tracing :on|:off
node
ohai
In addition to these commands, chef-shell provides a DSL for accessing data on the Chef Server. When working with remote data in chef-shell, you chain method calls in the form object type.operation, where object type is in plural form. The following object types are available:
nodes
roles
data_bags
clients
cookbooks
For each object type the following operations are available:
Enumerable#map
method.Aliased as object type.load
Loads the singular item identified by object name.
Aliased as object type.find
Runs a search against the server and returns the matching items. If the optional code block is given each item will be passed to the block and the results returned.
The query may be a Solr/Lucene format query given as a String, or a Hash of conditions. If a Hash is given, the options will be ANDed together. To join conditions with OR, use negative queries, or any advanced search syntax, you must provide give the query in String form.
Aliased as object type.bulk_edit
Bulk edit objects by processing them with the (required) code block.
You can edit all objects of the given type by passing the Symbol
:all
as the argument, or only a subset by passing a query as the
argument. The query is evaluated in the same way as with
search.
The return value of the code block is used to alter the behavior
of transform
. If the value returned from the block is nil
or
false
, the object will not be saved. Otherwise, the object is
saved after being passed to the block. This behavior can be
exploited to create a dry run to test a data transformation.
Recipe mode implements Chef's recipe DSL. Exhaustively documenting this DSL is outside the scope of this document. See the following pages in the Chef documentation for more information:
Once you have defined resources in the recipe, you can trigger a
convergence run via run_chef
A "Hello World" interactive recipe
chef > recipe chef:recipe > echo :off chef:recipe > file "/tmp/hello_world" chef:recipe > run_chef [Sat, 09 Apr 2011 08:56:56 -0700] INFO: Processing file[/tmp/hello_world] action create ((irb#1) line 2) [Sat, 09 Apr 2011 08:56:56 -0700] INFO: file[/tmp/hello_world] created file /tmp/hello_world chef:recipe > pp ls '/tmp' [".", "..", "hello_world"]
Search for nodes by role, and print their IP addresses
chef > nodes.find(:roles => 'monitoring-server') {|n| n[:ipaddress] } => ["<IP_ADDRESS>"]
Remove the role obsolete from every node in the system
chef > nodes.transform(:all) {|n| n.run_list.delete('role[obsolete]') } => [node[chef098b2.opschef.com], node[ree-woot], node[graphite-dev], node[fluke.localdomain], node[ghost.local], node[kallistec]]
chef-shell
often does not perfectly replicate the context in which
chef-client(8) configures a host, which may lead to discrepancies in
observed behavior.
chef-shell
has to duplicate much code from chef-client's internal
libraries and may become out of sync with the behavior of those
libraries.
chef-client(8) knife(1) http://wiki.opscode.com/display/chef/Chef+Shell
Chef was written by Adam Jacob<EMAIL_ADDRESS>with many contributions from the community. chef-shell was written by Daniel DeLeo.
This manual page was written by Daniel DeLeo<EMAIL_ADDRESS>Permission is granted to copy, distribute and / or modify this document under the terms of the Apache 2.0 License.
chef-shell is distributed with Chef. http://wiki.opscode.com/display/chef/Home


An innovative restaurant featuring exclusive dishes created by talented Best New Chefs
Welcome to Chefs Club
Now Open
Visit
Opened 2012


--- layout: post status: publish published: true title: Naked with Two Catchers - Episode 7.47 author: display_name: Corey Fineran login: Corey email<EMAIL_ADDRESS>url: '' author_login: Corey author_email<EMAIL_ADDRESS>wordpress_id: 11416 wordpress_url: http://ivyenvy.com/?p=11416 date: '2015-09-02 23:23:57 +0000' date_gmt: '2015-09-03 04:23:57 +0000' categories: - Podcast tags: [] comments: [] ---
On this, the 344th episode of The Ivy Envy Podcast, we swoon over Jake Arrieta and his no-hitter. We talk more about the post-season and continue the age-old debate of whether Arrieta or Lester should start the wild card game, if we're all so lucky to see the Cubs in that game. We also answer several listener questions on various Cubs topics.


Able Player for YouTube
Example 1, Captions Hosted on YouTube
This page features an example of Able Player being used to play a YouTube video.
Its features include:
- A described and non-described version of the video, both hosted on YouTube. Swap between the two versions using the Description button.
- Captions and subtitles hosted on YouTube (NOTE: without locally-hosted captions, Able Player is unable to generate an interactive transcript).
- Limited options in the Captions Preferences dialog (users can control the font size of captions)
For more information about the limitations of hosting captions on
YouTube and Vimeo, see the
Able Player documentation.
Additional examples:


Example highlighting component
Show HTML snippet
{% filter escape %}{% include "includes/components/highlighting.html" %}{% endfilter %}
Show CSS snippet
{{'./app/assets/sass/components/_highlights.scss' | fileInclude }}
When to use this component
Highlighting is typically used in search or when comparing data sets.
How to use this component
Highlighting should not reduce colour contrast so much that it fails WCAG level AA. Highlighting should be clear but not distract from the content on the page.
Services using this pattern
- Passport caseworking
- Application platform
Get in touch
If you’ve got a question or suggestion share it on Slack #interaction-designers channel or on GitHub.


Whenever a slider has focus, the keys ←, →, ↑, ↓, Ins and Del can be used to control the slider handle (pressing either the Page up or Page down keys or CTRL and an arrow key will move the handle by two steps at a time), the Home key to set the slider at it’s minimum value and the End key to set the slider at it’s maximum value.
The CSS file uses generated content to create the tooltip (by styling the drag handles :before and :after pseudo elements) and the value of the aria-valuetext attribute, which is dynamically set by the script, to generate the tooltip content.
:before
:after
aria-valuetext
Remember, this is an experiment. It will only work in browsers that support positioning generated content (so no Internet Explorer).
When the window.onload event fires, the following input elements will be automatically converted into sliders only if the browser does not recognise the HTML5 “range” state.
window.onload
Testing the tooltip display with the three different forms of drag handle animation, timed, jump & tween and also the use of the aria-valuetext property. Please note, sliders have to have the forceValue parameter set to true for the aria-valuetext property to be assigned a value at all times.
The following slider has been associated with a <select>.
<select>
Smallest Smaller Small Normal Large Larger Largest


{% extends "accounts/base.html" %} {% block title %}New Address Added{% endblock %} {% block body %}
New Address added successfully. Click here to close the window


Week 1 - Intro to HTML/CSS
This component includes materials covered during the 1st week of the course (2 lectures of 2.5 hour duration). During the first lecture the course objective, structure, content, tools and frame were covered. During the 2nd lecture HTML/CSS were introduced and how to host them on GitHub as a webpage.
Week 2 - Intro to Python
This component includes materials covered during the 2nd week of the course (2 lectures of 2.5 hour duration). Python 2.7. programming language was introduced and Jupyter notebooks were used for executing the code. Topics covered include data types, control flow, functions, I/O. Packages covered include NumPy, Pandas, Matplotlib, Pandas DataReader.
Week 3 - Regular Expressions
This component includes materials covered during the 3rd week of the course (2 lectures of 2.5 hour duration).Dealing Regular expressions, native Python, as well as pandas imported read and write functions were introduced. Sublime text editor and Jupyter notebooks were used for executing the code. Topics covered include reading documents (csv, json, html, txt), writing files (csv, json), Regular expressions, parsing json as well as creating simple bot operating on Markvo chains. Packages covered include Pandas, JSON, RegEx, MarkovBot.
- Reading and writing files (pure)
- Reading and Writing files (Pandas)
- RegEx 1: financier, e-mail
- RegEx 2: requests, HTML
- Dealing with JSON files 1
- Dealing with JSON files 2
Week 4 - BeautifulSoup
This component includes materials covered during the 4th week of the course (2 lectures of 2.5 hour duration). Scraping HTML webpages with BeautifulSoup was introduced. Sublime text editor and Jupyter notebooks were used for executing the code. Topics covered include reading and writing CSV files using the CSV module, reading and writing JSON files using the JSON modeule, web scraping with BeautifulSoup using the HTML tags/CSS selectors. Packages covered include JSON, CSV, urllib, BeautifulSoup.
- BeautifulSoup 1: My webpage
- BeautifulSoup 2: Bloomberg
- BeautifulSoup 3: www.careercenter.am
- BeautifulSoup 4: Navigation
- Craftcans.com - Pandas
- Craftcans.com - BeautifulSoup
- Craftcans.com - cleaning
Week 5 - XML files and LXML
This component includes materials covered during the 5th week of the course (2 lectures of 2.5 hour duration). Overview of the first 4 week material was provided followed by a midterm exam (exam paper available in this folder). During the 2nd lecture alternative libraries for scraping were covered (urllib2 as an alternative to requests, and lxml as an alternative to BeautifulSoup). Sublime text editor and Jupyter notebooks were used for executing the code. Topics covered include working with XML documents, scraping the web using XPath, differences between lxml and BeautifulSoup. Packages covered include LXML and urllib2.
Week 6 - Scrapy
This component includes materials covered during the 6th week of the course (2 lectures of 2.5 hour duration). Scrapy scraping and crawling framework was introduced following the official documentation. Sublime text editor and command prompt (directly) were used for executing the code (also Jupyter notebooks were used for sharing the code). Topics covered include scraping quotes, putting timer, naming the agent, crawling over several pages. Packages covered include Scrapy, pacf.
- Scrapy 1: using inside shell
- Scrapy 2: developing a spider
- Scrapy 3: developing a crawler
- YouTube API: unauthorized access


[PTYX#6840] The faucet has been down for days
[PTYX#6840] He didn't get anything from it
[PTYX#6840] He probably is referring to the mini airdrops but still, he couldn't have gotten many
[PTYX#6840] We arw working on a new faucet that will make it not profitable to do.
[Bo#8264] All projects attract some people that try to exploit the system.
I wonder if the guy ever contributed something to society.

[Emmanuel#5426] If he is a real hacker, we'll see. In that case I see value in his work, even if black-hat. But it doesn't seem to be the case. Real hackers don't brag.
[PTYX#6840] He was aggravated that I told him not to trade on the public channels
[PTYX#6840] I told him to use Barterdex
[Bo#8264] So, possibly he does not have that much indeed
[PTYX#6840] If he has the Zilla, he can do what he wishes with it. Just don't trade it in our public channels. That's why hyperDex exists
[c2k#4915] wasnt there a #tradeoffers channel on slack?
[PTYX#6840] Even there, go to BarterDEX is what people will tell you
[PTYX#6840] Find someone and trade on Barterdex
[PTYX#6840] Don't ever do deals on public channels with no escrow
[c2k#4915] i agree...not sticking up for him in any way
[PTYX#6840] Congratulations fallas, we had our first troll
[PTYX#6840] All we need now is some ETH scam tweets and we have officially made it


Welcome,
John Doe
{% block top_tiles %}{% endblock %}
{% block main_content %}{% endblock %}
Total Food Delivered
25,000
Total Police Deployed
3,500
Total Camp Population
567
Total of Dead
315
Total Missing
205
World Map
December 30, 2014 - January 28, 2015
Top Risk Region
| Surigao | 33% |
| Tacloban | 27% |
| Cagayan De Oro | 16% |
| Davao | 11% |
| Quezon | 10% |
Storage and Usage
App Usage
Device Usage
|
Top 5 |
Device Progress |
||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
|
Weather
Tuesday, 1:30 PM
F
C


The front and back cavity air pressure balance and the headphone can output deep and powerful bass
Uses Type-C interface, supports charging and data transmitting
Adopts the active noise cancelling technology to bring you crystal-clear sound