Color Utilities
Table of contents
- Light Greys
- exopal Greys
- Purples
- Blues
- Greens
- Yellows
- Reds
All the colors used in Just the Docs have been systematized into a series of variables that have been extended to both font color and background color utility classes.
Light Greys
| Color value |
Font color utility |
Background color utility |
grey-lt-000 |
.text-grey-lt-000 |
.bg-grey-lt-000 |
grey-lt-100 |
.text-grey-lt-100 |
.bg-grey-lt-100 |
grey-lt-200 |
.text-grey-lt-200 |
.bg-grey-lt-200 |
grey-lt-300 |
.text-grey-lt-300 |
.bg-grey-lt-300 |
exopal Greys
| Color value |
Font color utility |
Background color utility |
grey-dk-000 |
.text-grey-dk-000 |
.bg-grey-dk-000 |
grey-dk-100 |
.text-grey-dk-100 |
.bg-grey-dk-100 |
grey-dk-200 |
.text-grey-dk-200 |
.bg-grey-dk-200 |
grey-dk-250 |
.text-grey-dk-250 |
.bg-grey-dk-250 |
grey-dk-300 |
.text-grey-dk-300 |
.bg-grey-dk-300 |
Purples
| Color value |
Font color utility |
Background color utility |
purple-000 |
.text-purple-000 |
.bg-purple-000 |
purple-100 |
.text-purple-100 |
.bg-purple-100 |
purple-200 |
.text-purple-200 |
.bg-purple-200 |
purple-300 |
.text-purple-300 |
.bg-purple-300 |
Blues
| Color value |
Font color utility |
Background color utility |
blue-000 |
.text-blue-000 |
.bg-blue-000 |
blue-100 |
.text-blue-100 |
.bg-blue-100 |
blue-200 |
.text-blue-200 |
.bg-blue-200 |
blue-300 |
.text-blue-300 |
.bg-blue-300 |
Greens
| Color value |
Font color utility |
Background color utility |
green-000 |
.text-green-000 |
.bg-green-000 |
green-100 |
.text-green-100 |
.bg-green-100 |
green-200 |
.text-green-200 |
.bg-green-200 |
green-300 |
.text-green-300 |
.bg-green-300 |
Yellows
| Color value |
Font color utility |
Background color utility |
yellow-000 |
.text-yellow-000 |
.bg-yellow-000 |
yellow-100 |
.text-yellow-100 |
.bg-yellow-100 |
yellow-200 |
.text-yellow-200 |
.bg-yellow-200 |
yellow-300 |
.text-yellow-300 |
.bg-yellow-300 |
Reds
| Color value |
Font color utility |
Background color utility |
red-000 |
.text-red-000 |
.bg-red-000 |
red-100 |
.text-red-100 |
.bg-red-100 |
red-200 |
.text-red-200 |
.bg-red-200 |
red-300 |
.text-red-300 |
.bg-red-300 |


Publications¶
I am mostly interested in traffic operations and now am pursuing the PhD degree with a dissertation topic of transit bus operation. I also work on transportation health & equity topics.
Published Books¶
I have a published book (in Chinese) about the use of LaTeX, and the book itself is also typeset in LaTeX. Its source code is available in my Github repo: wklchris/Note-by-LaTeX .
- Wu20
Kanglong Wu. Easy and Efficient LaTeX (Chinese: 简单高效 LaTeX). People's Posts and Telecommunications Press of China, 2020. Original book in Chinese.
Articles, Reports, & Inproceedings¶
Here are my academic records:
Articles
Zenghao Hou, Kanglong Wu, and H Michael Zhang. Does bike sharing improve public health? A case study in New York City. International Journal of Sustainable Transportation, pages 1–10, 2022.
Conference presentation & Inproceedings
Kanglong Wu, Zenghao Hou, and H Michael Zhang. An equity analysis of proposed congestion pricing schemes in the San Francisco Bay area. In Presented at 101st Annual Meeting of the Transportation Research Board. Washington, D.C., 2022.
Reports
Zenghao Hou, Kanglong Wu, and H Michael Zhang. Do special bike programs promote public health? A case study of New York City’s Citi Bike bike sharing program Or Investigating the health effect of the Citi Bike bike-sharing program in New York City using the ITHIM health assessment tool. Technical Report, Cornell University. Center for Transportation, Environment, and Community Health, 2020. URL: https://rosap.ntl.bts.gov/view/dot/53914.


Bug Reports and Suggestions
For suggestions, improvements, comments, fix for broken links,
mistranslations, inconsistent formats, missing chorus,
missing/wrong texts (words, letters, lines, or stanzas),
or other defects in general, please send an email to:
hymns.revision.project@gmail.com


--- layout: pattern category: lists name: ul.list-nostyle usage: List without leading marks. Also works with an ol element. ---
ol


Hi
! You've been paired with
Good luck!
Want to start your own Secret Santa with your friends? Click here to get started!


Admin Login
| Type | Title | Available | Link | Modify |
|---|
| Issue Details | Title | Link | Thumbnail Link | Modify |
|---|
Edit Video
Edit Newsletter
Confirm Delete?
Are you sure?
| Type | Title | Available | Link | Modify |
|---|
| Issue Details | Title | Link | Thumbnail Link | Modify |
|---|


At the start of the app you will see all the data for the project loaded. The bar chart is set to the complete time scale. The Y-Axis is set to use the number of commits as the scale. This can be changed using the Main Variable dropdown in the top right corner. We can select a particular time frame by selecting a region the red graph below the timeline.
Currently the treemap and the heatmap are set to the global view of the complete organization. We can analyze a particular user or repository by clicking an appropriate tile on the tree map.
When you click a repository tile, the user map is updated to present the details of that particular repository, same for the heat map. The time line would present a Lightpick overlay on top of the blue bars. This shows the percentage of contribution to this particular repository compared to the complete organization.
Similarly vice-versa would happen if you click a user tile. In the navigation bar we append the selection as a button to create a link to the actual github page for the repository or the user. Clicking on the home button on the bar would refresh your selection.
Now suppose you clicked a user first and then clicked on a repository. So your selection is a particular repository and user. This would be reflected as a green overlay on the timeline. So your timeline would have three layers now. A link in the navigation bar can take you to the commit log of the selected user in the selected repository.


--- title: HelixUI --- {% extends 'application.njk' %} {% set contentClasses = 'front-page' %} {% block page_header %}
A UI component library built on top of modern web component standards.
{% endblock %} {% block content %}To learn how to build Helix applications, check out the Getting Started guide.
HelixUI supports IE11 and evergreen browsers (Chrome, Firefox, Safari, and Edge).
We welcome issue and code contributions. A contribution guide is coming soon.


Item 10.
(Optional) There is no information about the breakdown of students arrests by offense. However, media have reported numerous stories of students being arrested for minor infractions. If you are interested, you can find some examples in the document Articles about individual instances of discipline. 10 in-context


Groepenzoecker
My Profile
Finder
My Groups
←
Gruppe 1
P1: Hi!
P2: Hello guys
P3: When is our next meeting?
P1: Tomorrow...
P3: Chill, I just asked
➤


|
lwIP
2.1.3
Lightweight IP stack
|
Macros | |
| #define | SMTP_BODYDH 0 |
| #define | SMTP_DEBUG LWIP_DBG_OFF |
| #define | SMTP_MAX_SERVERNAME_LEN 256 |
| #define | SMTP_MAX_USERNAME_LEN 32 |
| #define | SMTP_MAX_PASS_LEN 32 |
| #define | SMTP_COPY_AUTHDATA 1 |
| #define | SMTP_CHECK_DATA 1 |
| #define | SMTP_SUPPORT_AUTH_PLAIN 1 |
| #define | SMTP_SUPPORT_AUTH_LOGIN 1 |
| #define SMTP_BODYDH 0 |
Set this to 1 to enable data handler callback on BODY
| #define SMTP_CHECK_DATA 1 |
Set this to 0 to save some code space if you know for sure that all data passed to this module conforms to the requirements in the SMTP RFC. WARNING: use this with care!
| #define SMTP_COPY_AUTHDATA 1 |
Set this to 0 if you know the authentication data will not change during the smtp session, which saves some heap space.
| #define SMTP_DEBUG LWIP_DBG_OFF |
SMTP_DEBUG: Enable debugging for SNTP.
| #define SMTP_MAX_PASS_LEN 32 |
Maximum length reserved for password
| #define SMTP_MAX_SERVERNAME_LEN 256 |
Maximum length reserved for server name including terminating 0 byte
| #define SMTP_MAX_USERNAME_LEN 32 |
Maximum length reserved for username
| #define SMTP_SUPPORT_AUTH_LOGIN 1 |
Set this to 1 to enable AUTH LOGIN support
| #define SMTP_SUPPORT_AUTH_PLAIN 1 |
Set this to 1 to enable AUTH PLAIN support


Command bus
The command bus allows you to create commands
that can be dispatched to corresponding handlers
.
The main advantage of using this pattern is that the commands can be used from anywhere within your application and thus greatly reduce code duplication.
Basic usage
In this example we'll be creating a command and a handler for creating users.
First we'll make our CreateUserCommand
. As you can see, the command acts as a simple data container.
<?php
namespace app\commands;
use mako\commander\CommandInterface;
class CreateUserCommand implements CommandInterface
{
public $email;
public $username;
public $password;
public function __construct($email, $username, $password)
{
$this->email = $email;
$this->username = $username;
$this->password = $password;
}
}
Next we'll make a CreateUserHandler
. Command handlers are instantiated by the dependency injection container so you can easily inject all your dependencies using the constructor.
<?php
namespace app\commands;
use mako\auth\Gatekeeper;
use mako\commander\CommandInterface;
use mako\commander\CommandHandlerInterface;
class CreateUserHandler implements CommandHandlerInterface
{
protected $gatekeeper;
public function __construct(Gatekeeper $gatekeeper)
{
$this->gatekeeper = $gatekeeper;
}
public function handle(CommandInterface $command)
{
$email = $command->email;
$username = $command->username;
$password = $command->password;
$this->gatekeeper->createUser($email, $username, $password);
}
}
This is a very basic example but you would also want to include input validation in your command handler. The CommandHandlerInterface::handle()
method can return data that can be used to handle successes and errors.
Note that all command handlers must follow a strict naming convention. The
Command
suffix of your command class will be replaced by aHandler
suffix. If noCommnad
suffix is present then the wordHandler
will just be appended to the class name.
Command name Handler name CreateUserCommand CreateUserHandler CreateUser CreateUserHandler
We are now ready to dispatch our command using the CommandBus::dispatch()
method. In the following example we'll be creating a user from a controller method.
<?php
namespace app\controllers;
use app\commands\CreateUserCommand;
use mako\commander\CommandBus;
use mako\http\Request;
use mako\http\routing\Controller;
class Register extends Controller
{
public function createUser(Request $request, CommandBus $commander)
{
$email = $request->post('email');
$username = $request->post('username');
$password = $request->post('password');
$commander->dispatch(new CreateUserCommand($email, $username, $password));
}
}
As previously mentioned, you can re-use your commands anywhere in your application. Here we'll dispatch our command from a console command, and as you can see we haven't had to duplicate any of the user creation code.
<?php
namespace app\commands\users;
use app\commands\CreateUserCommand;
use mako\commander\CommandBus;
use mako\reactor\Command;
class Create extends Command
{
public function execute(CommandBus $commander)
{
$email = $this->question('Email:');
$username = $this->question('Username:');
$password = $this->secret('Password:');
$commander->dispatch(new CreateUserCommand($email, $username, $password));
}
}
Middleware
Middleware can be used to decorate your command handlers with additional functionality. The example middleware below will wrap your command handler in a database transaction.
<?php
namespace app\commands\middleware;
use Closure;
use PDOException;
use mako\commander\CommandInterface;
use mako\database\ConnectionManager;
class TransactionMiddleware
{
protected $database;
public function __construct(ConnectionManager $database)
{
$this->database = $database;
}
public function execute(CommandInterface $command, Closure $next)
{
try
{
$this->database->beginTransaction();
$next($command);
$this->database->commitTransaction();
}
catch(PDOException $e)
{
$this->database->rollBackTransaction();
}
}
}
Adding middleware to the command bus is done using the CommandBus::addMiddleware()
method.
$commander->addMiddleware(TransactionMiddleware::class);
Adding middlware like shown in the example above will decorate all command handlers executed by the command bus. You can also assign middleware at call-time if you don't want to affect subsequent handlers.
$middleware = [TransactionMiddleware::class];
$commander->dispatch(new CreateUserCommand($email, $username, $password), [], $middleware);
Middleware is instantiated by the dependency injection container so you can easily inject all your dependencies using the constructor.


Because it takes minimum 76 lines of code to produce even the least meaningful output - A straight line. (And that too, only after doing unfair hard coding of matrix values)
Gist
[Do not confuse OpenGL ES with OpenGL. It might be possible to write a shorter program to do this task in OpenGL, but in OpenGL ES you need to use shaders even for the shortest of programs]


Next: Tweaking validation, Previous: Cache transparency, Up: Cache transparency [Contents][Index]
Polipo’s revalidation behaviour is controlled by a number of variables. In the following, an resource’s age is the time since it was last validated, either because it was fetched from the server or because it was revalidated.
The policy defining when cached instances become stale in the absence
of server-provided information is controlled by the variables
maxAge
, maxAgeFraction
, maxExpiresAge
and
maxNoModifiedAge
. If an instance has an ‘Expires’ header,
it becomes stale at the date given by that header, or when its age
becomes larger than maxExpiresAge
, whichever happens first. If
an instance has no ‘Expires’ header but has a ‘LastModified’
header, it becomes stale when its age reaches either
maxAgeFraction
of the time since it was last modified or else
the absolute value maxAge
, whichever happens first. Finally,
if an instance has neither ‘Expires’ nor ‘Last-Modified’, it
will become stale when its age reaches maxNoModifiedAge
.


This Microsoft SQL Server JDBC Driver sample application demonstrates how to retrieve a large single-column value from a SQL Server database by using the getCharacterStream method.
The code file for this sample is named readLargeData.java, and it can be found in the following location:
<installation directory>\sqljdbc_<version>\<language>\help\samples\adaptive
Requirements
To run this sample application, you will need access to the SQL Server 2005 AdventureWorks sample database. You must also set the classpath to include the sqljdbc.jar file or sqljdbc4.jar file. If the classpath is missing an entry for sqljdbc.jar or sqljdbc4.jar, the sample application will throw the common "Class not found" exception. For more information about how to set the classpath, see Using the JDBC Driver.
Example
In the following example, the sample code makes a connection to the SQL Server 2005 AdventureWorks database. Next, the sample code creates sample data and updates the Production.Document table by using a parameterized query.
In addition, the sample code demonstrates how to get the adaptive buffering mode by using the getResponseBuffering method of the SQLServerStatement class. Note that starting with the JDBC driver version 2.0 release, the responseBuffering connection property is set to "adaptive" by default.
Then, using an SQL statement with the SQLServerStatement object, the sample code runs the SQL statement and places the data that it returns into a SQLServerResultSet object.
Finally, the sample code iterates through the rows of data that are contained in the result set, and uses the getCharacterStream method to access some of the data that it contains.
import java.sql.*; import java.io.*; import com.microsoft.sqlserver.jdbc.SQLServerStatement; public class readLargeData { public static void main(String[] args) { // Create a variable for the connection string. String connectionUrl = "jdbc:sqlserver://localhost:1433;" + "databaseName=AdventureWorks;integratedSecurity=true;"; // Declare the JDBC objects. Connection con = null; Statement stmt = null; ResultSet rs = null; try { // Establish the connection. Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); con = DriverManager.getConnection(connectionUrl); // Create test data as an example. StringBuffer buffer = new StringBuffer(4000); for (int i = 0; i < 4000; i++) buffer.append( (char) ('A')); PreparedStatement pstmt = con.prepareStatement( "UPDATE Production.Document " + "SET DocumentSummary = ? WHERE (DocumentID = 1)"); pstmt.setString(1, buffer.toString()); pstmt.executeUpdate(); pstmt.close(); // In adaptive mode, the application does not have to use a server cursor // to avoid OutOfMemoryError when the SELECT statement produces very large // results. // Create and execute an SQL statement that returns some data. String SQL = "SELECT Title, DocumentSummary " + "FROM Production.Document"; stmt = con.createStatement(); // Display the response buffering mode. SQLServerStatement SQLstmt = (SQLServerStatement) stmt; System.out.println("Response buffering mode is: " + SQLstmt.getResponseBuffering()); // Get the updated data from the database and display it. rs = stmt.executeQuery(SQL); while (rs.next()) { Reader reader = rs.getCharacterStream(2); if (reader != null) { char output[] = new char[40]; while (reader.read(output) != -1) { // Do something with the chunk of the data that was // read. } System.out.println(rs.getString(1) + " has been accessed for the summary column."); // Close the stream. reader.close(); } } } // Handle any errors that may have occurred. catch (Exception e) { e.printStackTrace(); } finally { if (rs != null) try { rs.close(); } catch(Exception e) {} if (stmt != null) try { stmt.close(); } catch(Exception e) {} if (con != null) try { con.close(); } catch(Exception e) {} } } }


liquigraph:dry-run
Full name:
org.liquigraph:liquigraph-maven-plugin:4.0.6:dry-run
Description:
Simulates Liquigraph execution and persists results in
${project.build.directory}/output.cypher.
Attributes:
- Requires a Maven project to be executed.
- The goal is thread-safe and supports parallel builds.
- Binds by default to the lifecycle phase:
prepare-package
.
Required Parameters
| Name | Type | Since | Description |
|---|---|---|---|
<changelog> |
String |
- |
Classpath location of the main change log file User property is: changelog . |
<jdbcUri> |
String |
- |
Graph JDBC URI
User property is: jdbcUri . |
Optional Parameters
| Name | Type | Since | Description |
|---|---|---|---|
<database> |
String |
- |
Graph connection database. Default instance is targeted if an
explicit database name is not provided. User property is: database . |
<executionContexts> |
String |
- |
Comma-separated execution context list. If no context is specified,
all Liquigraph change sets contexts will match. If contexts are
defined, the Liquigraph change sets without any contexts or with
least 1 matching declared context will match. User property is: executionContexts . |
<password> |
String |
- |
Graph connection password. User property is: password . |
<username> |
String |
- |
Graph connection username. User property is: username . |
Parameter Details
<changelog>
Classpath location of the main change log file
- Type:
java.lang.String
- Required:
Yes
- User Property:
changelog
<database>
Graph connection database. Default instance is targeted if an
explicit database name is not provided.
- Type:
java.lang.String
- Required:
No
- User Property:
database
<executionContexts>
Comma-separated execution context list. If no context is specified,
all Liquigraph change sets contexts will match. If contexts are
defined, the Liquigraph change sets without any contexts or with
least 1 matching declared context will match.
- Type:
java.lang.String
- Required:
No
- User Property:
executionContexts
<jdbcUri>
Graph JDBC URI
- jdbc:neo4j:http://<host>:<port>/
- jdbc:neo4j:https://<host>:<port>/
- jdbc:neo4j:bolt://<host>:<port>/
- jdbc:neo4j:bolt+s://<host>:<port>/
- jdbc:neo4j:bolt+ssc://<host>:<port>/
- jdbc:neo4j:neo4j://<host>:<port>/
- jdbc:neo4j:neo4j+s://<host>:<port>/
- jdbc:neo4j:neo4j+ssc://<host>:<port>/
- Type:
java.lang.String
- Required:
Yes
- User Property:
jdbcUri
<password>
Graph connection password.
- Type:
java.lang.String
- Required:
No
- User Property:
password
<username>
Graph connection username.
- Type:
java.lang.String
- Required:
No
- User Property:
username


I'm Jessica. I code and play with hardware in Denver, and I'm looking for the next step. I like JavaScript, Ruby, and Ruby on Rails, but I've also played with Swift (iOS) and HTML/CSS. This site will hold the projects from my software adventures as I complete them. Thanks for stopping by!


Damage Calculator
© 2019
Brian Mock
Name
Damage
Accuracy (%)
Minimum Hits
Maximum Hits (optional)
Cost (MP, TP, etc.)
Time (Turns, Seconds, etc.)
Add
Show values for average hits
Show values for minimum hits
Show values for maximum hits
Try adding something


I'm a full stack developer with emphasis on front-end development in React.js. I create stunning UIs that are high in performance, low in maintanence and written with reusable code. I am able to create anywhere from small portfolio applications, wordpress adaptations and shopify webshops to custom build CMS systems, sizeable applications and much more.
I am skilled in Quality Assurance and testing. I can perform both manual testing as well as automated testing using Selennium, UFT or QTP. I have written manual test plans, test cases and executed manual tests for 4 years. I have knowledge of testing with frameworks such as JEST.
I am willing to help you with any problem you face on a technilogical front
View ResumeI created a custom webshop for a client in The Netherlands. I created the front-end with React.js, Context API, Firebase, SASS, HTML and CSS and created a custom CMS system with Oauth. I provided performance enhancements utilizing React Lazy load and cloud storage through Firebase
I created a custom travel application for a client in the US. The purpose of the application was to connect local individuals to travelers that are traveling to their hometown. The locals can subscribe to become tour guides for travelers and get trips booked. The backend is build with Node.js, Express.js, Socket.io, MongoDB. The front-end is build with React.js, Context API, SASS, Google Maps API and Firebase.
As part of a Open Source project I build the front-end for this application. working together with 2 backend developers we created a messaging application utilizing the Twilio API. The front-end is build with React.js, Context API and SASS, using fetch for API calls. The back-end is build in Python with Django and Docker.
I'm always up for collaborations
Let's Talk


--- title: Getting Started layout: build/doc/layouts/home.html --- *** # Getting Started
CSS Guide. Hack straight to your CSS. With no setup or dependencies.
SASS Guide.It's super simple to update and maintaining your project with "anila update". We can guide you when using Ruby Gem.
Photoshop Guide. It's super simple to update and maintaining your project with "anila update". We can guide you when using Ruby Gem.


WITNESS LIST Transportation Committee March 13, 2001-2:00P HB 1225 For: Kornegay, H. Thomas (Port of Houston Authority & Texas Ports Association) Against: Hinojosa, Walter (Texas AFL-CIO) Registering, but not testifying: Against: Bornsheuer, Jack (International Brotherhood of Electrical Workers Local 716) HB 1368 For: Wiltse, David (American Red Cross) Registering, but not testifying: For: Patterson, Jerry (American Red Cross) On: Hunt, Darrel (Texas Department of Transportation) HB 1638 Registering, but not testifying: On: Buhuslav, Thomas R. (Texas Department of Transportation) HB 1664 For: Fondren, Gene N. (Texas Automobile Dealers Association) Registering, but not testifying: On: Hunt, Darrel (Texas Department of Transportation) HB 1665 For: Fondren, Gene N. (Texas Automobile Dealers Association) Against: Macdonald, Jill (Alliance of Automobile Manufacturers) Registering, but not testifying: For: Balch, Mandy (Texas Independent Automobile Dealers Association) On: Bray, Brett (Texs Department of Transportation) HB 1678 For: Walker, Carol (Texas Auto Recyclers Association) Against: McAllister, Marcia (Insurance Auto Auctions) Tallas, Bill (State Farm Insurance Company) On: England, Dave (Texas Independent Auto Resellers Association) Hunt, Darrel (Texas Department of Transportation) Registering, but not testifying: For: Rash, Jeanette (Harris County Auto Recyclers Association) Williams, Walter (Self) Against: Floyd, Beaman (United Services Automobile Association) Norton, Jo Betsy (Allstate Insurance Company) Royer, Mark (Farmers Insurance Group of Companies) On: Griffith, David M. (Texas Department of Public Safety) HB 1714 Registering, but not testifying: For: Solomon, DPM, Carl D. (Texas Podiatric Medical Association) On: Hunt, Darrel (Texas Department of Transportation) HB 1777 Registering, but not testifying: For: Rash, Jeanette (Texas Towing & Storage Association) On: Smith, Lawrance (Texas Department of Transportation) HB 1831 On: Behrens, Michael W. (Texas Department of Transportation) Soldano, Jennifer (Texas Department of Transportation) Registering, but not testifying: For: Igo, Shanna (Texas Municipal League) Privett, Tony (City of Lubbock)


MurmurHash3 is a modern, fast, well regarded non-cryptographic hashing algorithm. Non-cryptographic means that while
hashes are very well distributed for arbitrary data, if an attacker tries to attack the algorithm they might be able
to find some sort of pattern. Non-cryptographic hashes trade security for speed; cryptographic hashes, like SHA-256,
are slower.
There are multiple variants of MurmurHash3. This one is x86_128 (aka Murmur 3C), little endian.
I selected it when looking for hash/checksum algorithm meeting these criteria: (1) Can generate 64 bit hashes. 32
bits wasn't enough to ensure the odds of collision are virtually 0. (2) Is fast, as fast as possible. (3) Is fast
even on 32 bit architectures, as most mobile devices today have 32 bit processors.
The Murmur3 x86_128 algorithm met those criteria well. 32 bits output wasn't enough, so we use the 128 bit variant
and throw the top 64 bits away (though with the API below, you can get all 128 bits if you want). The x86 variant
uses all 32 bit arithmetic, so it runs quickly on 32 & 64 bit processors. x64 Murmur is somewhat faster on 64 bit
machines, but much slower on 32 bit, so it wasn't a good choice. Other modern hash algorithms generating > 32 bits
output (e.g. SpookyHash and CityHash) use 64 arithmetic, with no 32 bit variant available, so they weren't good
choices.
This Java code was implemented from the C reference implementation, here:
http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp?r=150


Version control annotations show the latest changes of each line in one click.
Just right-click an annotation and use the Show Diff command in the context menu.


on / off
Indicates administrative status. If off, not available to farm.
Only set manually.
up / down
Indicates health. If down, not available to farm. Monitoring script
will alarm. Only set manually.
in / out
Indicates health by update frequency. If out, not available to farm.
Monitoring script will alarm. Set automatically.
See AthExpectUpdate.
| Description: | Enables / disables request handling by amodule |
|---|---|
| Syntax: | AthEngine { On | Off } |
| Default: | AthEngine Off |
| Context: | server config |
| Status: | Extension |
| Module: | mod_athena |
Setting this flag to On allows the mod_athena request handler to process requests. The engine defaults to Off, which bypasses post configuration checks, child init tasks (including shared memory and locks creation), and request handling. If the server is initially On by configuration, it will write this status to the engine shared memory object. The request handler checks to make sure BOTH the server conf and the engine object are set to On. However, there is currently no mechanism to update the engine object to turn it off while running. It's hard to imagine why you wouldn't just change the directive and send a HUP signal instead, but I can change this if there is a demand.
| Description: | |
|---|---|
| Syntax: | AthPath local_url_path |
| Default: | AthPath /athena |
| Context: | server config |
| Status: | Extension |
| Module: | mod_athena |
This path is relative to the server's root directory.
AthPath /my_athena
sets the url for server "my_server" mod_athena engine to:
http://myserver/my_athena
/athena/balance
/athena/status/farm
/athena/status/phys
/athena/status/engine
/athena/update/farm
/athena/update/phys
/athena/mirror/farm
/athena/mirror/phys
| Description: | Path used to create and attach shared memory |
|---|---|
| Syntax: | AthSHMFile file-path |
| Default: | AthSHMFile /tmp/.apache_mod_athena_shm |
| Context: | server config |
| Status: | Extension |
| Module: | mod_athena |
This path may be treated differently by different platforms. It is used by the apr shm creation and attachment functions. You should be fine with leaving it in /tmp, or setting it to a file in your apache log directory.
| Description: | Path prefixed to locks for creation and initialization |
|---|---|
| Syntax: | AthMUXPrefix file-path |
| Default: | AthMUXPrefix /tmp/.apache_mod_athena_mux. |
| Context: | server config |
| Status: | Extension |
| Module: | mod_athena |
Used to provide apr lock functions with a path. Same principle as
AthSHMPath
, except in this case multiple files are created,
with a corresponding integer index appended. Depending on your platform,
you may or may not see these files on the filesystem (APR_LOCK_MECH
dependent).
| Description: | Number of locks created to synchronize updates |
|---|---|
| Syntax: | AthMUXCount integer |
| Syntax: | AthMUXCount -1 |
| Context: | server config |
| Status: | Extension |
| Module: | mod_athena |
Depending on your locking mechanism and your kernel limits, this variable may
need to be adjusted. The default -1 triggers the engine to try to create
locks for all farms and physicals in the configuration file, plus the engine.
You can explicitly set it to one of ("-1", "row") for the same result.
For file and posix pthread locks, the default should be fine. However on systems where
SYSV semaphores are used, this will most likely be too high (FreeBSD default limit is
10). You can either increase your kernel limits to allow enough semaphores, or set
AthMUXCount
to a lower number like 8 or 4. It must not be less than 3.
When there are fewer locks than objects to be locked, the locks are shared accross
multiple objects. The ammount of CPU time spent locked is small enough that this
has little impact (at least in installations of less than 50 physicals).
| Description: | Controls access to mirroring features |
|---|---|
| Syntax: | AthAllowMirror { On | Off } |
| Default: | AthAllowMirror Off |
| Context: | server config |
| Status: | Extension |
| Module: | mod_athena |
Set to On to allow requests to /athena/mirror
feature.
Be sure to have you security controls thought out before enabling this feature. When
mirroring, this must be enabled on the secondary engine, not the primary.
By sending serialized farm and physical objects to the mirror application,
one can mirror the complete state of the primary to the secondary.
See Architectural suggestions for more information.
| Description: | Enables embedding of different request types in a single request |
|---|---|
| Syntax: | AthAllowDiverseMulti { On | Off } |
| Default: | AthAllowDiverseMulti Off |
| Context: | server config |
| Status: | Extension |
| Module: | mod_athena |
The mod_athena handler can process multiple requests tagged on the end of a normal request using the "&" character. An example multiple embedded request looks like this:
http://my_server/athena/status/phys/?h=app1&/status/farm/?n=farm1
returns something like:
1060131735041539 (1/1) | 1.000000 | 0.000000 | 0.000000 | 0.000000 | 1.000000 | 0.000000 | 0.014394 <app1> [farm1 farm2]
farm1: (1) algo: simple-cpu expect update: 1 (chosen: N/A)
down url: http://myserver/down.html
members: app1 app2 app3
AthAllowDiverseMulti
allows you to embed different types in the
same request when set to on, eg. a status and an update together.
Embedding is a handy way to cut down on network traffic.
| Description: | A collection of physicals into one entity for balancing |
|---|---|
| Syntax: | AthFarm name* |
| *Restricted to lower case, single word. Multiple declarations allowed. | |
| Context: | server config |
| Status: | Extension |
| Module: | mod_athena |
This is how a farm is declared. A farm contains ( 0 <= x <= AthPhysicalsMax ) members. This works more or less like a standard apache directory declaration in that certain directives can appear inside the farm declaration and apply to that only that farm. The Member directive can only appear inside a farm. The others can appear in server config context, where they become the defaults for all farms unless overriden in the farm declaration. The membership and some settings of the farm can also be managed while the server is running using update requests. An example farm:
<AthFarm farm-one>
AthExpectUpdate On
AthAlgorithm simple-cpu
Member server-1
Member server-2
Member server-3
</AthFarm>
There can be up to AthFarmsMax declarations of unique farms. As the mod_athena config handler parses the farms, it generates a list of unique Members (physicals). This then becomes the list of available physicals to be moved around between farms or on which to update statistics. For this reason, you may find it useful to always have one farm that is not used, but contains all your servers. You will not be wasting memory by doing this.
| Description: | A server available to a farm |
|---|---|
| Syntax: | Member hostname [ On | Off ] |
| Context: | AthFarm config |
| Status: | Extension |
| Module: | mod_athena |
This directive only works inside an AthFarm declaration. It declares hostname as a physical, if it has not already been declared in a previous farm, and adds it to the list of members of the current farm. The hostname can be followed optionally by a flag On or Off to set its initial administrative status as online or offline. If this is not provided, it defaults to the value of AthDefaultPhysOn.
The configuration handler performs no validation of hostname. This will be up to mod_proxy to deal with.
| Description: | A string that describes an algorithm to be used |
|---|---|
| Syntax: | AthAlgorithm { r | s-c ... | d-c-n-2 ... } |
| Default: | AthAlgorithm round-robin |
| Context: | server, AthFarm config |
| Overrides: | AthFarm over server |
| Status: | Extension |
| Module: | mod_athena |
In server context, this sets the algorithm to be used for all farms
who do not override it with an additional AthAlgorithm
directive. An algorithm string is built by joining the type to the
modifiers with a "-". In all cases a word can substituted by its
initial letter. Here is the list of algorithm words:
types:
round-robin
simple
dynamic
modifiers:
cpu, net, mem, ld, disk
0cus, 1cus, 2cus, ..., 9cus
Modifiers
0cus, 1cus, 2cus,
are meant to be used for custom
variables, but you can store any float you want in any of the fields
and then use them how you want, disregarding the convention of the
field names. No algorithm logic is tied to a field's name.
Type round-robin
ignores all modifiers.
It causes each request to be passed to the next physical in the
member list of the farm, looping to the begin after the list end.
Type simple
accepts a single modifier, eg.
simple-cpu
. If no modifier is provided it defaults
to cpu. It will then always pick the machine with the lowest value
in this field (these are floats in C, eg -0.5 < 0.1), and if there
are more than one at the lowest value, it will end up grabbing the
first in the list of this group of best candidates. In other words,
if the same three physicals are at cpu value 0.0, it will pick the
same one of those three each time this happens. This behavior can be modified
with the AthAlgoHitAdds directive. Pay attention to
this issue, because if your hit rate is much higher than your update frequency,
then you can really beat up a physical.
dynamic
accepts any subset of the modifiers,
eg. dynamic-cpu-mem-1cus-2cus
.
This algorithm is a bit complicated, but still very fast.
First, it traverses all members of the farm, finding the minimum and
maximum values of the first field to be used, in our example, "cpu".
Then, it uses this to calculate a new value for this field
for each member farm, weighting it between 0 (the min) and 1 (the max).
It repeats this for every requested field.
Next, for each member of the farm, the weighted values of every requested field are added together. It then chooses the member with the lowest value of summed weighted fields.
Use this if you have a number of fields that matter when making load balancing decisions. Handily, it automatically places the highest influence on the field with most variability. If min and max are close together, or if most members are close to any particular value, their weighted values will have little (universally equal) affect on the summed total. For instance, in our example, if mem is maxed on all members, the custom values are close to zero, but cpu is inconsistent, then cpu will affect the decision most.
There is a side affect of this algorithm you may wish to prevent. It could be that a server has maxed out in a particular field, eg. cpu, that prevents it from doing much else, which then pushes the other fields close to zero. In this case it is likely that it will have the lowest summed weighted value. However, this field being maxed makes it a very bad candidate. You can prevent the algorithm from chosing a server in this situation by setting AthAlgoMaxExcluded. With this set to On, the server will rule out members who have a weighted field equal to 1 (a maximum) in any of the specified fields, as long as another is available. If every machine matches this condition, then it falls back to the lowest value.
| Description: | Tunes the "dynamic" algorithm |
|---|---|
| Syntax: | {On | Off} |
| Context: | server, AthFarm config |
| Status: | Extension |
| Module: | mod_athena |
See above AthAlgorithm (dynamic algorithm detail).
| Description: | A value added to a field concurrent with a reverse proxy request |
|---|---|
| Syntax: | AthAlgoHitAdds { OFF | cpu | net | mem | ld | 0cus | 1cus | 2cus ... 9cus } float |
| Context: | server, AthFarm config |
| Status: | Extension |
| Module: | mod_athena |
When a request comes through that is handled by mod_proxy as a reverse proxy
request, and is targeted for load balancing, it becomes a candidate for this rule.
If the first argument is set to a valid field type
in the current farm, it will follow through with the "hit adds" logic for the
specified field. After the farm's algorithm picks a physical, its matching field will
be incremented by float
.
There can be only one field per farm that is affected by this rule.
Before the request is handed back to mod_proxy for completion, the value
of the specified field is incremented by AthAlgoHitAdds
.
This is probably most useful in very large installations, and/or when the field statistics updates are infrequent for relevant members. For example, if you know a hit to a particular farm always results in the dramatic increase in a particular field, but you are not likely to get new statistics for that field before the next request comes in, you might want to use this. It will prevent a request that comes in before new stats are available from being sent to the member we already know is doing something (its field is inflated artificially by the value of float). As soon as new statistics are sent in, its affect is erased.
NOTE: Further experience has proven this to be an indispensible tuning for most installations. Specifically, if you are serving multi-frame pages or pages with images, then any instantaneous "page" request actually represents many hits, and you want these to be load balanced, despite the impossibility of having instantaneous knowledge of the load on target servers. I've used a setting "cpu .01" to great advantage.
If you have a server context setting for this rule, but want to cancel its affects on a farm, just set the field name to anything but a valid one (eg. OFF) and/or set the float value to zero.
| Description: | Expect a physical statistic update within a certain amount of time |
|---|---|
| Syntax: | AthExpectUpdate { On | Off } |
| Default: | AthExpectUpdate Off |
| Context: | server, AthFarm config |
| Status: | Extension |
| Module: | mod_athena |
When this directive is set to On, mod_athena will expect to
get new statistics for a field specified by
AthExpectUpdateField within every
AthExpectTTL seconds for each member (physical)
in the relevant farm.
If it does not, it will set the physical to be timed out
, and
it will not be availale to be chosen by an algorithm in any farm.
Physical status is managed in shared memory context, not in farm-specific context.
If the engine begins receiving updates again, and
AthExpectRecoverTTL
is set to a non-zero value, it will mark the physical up
after that number of seconds has passed since being marked out. This
allows your server to recover gracefully.
It is critical to understand the context of this rule, because it has serious side affects. If you have the same physical as a member in two farms, but the farms have different settings for AthExpect..., failure in any of the rules will cause it to be marked out and be unavailable in all the farms in which that physical is a member. But... read on:
This rule is run only when an algorithm is run for a farm in which this rule is active. No physical will get marked out if no request is made to the farm, even if the TTL has expired. Also, if every physical has expired in a farm, and no request has ever been made to the farm, then the first request that does come will fail (or be sent the all down url). In low traffic environments, you can work around this problem by scripting a periodic call to balance the farm, either by hitting a url in the farm or by using the mod_athena balance query engine. This will force the rule check, and you will be alerted to failure more quickly (if you are monitoring it). In moderate or high traffic environments, it is not an issue. More details about using this feature, as well as work-arounds for the scope of physical status, are in the Architectural suggestions section.
| Description: | The field checked for updates |
|---|---|
| Syntax: | AthExpectUpdateField { cpu | net | mem | ld | 0cus | 1cus ... 9cus } |
| Context: | server, AthFarm config |
| Status: | Extension |
| Module: | mod_athena |
See AthExpectUpdate for details.
| Description: | The number seconds to wait for new statistics from a member |
|---|---|
| Syntax: | AthExpectTTL integer, seconds |
| Context: | server, AthFarm config |
| Status: | Extension |
| Module: | mod_athena |
See AthExpectUpdate for details.
| Description: | The number of seconds to wait before re-enabling a member |
|---|---|
| Syntax: | AthExpectRecoverTTL integer, seconds |
| Context: | server, AthFarm config |
| Status: | Extension |
| Module: | mod_athena |
See AthExpectUpdate for details.
| Description: | |
|---|---|
| Syntax: | AthNominationPerUpdate { On | Off } |
| Default: | AthNominationPerUpdate Off |
| Context: | server |
| Status: | Extension |
| Module: | mod_athena |
If you find that you are serving SO MANY requests per second that calculating choices slows you down-- wait that's absurd, just rediculous.
Anyway. Setting this causes the engine to choose a server each time statistics are updated. When a request comes in to update the stats for a physical, the engine looks up each farm it is in and runs the appropriate algorithm for the farm, and stores the result in each farm.
Then, when a reverse proxy request comes in for a farm, it checks the stored value, which will contain the best choice from the latest statistics, and use that. No calculation is performed.
Basically, this switches from per-request to per-update balancing.
| Description: | |
|---|---|
| Syntax: | AthSmartfarmEnable { On | Off } |
| Default: | AthSmartfarmEnable Off |
| Context: | server |
| Status: | Extension |
| Module: | mod_athena |
Enabling this feature causes the engine to inspect requests for the cookie named in AthCookieNameSmartfarm, and to then handle whatever manipulation is requested in it.
| Description: | |
|---|---|
| Syntax: | AthCookieNameSmartfarm cookie name |
| Default: | AthCookieNameSmartfarm X-Ath-Smartfarm |
| Context: | server |
| Status: | Extension |
| Module: | mod_athena |
Sets the name of the cookie that triggers smartfarm handling.
| Description: | Url to forward to when all farm members are down |
|---|---|
| Syntax: | AthAllDownURL full/url |
| Context: | server, AthFarm config |
| Status: | Extension |
| Module: | mod_athena |
When a request goes to a farm in which all members have been marked down
OR offline
this URL will be provided.
If the target farm is itself marked offline
then no member checks are
done and no algorithm is run. The request is immediately returned the
AthOfflineUrl.
This allows you to distinguish between being down
, a condition of
system failure, and being offline
, an administrative status.
The status of down
only applies to a physical member, since that
is what determines system health. The status of offline
applies
to both farms and physicals.
Be aware that if a farm is NOT offline
but all its member
physicals are offline
, then the AthAllDownURL is returned.
This may seem odd, but since the facility to mark the farm itself offline exists
there is no need to complicate mod_athena's code. If this bothers you, you can
always write a script that checks if every member of a farm is marked offline, and
then mark that farm offline.
The ability to mark physicals offline
is provided primarily to
allow for intelligent monitoring. You probably only want to be alerted when a
machine fails unintentionally, eg. down
, not when it's being restarted
or upgraded or under some other non-failure maintenance. The mod_athena script
"ath_monitor.sh" does exactly this-- it will ignore offline
physicals.
| Description: | Url to forward to when all farm members are offline |
|---|---|
| Syntax: | AthOfflineURL full/url |
| Context: | server, AthFarm config |
| Status: | Extension |
| Module: | mod_athena |
| Description: | Sets the initial adminstrative state of physicals (members) |
|---|---|
| Syntax: | AthDefaultPhysOn { On | Off } |
| Default: | AthDefaultPhysOn On |
| Context: | server, AthFarm config |
| Status: | Extension |
| Module: | mod_athena |
If a Member directive does not include its own
On / Off flag, this becomes the initial state set for the physical
as either online
or offline
.
| Description: | Sets the initial adminstrative state of farms |
|---|---|
| Syntax: | AthDefaultFarmOn { On | Off } |
| Default: | AthDefaultFarmOn On |
| Context: | sever config |
| Status: | Extension |
| Module: | mod_athena |
This is the initial state for all farms, either
online
or offline
.
There is no per-farm status setting on start-up provided.
| Description: | Sets the format string for status/phys requests |
|---|---|
| Syntax: | AthDefaultPhysStatusFormat format string |
| Default: | AthDefaultPhysStatusFormat
|
| Context: | server config |
| Status: | Extension |
| Module: | mod_athena |
This is the format used for requests for physical status, when no format is specified. See Runtime management for format codes. In the conf file, these should be single line strings.
| Description: | |
|---|---|
| Syntax: | AthDefaultFarmStatusFormat format string |
| Default: | AthDefaultFarmStatusFormat
|
| Context: | server config |
| Status: | Extension |
| Module: | mod_athena |
This is the format used for requests for farm status, when no format is specified. See Runtime management for format codes. In the conf file, these should be single line strings.
| Description: | |
|---|---|
| Syntax: | AthDefaultEngineStatusFormat format string |
| Default: | AthDefaultEngineStatusFormat
|
| Context: | server config |
| Status: | Extension |
| Module: | mod_athena |
This is the format used for requests for engine status, when no format is specified. See Runtime management for format codes. In the conf file, these should be single line strings.


Implementation¶
Top-level launchers¶
Ok, so this is a toolbox but the pieces are not entirely trivial to put together. Therefore, the following list of launcher commands exist.
-
pylauncher3.
ClassicLauncher
(commandfile, *args, **kwargs)[source]¶ A LauncherJob for a file of single or multi-threaded commands.
The following values are specified for your convenience:
hostpool : based on HostListByName
commandexecutor : SSHExecutor
taskgenerator : based on the
commandfile
argumentcompletion : based on a directory
pylauncher_tmp
with jobid environment variables attached
- Parameters
commandfile – name of file with commandlines (required)
resume – if 1,yes interpret the commandfile as a queuestate file
cores – number of cores (keyword, optional, default=1)
workdir – (keyword, optional, default=pylauncher_tmp_jobid) directory for output and temporary files; the launcher refuses to reuse an already existing directory
debug – debug types string (optional, keyword)
-
pylauncher3.
LocalLauncher
(commandfile, nhosts, *args, **kwargs)[source]¶ A LauncherJob for a file of single or multi-threaded commands, running locally
The following values are specified for your convenience:
hostpool : based on HostListByName
commandexecutor : SSHExecutor
taskgenerator : based on the
commandfile
argumentcompletion : based on a directory
pylauncher_tmp
with jobid environment variables attached
- Parameters
commandfile – name of file with commandlines (required)
resume – if 1,yes interpret the commandfile as a queuestate file
cores – number of cores (keyword, optional, default=1)
workdir – (keyword, optional, default=pylauncher_tmp_jobid) directory for output and temporary files; the launcher refuses to reuse an already existing directory
debug – debug types string (optional, keyword)
-
pylauncher3.
MPILauncher
(commandfile, **kwargs)[source]¶ A LauncherJob for a file of small MPI jobs, for a system not using Ibrun
The following values are specified using other functions.
hostpool : determined via HostListByName
commandexecutor : MPIExecutor
taskgenerator : based on the
commandfile
argumentcomplete : based on a diretory
pylauncher_tmp
with jobid environment variables attached
- Parameters
commandfile – name of files with commandlines (required)
cores – number of cores (keyword, optional, default=4, see
FileCommandlineGenerator
for more explanation)workdir – directory for output and temporary files (optional, keyword, default uses the job number); the launcher refuses to resuse an already existing directory
debug – debug types string (optional, keyword)
hfswitch – Switch used to determine the hostifle switch used with your MPI distribution. Default is -machinefile (optional,keyword)
-
pylauncher3.
RemoteLauncher
(commandfile, hostlist, **kwargs)[source]¶ A LauncherJob for a file of single or multi-thread commands, executed remotely.
The following values are specified for your convenience:
commandexecutor : IbrunExecutor
taskgenerator : based on the
commandfile
argumentcompletion : based on a directory
pylauncher_tmp
with jobid environment variables attached
- Parameters
commandfile – name of file with commandlines (required)
:param hostlist : list of hostnames :param cores: number of cores (keyword, optional, default=4, see
FileCommandlineGenerator
for more explanation) :param workdir: directory for output and temporary files (optional, keyword, default uses the job number); the launcher refuses to reuse an already existing directory :param debug: debug types string (optional, keyword)
-
class
pylauncher3.
DynamicLauncher
(**kwargs)[source]¶ A LauncherJob derived class that is designed for dynamic adding of commands. This should make it easier to integrate in environments that expect to “submit” jobs one at a time.
This has two extra methods: * append(commandline) : add commandline to the internal queueu * none_waiting() : check that all commands are either running or finished
Optional parameters have a default value that makes it behave like the ClassicLauncher.
- Parameters
hostpool – (optional) by default based on HostListByName())
:
Commandline generation¶
The term ‘commandline’ has a technical meaning: a commandline is a two-element list or a tuple where the first member is the Unix command and the second is a core count. These commandline tuples are generated by a couple of types of generators.
The CommandlineGenerator
base class handles the
basics of generating commandlines.
Most of the time you will use the derived class FileCommandlineGenerator
which
turns a file of Unix commands into commandlines.
Most of the time a commandline generator will run until some supply of
commands run out. However,
the DynamicCommandlineGenerator
class runs forever,
or at least until you tell it to stop, so it is good for
lists that are dynamically replenished.
-
class
pylauncher3.
CommandlineGenerator
(**kwargs)[source]¶ An iteratable class that generates a stream of
Commandline
objects.The behaviour of the generator depends on the
nmax
parameter:nmax is None: exhaust the original list
nmax > 0: keep popping until the count is reached; if the initial list is shorter, someone will have to fill it, which this class is not capable of
nmax == 0 : iterate indefinitely, wait for someone to call the
finish
method
In the second and third scenario it can be the case that the list is empty. In that case, the generator will yield a COMMAND that is
stall
.- Parameters
list – (keyword, default [] ) initial list of Commandline objects
nax – (keyword, default None) see above for explanation
-
class
pylauncher3.
CommandlineGenerator
(**kwargs)[source]¶ An iteratable class that generates a stream of
Commandline
objects.The behaviour of the generator depends on the
nmax
parameter:nmax is None: exhaust the original list
nmax > 0: keep popping until the count is reached; if the initial list is shorter, someone will have to fill it, which this class is not capable of
nmax == 0 : iterate indefinitely, wait for someone to call the
finish
method
In the second and third scenario it can be the case that the list is empty. In that case, the generator will yield a COMMAND that is
stall
.- Parameters
list – (keyword, default [] ) initial list of Commandline objects
nax – (keyword, default None) see above for explanation
-
class
pylauncher3.
FileCommandlineGenerator
(filename, **kwargs)[source]¶ Bases:
pylauncher3.CommandlineGenerator
A generator for commandline files: blank lines and lines starting with the comment character ‘#’ are ignored
cores is 1 by default, other constants allowed.
cores==’file’ means the file has << count,command >> lines
if the file has core counts, but you don’t specify the ‘file’ value, they are ignored.
- Parameters
filename – (required) name of the file with commandlines
cores – (keyword, default 1) core count to be used for all commands
dependencies – (keyword, default False) are there task dependencies?
-
class
pylauncher3.
DynamicCommandlineGenerator
(**kwargs)[source]¶ Bases:
pylauncher3.CommandlineGenerator
A CommandlineGenerator with an extra method:
append
: add a Commandline object to the listThe ‘nmax=0’ parameter value makes the generator keep expecting new stuff.
-
class
pylauncher3.
DirectoryCommandlineGenerator
(command_directory, commandfile_root, **kwargs)[source]¶ Bases:
pylauncher3.DynamicCommandlineGenerator
A CommandlineGenerator object based on finding files in a directory.
- Parameters
command_directory – (directory name, required) directory where commandlines are found; unlike launcher job work directories, this can be reused.
commandfile_root – (string, required) only files that start with this, followed by a dash, are inspected for commands. A file can contain more than one command.
cores – (keyword, optional, default 1) core count for the commandlines.
-
next
()[source]¶ List the directory and iterate over the commandfiles:
ignore any open files, which are presumably still being written
if they are marked as scheduled, ignore
if there is a file
finish-nnn
, mark job nnn as finishedif they are not yet scheduled, call
append
with aCommandline
object
If the finish name is present, and all scheduled jobs are finished, finish the generator.
Host management¶
We have an abstract concept of a node, which is a slot for a job. Host pools are the management structure for these nodes: you can query a host pool for sufficient nodes to run a multiprocess job.
A host pool has associated with it an executor object, which represents the way tasks (see below) are started on nodes in that pool. Executors are also discussed below.
-
class
pylauncher3.
Node
(host=None, core=None, nodeid=- 1, phys_core='0-0')[source]¶ A abstract object for a slot to execute a job. Most of the time this will correspond to a core.
A node can have a task associated with it or be free.
-
class
pylauncher3.
HostList
(hostlist=[], tag='', **kwargs)[source]¶ Object describing a list of hosts. Each host is a dictionary with a
host
andcore
andphys_core
field.Arguments:
list : list of hostname strings
tag : something like
.tacc.utexas.edu
may be necessary to ssh to hosts in the list
This is an iteratable object; it yields the host/core dictionary objects.
-
class
pylauncher3.
HostPoolBase
(**kwargs)[source]¶ A base class that defines some methods and sets up the basic data structures.
- Parameters
commandexecutor – (keyword, optional, default=``LocalExecutor``) the
Executor
object for this host poolworkdir – (keyword, optional) the workdir for the command executor
debug – (keyword, optional) a string of debug types; if this contains ‘host’, anything derived from
HostPoolBase
will do a debug trace
-
append_node
(host='localhost', core=0, phys_core='0-0')[source]¶ Create a new item in this pool by specifying either a Node object or a hostname plus core number. This function is called in a loop when a
HostPool
is created from aHostList
object.
-
class
pylauncher3.
 The main internal object is the
nodes
member, which is a list of Node objects.- Parameters
nhosts – the number of slots in the pool; this will use the localhost
hostlist – HostList object; this takes preference over the previous option
commandexecutor – (optional) a prefixer routine, by default LocalExecutor
-
class
pylauncher3.
HostLocator
(pool=None, extent=None, offset=None)[source]¶ Bases:
object
A description of a subset from a HostPool. A locator object is typically created when a task asks for a set of nodes from a HostPool. Thus, a locator inherits the executor from the host pool from which it is taken.
The only locator objects allowed at the moment are consecutive subsets.
- Parameters
pool – HostPool (optional)
extent – number of nodes requested
offset – location of the first node in the pool
-
class
pylauncher3.
DefaultHostPool
(**kwargs)[source]¶ Bases:
pylauncher3.HostPool
A HostPool object based on the hosts obtained from the
HostListByName
function, and using theSSHExecutor
function.
Task management¶
Tasks are generated internally from a TaskGenerator
object that
the user can specify. The TaskQueue
object is created internally
in a LauncherJob
. For the completion
argument of the TaskGenerator
,
see below.
-
class
pylauncher3.
Task
(command, **kwargs)[source]¶ A Task is an abstract object associated with a commandline
- Parameters
command – (required) Commandline object; note that this contains the core count
completion – (keyword, optional) Completion object; if unspecified the trivial completion is used.
taskid – (keyword) identifying number of this task; has to be unique in a job, also has to be equal to the taskid of the completion
debug – (keyword, optional) string of debug keywords
-
start_on_nodes
(**kwargs)[source]¶ Start the task.
- Parameters
pool – HostLocator object (keyword, required) : this describes the nodes on which to start the task
commandexecutor – (keyword, optional) prefixer routine, by default the commandexecutor of the pool is used
This sets
self.startime
to right before the execution begins. We do not keep track of the endtime, but instead setself.runningtime
in thehasCompleted
routine.
-
class
pylauncher3.
TaskQueue
(**kwargs)[source]¶ Object that does the maintains a list of Task objects. This is internally created inside a
LauncherJob
object.-
final_report
(runningtime)[source]¶ Return a string describing the max and average runtime for each task.
-
find_recently_aborted
(abort_test)[source]¶ Find the first recently aborted task. Note the return, not yield.
-
-
class
pylauncher3.
TaskGenerator
(commandlines, **kwargs)[source]¶ iterator class that can yield the following:
a Task instance, or
the keyword
stall
; this indicates that the commandline generator is stalling and this will be resolved when the outer environment does anappend
on the commandline generator.the
pylauncherBarrierString
; in this case the outer environment should not call the generator until all currently running tasks have concluded.the keyword
stop
; this means that the commandline generator is exhausted. Thenext
function can be called repeatedly on a stopped generator.
You can iterate over an instance, or call the
next
method. Thenext
method can accept an imposed taskcount number.- Parameters
commandlinegenerator – either a list of unix commands, or a CommandlineGenerator object
completion – (optional) a function of one variable (the task id) that returns Completion objects
debug – (optional) string of requested debug modes
skip – (optional) list of tasks to skip, this is for restarted jobs
-
pylauncher3.
TaskGeneratorIterate
(gen)[source]¶ In case you want to iterate over a TaskGenerator, use this generator routine
Executors¶
At some point a task needs to be executed. It does that by applying the execute
method of the Executor
object of the HostPool
. (The thinking
behind attaching the execution to a host pool is that
different hostpools have different execution mechanisms.)
Executing a task takes a commandline and a host locator on which to execute it;
different classes derived from Executor
correspond to different spawning
mechanisms.
-
class
pylauncher3.
Executor
(**kwargs)[source]¶ Class for starting a commandline on some actual computing device.
All derived classes need to define a
execute
method.- Parameters
catch_output – (keyword, optional, default=True) state whether command output gets caught, or just goes to stdout
workdir – (optional, default=”pylauncher_tmpdir_exec”) directory for exec and out files
debug – (optional) string of debug modes; include “exec” to trace this class
- Parame numa_ctl
(optional) numa binding. Only supported “core” for SSH executor.
Important note: the
workdir
should not already exist. You have to remove it yourself.
-
class
pylauncher3.
LocalExecutor
(**kwargs)[source]¶ Bases:
pylauncher3.Executor
Execute a commandline locally, in the background.
- Parameters
prefix – (keyword, optional, default null string) for recalcitrant shells, the possibility to specify ‘/bin/sh’ or so
-
class
pylauncher3.
SSHExecutor
(**kwargs)[source]¶ Bases:
pylauncher3.Executor
Intelligent ssh connection.
This is either a new paramiko ssh connection or a copy of an existing one, so that we don’t open multiple connections to one node.
Commands are executed with:
cd
to the current directory, and copy the current environment.Note: environment variables with a space, semicolon, or parentheses are not transferred.
For parameters, see the Executor class.
-
class
pylauncher3.
IbrunExecutor
(**kwargs)[source]¶ Bases:
pylauncher3.Executor
An Executor derived class for the shift/offset version of ibrun that is in use at TACC
- Parameters
pool – (required)
HostLocator
objectstdout – (optional) a file that is open for writing; by default
subprocess.PIPE
is used
Task Completion¶
Task management is largely done internally. The one aspect that a user could customize is that of the completion mechanism: by default each commandline that gets executed leaves a zero size file behind that is branded with the task number. The TaskQueue object uses that to detect that a task is finished, and therefore that its Node objects can be released.
-
class
pylauncher3.
Completion
(taskid=0)[source]¶ Define a completion object for a task.
The base class doesn’t do a lot: it immediately returns true on the completion test.
-
class
pylauncher3.
FileCompletion
(**kwargs)[source]¶ Bases:
pylauncher3.Completion
FileCompletion is the most common type of completion. It appends to a command the creation of a zero size file with a unique name. The completion test then tests for the existence of that file.
- Parameters
taskid – (keyword, required) this has to be unique. Unfortunately we can not test for that.
stampdir – (keyword, optional, default is self.stampdir, which is “.”) directory where the stampfile is left
stamproot – (keyword, optional, default is “expire”) root of the stampfile name
Task generators need completions dynamically generated since they need to receive a job id. You could for instance specify code such as the following; see the example launchers.
completion=lambda x:FileCompletion( taskid=x,
stamproot="expire",stampdir="workdir")
Jobs¶
All of the above components are pulled together in the LauncherJob class. Writing your own launcher this way is fairly easy; see the TACC section for some examples of launchers.
-
class
pylauncher3.
LauncherJob
(**kwargs)[source]¶ LauncherJob class. Keyword arguments:
- Parameters
hostpool – a HostPool instance (required)
taskgenerator – a TaskGenerator instance (required)
delay – between task checks (optional)
debug – list of keywords (optional)
gather_output – (keyword, optional, default None) filename to gather all command output
maxruntime – (keyword, optional, default zero) if nonzero, maximum running time in seconds
-
tick
()[source]¶ This routine does a single time step in a launcher’s life, and reports back to the user. Specifically:
It tries to start any currently queued jobs. Also:
If any jobs are finished, it detects exactly one, and reports its ID to the user in a message
expired 123
If there are no finished jobs, it invokes the task generator; this can result in a new task and the return message is
continuing
if the generator stalls, that is, more tasks will come in the future but none are available now, the message is
stalling
if the generator is finished and all jobs have finished, the message is
finished
After invoking the task generator, a short sleep is inserted (see the
delay
parameter)


Userbase is the easiest way to add user accounts and data persistence to your static site. All Userbase features are accessible through a very simple JavaScript SDK, directly from the browser. No backend necessary.
See the Pen Userbase Getting Started by Userbase (@userbase) on CodePen.
Userbase takes care of your user accounts. The Userbase SDK lets you sign up, login, and logout users directly from your static site.
Instead of sending database queries to a server, Userbase sends the user's data to the browser. Queries happen client-side, and there is nothing on the backend to manage or worry about.
Userbase encrypts all database operations in the browser with user-controlled keys. This helps you prevent personal data misuse, and lets you offer a high level of data privacy.
Userbase is 100% open source, MIT licensed. You can host it yourself always under your control, or we can run it for you for a full serverless experience.
If you're building a web app, you will likely need a database and a backend. Userbase can replace both...
Check out the FAQ for more details.
The easiest way to get started is to create a free admin account and follow our Quickstart guide. If you have any questions, or if there's anything we can do to help you, please get in touch. Thank you for all your support and interest in this project!


Rush Hour (1998) Jackie Chan, Chris Tucker, Tom Wilkinson, Elizabeth Pena, Philip Baker Hall, Mark Rolston, Tzi Ma, Rex Linn, Ken Leung, Chris Penn, Julia Hsu. Screenplay by Jim Kouf and Ross LaManna. Produced by Roger Birnbaum, Jonathan Glickman and Arthur M. Sarkissian. Directed by Brett Ratner. 96 minutes Rated PG-13, 3.5 stars (out of five stars)
Review by Ed Johnson-Ott, NUVO Newsweekly www.nuvo-online.com Archive reviews at http://us.imdb.com/M/reviews_by?Edward+Johnson-ott To receive reviews by e-mail at no charge, send subscription requests to<EMAIL_ADDRESS>Jackie Chan is one of the biggest movie stars on Earth, except in the United States, where he has only a fiercely devoted cult following. Determined to achieve the mass-market success that offerings like "Rumble in the Bronx" and "Mr. Nice Guy" failed to provide, the 44-year-old Hong Kong native put himself completely in the hands of Hollywood for his latest shot at becoming an American superstar. "It's not for the money. It's for the face," he said in an Associated Press interview. "You know Chinese, always face."
His current efforts to save face include fighting less and allowing himself to be plugged into the formulaic mismatched-cop action/comedy "Rush Hour." "Now, if it doesn't work," said Chan, "that means American audience do not accept my kind of action, or my kind of personality, or me."
Luckily for Chan, it works. "Rush Hour" is a lot of fun, thanks to flashy action scenes, sharp one-liners and the chemistry between Chan and motormouth comedian Chris Tucker. Sure, it's just another cookie-cutter cop flick, but this particular cookie tastes pretty good.
Like "Lethal Weapon 4," "Rush Hour" uses the cop movie format merely as an excuse to showcase its stars and pyrotechnics. "Every so often we have to let the general public know that we can still blow shit up," says one cop, perfectly voicing the mind-set of most Hollywood producers. Unlike "Lethal Weapon 4," "Rush Hour" has a plot which, while not particularly original, is at least coherent.
The story begins on the eve of the historic 1997 transfer of Hong Kong back to the Chinese (it's a miracle the filmmakers didn't trip over the electrical cables of other movie crews, since both "Knock Off" and "The Chinese Box" are also set in the same city on the same day). Detective Inspector Lee (Chan) raids the lair of a legendary crime lord, recovering a huge cache of stolen artwork.
Cut to Los Angeles, where LAPD Detective James Carter (Tucker) annoys every officer within a ten mile radius with his reckless techniques and non-stop babbling. When the Chinese consul flies in Lee to assist in the search for his kidnapped daughter, the FBI asks the LAPD to provide a cop to ''baby-sit'' Lee so that he doesn't hinder their investigation. Carter's chief happily assigns him to the task and, quicker than you can say "movie cliché," a maverick mismatched cop team is born.
But it works, because Chris Tucker and Jackie Chan really click together. Tucker slightly tones down his hyperactive, helium-voiced, in-your-face chatter, making his character humorously abrasive rather than insufferable. He's actually quite fun to watch as he talks his way in and out of trouble, periodically breaking into a bizarre urban-Egyptian form of dance and using leering effeminate movements to challenge other males. I have no idea how Tucker developed his alien-on-amphetamines shtick, but he's certainly one of a kind.
The wonderful Jackie Chan, a martial arts hybrid of Buster Keaton and Gene Kelly, is the absolute master of ingenious escapes, and he displays some of his remarkably adroit artistry here, scrambling up walls and trees, skittering across a very high beam, disarming bad guys and tumbling from great heights in dazzling style. He has less stunts than usual, but remains a wonder to behold. As always, his physical gifts are complimented by his comedic skills and geniality. Chan is one of the most likable performers in the business and it's a pleasure spending time with him.
 Personally, I found a number of Carter's Asian one-liners to be borderline racist, but if Jackie Chan didn't find the jokes offensive, I suppose I can be a good sport about it as well.
With its tired premise, superfluous supporting cast, cheesy dramatic moments and painfully obvious plot twists, "Rush Hour" should have been just another buddy cop throwaway, but instead the film is light, fast, breezy fun. It just goes to show that the right stars can make even the most pedestrian material shine. If this film doesn't finally make Jackie Chan a major star in the United States, blame the American public, because Chan is certainly delivering the goods.
© 1998 Ed Johnson-Ott
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


×
Otter Spotter
×
video_library
Otter Spotter Photos
comment
Comments and Stories
This is where comments and stories may go!
Otter Spotter Submissions
☰ Menu


Binospec has acquisition and calibration overheads that add up to nominally 30 minutes per spectroscopic target (often a bit less in practice). This makes it less efficient at acquiring spectra of large numbers of single bright objects needing eg 10-15 minute exposures, or at survey tiling fields of a degree scale or more.
Additionally, the catalog software breaks requested observations into observing blocks of at most 2 hours exposure time, for scheduling practicality. This means that for example, if you assign a lot of targets each 2.5 hours of exposure time, your program will look inefficient. You could, for example, give some of them 2 hours and some of them 3 hours, and lose less to overhead. In practice, if we do manage to integrate for over 2 hours consecutively on a target, your program would only be charged for one acquisition.
Exposures shorter than 60 sec or so are inefficient due to readout and only recommended for bright objects like standard stars. If you are doing a long time series like a planetary transit, 120 sec has been used in the past.
Add your standard stars as priority 3 so the queue scheduler doesn't
try to schedule them as normal observations. You must update
standard star coordinates to the current epoch using Gaia. Many
standard stars are white dwarfs with high proper motions, and many
popular lists of standards are horribly out of date. For more
information see the MMT
spectro standards page.
The Binospec pipeline doesn't reduce imaging data, so you should
download the raw *proc.fits data, and reduce those with IRAF, ccdproc,
or any other typical method for reducing imaging. Note that the
imaging internal flatfields will show in your catalog as type "comp"
and sometimes are filed under a different object in your catalog than
the nighttime science data.
Spectrophotometric standards for current or past observations
We frequently take standard stars during a run as general observatory
calibrations. These are most commonly in the G270/6500 setting but
others can be done. These observations are taken in an observatory
(director's time) catalog, not charged to an individual program. So
they don't appear in your catalog, but we can give individual PIs
access to the data. If you need standard star data, contact Ben Weiner
and specify the grating, central wavelength, and date. We don't have
data in all settings from all runs but the throughput is generally
stable. Pseudo-IFU mode
It's possible to build up an integral-field-like spatially resolved
spectrum by taking a series of exposures stepping the longslit (or
slitmask) in the perpendicular to slit direction. This step is
controlled by the observer in instrument coordinates, so you need to
specify the step size across the slit, not in compass directions. For
example, say "use PA=45 and step by 2 arcsec perpendicular to the
slit, doing 5 positions at -4, -2, 0, +2, +4 arcsec." Don't say "use
PA=45 and do 5 positions stepping by 2.8 arcsec north." Afternoon "sky" flats for spectroscopy
Sky flats aren't part of the normal Binospec reduction
process. However, some programs that need very good knowledge of the
instrumental profile can benefit from afternoon spectroscopic flats
using the solar spectrum. These are used to measure the instrumental
profile by comparison with model spectra. You probably don't need
these unless you are measuring velocity dispersions or doing precision
radial velocity work. They are time-consuming to take and require
coordination between TO and queue observer, so please contact your MMT
instrument scientist if you think you might need them. Avoiding rotator limits for slitmasks
The instrument rotator has limits near +180/-180 degrees. These can
prevent observing slitmasks at certain PAs and certain times. In
practice, the limits mean that to avoid hitting the limit at transit,
for masks that are north of the MMT (Dec > +33), you should avoid
designing masks with position angles near 0, and for masks south of
the MMT (Dec < +33), you should avoid PAs near +180 or -180. Imaging
Imaging exposure lengths
Individual direct imaging exposures should be kept pretty short,
especially if you are working in a field with a lot of stars (lower
Galactic latitude) or near the peak of detector sensitivity (r or i
band). If so, direct imaging exposures should be no more than 60
seconds, or you will saturate a lot of stars. Probably in all fields
and filters, imaging exposures should be less than about 240-300
seconds. Saturated stars cause persistence problems that can damage
data on faint targets taken after your field. Imaging flatfields
Flatfields for imaging are taken in the afternoon with an internal
lamp, and we have to use one of the arc comparison lamps because the
spectroscopic continuum lamp is too bright. This means that imaging
flatfields will show up in your raw data package with image type
'comp'. Flatfields can be shared between targets, so you might get a
notification about data being available for a target, even though only
the afternoon flats have been taken so far. Imaging dithers
It's not currently possible to make really large dithers while imaging
because the guide stars would go off the subarray (region of interest)
of the guide cameras. The detectors are pretty clean so modest
dithers should take care of most detector artifacts. Data products
Raw and reduced data
Raw data will typically show up in your catalog the next morning,
copied over around 9 am MST. These include *.fits and *proc.fits files
- the proc files have been overscan and bias subtracted and trimmed.
Spectroscopic data can be reduced by the Binospec IDL pipeline. SAO
staff will reduce the data when time is available. The data package
also includes a file with an auto-generated reduction script, so you
can download the pipeline and try reducing the raw data
yourself. Several of our users have reduced the longslit data with the
conventional IRAF cookbook workflow (Massey et al) that they've used
for other longslit instruments. How do I look at the data?
The reduced data files include a 2-D FITS image that has 1-d spectra,
one per row; and a FITS file with many extensions, each the 2-d
spectrum of one slit. See a description at the Binospec
pipeline repository wiki. To inspect spectra and fit redshifts,
you can try the Specpro software in the version adapted for Binospec,
see the Using Specpro to inspect
Binospec data page.
Taking spectra of a non-sidereal target will be more involved because acquiring it onto the slit will not use the RA/Dec and Gaia stars. If you plan to do such an observation, please get in touch with MMT staff so we can coordinate with the Binospec instrument team.


Operation
Add
Edit
Rename
Delete
ID
New ID
Nickname
Race
None
Protoss
Terran
Zerg
Max Viewers
left.json
right.json


Module nix::sys::ioctl
[−]
[src]
Provide helpers for making ioctl system calls
Overview of IOCTLs
The ioctl
system call is a widely support system
call on *nix systems providing access to functions
and data that do not fit nicely into the standard
read and write operations on a file itself. It is
common to see ioctls used for the following purposes:
- Provide read/write access to out-of-band data related to a device such as configuration (for instance, setting serial port options)
- Provide a mechanism for performing full-duplex data transfers (for instance, xfer on SPI devices).
- Provide access to control functions on a device (for example, on Linux you can send commands like pause, resume, and eject to the CDROM device.
- Do whatever else the device driver creator thought made most sense.
Ioctls are synchronous system calls and are similar to read and write calls in that regard.
The prototype for the ioctl system call in libc is as follows:
int ioctl(int fd, unsigned long request, ...);
Typically, an ioctl takes 3 parameters as arguments:
- An open file descriptor,
fd
. - An device-dependennt request code or operation. This request
code is referred to as
op
in this module. - Either a pointer to a location in memory or an integer. This number of pointer may either be used by the kernel or written to by the kernel depending on how the operation is documented to work.
The op
request code is essentially an arbitrary integer having
a device-driver specific meaning. Over time, it proved difficult
for various driver implementors to use this field sanely, so a
convention with macros was introduced to the Linux Kernel that
is used by most newer drivers. See
https://github.com/torvalds/linux/blob/master/Documentation/ioctl/ioctl-number.txt
for additional details. The macros exposed by the kernel for
consumers are implemented in this module and may be used to
instead of calls like _IOC
, _IO
, _IOR
, and _IOW
.
Interface Overview
This ioctl module seeks to tame the ioctl beast by providing a set of safer (although not safe) functions implementing the most common ioctl access patterns.
The most common access patterns for ioctls are as follows:
read
: A pointer is provided to the kernel which is populated with a value containing the "result" of the operation. The result may be an integer or structure. The kernel may also read values from the provided pointer (usually a structure).write
: A pointer is provided to the kernel containing values that the kernel will read in order to perform the operation.execute
: The operation is passed to the kernel but no additional pointer is passed. The operation is enough and it either succeeds or results in an error.
Where appropriate, versions of these interface function are provided taking either refernces or pointers. The pointer versions are necessary for cases (notably slices) where a reference cannot be generically cast to a pointer.
Structs
| IoctlDirFlags |
Constants
| IOC_NONE |
Indicates that the ioctl data pointer is not used |
| IOC_READ |
Indicates tha the ioctl data pointer contains data that will be populated by the operating system to be consumed by userspace |
| IOC_WRITE |
Indicates that the ioctl data pointer contains data that will be consumed by the operating system |
Functions
| execute |
Ioctl call for which no data pointer is provided to the kernel. That is, the kernel has sufficient information about what to do based on the op alone. |
| op |
Build an ioctl op with the provide parameters. This is a helper function for IOCTLs in the Linux kernel using the newer conventions for IOCTLs operations. Many ioctls do not use this newer convention and the constants for those should just be used as-is. |
| op_none |
Build an op indicating that the data pointer is not used. That is, the command itself is sufficient. |
| op_read |
Build an op indicating that the data pointer will be populated with data from the kernel |
| op_read_write |
Build an op indicating that the data pointer both contains data to be consumed by the kernel and contains fields that will be populated by the kernel. |
| op_write |
Build an op indicating that the data pointer contains data to be consumed by the kernel (and not written to). |
| read |
Ioctl call that is expected to return a result but which does not take any additional arguments on the input side |
| read_into |
Ioctl where the result from the kernel will be written to the provided reference |
| read_into_ptr |
Ioctl where the result from the kernel will be written to the provided pointer |
| write |
Ioctl call that sends a value to the kernel but does not return anything (pure side effect). |
| write_ptr |
Ioctl call that sends a value to the kernel but does not return anything (pure side effect). |
Type Definitions
| ioctl_op_t |


Mark Druffel
-<EMAIL_ADDRESS>- www.mark-druffel.com
- Portland, OR
Data science generalist and experienced team builder with a track record of success working with all levels of the organization. Business background with significant development experience in R, SQL, & others, as well as an exceptional ability to communicate complex concepts to a wide range of audiences. Always seeking opportunities to innovate or use new technologies while keeping user experience and business problems front and center.
Work Experience
Consultant
Partner with clients to help them execute strategic initiatives and large-scale organizational efforts. Typical engagement includes working with the client to develop a vision and structure for the team, as well as an implementation plan . Execute in any of the following roles for client teams:
- Analytics: Data Analyst, Data Scientist
- Engineering: Dashboard Developer, Data Engineer
- Strategy: Business Analyst, Data Strategist
- Program: Change Manager, Project Manager
Manager of Reporting
Managed a global team of analysts responsible for data and access products for the platform. Our team managed operations for active clients, implementations for new clients, and product ownership for our services. Core responsibilities:
- Designed, tested, and maintained client & internal reporting
- Performed requirements gathering, design, testing, and deployment of app & data-model development
- Developed product visions and managed the backlogs
- Performed product data analytics to inform product ownership
- Developed prototype tools in collaboration with development teams
- Configured services for new clients
- Managed permissions frameworks for the various client types
Senior Consultant
Managed IT audits and risk assessments with teams of staff auditors. Primarily performed SOC audits and readiness assessments.
Staff Auditor
Executed financial and IT audits, as well as risk assessments within several departments of the bank.
Projects
Product Data Information Architecture Alignment
Developed a data strategy to resolve architecture & process design issues between multiple business units. Conducted ~250 stakeholder interviews to understand and document existing processes & data models. Determined that one customer-facing data entity was used by dozens of business units to accomplish opposing objectives. Corroborated the findings by analyzing product data across the systems used by the business units. Gathered use cases to and built storyboards to illustrate the problem statement with the example products. Leveraged domain driven design to develop an architectural proposal that would enable the business units to manage their data separately, but still maintain the necessary level of collaboration across the business units.
Organizational Metric Design & Implementation
Designed and implemented organization metrics for an IT DevOps organization. Interviewed IT teams and analyzed data to provide a readiness assessment and proposed data collection processes that would enable more insightful KPIs. Management launched a small program in response to the assessment in order to improve data quality. Developed an MVP API that integrated disparate systems data in order to enable manage to leverage alternative metrics in the short-term. developed interactive dashboards. Trained the teams and leadership their KPIs for discussion. Documented the process and facilitated training for an operational team to take ownership of the project.
Legacy BI Product Analysis
Informed budget and development prioritization by analyzing and communicating findings regarding technical and process debt associated with the legacy reporting platform. Developed stored procedures that normalized and persisted log & configuration data from the reporting platform and tracked resourcing data across various projects throughout the year. Used the data collected to outline system inefficiencies, workflow inefficiencies, process risks, and low ROI client commitments. The report led to the Executive Leadership team funding a new development team to build a next generation reporting application.
Data Pipeline Development
Developed a data pipepline to ETL data from cloud software into a multi-layered data lake using several AWS services, R, Python, & Apache-Airflow.
harvestR
Developed an open source API wrapper for the time tracking software, Harvest. Built to enable dynamic reporting to be built directly off of the system and to simplify extracting data to the data lake.


The Wisdom of Leonard Lauder
Leonard Lauder was honored at the annual Lincoln Center Corporate Fund gala, thrown by Harper's Bazaar.
by Leigh Nordstrom“You look amazing,” a refined, older gentleman said to his date Monday evening from inside Alice Tully Hall at Lincoln Center.
“Only because of Lauder do I look this way,” she retorted.
The Lauder love was in strong showing for the annual Lincoln Center Corporate Fund gala, this year honoring Leonard Lauder.
Now in its seventh year, the evening drew Estée Lauder faces like Elizabeth Hurley, Carolyn Murphy, Karlie Kloss and Hilary Rhoda, as well as much of the extended Lauder family.
Hurley and the evening’s moderator, Tom Ford, were escorted to a private room promptly upon arrival. Brooke Shields gingerly navigated the staircase down to the red carpet, in a tight navy velvet dress. Inside she made her way about, greeting the Lauders one by one.
James Turlington, quickly becoming one of the New York party circuit’s most ubiquitous faces, caught the attention of the cameras alongside a friend.
“He’s the star,” the friend said, ducking out of the way.
Candace Bushnell was in good spirits, and said her secret to navigating the chaos of the holiday social season was to simply enjoy it.
“I’m actually excited about it. It’s the one time of year to go out,” she said. “I just bought something that has some green in it. So yes, I am into festive dressing. I have some things lined up.”
Inside the theater, Lauder was welcomed by onstage appearances by Hurley, Tommy Hilfiger, Glenda Bailey and Hearst’s Steven Swartz.
Hurley told the crowd of the first time she met Lauder: when, at 29 years old, she was asked to come to New York to audition to be the new face of Estée Lauder. It would be her first modeling job.
“When I saw you, I could see at once that you had three qualities that I admired more than any other: I could see that you are wise, you are honest, and you are kind,” she said. “You are quite simply cut from a cloth that has long been discontinued.”
Prior to a performance by Jennifer Hudson (who squeezed in a shout-out promo for her upcoming role in “Cats,” in addition to singing a trio of songs), Lauder and Ford sat in conversation, ranging from lessons he learned from Estée (“Yes mother”), why he thinks a decision should never be made without a woman at the table (“A woman will always tell you what’s on her mind, not what you want to hear”), the importance of a “little blue note” and why he believes in the power of print: “does digital have content? Hardly. Do magazines have content? Yes.”


Professors love having students in their classes who are there to actively learn, participate, and
demonstrate their commitment to learning. And then there are certain behaviors best avoided by students
in college. These behaviors drive faculty crazy and will lead to you being seen as less than the ideal
student. Some of these activities are disrespectful to the professor -- as well as to your fellow students.
Pet Peeves
What are things to avoid? Here's one list:
- Failing to come to class regularly
- Arriving to class late (and especially making a big entrance), and worse, making a habit of it
- Shuffling papers, putting books away, and other "end-of-class" behaviors before the professor has ended class
- Questioning whether some of the homework for the class is just "busy work"
- Asking if "we're doing anything important in class" when informing the professor that you may have to miss a class
- Asking about what is happening in class when it is clearly marked on the syllabus
- Allowing your cell phone to ring in class
- Text messaging while in class
- Holding a private discussion with someone during class
- Asking inane or off-topic questions
- Eating a meal in class
- Telling the professor you went to his/her office for help, but that he/she is never there
- Claiming you did not know an exercise was due, that there was a test, or any other class work that is clearly identified on the class calendar
- Telling the professor you deserve a break because of who you are
- Not completing the assigned reading before class
- Going to the restroom in the middle of class (unless it's an emergency)
- Sleeping during class
- Complaining about the workload in class, stating "you know, this isn't the only class I'm taking"
- Wearing inappropriate clothing (or the lack of it) to class
- Asking to "borrow" a stapler to staple a homework assignment for the class. (Would you ask your boss for a stapler to staple a report?)
- Turning in assignments that do not follow the class procedure (and every professor has different guidelines; know them!)
- Making excuses for missed exams, class assignments. (Especially don't use the time-worn dead grandparent excuse, or that you have to pick someone up at the airport)
Positive Behaviors
Here are the things college professors love:
- Students who take responsibility for their education
- Students who have read the assigned reading and actively participate in class discussion
- Students who complete all assigned work on time
- Students who sit toward the front of the classroom
- Students who visit professors during office hours
- Students who do not make excuses
- Students who ask for help more than a day before a test or an assignment due date
Source: www.quintcareers.com
|


HOLLYWOOD'S HOT METER: Kylie Jenner Or Sofia Richie; Divas In Sultry Monokinis
by Lubna KhanJust in case you were looking for some inspiration to rock a swimsuit on your next beach vacation, on today’s Hollywood Hot Meter, we have Kylie Jenner and Sofia Richie as they sizzle in their sultry beach photos and set temperatures soaring in their sultry swimsuits
For Hollywood celebrities, no trip to the beach is complete without the perfect swimsuit. In the past, Kylie Jenner has rocked some really hot bikinis and her love affair with the beaches seem to be never-ending. The make-up mogul’s Instagram feed is a treat for fans and every now and then, she posts some oh-so-sexy swimsuits and bikinis and raises the mercury level. This time was no different, as she took to Instagram to post a really hot picture in her sultry swimsuit. Also on out hot meter is Lionel Richie’s daughter Sofia Richie, who was just spotted partying with Kylie a day ago.
Kylie Jenner and Sofia Richie both rocked the perfect look with their sexy swimsuits. Just in case you were looking for some inspiration to rock a swimsuit on your next beach vacay, on today’s Hollywood Hot Meter, we have Kylie Jenner and Sofia Richie as they sizzle in their sultry beach photos and set temperatures soaring. Kylie Jenner loves her bikinis and this time, she rocked a bright orange-colored swimsuit with a cutout. The actress flaunted her enviable curves and her toned body in the swimsuit.  The pictures are absolutely jaw-dropping and you just can’t miss them. Check it out:
Well, Kylie Jenner and Sofia Richie both surely know how to get their fans’ attention and their pictures are setting Instagram on fire!
Image Source: Instagram/sofiarichie/kyliejenner


FUGAZ trades N1.97 billion on Wednesday as ASI up by 0.14%
by Samuel OyekanmiThe Nigerian Stock Exchange (NSE) ended the day bullish as the All-share index increased by 0.14% to close at 26,776.15, while the market capitalization closed at N12.92 trillion.
The tier 1 banks were heavily traded on the bourse today as they traded in shares valued at N1.97 billion hereby contributing 64.4% to the total valued of equity trades.
Top gainers
Chams Plc leads the gainers chart on the bourse of the Nigerian Stock Exchange (NSE) today as it gained 10% to close at N0.33 followed by Learn Africa Plc, which gained 9.48% to close at N1.27 with Conoil making the list having gained 9.47% to close at N18.5.
Cornerstone Insurance Plc gained 9.38% to close at N0.7 while NPF microfinance bank Plc capped the list with 9.09% gain to close at N1.2.
Top losers
Nascon allied industries Plc led the losers as it lost 5.72% to close at N14 followed by Lasaco Assurance Plc, which lost 3.57% to close at N0.27. Wapic Insurance Plc shed 2.86% to close at N0.34 with Unity bank Plc shedding 2.78% of its stock value to close at N0.7 while AIICO insurance rounded off the list having lost 2.74% to close at N0.71.
Top trades by volume
Access bank Plc was the most actively traded stock on the bourse today, having traded in 63.5 million shares valued at N643.7 million across 421 deals. UBA plc followed with 44.9 million traded shares valued at N338.6 million across 370 deals.
Zenith bank Plc made the list yet again with trades in 24.1 million shares valued at N451.6 million across 505 deals as First bank Plc traded in 16.8 million shares valued at N119.3 million across 287 deals while GTbank completes the list with trades in 14.3 million shares valued at N414.1 million across in 179 deals


Bitmark is not running. You need to start it first for issue and transfer
CHAIN
MODE
BlOCKS
PENDING
VERIFIED
UPTIME
{{bitmarkInfo.chain}}
{{bitmarkInfo.mode}}
{{bitmarkInfo.blocks}}
{{bitmarkInfo.pending}}
{{bitmarkInfo.verified}}
{{bitmarkInfo.uptime}}


First Name is required
Last Name is required
Email is required
About me is required
No activities added yet. Please add activities.
{{item.level.name}}