Equation of State¶
The eos
module contains data structures to compute and hold equation
of state variables used throughout pyRT_DISORT.
-
class
eos.
Hydrostatic
(altitude_grid, pressure_grid, temperature_grid, altitude_boundaries, particle_mass, gravity)¶ A data structure that computes a hydrostatic equation of state.
Hydrostatic accepts equation of state variables and regrids them to a user-specified altitude grid using linear interpolation. Then, it computes number density and scale height at the new boundaries, and the column density within the new boundaries, assuming the atmosphere is in hydrostatic equilibrium.
-
__init__
(altitude_grid, pressure_grid, temperature_grid, altitude_boundaries, particle_mass, gravity)¶ - Parameters
altitude_grid (
ndarray
) – The altitude grid [km] over which the equation of state variables are defined. See the note below for additional conditions.pressure_grid (
ndarray
) – The pressure [Pa] at all values inaltitude_grid
.temperature_grid (
ndarray
) – The temperature [K] at all values inaltitude_grid
.altitude_boundaries (
ndarray
) – The desired boundary altitude [km]. See the note below for additional conditions.particle_mass (
float
) – The average mass [kg] of atmospheric particles.gravity (
float
) – The gravitational acceleration [\(\frac{\text{kg m}}{\text{s}^2}\)] of the atmosphere.
- Raises
TypeError – Raised if
altitude_grid
,pressure_grid
,temperature_grid
, oraltitude_boundaries
are not all numpy.ndarrays; or ifparticle_mass
orgravity
are not floats.ValueError – Raised if: *
altitude_grid
,pressure_grid
, ortemperature_grid
do not have the same shapes *altitude_grid
oraltitude_boundaries
have incompatible pixel dimensions *altitude_grid
oraltitude_boundaries
are not monotonically decreasing along the 0 th axis; *pressure_grid
, ortemperature_grid
contain non-positive, finite values *altitude_boundaries
does not contain at least 2 boundaries *particle_mass
orgravity
are not positive, finite
Notes
This class assumes the atmosphere follows the equation
(1)¶\[P = n k_B T\]where \(P\) is the pressure, \(n\) is the number density, \(k_B\) is Boltzmann’s constant, and \(T\) is the temperature.
The inputs can be ND arrays, as long as they have compatible shapes. In this scenario,
altitude_grid
,pressure_grid
, andtemperature_grid
must be of shape Mx(pixels) whereasaltitude_boundaries
must be of shape Nx(pixels), as long as N > 1 to ensure that the model has at least 1 layer.To keep with DISORT’s convention,
altitude_grid
andaltitude_boundaries
must be monotonically decreasing. If these are ND arrays, this condition only applies to the 0 th axis.Also, scipy’s Gaussian quadrature routine becomes less accurate the smaller the atmosphere’s scale height is. I’m working to reduce the errors. In the meantime the column density is fairly close to analytical results but should be improved.
-
property
altitude
¶ Get the input boundary altitude [km].
- Return type
ndarray
-
property
column_density
¶ Get the column density [\(\frac{\text{particles}}{\text{m}^2}\)] of the boundary layers.
Notes
This is obtained by getting the number density at the boundary altitude, then integrating (using Gaussian quadrature) between the boundary altitude such that
\[N = \int n(z) dz\]is satisfied, where \(N\) is the column density and \(n(z)\) is the number density.
- Return type
ndarray
-
property
n_layers
¶ Get the number of layers in the model.
Notes
This value is inferred from the 0 th axis of
altitude_boundaries
.In DISORT, this variable is named
MAXCLY
(though in thedisort
package, this variable is optional).- Return type
int
-
property
number_density
¶ Get the number density [\(\frac{\text{particles}}{\text{m}^3}\)] at the boundary altitude.
Notes
This variable is obtained by getting the pressure and temperature at the boundary altitude, then solving (1).
- Return type
ndarray
-
property
pressure
¶ Get the pressure [Pa] at the boundary altitude.
Notes
This variable is obtained by linearly interpolating the input pressure onto
altitude_boundaries
.- Return type
ndarray
-
property
scale_height
¶ Get the scale height [km] at the boundary altitude.
Notes
For a hydrostatic atmosphere, the scale height is defined as
\[H = \frac{k_B T}{mg}\]where \(H\) is the scale height, \(k_B\) is Boltzmann’s constant, \(T\) is the temperature, \(m\) is the average mass of an atmospheric particle, and \(g\) is the planetary gravity.
In DISORT, this variable is named
H_LYR
. Despite the name, this variable should have length ofn_layers + 1
. It is only used ifdo_pseudo_sphere
is set toTrue
.- Return type
ndarray
-
property
temperature
¶ Get the temperature [K] at the boundary altitude.
Notes
This variable is obtained by linearly interpolating the input temperature onto
altitude_boundaries
.In DISORT, this variable is named
TEMPER
. It is only needed by DISORT ifthermal_emission
is set toTrue
.- Return type
ndarray
-


Gatekeeper Clarissa:
We are gatekeepers of space and time, capable of teleporting people to destinations in the mere blink of an eye. Where do you want to go?
Teleport
Exchange Dimension Diamonds.
[Noblesse Exclusive] Teleport
Teleport to the Arena & Monster Race Track (Free).
Quest


Select documents, spreadsheets, presentations, email archives or zip packages.
Facilitates the extraction of country-specific information, such as phone numbers.
After upload, documents will be processed and analysed. It will take a while for them to show up in searches.


The Federal Reserve bank of St. Louis, MO provides free macroeconomic indicators and other figures. QuantConnect hosts this Federal Reserve Economic Data (FRED) for use in your algorithms. This data includes various volatility measures, recession indicators, interest rates, and other factors that can be used to analyze the relationships between macroeconomic factors and the market. You can find a full list of these factors in the Alternative Data documentation.
Let's analyze how SPY performs when there is a recession according to the From Period Following Peak Through The Trough indicator. We can subscribe to FRED data with qb.AddData(FRED, Selector)
, where Selector is the metric we wish to analyze.
# We must import any custom data that we want to use from QuantConnect.Data.Custom.Fred import * # Add SPY to see how the market reacts to the recession indicator spy = self.AddEquity("SPY") # Add Federal Reserve Economic Data (FRED) custom data oecd = self.AddData(Fred, Fred.OECDRecessionIndicators.UnitedStatesFromPeakThroughTheTrough)
We can then make requests for the OCED recession indicator data using qb.History
. History calls for alternative data sources are similar to history calls for price data. We can use either qb.History(Type, Symbol, StartDate, EndDate)
, where Type is the data type, Symbol is the symbol for which to retrieve data for, or we can use qb.History(Type, Symbol, Period)
, which returns historical data from the given past period starting from today's date.
# We request for 1000 days of data starting from today spy_daily = self.History(spy.Symbol, timedelta(days=10000), Resolution.Hour) oecd_history = self.History(Fred, oecd.Symbol, timedelta(days=10000)) # Drop the symbol index from multi-index dataframe, so that we have a time series oecd_history = oecd_history.reset_index(level=0, drop=True) spy_daily = spy_daily.reset_index(level=0, drop=True)
The OCED From Period Following Peak Through The Trough indicator returns a value of 0 if there is not a recession and 1 if there is a recession. In order to analyze how the indicator correlates to SPY, we can plot the daily close of SPY in red if there is a recession and in blue otherwise. We can achieve this by first plotting the overall daily close values in blue and then plotting the recessionary periods on top in red.
# Chart formatting plt.title('OECD Recession Indicator Periods') plt.legend(('SPY (no recession)', 'SPY (in recession)')) plt.ylabel('price') # Plot first so that we can put the recessionary period on top of the price graph spy_daily['close'].plot(color='blue')
We can find the recessionary periods by looping over the time periods when there is a continous recession and adding them to a list, We cab then separate the chart into periods of indicated recession and periods of no recession.
recessions = [] # list to hold periods of recession # helper pointers i = 0 previous = 0 # Loop over values in oecd history for period, df in oecd_history.iterrows(): # if there is currently a recession if df['value'] == 1: # add that date to list of recessions if not i == len(recessions) - 1: recessions.append([]) recessions[i].append(period) # if a recessionary period has ended, increment i if previous == 1.0 and df['value'] == 0.0: i += 1 previous = df['value']
To plot the recessionary periods, we can loop over our list of recessions, find the start and end dates of each recession and replot the SPY daily close values in red for those periods.
for recession in recessions: # Get the start and end dates of the recession period recession_start = recession[0] recession_end = recession[-1] # Plot the start and end of the recession in red spy_daily.loc[recession_start:recession_end]['close'].plot(color='red')


New GLCD code for displaying 6 values on one screen
Submitted by cybergibbons on Sat, 22/03/2014 - 10:13
I'm currently developing a heat pump monitor system with a GLCD and I need to be able to display quite a lot of data on a single screen for it to be useful, as well as configure the screen to fit different setups.
After spending a while getting used to the capabilities of the GLCD, I made a fairly tidy display but then found it was painful to reconfigure the layout, chose different parameters and so on. I wanted to create a single table that allowed me to chose which node, which value (power1, power2, Vrms, temp, humidity) etc, where it should be displayed, what units to use etc. rather than change the code in a million places.
So, I present my new 6 panel GLCD sketch.
I realise this might be a bit cluttered and show a lot of information - perhaps too much for some. I find it takes a short while to get used to it.
Easy to configure which pane displays which value for a given node ID - deals with emonTH and emonTX values
Can calculate energy for 3 different power readings
Displays alternating daily MIN/MAX for temperature readings
Can display temperature, power, energy, voltage and percentage units
Allows display of numbers and strings aligned left, right, centre and on the number/unit division (which allows neat display of numbers that change from W to KW)
Uses a monospaced font to make calculating position of text easier
Has configurable timeouts for nodes - if no signal is received then label flashes "TIMED OUT"
Displays time
Has a small flashing circle to show system is still running (very dumb, but protects against hangs and memory issues)
Stores strings in flash to reduce RAM usage
Currently uses ~55% of flash and 82% of RAM - hopefully be enough headroom to add additional functionality.
There are a few bits and bobs I don't like about the code - mainly having to maintain an index for the string table outside of the string table.
New GLCD code for displaying 6 values on one screen
Submitted by cybergibbons on Sat, 22/03/2014 - 10:13I'm currently developing a heat pump monitor system with a GLCD and I need to be able to display quite a lot of data on a single screen for it to be useful, as well as configure the screen to fit different setups.
After spending a while getting used to the capabilities of the GLCD, I made a fairly tidy display but then found it was painful to reconfigure the layout, chose different parameters and so on. I wanted to create a single table that allowed me to chose which node, which value (power1, power2, Vrms, temp, humidity) etc, where it should be displayed, what units to use etc. rather than change the code in a million places.
So, I present my new 6 panel GLCD sketch.
I realise this might be a bit cluttered and show a lot of information - perhaps too much for some. I find it takes a short while to get used to it.
https://github.com/cybergibbons/HomeEnergyMonitor/blob/master/HomeEnergy...
It has the following features:
There are a few bits and bobs I don't like about the code - mainly having to maintain an index for the string table outside of the string table.
Here is an example of a row in the configuration:
POWER_ID is the node ID of the EMONTX.
NODE_EMONTX tells us this is a normal EMONTX. Supports EMONTH as well
VALUE_EMONTX_POWER1 says we want to show the power1 value
X0_Y0 is the top left panel.
UNIT_POWER says to use W/KW units.
I_LABEL_POWER uses the string in the table represented by this index ("POWER").
30 is the timeout in s - i.e. we can miss several readings before it shows


|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object apollo.datamodel.CompositeDataHolder
public class CompositeDataHolder
Holds multiple curation sets for synteny. Should this be called SyntenyDataHolder or MultiSpeciesDataHolder? For composite curation sets just wraps it - eventually replace CurationSets compositeness with this. CompDataHolder holds a list of SpeciesComparisons (that holds 2 cur sets and a link set) rename species stuff to curation stuff CompositeDataHolder is too vague. rename MultiCurationHolder, but it also holds links
| Constructor Summary | |
|---|---|
CompositeDataHolder()
|
|
CompositeDataHolder(CurationSet curSet)
Puts composite curation sets into species comparisons |
|
CompositeDataHolder(SpeciesComparison sc)
|
| Method Summary | |
|---|---|
void |
addSpeciesComparison(SpeciesComparison sc)
|
CurationSet |
getCompositeCurationSet()
Should be phased out |
CompositeDataHolder |
getCompositeDataHolder()
|
CurationSet |
getCurationSet()
ApolloDataI method. |
CurationSet |
getCurationSet(int i)
Return ith species curation set as listed in species array list - this excludes curation sets for links (if thats how links are represented) rename this - needs to lose species association. |
CurationSet |
getCurationSet(java.lang.String setName)
|
CurationSet |
getCurSetFromCompCurSet(java.lang.String setName)
|
LinkSet |
getLinkSet(int i)
|
java.lang.String |
getName()
unclear if name is really needed. |
int |
getNumberOfLinkSets()
|
int |
getNumberOfSpecies()
I keep forgetting numberOfSpecies has no 'get' in front of it, so I'm inserting this standard accessor for my own sanity. |
java.lang.String |
getSpecies(int i)
|
SpeciesComparison |
getSpeciesComparison(int i)
|
boolean |
hasNonEmptyLinkSet()
|
boolean |
isCompositeDataHolder()
|
boolean |
isCurationSet()
ApolloDataI - we are not a curation set so returning false. |
boolean |
isMultiSpecies()
If we have more than one species, it answers 'true', otherwise not. |
int |
numberOfSpecies()
Number of curation sets for species - not links. |
int |
speciesCompSize()
|
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Constructor Detail |
|---|
public CompositeDataHolder()
public CompositeDataHolder(SpeciesComparison sc)
public CompositeDataHolder(CurationSet curSet)
| Method Detail |
|---|
public CurationSet getCurationSet(java.lang.String setName)
public CurationSet getCurationSet(int i)
public int numberOfSpecies()
public int getNumberOfSpecies()
public java.lang.String getSpecies(int i)
public boolean hasNonEmptyLinkSet()
public CurationSet getCurSetFromCompCurSet(java.lang.String setName)
public int getNumberOfLinkSets()
public LinkSet getLinkSet(int i)
public void addSpeciesComparison(SpeciesComparison sc)
public int speciesCompSize()
public SpeciesComparison getSpeciesComparison(int i)
public CurationSet getCompositeCurationSet()
public boolean isCurationSet()
isCurationSet
in interface ApolloDataI
public CurationSet getCurationSet()
getCurationSet
in interface ApolloDataI
public boolean isCompositeDataHolder()
isCompositeDataHolder
in interface ApolloDataI
public CompositeDataHolder getCompositeDataHolder()
getCompositeDataHolder
in interface ApolloDataI
public boolean isMultiSpecies()
isMultiSpecies
in interface ApolloDataI
public java.lang.String getName()
ApolloDataI
getName
in interface ApolloDataI
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


“If this nation is to be wise as well as strong, if we are to achieve our destiny, then we need more new ideas for more wise men reading more good books in more public libraries. These libraries should be open to all—except the censor. We must know all the facts and hear all the alternatives and listen to all the criticisms. Let us welcome controversial books and controversial authors. For the Bill of Rights is the guardian of our security as well as our liberty."
John F. Kennedy [Response to questionnaire in Saturday Review, October 29 1960]


@* * Copyright 2021 HM Revenue & Customs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *@ @import config.FrontendAppConfig @import models.requests.ServiceInfoRequest @this( main_template: main_template ) @(appConfig: FrontendAppConfig, utr: Option[SaUtr])(serviceInfoContent: Html)(implicit request: Request[_], messages: Messages) @main_template( title = messages("payment_and_penalties.title"), appConfig = appConfig, bodyClasses = Some("business-tax"), serviceInfoContent = serviceInfoContent) {
@Messages("payment_and_penalties.deadlines")
@Messages("payment_and_penalties.dont_wait")
@Messages("payment_and_penalties.understanding_payments")
@Messages("payment_and_penalties.make_sure") @Messages("payment_and_penalties.pay_penalty_link") @Messages("payment_and_penalties.late_payment")
@Messages("payment_and_penalties.depends")
@Messages("payment_and_penalties.no_longer")
@Messages("payment_and_penalties.read_info")
@components.sa_calculation()@Messages("payment_and_penalties.budget_taxbill")
@Messages("payment_and_penalties.how_do_i_budget_video")
@Messages("payment_and_penalties.how_do_i_budget_transcript")
@Messages("payment_and_penalties.penalty_showing")
@Messages("payment_and_penalties.affected_covid")
@Messages("payment_and_penalties.appeal_if") @Messages("payment_and_penalties.excuse_link") @Messages("payment_and_penalties.for_example")
@if(utr.isDefined) {@Messages("payment_and_penalties.conditional.you_can")
@Messages("payment_and_penalties.conditional.happens_next")
@Messages("payment_and_penalties.conditional.send_contact")
@Messages("payment_and_penalties.conditional.no_penalties")
}


I bit the bullet. I completely deleted my old cloud server, with the hours of work that went into building a crappy Django site, and replaced it with a fresh Ubuntu 16.04 x64 image. It's just as if I went out, bought a new computer, and just finished installing Ubuntu on it. So, from a tabula rasa, we can lay out the recipe for building a website. I may as well lay it out as a tutorial, as long as I'm going through the steps and documenting them.
This will kind of be the blind leading the blind, though.
Tutorial: Setting Up a Website in One Hour
So, I'll assume you just set up your new computer, and you're running a Linux distro, and you've SSH-ed into it. I've picked Ubuntu. Why Ubuntu? It has the largest Linux market share, with a small lead in web servers, and it also has an enormous userbase, so I expect it has the best community support.
1. Web Server
The first thing we want to do is get a web server running. In this case, I've selected Nginx, so I'm going with nginx (all caps?). Installation instructions for Ubuntu are here.
At this point, nginx automatically starts up and shows you a nifty splash page if you type your server's IP address into a browser. The one thing I'll do now is type
sudo update-rc.d nginx defaults
to make sure nginx starts up whenever the server reboots. So from this point on, nginx will always be running in the background, and we can take it for granted.
2.  This step may be all you need for your site, if all your code is client-side--it's certainly all I needed, even up through today.
Since you can see the nginx splash page, the server is already actually serving static files. The file shows up in both /var/www/html/
and /usr/share/nginx/html/
, although it looks like it's using the one in the former directory. We can appropriate that for all of our files. To change this directory, I'd need to configure nginx.
This is something I can never remember, where the files to configure nginx are located. For future reference, they're in /etc/nginx/sites-available/.
Each file configures a virtual host. I'll copy the default template (which currently points at /var/www/html/)
into a new file to configure this new website.
So in this new file, we can change the default server and point it at some other working directory. I don't know what a best practice here is--I pointed it at /home/<sitename>/publish/.
You can probably just leave it in /var/www/html/.
This part doesn't matter as long as you remember it.
Now, after you put some stuff in the new directory, you need to enable this new config. I think nginx essentially only cares about something if it's in /etc/nginx/sites-enabled/.
Remove the existing symbolic link to the default file and add a symbolic link to the new file you just added to sites-available. Restart nginx and voila, everything works.
There is still the question of domain names. You should acquire one. And then you should follow the DNS provider's instructions as to how to point that domain name at your server. I can't help you there--I did this two years ago and haven't touched it since.
But, that's how we moved to our new (permanent?) home at ivoirians.me.
Conclusions
A single git clone later and the site has been effectively transferred. So long to github.io.
As I've said for the third day in a row: tomorrow we build out a global counter app. We probably won't, considering the various configuring and setup we'll need to do with our new server. In particular, what comes to mind is the deploy step of my workflow: right now, I can develop locally, push my changes, ssh into the server, and pull my changes there. I'd like to automate this somehow, even if it's only three commands. Probably will end up writing another python script.
Also, I took a look at my github page. We're probably going to have a hundred folders in this repo. It already is looking somewhat bad. I should probably fix this problem earlier so I don't have to deal with fixing links in a hundred pages down the line.


amazon-chime-sdk
/
com.amazonaws.services.chime.sdk.meetings.audiovideo.video.gl
/
SurfaceRenderView
/
mirror
mirror
var
mirror
:
Boolean
If true, rendered frames will be mirrored across the vertical axis


GINA
PARK
Home
About
Experience
Interests
Contact
Gina Park
Hi there,
I'm Gina
MS Computer Science
@ Northeastern University
BA Economics
@ University of California, Berkeley
Software Engineer Intern
@ Amazon
Software Engineer Intern
@ F5 Networks
Finance
@ Microsoft
Travel
& Desserts
Denmark, Netherlands, Italy, Scotland, England
Czech Republic, Korea, Japan, Mexico, Canada
Currently updating :)
Get in Touch
Feel free to email or connect below to talk or grab coffee!
Email:
ginajinahpark@gmail.com


Customer Transactions by Type
(Customer Email)
TRANSACTION TYPE
click to select all transactions by type


This shows the full colour pallet used in Foundry, including the base texture applied to some elements.
Paragraph text
Small paragraph text
This is an example of the collapsing Noticeboard created for the Foundry system.
Based on the Bootstrap collapsable panels, it has been styled to show a clear heirachy of information as well as badges highlighting any outstanding actions that need to completed. The To Do list is set to be open on default.
First of all the main panel should have a class of .noticeboard added to it.
It has a top .panel-heading with just the H3 heading of Noticeboard, this has .badge attached that calculates the total of the badges in the following 3 sections (To Do, Waiting and Reference).Each sections has no .panel, just a .panel-heading followed by a .panel-body, with a .panel-footer sitting WITHIN the .panel-body, so that footer is hidden when the panel collapses.
Each Panel Heading has a data-toggle .collapse, and a data-target and href of it's ID (#todo, #waiting or #reference). Each Section Panel Body also needs the relative ID added to it as well as the class of .collapse. The first section (To Do) should also have the class of .in added to it's Panel Body, so that it is open at refresh.Each Section has the articles within the Panel Body in this order.
.notice-article and within that,Each article is serapted by a DIV with a class of .divide-dots.
And finishes of with a Panel Footer with the Panel Body.


--- layout: post title: If you go down to the woods today... date: 2006-09-25 00:00:00 category: personal ---
... you're sure of a big surprise...
Thanks to everyone who came along for the ride. I hope you had as much fun as I did :)
Update: w00t! I killed a policeman! Ice T eat your heart out...


{% extends "base.html" %} {% block content %}
Please note that a requirement set can only be removed when there are no links from or to its requirements.


I am currently a Ph.D. student in the Department of Computer Science at Missouri University of Science & Technology. My advisor is Prof. Tony Luo.
Previously, I received my Masters degree in Computer Science from the University of Texas at Arlington. Prior to that, I worked as a Research Assistant at the Indian Institute of Science, where I was advised by Prof. Y Narahari. I also worked as an intern at Dassault Systems and SCSK Corporation. I obtained my Bachelors degree from MS Ramaiah Institute of Technology, India.
The current focus of my research is at the nexus of Internet of Things (IoT), Machine Learning, Cyber Security & Privacy. I'm specifically working on:
Previously, I worked on Social Network Analytics, Bitcoin, Blockchain & Decentralized Applications (DApps).


This is the Game of Life as invented by John Conway in 1970.
The Game of Life follows three simple rules:
a board wide, high and place initial cells by clicking onto the board. Or use a preset: choose... Each of generations will last miliseconds. Then let it


Plugin Information |
|---|
View Event Publisher (via ZMQ PUB SUB) on the plugin site for more information. |
This is a Jenkins plugin that will publish Jenkins Job run events
(start, complete, finish) to a ZMQ PUB socket. By default the PUB
socket is on TCP port 8888 and no Job events will be published.
You can choose to enable event publishing for all jobs in the
Jenkins' global config or enable the plugin on a per job basis.
This plugin uses jeromq to satisfy the dependency on ZMQ. It is
possible to use jzmq instead if you need the features that jeromq
is lacking; however, it is a pain to get jzmq built and is less
portable. If you really really want jzmq look back in the git
history and you will find the old versions of this plugin that
depended on jzmq.
TODO:
- Avoid reading in the global config for each event if possible.
- Need to allow ZMQRunnable thread to die if something truly
unexpected happens. The RunListener should then start a new
DaemonThread to handle further events. - Cleanup config.jelly for the non global Job config.
This plugin borrows heavily from the Jenkins Notification Pluginhttps://github.com/jenkinsci/notification-plugin. That plugin
does much of the same work and where applicable I have gone the
easy route and copied the work they have done.
Contributing
------------
To browse the latest code, see:https://git.openstack.org/cgit/openstack-infra/zmq-event-publisher/tree/
To clone the latest code, use
`git clone git://git.openstack.org/openstack-infra/zmq-event-publisher`
Bugs are handled at: https://storyboard.openstack.org/#!/project/750|https://storyboard.openstack.org/#!/project/750
Code reviews are handled by gerrit. The gerrit in
use is http://review.openstack.org
Developer docs: http://docs.openstack.org/infra/manual/developers.html
Attachments:
changes-2.png (image/png)
gconfig.png (image/png)
ghserver-config.png (image/png)
secret-text.png (image/png)
manage-token.png (image/png)