Configure GEE Server Admin pages for LDAP authentication¶
You can use LDAP authentication, which is based on Microsoft
Active Directory, to authenticate users to GEE Server
admin pages. GEE server software is based on Apache httpd
.
It is easy to administer and manage user accounts. You can use a
simple .htpasswd
to secure GEE Server admin pages, then you can
assign the permissions levels via groups or user level. If you
have an existing Active Directory user catalog, you can use that
instead of implementing a redundant authentication system. For
information about enabling your Active Directory for LDAP, see the
OpenLDAP documentation.
Tip
This article explains how to configure GEE Server admin pages for LDAP authentication.
To configure GEE Server admin pages for LDAP authentication:
Make sure that the LDAP modules are loaded on your Apache server. For most GEE installations, these are loaded automatically.
Load the LDAP modules in your
/opt/google/gehttpd/conf/gehttpd.conf
After the modules are loaded, you can control access by querying the directory for particular attributes.
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so LoadModule ldap_module modules/mod_ldap.so
Point Apache to the LDAP server
AuthLDAPURL
key directive.An example of an
AuthLDAPURL
directive is:AuthLDAPURL ldap://ldapserver.example.com:389/ou=Users,dc=example,dc=com?uid
The key directive format declares the LDAP server, the distinguished name (DN), and the attribute to use in the search (typically the
Uid
attribute in theUsers
organizational unit). You can also customize these filters for additional security constraints.Create a user account in Active Directory
geserver
. This can be any user account that has limited access. The user account only needs access to the global catalog. Make sure that your user has the full organizational unit name.Restart the GEE server to load the modules into the system:
# /etc/init.d/geserver restart
Add the directives to your config file
/opt/google/gehttp/conf/gehttpd.conf
for/opt/google/gehttpd/htdocs/admin
Directory.Comment/remove these lines :
AuthUserFile /opt/google/gehttpd/conf.d/.htpasswd AuthGroupFile /dev/null
And Add these lines :
AuthBasicProvider ldap AuthLDAPBindDN<EMAIL_ADDRESS>AuthLDAPBindPassword "somepassword" AuthLDAPURL "ldap://ldapserver.example.com:389/ou=Users,dc=example,dc=com?uid"
For testing purposes, add the lines below to the
gehhtpd.conf
file:<Directory "/opt/google/gehttpd/htdocs/admin"> #AuthUserFile /opt/google/gehttpd/conf.d/.htpasswd #AuthGroupFile /dev/null AuthName "Earth Server admin pages" AuthType Basic AuthBasicProvider ldap AuthLDAPBindDN<EMAIL_ADDRESS>AuthLDAPBindPassword "somepassword" AuthLDAPURL "ldap://ldapserver.example.com:389/ou=Users,dc=example,dc=com?uid" <Limit GET> require valid-user </Limit> </Directory>
Restart your server and try to access the earth server admin page. Authenticate with your LDAP credentials. If you cannot access Apache, open the file error log at
/opt/google/gehttpd/logs/error_log and access_log
.
Directives
require valid-user
. Allows all users who log in with correct passwords.AuthLDAPBindDN
. The distinguished name (DN) of the user account that Apache uses to connect to the directory system and authenticate the user.AuthLDAPBindPassword
. The password for the user account configured with theAuthLDAPBindDN
directive.AuthLDAPURL
. The URL that tells where the directory server is, where to look for users, which user attribute is used to identify a user, and other miscellaneous things that are specific to the LDAP query syntax.AuthBasicProvider
. Tells Apache which authentication module to use for Basic Authentication.
For more information, see the Apache mod_ldap mod_authnz_ldap and mod_auth_basic documentation.
Tip
To troubleshoot any connection issues, begin by checking the logs on the LDAP server to make sure GEE server is correctly making authentication requests.


Despite problem times, MaxiTRANS remains important to Ballarat employment
by Tim WalsheDespite problem times, MaxiTRANS remains important to Ballarat employment
Over the past 2 years MaxiTRANS in Ballarat would have offered over 100 short to medium term casual jobs to people in the Ballarat community.
Because these opportunities are casual, people with extensive experience that are in work do not consider them, this means these opportunities are filled either by people that are out of work or by people that lack the experience to gain a full time ongoing job.
Thanks to MaxiTRANS people new to Ballarat that need work quickly or people who have lost their job at short notice are able to gain work quickly because "Maxi is always hiring", this offers them a medium term solution while they work out there long term future.
MaxiTRANS also does a wonderful job breaking down roles into high a low skilled, allowing them to hire younger people, that are really struggling to 'get a go'.
Thanks to MaxiTRANS they get that opportunity, build some skills that open them up to more opportunities as they get their career started.
Large manufacturers like MaxiTRANS are required to respond to the needs of their customers, these needs can fluctuate considerably and unpredictably.
Unfortunately, this means they rely on a flexible workforce, which sucks for those that have lost their jobs recently but let's not forget the significant opportunities MaxiTRANS offers people in our community.
We are lucky they are in Ballarat and should all hope to see them bounce back with a big start to 2020, it will be the people of Ballarat that will benefit the most.
Tim Walshe runs a Ballarat recruitment agency


[gecode-users] Minor bug in the independent-set example
Christian Schulte
cschulte at kth.se
Tue Feb 10 14:01:46 CET 2009
Stefano,
thanks a lot. Fixed for 3.0. Christian
--
Christian Schulte, www.ict.kth.se/~cschulte/
-----Original Message-----
From: users-bounces at gecode.org [mailto:users-bounces at gecode.org] On Behalf
Of Stefano Gualandi
Sent: Tuesday, February 10, 2009 12:36 PM
To: users at gecode.org
Subject: [gecode-users] Minor bug in the independent-set example
Hi,
there is a small bug in "examples/ind-set.cpp".
You can find attached a possible bug-fix, cheers, Stefano
More information about the gecode-users
mailing list


qolboard
About qolboard
About qolboard
Attributions
Google/Material design icons
Project:
https://github.com/google/material-design-icons
License:
https://github.com/google/material-design-icons/blob/master/LICENSE
Google/Golang
Project:
https://golang.org/
License:
https://golang.org/LICENSE
Gorilla/websocket
Project:
https://github.com/gorilla/websocket
License:
https://github.com/gorilla/websocket/blob/master/LICENSE


Removing Multiple Deleted SuperUser Accounts
How to remove multiple SuperUser accounts which have been "soft" deleted from the SuperUser Accounts module. This action will permanently remove all information related to these accounts from your site's database.
- Navigate to Host > Advanced Settings > SuperUser Accounts.
- Click the Remove Deleted Users button.
-
Click the OK button to confirm.


{% include "edit-menu.html" %}
{% include "upload-zone.html" %}
{% include "edit-zone.html" %}
{% include "modals/edit-legend.html" %}
{% include "modals/about.html" %}
{% include "modals/help.html" %}
{% include "modals/copyright.html" %}
{% include "modals/delete-legend.html" %}
{% include "modals/confirm-overide_with-example.html" %}
{% include "modals/delete-picture.html" %}
{% include "modals/load-new-pic.html" %}
{% include "modals/update-pic.html" %}
{% include "modals/warning.html" %}
{% include "icons.html" %}
{% include "js.html" %}


I have read, understand, and agree
to the
Terms and Conditions
Login
Washington Dulles
International Airport
Ronald Reagan Washington
National Airport
*Free Airport information is limited. Please log in for full website access.
Weather
DCA
H:
40
L:
28
IAD
H:
39
L:
24
Customer Support
1-866-849-2850


PodPlayer
Original by Robert Parker 2014 released under the MIT Licence from his GitHub repository.
Introduction
PodPlayer is an open source audio file player for automated podcast and music listening. Being at an age when early morning sleep sometimes eludes me, I like to listen to the range of interesting podcasts available from ABC Radio National. Juice is a fairly goog downloaded but I find the playback options limited. This player will randomly play the least heard of the downloaded podcasts and keep track of which have been heard. However, back to back documentaries can leave little space for cogitation, so this player can play music from your collection between documentaries. In this mode it will play a quieter music item first, so if this player is used in conjunction with my other program, WakeUp, the process of returning consciousness is less painful.
Installation
Download the project and compile. Development so far has been on Visual Studio 2010 and it has been tested on Windows8.0 and XP SP2 with DotNet Framework 3.5 installed. I have not provided a binary as this is far from a finished product and I would not care to be responsible for a virus being spread. The only files written by this program will be located in the execution directory. It can also delete files located in the podcast download path - so beware.
Configeration
Run the program and you will see a "config" button in the bottom right corner. Clicking on this will open the primary configeration dialog.
Configeration Dialog
The different items are as follows:
- fadeInSpeed% = how quickly the volume rises for the first item.
- Play music between podCast = for when back to back documentary is too much.
- Set Hot Keys = raises a dialog to allow user customisation for the keyboard layout being used.
- PodFile Path = location where the podcast downloader (such as Juice) has loaded the files - typically mp3. Juice creates seperate subdirectories for subject, so PodPlayer will grab of list of files from this base and all subdirectories when it is run. It then seperates the podcasts in order of least heard to most heard and then randomises these.
- WakeSongList Playlist = the windows media player playlist of songs you would prefer to wake to. The least heard song will be played when the program is first run.
- SongList Playlist = music you would like to hear between the pod cast documentaries.
- Save podcasts heard which exist = this will resave the podcasts heard list but only for the items that have not been deleted. Usefull only if the file is getting so large that program startup is being slowed.
- Delete pods marked DELETE = if you have heard a podcast too many times it can be tagged by pressing the
DELETE key (which is usually the delete key :)) and then, if you are sure, you can press click this button and it will offer to delete the marked podcast files.
- Review pods heard = This will bring up a dialog list of all the podcasts with descriptions if available.
- SaveConfig = save alterations to the configeration.
For minimum installation you should only need to set the podcast download directory.
HotKeys
You can view the hot keys from the main window by pressing the K key (default setting).
Keyboard actions for the main windows can be reconfigered in the following dialog accessed from the config dialog.
HotKey Dialog
The different actions in the current version are:
- Exit - on the first, this causes the program to flag a pending shutdown once the current audio is finished. Pressing a second time will cause the program to exit immediately.
- Pause - pauses the current audio.
- Full Screen - toggles full screen mode.
- Fast Forward - jumps through the current audio in steps of 10% of the duration.
- Restart - jumps back to the start of the current audio.
- Delete - marks the heard log record that the current item is to be deleted and also skips to the next item.
- Keep - marks the heard log record that the current item is worth of keeping.
- Configure - opens the configure dialog window.
- Vol+ - increase the volume.
- Vol- - guess what this does.
- Help - opens the help.html file with the default html program - e.g. a browser.
- HotKeys - Shows a list of action descriptors and the associated key descriptors.
- Print Keys - prints a list of keyboard descriptors to the console if there is one.


ATF to investigate after 4 injured in Dippin Dots factory explosion
by Ashley SmithMCCRACKEN COUNTY, Ky. (KFVS) - Four people were hurt in an explosion Friday night at the Dippin’ Dots factory in McCracken County Ky, located at 5101 Charter Oak Drive, across from the emergency operation center.
According to Jerome Mansfield, EMA director of McCracken County, four people inside the facility were injured, and all of them have been transported to a hospital. The medical status of the four people involved is not known at this time.
The ATF will be onsite Monday Nov. 25 to begin an investigation. The plant will remain closed until the investigations are complete.
As of Sunday afternoon, a third employee has been released from the hospital. The last employee ramains in the hospital for treatment.
“We have very few employees that work the night shift, all employees have been accounted for. Four were taken to an area hospital with reported injuries. We do not know the extent of those injuries,” said Steve Heisner, Vice President of Administration and Human Resources, Dippin’ Dots LLC.
There was a nitrogen leak. At this time, it is unclear whether it contributed to the explosion, or if it occurred after the explosion.
According to Dippin’ Dots CEO Scott Fisher, the explosion happened around 9 p.m. Local, state and federal units are working on an investigation.
Dippin’ Dots is unable to comment at this time without a comprehensive investigation.
Fisher hopes the injured employees will make a full and speedy recovery and wanted to thank first responders for their quick reaction.
The Paducah Fire Department has been working with Atmos Energy, Jackson Purchase Energy Corporation, and Paducah Water.
Pam Spencer, City of Paducah spokesperson, noted that the focus is currently shifting to the investigation phase, with the fire crews beginning to leave the site.
“We will soon be able to get inside safely and make an assessment of what has occurred. The building is all intact. There was an isolated explosion, for lack of a better term,” said Heisner. “We do not yet know what the cause of that explosion was.”
We will update the story as information comes in.
Copyright 2019 KFVS. All rights reserved.


--- layout: post title: Weeks and weekends date: 2006-05-30 00:00:00 category: personal ---
A short week, as Tom's European Tour 2006 kicks off on Friday with a trip to Geneva for this aikido course with Patrick Cassidy. NewTom went along last year and came back raving about it, and I've never been to Switzerland before so it should be a fun one (aside from worries about explaining to customs officials why I'm carrying a bag of weapons).
Had a most enjoyable weekend, minimally but aptly described elsewhere in the blogosphere - nuff said :)
Main lesson of the bank holiday: you can't substitute marmalade for lemon in a tequila slammer.


IntroductionFrequently asked questionsSyntax, keywords and built-in functionsStandard distributionimport implementationBrowser interface
Introduction - DOM API
Creating a document Accessing elements Attributes and methods Events Mouse events Keyboard events Focus events Drag events Query string Using Javascript objects and libraries Brython-specific built-in modules
browser
browser.ajax browser.html browser.local_storage browser.markdown browser.object_storage browser.session_storage browser.svg browser.timer browser.websocket javascript Working with Brython
Options of function
brython()
Installing the development environment Testing and debugging Deploying an application Brython for Firefox OSCookbook |
module browser.timerImplements methods to allow differed or repetitive execution of functions :set_timeout( function,ms)
runs the function after ms milliseconds. function takes no argument. Returns an object usable in the following function
It is a wrapper of the
In this simple example, the color of the text in the black box will change after 3 seconds. from browser import document as doc from browser import timer def change_color(): doc['first-text'].style.color = "blue" def press_button(ev): timer.set_timeout(change_color, 3000) doc['first-button'].bind('click', press_button)
clear_timeout( timer)
cancels the execution of the function defined by
It is a wrapper of the
Let's see the previous example. Now you have the possibility to stop the execution of the action before the 3 seconds that delays in the execution. from browser import document, timer idtimer = 1 def change_color_two(): document['ct-text2'].style.color = "blue" def press_button_two(ev): global idtimer idtimer = timer.set_timeout(change_color_two, 3000) def stop_button(ev): timer.clear_timeout(idtimer) document['ct-start'].bind('click', press_button_two) document['ct-stop'].bind('click', stop_button)
set_interval( fonction,ms)
launches repeated execution of the function every ms milliseconds. This function returns an object usable in the following function
It is a wrapper of the
When possible, you should avoid the use of this function and use requestanimationframe (see below) as an alternative. clear_interval( timer)
stops the repeated execution of the function defined by
It is a wrapper of the
Here you could see an example where it is used import time from browser import document as doc from browser import timer _timer = None counter = 0 def show(): doc['_timer'].text = '%.2f' %(time.time()-counter) def start_timer(ev): global _timer,counter if _timer is None: counter = time.time() _timer = timer.set_interval(show,10) doc['start'].text = 'Hold' elif _timer == 'hold': # restart # restart timer counter = time.time()-float(doc['_timer'].text) _timer = timer.set_interval(show,10) doc['start'].text = 'Hold' else: # hold timer.clear_interval(_timer) _timer = 'hold' doc['start'].text = 'Restart' def stop_timer(ev): global _timer timer.clear_interval(_timer) _timer = None t = 0 doc['_timer'].text = '%.2f' %0 doc['start'].text = 'Start' doc['start'].bind('click', start_timer) doc['stop'].bind('click', stop_timer)
request_animation_frame(*function*)
runs the function repeatedly letting the browser be in charge to update the browser. function uses a fake argument
It is a wrapper of the
cancel_animation_frame(*id*)
cancels the repeated execution of the function defined by requestanimationframe() and uses the value returned by requestanimationframe() as id
It is a wrapper of the
Here you could see an example where it is used from browser.timer import request_animation_frame as raf from browser.timer import cancel_animation_frame as caf from browser import document as doc from browser import window as win from time import time from browser.html import CANVAS, BUTTON import math ctx = doc['raf-canvas'].getContext( '2d' ) toggle = True def draw(): t = time() * 3 x = math.sin(t) * 96 + 128 y = math.cos(t * 0.9) * 96 + 128 global toggle if toggle: toggle = False else: toggle = True ctx.fillStyle = 'rgb(200,200,20)' if toggle else 'rgb(20,20,200)' ctx.beginPath() ctx.arc( x, y, 6, 0, math.pi * 2, True) ctx.closePath() ctx.fill() def animate(i): global id id = raf(animate) draw() def stop(i): global id print(id) caf(id) doc['btn-animate'].bind('click', animate) doc['btn-stop'].bind('click', stop)
|


The Preferences window contains user-controlled options for how fv behaves and looks. Click on one of the labeled tabs to bring up one of the following sets of options...
Click on "Configure..." to modify the graph size list.
To delete one of more size(s), on the "fv: Graph Size" top panel, click the button in front of the selection (could click on more than one selection.) And then click on "Delete" to delete the selection(s).
To add a new graph size, on the "fv: Graph Size" bottom panel, input new width and height. The new size (in width x height) will show up on top of "Available Graph Size" if it is a new one.
Click "OK" or "Cancel" to exit.
Click the Save button to permanently save your preferences. Location of saved preference:


Before Change
util.run([
kfctl_path, "init", app_path, "-V",
"--config=" + os.path.join(parent_dir, "tmp.yaml")], cwd=parent_dir)
util.run(["cat", "app.yaml"], cwd=app_path)
// We need to use retries because if we don"t we see random failures
// where kfctl just appears to die.
run_with_retries([
After Change
if not email:
raise ValueError("Could not determine GCP account being used.")
os.environ["PROJECT"] = project
if not project:
raise ValueError("Could not get project being used")
// username and password are passed as env vars and won"t appear in the logs
//
config_spec = get_config_spec(config_path, project, email)
// Set KfDef name to be unique
regex = re.compile("[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?")


|
Solid Transformations
A basic project to implement transformations and projections using opengl.
|
Represents on solid object with vertices, edges and faces. More...
#include <Object.h>
Public Member Functions | |
| void | setVertices (Eigen::Matrix4Xd &) |
| Sets the veritices of solid. More... | |
| Eigen::Matrix4Xd & | getVertices () |
| void | addEdge (Edge *) |
| void | addFace (Face *) |
| Object (const unsigned int, unsigned int, unsigned int, unsigned int) | |
| Construct a new Object:: Object object. More... | |
| ~Object () | |
| Destroy the Object:: Object object. | |
Represents on solid object with vertices, edges and faces.
| Object::Object | ( | const unsigned int | iden, |
| unsigned int | vCount, | ||
| unsigned int | eCount, | ||
| unsigned int | fCount | ||
| ) |
| void Object::setVertices | ( | Eigen::Matrix4Xd & | verti | ) |
Sets the veritices of solid.
| verti |


Internal Wiki
Services
About us
Scipion Web Tools
Single particle analysis tools
Align your movies
|
Analyze your maps
|
Analyze your maps
Reliability tools
|
Check the reliability of your data


{% extends 'layouts/base.html' %} {% block content %}
The University Reservation System is an online tool that helps you reserve spaces and equipment at your university. It gives you all the information you need about the thing you are reserving, such as condition, amenities, and more, to ensure that you get exactly what you are looking for.
This API is for anyone who is interested in the space and equipment data we have. This documentation will teach you how to get data regarding the current spaces, equipment, and reservations at your university and also how to add new spaces and equipment for others to use.
In this section, you will learn how to perform basic querying operations to get the information we have in our database.
Returns a list of spaces in the database.
urs-tufts.herokuapp.com/api/spaces
{
"num_results": 2,
"objects": [
{
"capacity": 15,
"condition": null,
"created_by": null,
"date_created": "2017-04-10T02:07:36.149514",
"id": 1,
"last_updated": "2017-04-10T02:07:36.149520",
"last_updated_by": null,
"location_id": 1,
"name": "102",
"space_type_id": 8
},
{
"capacity": 15,
"condition": null,
"created_by": null,
"date_created": "2017-04-10T02:07:36.150924",
"id": 2,
"last_updated": "2017-04-10T02:07:36.150928",
"last_updated_by": null,
"location_id": 1,
"name": "211",
"space_type_id": 8
}
],
"page": 1,
"total_pages": 1
}
Returns a specific spaces in the database with the given id number.
urs-tufts.herokuapp.com/api/spaces/1
{
"capacity": 15,
"condition": null,
"created_by": null,
"date_created": "2017-04-10T02:07:36.149514",
"id": 1,
"last_updated": "2017-04-10T02:07:36.149520",
"last_updated_by": null,
"location_id": 1,
"name": "102",
"space_type_id": 8
}
Returns a list of campuses in the database.
urs-tufts.herokuapp.com/api/campuses
{
"num_results": 2,
"objects": [
{
"city": "Medford",
"created_by": null,
"date_created": "2017-04-10T02:07:36.124219",
"id": 1,
"last_updated": "2017-04-10T02:07:36.124227",
"last_updated_by": null,
"name": "Tufts Medford/Somerville",
"state": "MA"
},
{
"city": "Grafton",
"created_by": null,
"date_created": "2017-04-10T02:07:36.125580",
"id": 2,
"last_updated": "2017-04-10T02:07:36.125584",
"last_updated_by": null,
"name": "Tufts Grafton",
"state": "MA"
}
],
"page": 1,
"total_pages": 1
}
Returns a specific campus in the database with the given id number.
urs-tufts.herokuapp.com/api/campuses/1
{
"city": "Medford",
"created_by": null,
"date_created": "2017-04-10T02:07:36.124219",
"id": 1,
"last_updated": "2017-04-10T02:07:36.124227",
"last_updated_by": null,
"name": "Tufts Medford/Somerville",
"state": "MA"
}
Returns a list of locations/buildings in the database.
urs-tufts.herokuapp.com/api/locations
{
"num_results": 2,
"objects": [
{
"address_line_1": "161 College Ave",
"address_line_2": null,
"address_line_3": null,
"campus_id": 1,
"city": "Medford",
"created_by": null,
"date_created": "2017-04-10T02:07:36.142521",
"id": 1,
"last_updated": "2017-04-10T02:07:36.142528",
"last_updated_by": null,
"name": "Halligan Hall",
"state": "MA",
"zip_code": "02144"
},
{
"address_line_1": "35 Professors Row",
"address_line_2": null,
"address_line_3": null,
"campus_id": 1,
"city": "Medford",
"created_by": null,
"date_created": "2017-04-10T02:07:36.144008",
"id": 2,
"last_updated": "2017-04-10T02:07:36.144013",
"last_updated_by": null,
"name": "Tisch Library",
"state": "MA",
"zip_code": "02144"
}
],
"page": 1,
"total_pages": 1
}
Returns a specific location/building in the database with the given id number.
urs-tufts.herokuapp.com/api/locations/2
{
"address_line_1": "35 Professors Row",
"address_line_2": null,
"address_line_3": null,
"campus_id": 1,
"city": "Medford",
"created_by": null,
"date_created": "2017-04-10T02:07:36.144008",
"id": 2,
"last_updated": "2017-04-10T02:07:36.144013",
"last_updated_by": null,
"name": "Tisch Library",
"state": "MA",
"zip_code": "02144"
}
In this section, you will learn how to perform operations used to send information to our database.
Adds a new space to the database.
curl -H "Content-Type: application/json" -X POST -d '{"capacity":20,"name":"A room"}' urs-tufts.herokuapp.com/api/spaces
{
"capacity": 20,
"condition": null,
"created_by": null,
"date_created": "2017-04-20T02:55:34.091498",
"id": 23,
"last_updated": "2017-04-20T02:55:34.091509",
"last_updated_by": null,
"location_id": null,
"name": "A room",
"space_type_id": null
}


- Load a list of docx file names from a service.
- Load a docx file from the service.
- Insert a docx file into the current document.
- Parse the content control collection based on tags and titles.
- Use the content controls to create input boxes.
- Update the text value of the content control collection based on the values in the input boxes.


Score: 0
Keyboard Control Guidance:
1: Control Fish_kun
2: Control Fish_aqua
3: Control Light Source
Oriented Objects (e.g. Fish):
Q/E: Scale Up/Scale Down
W/S: Move fowared/Move backward
A/D: Rotate along normal
←/→: Rotate along orientation
↑/↓: Rotate along normal × orient
Simple Objects (e.g. Light Source):
Q/E: Scale Up/Scale Down
←/→: Move by X axis
↑/↓: Move by Y axis
W/S: Move by Z axis
A/D: Rotate along Y axis
Camera：
Left Click: Rotate along focus ball
Middle Click: Move along diameter
Right Click: Move along tanget plane
(Focus ball refers to the sphere whose heart set on focus point, with a radius of the distance between the foucs point and the camera)


In your initialize method, you can use the $[AddChart(Chart obj),M:QuantConnect.Algorithm.QCAlgorithm.AddChart] method to insert a new chart. Each chart object has an internal collection of Series objects.
In creating Series objects, you must specify the name of the series, the $[SeriesType], and the index the series operates on. The series index refers to its position in the chart - for example, if all the series are index 0, they will lay on top of each other. If each series has its own index, it will have several mini-charts stacked next to each other.
The picture below shows an EMA cross chart with both EMA series set to the same index: Using different indexes the chart looks as follows:
// In your initialize method: // Chart - Master Container for the Chart: var stockPlot = new Chart("Trade Plot"); // On the Trade Plotter Chart we want 3 series: trades and price: var buyOrders = new Series("Buy", SeriesType.Scatter, 0); var sellOrders = new Series("Sell", SeriesType.Scatter, 0); var assetPrice = new Series("Price", SeriesType.Line, 0); // Or Using Custom Chart // Import the necessary module before using Custom color using System.Drawing; var buyOrders = new Series("Buy", SeriesType.Scatter, "$", Color.Red, ScatterMarkerSymbol.Triangle); var sellOrders = new Series("Sell", SeriesType.Scatter, "$", Color.Blue, ScatterMarkerSymbol.TriangleDown); var assetPrice = new Series("Price", SeriesType.Line, "$", Color.Green); stockPlot.AddSeries(buyOrders); stockPlot.AddSeries(sellOrders); stockPlot.AddSeries(assetPrice); AddChart(stockPlot); // Later in your OnData(Slice data): Plot("Trade Plot", "Price", data.Bars["SPY"].Close);
# In your initialize method: # Note - use single quotation marks: ' instead of double " # Chart - Master Container for the Chart: stockPlot = Chart('Trade Plot') # On the Trade Plotter Chart we want 3 series: trades and price: stockPlot.AddSeries(Series('Buy', SeriesType.Scatter, 0)) stockPlot.AddSeries(Series('Sell', SeriesType.Scatter, 0)) stockPlot.AddSeries(Series('Price', SeriesType.Line, 0)) # Or using custom chart # Import the necessary module before using Custom color from System.Drawing import Color stockPlot.AddSeries(Series('Price', SeriesType.Line, '$', Color.Green)) stockPlot.AddSeries(Series('Buy', SeriesType.Scatter, '$', Color.Red, ScatterMarkerSymbol.Triangle)) stockPlot.AddSeries(Series('Sell', SeriesType.Scatter, '$', Color.Blue, ScatterMarkerSymbol.TriangleDown)) self.AddChart(stockPlot) # Later in your OnData(self, data): self.Plot('Trade Plot', 'Price', data.Bars["SPY"].Close)