--- layout: post title: Building a responsive site in less than 20 minutes date: 2012-06-28 21:55:19.000000000 +05:30 categories: - Blog - Data Visualization Thoughts tags: - css - development - information design - mobile - responsive design status: publish type: post published: true meta: _edit_last: '1' _thumbnail_id: '2702' image: '' quote-author: Unknown quote-url: http:// quote-copy: Unknown audio: http:// link-url: http:// seo_follow: 'false' seo_noindex: 'false' tmac_last_id: '' pvc_views: '6988' _jetpack_related_posts_cache: a:1:{s:32:"8f6677c9d6b0f903e98ad32ec61f8deb";a:2:{s:7:"expires";i:1435682627;s:7:"payload";a:3:{i:0;a:1:{s:2:"id";i:3332;}i:1;a:1:{s:2:"id";i:2345;}i:2;a:1:{s:2:"id";i:3998;}}}} dsq_thread_id: '3595937928' author: login: cvlewis email<EMAIL_ADDRESS>display_name: Carl V. Lewis first_name: Carl V. last_name: Lewis excerpt: !ruby/object:Hpricot::Doc options: {} ---
[caption id="attachment_2704" align="aligncenter" width="407"] An ever-so-sleek responsive portfolio site I designed for a friend in less than 20 minutes using Skeleton as a foundation.[/caption]
With all this talk lately of the new era of responsive design, I realized today that I've yet to create anything that's actually responsive. Given that I've only pondered using it in the implementation of complex, database-driven news sites, the task of tweaking every level of CSS to fit perfectly into a responsive grid system has so far seemed too daunting to tackle.
But I got curious this afternoon, and found my way upon a cool new library called Skeleton, which bills itself as a "a beautiful boilerplate for responsive, mobile-friendly development." Essentially, Skeleton is a collection of CSS and JS files that makes the mystery of responsive design seem a little less illusive. Upon uploading the package to my server, I was pleased to find a neatly-coded, easy-to-understand responsive site that I could play around with and tweak to my own liking. I ended up adjusting the grid size and performing some minor customizations to the underlying Skeleton structural CSS, but other than that, the development kit was, as it promised, "style agnostic."
Since I didn't have any specific projects I needed to be working on today, I decided to give Skeleton a whirl by designing a new online portfolio as a favor for my friend Daniel Medina. I'm not kidding – within 10 minutes I'd coded a fully satisfactory responsive portfolio site that looks beautiful on my iPhone and tablet.
So, if you're feeling experimental, try Skeleton out. It's exciting to see how quickly this technology is catching steam, and to see the actual workings of the responsive CSS in action firsthand. My next goal is to integrate a responsive layout into a more-powerful database-driven site, perhaps one designed in Drupal.


Almond cookies
Yields: 25 bakies
Preparation time: 10'
Cooking time: 13'
Tools
-
Oven (180°C)Baking paper
Ingredients
-
25 almonds, peeled100g almond flour (or more peeled almonds and a spice grinder 🙂)100g sugar1 egg white (~35g)
Directions
-
Pre-heat oven at 180°CMix the sugar with the eggs and the almond flourLay some baking paper on a trayMake roughly 25 balls of doughOn every ball lay one of the almonds an push it inside a bit to make it stickBake in the oven (not ventilated) for 13 minutes[OPTIONAL] add icing sugar on top
This is my quick and simplified version of almond bakies (which are like cookies, but are baked instead of cooked).
Category: Sweets
Origin: Sicilia


For more information check out: Knock-Knock on Github.
Required:
Max: 5
Regex: [^/]+\d+
Email:
Number:
Equals: ( evaluated against Number )
Required and Email:


PerCuriam
NOTICE: This opinion is subject to formal revision before publication in the preliminary print of the United States Reports. Readers are requested to notify the Reporter of Decisions, Supreme Court of the United States, Washington, D. C. 20543, of any typographical or other formal errors, in order that corrections may be made before the preliminary print goes to press.
SUPREME COURT OF THE UNITED STATES
_________________
No. 11–199
_________________
ALEXANDER VASQUEZ, PETITIONER v. UNITED STATES
Per Curiam.
The writ of certiorari is dismissed as improvidently granted.
It is so ordered.


The ceremony will be held at Madison Creek Farms, just 20 minutes away from downton Nashville.
November 7, 2015.
The ceremony will start at 4:00 pm, and shouldn't last too long.
A full dinner reception catered by Big Al's Deli will follow, just a few steps away from the ceremony. After dinner there'll be dancing and games, so bring your dancing-shoes and thinking-caps
We met while we were both working in different coffee shops in Nashville. Jess would need to get some (more) coffee after work, so she would wonder in to Luke's shop. And he needed coffee before, so he often found an excuse to wonder in to hers.
After complaining of some leg pain, Jess had to take Luke in to the hospital for what turned out to be an infection related to a motorcycle crash he was in the following fall. Through the trial they found real commitment to each other, and expressed that with three simple words.
Later that summer Jess took a (already planned) vacation to Southeast Asia. They say that absence makes the heart grow fonder, and the time apart showed these two adventurers that they really wanted to go out and explore together.
After not working for a year and some change, then working and figuring out a change was needed, Luke spent six months learning how code and build sweet websites. Luke finally bought Jess a ring and asked her if she wanted to go ahead and get married. She said yes, and we can't wait to celebrate this with you!


Welcome to Cricket fans.com I'm Krichit Patel. This is website for cricket fans to check scores, results etc. and if you do not know what cricket is? and you want to know about cricket than you can read Introduction to cricket below. or watch video at bottom of the page.
Introduction To Cricket
Cricket is a bat and ball game that played between 2 teams. Cricket was first played in southern England in the 16th century and by the end of 18th century it was devloped to be a national sport of England, they started playing cricket with a ball and stick after some time they invited bat and some other equpiments that we need to wear when we play international cricket and now Cricket is second best team game in world. More than 48 nations play cricket and it has three fomat Test, ODI, T20.
Test cricket is the longest format in the game of cricket and you get 5 daysto play 4 innings and each team get 2 innings to play. ODI is limited overs format. Each team get to play 50 overs (1 over = 6 balls) and The Cricket World Cup played in this format every 4 years. T20 Cricket is the format people most enjoyed, In this format each team get 20 overs to play and the T20 Cricket World Cup played in this format every 2 years.


It was popularised in the 1960s with the release of Letraset sheets containing Lorem ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
It was popularised in the 1960s with the release of Letraset sheets containing Lorem ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
Be a part of an important clinical research study investigating a treatment on multiple myeloma
Clinical study evaluating if a new drug is safe and effective in treating anemia in patients with chronic kidney disease who are not on dialysis
Would you be interested to participate in a clinical trial evaluating the efficacy and safety of an investigative drug for...
Effect and safety of semaglutide 2.4 mg once weekly in subjects with overweight or obesity


--- layout: default title: Page not found ---
The requested page couldn't be located. Checkout for any URL misspelling or return to the homepage.


Honor a veteran with Wreaths Across America
KNOXVILLE, Tenn. (WVLT-) The Knoxville Chapter of the Vietnam Veterans of America will provide wreaths to place on every headstone in Knox County's three veteran cemeteries.
This is part of the national organization, Wreaths Across America.
You can find information here if you'd like to help.
Volunteers will place the wreaths on Saturday, December 14, 2019.


pypospack.potential package¶
Submodules¶
pypospack.potential.eam module¶
-
class
pypospack.potential.eam.
EamPotential
(symbols, func_pair=None, func_density=None, func_embedding=None, filename=None)[source]¶ Bases:
pypospack.potential.potential.Potential
embedded energy method potential
This class is for the modelling of an EAM potential
Parameters: - symbols (list of str) –
- func_pairpotential (str) –
- func_density (str) –
- func_embedding (str) –
- filename (str) –
-
symbols
¶ list of str – the list of symbols
-
obj_pair
¶ OrderedDict of PairPotential
-
obj_density
¶ OrderedDict of EamDensityFunction
-
obj_embedding
¶ OrderedDict of EamEmbeddingFunction
-
N_r
¶ int – number of radial points, the distance between two atoms
-
r_max
¶ float – the maximum distance between two atoms
-
r_cut
¶ float – the cutoff distance between two atoms
-
N_rho
¶ int – the number of points in the electron density evaluation
-
rho_max
¶ float – the maximum electron density
-
evaluate
(r, rho, rcut, parameters)[source]¶ evaluate the potential
Parameters: - r (numpy.ndarray) – a numpy array of interatomic distances
- parameters (OrderedDict) – an dictionary of parameter values and keys
- r_cut (float,optional) – the global cutoff for the potential
pypospack.potential.eam_density module¶
-
class
pypospack.potential.eam_density.
EamDensityFunction
(symbols, potential_type='eamdens')[source]¶ Bases:
pypospack.potential.potential.Potential
implements the base class for the EAM Density Function
pypospack.potential.eam_density_function module¶
pypospack.potential.eam_embedding_eos module¶
-
class
pypospack.potential.eam_embedding_eos.
EamEmbeddingEquationOfState
(symbols, potential_type='eam_embed_eos')[source]¶ Bases:
pypospack.potential.eam_embedding_function.EamEmbeddingFunction
pypospack.potential.eam_embedding_function module¶
pypospack.potential.eamdens_expoential module¶
-
class
pypospack.potential.eamdens_expoential.
ExponentialDensityFunction
(symbols)[source]¶ Bases:
pypospack.potential.eam_density_function.EamDensityFunction
Parameters: symbols (list of str) – -
symbols
¶ list of str
-
potential_type
¶ str – This is set to ‘eamembed_universal’
-
parameter_names
¶ list of str
-
parameters
¶ OrderedDict – The key is the symbol associated with the embedding function. On initialization, the value of each parameter is set to None.
-
density
¶ OrderedDict – The key is the symbol associated with the embedding function.
-
N_r
¶ int
-
d_r
¶ float
-
r_max
¶ float
-
r
¶ numpy.ndarray
-
evaluate
(r, parameters, r_cut=None)[source]¶ Given a vector of interatomic distances, r, passed in as variable r, and the associated parameters of the potential. This method sets the density attribute.
Parameters: - r (numpy.ndarray) – This should be named as rho because it represents the electron density being evaluated.
- parameters (OrderedDict) – This is a dictionary of the parameters of the embedding function for each atom. The key is a string containing the ISO chemical symbol of the element. The value should be a numeric value.
- r_cut (float) – This would be the density cutoff. However the embedding energy is increasing with increasing electron density so the a r_cut has no physical meaning. Any variable passed into r_cut will be ignored.
-
pypospack.potential.eamdens_exponential module¶
-
class
pypospack.potential.eamdens_exponential.
ExponentialDensityFunction
(symbols)[source]¶ Bases:
pypospack.potential.eam_density_function.EamDensityFunction
Parameters: symbols (list of str) – -
symbols
¶ list of str
-
potential_type
¶ str – This is set to ‘eamembed_universal’
-
parameter_names
¶ list of str
-
parameters
¶ OrderedDict – The key is the symbol associated with the embedding function. On initialization, the value of each parameter is set to None.
-
density
¶ OrderedDict – The key is the symbol associated with the embedding function.
-
N_r
¶ int
-
d_r
¶ float
-
r_max
¶ float
-
r
¶ numpy.ndarray
-
evaluate
(r, parameters, r_cut=None)[source]¶ Given a vector of interatomic distances, r, passed in as variable r, and the associated parameters of the potential. This method sets the density attribute.
Parameters: - r (numpy.ndarray) – This should be named as rho because it represents the electron density being evaluated.
- parameters (OrderedDict) – This is a dictionary of the parameters of the embedding function for each atom. The key is a string containing the ISO chemical symbol of the element. The value should be a numeric value.
- r_cut (float) – This would be the density cutoff. However the embedding energy is increasing with increasing electron density so the a r_cut has no physical meaning. Any variable passed into r_cut will be ignored.
-
pypospack.potential.eamembed_bjs module¶
-
class
pypospack.potential.eamembed_bjs.
BjsEmbeddingFunction
(symbols)[source]¶ Bases:
pypospack.potential.eam_embedding_function.EamEmbeddingFunction
Parameters: symbols (list of str) – -
symbols
¶ list of str
-
potential_type
¶ str – This is set to ‘eamembed_universal’
-
parameter_names
¶ list of str
-
parameters
¶ OrderedDict – The key is the symbol associated with the embedding function. On initialization, the value of each parameter is set to None.
-
embedding
¶ OrderedDict – The key is the symbol associated with the embedding function.
-
N_rho
¶ int
-
d_rho
¶ float
-
rho_max
¶ float
-
rho
¶ numpy.ndarray
-
evaluate
(rho, parameters)[source]¶ Given a vector of electron densities, rho, passed in as variable r, and the associated parameters of the potential. This method sets the embedding attribute.
Parameters: - rho (numpy.ndarray) – This should be named as rho because it represents the electron density being evaluated.
- parameters (OrderedDict) – This is a dictionary of the parameters of the embedding function for each atom. The key is a string containing the ISO chemical symbol of the element. The value should be a numeric value.
- rho_cut (float) – This would be the density cutoff. However the embedding energy is increasing with increasing electron density so the a r_cut has no physical meaning. Any variable passed into r_cut will be ignored.
-
pypospack.potential.eamembed_eos_rose module¶
-
class
pypospack.potential.eamembed_eos_rose.
RoseEquationOfStateEmbeddingFunction
(symbols, obj_density_function=None, obj_pair_function=None, lattice_type=None, lattice_a0=None, parameters=None)[source]¶ Bases:
pypospack.potential.eam_embedding_eos.EamEmbeddingEquationOfState
An equation of state defined by the Rose Equation of the State
This class implements the determination of the embedding function by inverse solution of the Rose-Vinet Equation of State[1]. This method is outlined in by Foiles[1].
Parameters: - symbols (list of str) – a list of symbols.
- obj_density_function (EamDensityFunction,optional) – an object which is an instance of the eam density function.
- obj_pair_function (PairPotential,optional) – an object which is an instance of a pair potential.
- lattice_type (str,optional) – the type of metal lattice that we have, the acceptable lattice types are fcc, bcc, and hcp.
- lattice_a0 (str,optional) – the lattice parameter of the lattice type referenced in lattice_type.
- parameters (OrderedDict,optional) – the parameters to be evaluated
Notes
[1] Foiles, Baskes, and Daw., Phys. Rev. B., 1986 [2] Brent, R. P., Algorithms for Minimization Without Derivatives. Englewood Cliffs, NJ: Prentice-Hall, 1973. Ch. 3-4
-
evaluate
(rho, r, parameters, o_pair=None, o_density=None, a_min=0.0, a_max=10000.0, a_tol=1e-08)[source]¶ evaluate the potential
Parameters: - r (numpy.ndarray) – a numpy array of interatomic distances
- parameters (OrderedDict) – an dictionary of parameter values and keys
- r_cut (float,optional) – the global cutoff for the potential
pypospack.potential.eamembed_eos_zopemishin module¶
-
class
pypospack.potential.eamembed_eos_zopemishin.
ZopeMishinEosEmbeddingFunction
(symbols)[source]¶ Bases:
pypospack.potential.eam_embedding_function.EamEmbeddingFunction
Parameters: symbols (list of str) – -
symbols
¶ list of str
-
potential_type
¶ str – This is set to ‘eamembed_universal’
-
parameter_names
¶ list of str
-
parameters
¶ OrderedDict – The key is the symbol associated with the embedding function. On initialization, the value of each parameter is set to None.
-
embedding
¶ OrderedDict – The key is the symbol associated with the embedding function.
-
N_rho
¶ int
-
d_rho
¶ float
-
rho_max
¶ float
-
rho
¶ numpy.ndarray
-
evaluate
(rho, parameters)[source]¶ Given a vector of electron densities, rho, passed in as variable r, and the associated parameters of the potential. This method sets the embedding attribute.
Parameters: - rho (numpy.ndarray) – This should be named as rho because it represents the electron density being evaluated.
- parameters (OrderedDict) – This is a dictionary of the parameters of the embedding function for each atom. The key is a string containing the ISO chemical symbol of the element. The value should be a numeric value.
- rho_cut (float) – This would be the density cutoff. However the embedding energy is increasing with increasing electron density so the a r_cut has no physical meaning. Any variable passed into r_cut will be ignored.
-
-
pypospack.potential.eamembed_eos_zopemishin.
func_zopemishin_eos
(rho, E0, r0, alpha, beta)[source]¶ functio for the Zope Mishin equation of state :param rho: either a float or an array of electron density values :type rho: np.ndarray :param E0: a parameter :type E0: float :param r0: another parameter :type r0: float :param alpha: yet another parameter :type alpha: float :param beta: the final parameter :type beta: float
Returns: the array of values of the embedding function Return type: np.ndarray
pypospack.potential.eamembed_fs module¶
-
class
pypospack.potential.eamembed_fs.
FinnisSinclairEmbeddingFunction
(symbols)[source]¶ Bases:
pypospack.potential.eam_embedding_function.EamEmbeddingFunction
Parameters: symbols (list of str) – -
symbols
¶ list of str
-
potential_type
¶ str – This is set to ‘eamembed_universal’
-
parameter_names
¶ list of str
-
parameters
¶ OrderedDict – The key is the symbol associated with the embedding function. On initialization, the value of each parameter is set to None.
-
embedding
¶ OrderedDict – The key is the symbol associated with the embedding function.
-
N_rho
¶ int
-
d_rho
¶ float
-
rho_max
¶ float
-
rho
¶ numpy.ndarray
-
evaluate
(rho, parameters)[source]¶ Given a vector of electron densities, rho, passed in as variable r, and the associated parameters of the potential. This method sets the embedding attribute.
Parameters: - rho (numpy.ndarray) – This should be named as rho because it represents the electron density being evaluated.
- parameters (OrderedDict) – This is a dictionary of the parameters of the embedding function for each atom. The key is a string containing the ISO chemical symbol of the element. The value should be a numeric value.
-
pypospack.potential.eamembed_universal module¶
-
class
pypospack.potential.eamembed_universal.
UniversalEmbeddingFunction
(symbols)[source]¶ Bases:
pypospack.potential.eam_embedding_function.EamEmbeddingFunction
Parameters: symbols (list of str) – -
symbols
¶ list of str
-
potential_type
¶ str – This is set to ‘eamembed_universal’
-
parameter_names
¶ list of str
-
parameters
¶ OrderedDict – The key is the symbol associated with the embedding function. On initialization, the value of each parameter is set to None.
-
embedding
¶ OrderedDict – The key is the symbol associated with the embedding function.
-
N_rho
¶ int
-
d_rho
¶ float
-
rho_max
¶ float
-
rho
¶ numpy.ndarray
-
evaluate
(rho, parameters)[source]¶ Given a vector of electron densities, rho, passed in as variable r, and the associated parameters of the potential. This method sets the embedding attribute.
Parameters: - rho (numpy.ndarray) – This should be named as rho because it represents the electron density being evaluated.
- parameters (OrderedDict) – This is a dictionary of the parameters of the embedding function for each atom. The key is a string containing the ISO chemical symbol of the element. The value should be a numeric value.
-
pypospack.potential.eamemebed_eos_foiles module¶
-
class
pypospack.potential.eamemebed_eos_foiles.
RoseEquationOfStateEmbeddingFunction
(parameters)[source]¶ Bases:
pypospack.potential.eam_embedding_eos.EamEmbeddingEquationOfState
-
pypospack.potential.eamemebed_eos_foiles.
fembedFoiles
(rho, params)[source]¶ implements Foiles-style embeding function (i.e. density and pair potential forced to match Rose EOS) parameter list: p[0] p[1] p[2] p[3] p[4] p[5] p[6] p[7] p[8] E_coh a(morse) r0 rho0 lambda0 lambdarose De rp rd
-
pypospack.potential.eamemebed_eos_foiles.
func_eam_embed_foiles
(rho, E0, am, r0, rho0, lambda0, lambdarose, De, rp, rd, F_min=0, F_max=10000, F_xtol=1e-08)[source]¶
pypospack.potential.pair module¶
pypospack.potential.pair_bornmayer module¶
-
class
pypospack.potential.pair_bornmayer.
BornMayerPotential
(symbols)[source]¶ Bases:
pypospack.potential.pair.PairPotential
Implementation of a Born-Mayer repulsive potential
Parameters: symbols (list of str) – -
symbols
¶ list of str
-
pypospack.potential.pair_buckingham module¶
-
class
pypospack.potential.pair_buckingham.
BuckinghamPotential
(symbols)[source]¶ Bases:
pypospack.potential.pair.PairPotential
Implementation of the Buckingham Potential
This class provides an interface for the management of parameters to and from different molecular dynamics and lattice dynamics programs.
Parameters: symbols (list) – a list of chemicals -
evaluate
(r, parameters, r_cut=False)[source]¶ evaluate the potential
Parameters: - r (numpy.ndarray) – a numpy array of interatomic distances
- parameters (OrderedDict) – an dictionary of parameter values and keys
- r_cut (float,optional) – the global cutoff for the potential
-
gulp_potential_section_to_string
(parameters=None, r_cut=10.0)[source]¶ get GULP potential to string
The buckingham potential is a charged potential and so the charges associated with the potential are also part of the potential.”
-
lammps_potential_section_to_string
(parameters=None, rcut=10.0)[source]¶ get the string for the lammps potential section
Parameters: - parameters (OrderedDict) – a dictionary of parameter name keys with the associated values
- rcut (float) – the global cutoff
Returns: the string of the LAMMPS potential section
Return type: str
-
pypospack.potential.pair_lj module¶
-
class
pypospack.potential.pair_lj.
GeneralizedLennardJones
(symbols)[source]¶ Bases:
pypospack.potential.pair.PairPotential
Potential implementation of the generalized Leonnard Jones Function
Parameters: symbols (list) – a list of chemical symbols. -
evaluate
(r, parameters, r_cut=None)[source]¶ evaluate the potential for a given set of distances for a given parameter set
This method implements the parent method.
Parameters: - r (numpy.ndarray) – A numpy array of interatomic distances which to evaluate.
- parameters (OrderedDict) – A dictionary of parameters on which to evaluate the interatomic potential.
-
pypospack.potential.pair_morse module¶
this module impplements the morse potential
-
class
pypospack.potential.pair_morse.
MorsePotential
(symbols)[source]¶ Bases:
pypospack.potential.pair.PairPotential
Implementation of the morse potential
Parameters: symbols (list) – a list of chemical symbols. -
evaluate
(r, parameters, r_cut=None)[source]¶ evaluate the pair potential
This method evaluates the MorsePotential :param r: A numpy array of interatomic distances which to evaluate. :type r: np.ndarray :param parameters: A dictionary of parameters on which to evaluate the interatomic potential. :type parameters: OrderedDict
Notes
>>> symbols=['Ni'] >>> parameters=OrderedDict([ >>> ('NiNi_D0',0.001114),('NiNi_a',3.429506),('NiNi_r0',2.6813) >>> ]) >>> o = MorsePotential(symbols = s) >>> o.evaluate(r,testing_set['parameters'])
-
pypospack.potential.potential module¶
This module contains classes to interact with GULP.
-
class
pypospack.potential.potential.
Potential
(symbols, potential_type=None, is_charge=None)[source]¶ Bases:
object
base class for potential
Parameters: - symbols (list of str) – a list of symbols to use for the potential
- potential_type (str) – a description for the type of potential this is
-
PYPOSPACK_3BODY_FORMAT
= '{s1}{s2}{s3}_{p}'¶
-
PYPOSPACK_CHRG_FORMAT
= 'chrg_{s}'¶
-
PYPOSPACK_PAIR_FORMAT
= '{s1}{s2}_{p}'¶
-
evaluate
(r, parameters, r_cut=False)[source]¶ evaluate the potential
Parameters: - r (numpy.ndarray) – a numpy array of interatomic distances
- parameters (OrderedDict) – an dictionary of parameter values and keys
- r_cut (float,optional) – the global cutoff for the potential
pypospack.potential.threebody_stillingerweber module¶
-
class
pypospack.potential.threebody_stillingerweber.
StillingerWeberPotential
(symbols)[source]¶
pypospack.potential.threebody_tersoff module¶
-
class
pypospack.potential.threebody_tersoff.
TersoffPotential
(symbols)[source]¶
Module contents¶
-
class
pypospack.potential.
PotentialInformation
[source]¶ Bases:
object
Read/Write Empirical Interatomic Potential Information
pypospack uses yaml files to store configuration information for required for optimization routines.
-
filename
¶ str – filename of the yaml file to read/write configuration file. Default is pypospack.potential.yaml’
-
elements
¶ list – list of string of chemical symbols
-
parameter_names
¶ list – list of parameter names
-
potential_type
¶ str – type of potential
-
param_info
¶ dict – param info
-
eam_pair_potential
¶ str – name of the functional form for the eam pair potential. Set by default to None.
-
eam_embedding_function
¶ str – name of the functional form the eam embedding function. Set by default to None.
-
eam_density_function
¶ str – name of the functional form of the eam electron desnsity function. Set by default to None.
-
check
()[source]¶ performs sanity checks to potential configuration
doe the following checks: 1. check to see if the potential type is supported.
Raises: ValueError
– if the potential type is unsupported
-
free_parameter_names
¶
-
-
pypospack.potential.
determine_symbol_pairs
(symbols)[source]¶ determine symbol pairs
Parameters: symbols (list of str) – a list of symbols Returns: a list of symbol pairs Return type: list of list
-
pypospack.potential.
get_potential_map
()[source]¶ get the potential map
Support for interatomic potentials requires a mapping from the potential formalism to the class supporting the function. Additional potentials to be supported can either be added here, or provided using any module available on the PYTHONPATH.
Returns: the key is the name of the potential formalism, the value is a list where the first element contains the module. second element contains the class supporting the function Return type: (dict)


Lee Dong Wook to host a talk show
by jennywillLee Dong Wook will be hosting a talk show.
His label said, "Lee Dong Wook will be hosting SBS' new talk show 'Lee Dong Wook Wants to Talk'. He has wanted to go on a talk show for a while, so please show a lot of interest and love." He's actually hinted the news to his fans the news yesterday during his fanmeet 'I'm WOOK'.
The new talk show will launch on December 4th.


Web apps deserve sexy transitions too!
Hakim's Experiments, Thoughts & Projects
http://codepen.io/Sonick/pen/vijJl
http://anthonycalzadilla.com/css3-ATAT/
http://tympanus.net/Tutorials/CreativeCSS3AnimationMenus/
sole/tween.js - Javascript Tweening Engine


Locale Fallbacks
Extends the I18n module to hold a fallbacks instance which is set to an instance of I18n::Locale::Fallbacks by default but can be swapped with a different implementation.
Locale fallbacks will compute a number of fallback locales for a given locale. For example:
<pre> I18n.fallbacks[:"es-MX"] # => [:"es-MX", :es, :en] </pre>
Locale fallbacks always fall back to
* all parent locales of a given locale (e.g. :es for :"es-MX") first, * the current default locales and all of their parents second
The default locales are set to [I18n.default_locale] by default but can be set to something else.
One can additionally add any number of additional fallback locales manually. These will be added before the default locales to the fallback chain. For example:
# using the default locale as default fallback locale I18n.default_locale = :"en-US" I18n.fallbacks = I18n::Locale::Fallbacks.new(:"de-AT" => :"de-DE") I18n.fallbacks[:"de-AT"] # => [:"de-AT", :"de-DE", :de, :"en-US", :en] # using a custom locale as default fallback locale I18n.fallbacks = I18n::Locale::Fallbacks.new(:"en-GB", :"de-AT" => :de, :"de-CH" => :de) I18n.fallbacks[:"de-AT"] # => [:"de-AT", :de, :"en-GB", :en] I18n.fallbacks[:"de-CH"] # => [:"de-CH", :de, :"en-GB", :en] # mapping fallbacks to an existing instance # people speaking Catalan also speak Spanish as spoken in Spain fallbacks = I18n.fallbacks fallbacks.map(:ca => :"es-ES") fallbacks[:ca] # => [:ca, :"es-ES", :es, :"en-US", :en] # people speaking Arabian as spoken in Palestine also speak Hebrew as spoken in Israel fallbacks.map(:"ar-PS" => :"he-IL") fallbacks[:"ar-PS"] # => [:"ar-PS", :ar, :"he-IL", :he, :"en-US", :en] fallbacks[:"ar-EG"] # => [:"ar-EG", :ar, :"en-US", :en] # people speaking Sami as spoken in Finnland also speak Swedish and Finnish as spoken in Finnland fallbacks.map(:sms => [:"se-FI", :"fi-FI"]) fallbacks[:sms] # => [:sms, :"se-FI", :se, :"fi-FI", :fi, :"en-US", :en]


A simple path:
"must have all vertices be unique"
- "allows repetition of vertices so long as the length of the path is less than 5"
- "allows repetition of vertices so long as no edge is repeated"
- "must have all vertices unique except that the first and last vertices are the same"
A path is simple if all vertices on the path are distinct.


{% extends "layout.html" %} {% block title_content %}
Network Stickies (Assignment 4 of 6.170) is a simple web application that can be used to keep track of sticky notes. Users can:


@Documented @Retention(value=RUNTIME) @Target(value=TYPE) @Inherited public @interface AcraCore
| Modifier and Type | Optional Element and Description |
|---|---|
String[] |
additionalDropBoxTags
Custom tags to be included in DropBox event collection
|
String[] |
additionalSharedPreferences
Add here your
SharedPreferences identifier Strings if you use others than your application's default. |
boolean |
alsoReportToAndroidFramework
Set this to true if you prefer displaying the native force close dialog after ACRA is done.
|
String |
applicationLogFile
To use in combination with
ReportField.APPLICATION_LOG to set the path/name of your application log file. |
Directory |
applicationLogFileDir
To use in combination with
ReportField.APPLICATION_LOG to set the root for the path provided in applicationLogFile() |
int |
applicationLogFileLines
To use in combination with
ReportField.APPLICATION_LOG to set the number of latest lines of your application log file to be collected. |
Class<? extends AttachmentUriProvider> |
attachmentUriProvider
Allows
attachmentUris() configuration at runtime instead of compile time. |
String[] |
attachmentUris
Allows to attach files to crash reports.
|
Class |
buildConfigClass
The default value will be a BuildConfig class residing in the same package as the Application class.
|
boolean |
deleteOldUnsentReportsOnApplicationStart
Deprecated.
use @AcraLimiter.deleteReportsOnAppUpdate() instead
|
boolean |
deleteUnapprovedReportsOnApplicationStart
Controls whether unapproved reports are deleted on application start or not.
|
int |
dropboxCollectionMinutes
DropBox event collection will look back this many minutes
|
String[] |
excludeMatchingSettingsKeys
Provide here regex patterns to be evaluated on each
Settings.System , Settings.Secure and Settings.Global key to exclude KV pairs from being collected. |
String[] |
excludeMatchingSharedPreferencesKeys
Provide here regex patterns to be evaluated on each
SharedPreferences key to exclude KV pairs from the collected SharedPreferences. |
boolean |
includeDropBoxSystemTags
If enabled, DropBox events collection will include system tags:
system_app_anr
system_app_wtf
system_app_crash
system_server_anr
system_server_wtf
system_server_crash
BATTERY_DISCHARGE_INFO
SYSTEM_RECOVERY_LOG
SYSTEM_BOOT
SYSTEM_LAST_KMSG
APANIC_CONSOLE
APANIC_THREADS
SYSTEM_RESTART
SYSTEM_TOMBSTONE
data_app_strictmode
|
String[] |
logcatArguments
Arguments to be passed to the logcat command line.
|
boolean |
logcatFilterByPid
Set this to true if you want to include only logcat lines related to your Application process.
|
boolean |
logcatReadNonBlocking
Set this to true if you want to read logcat lines in a non blocking way for your thread.
|
boolean |
parallel
Allow parallel collection.
|
ReportField[] |
reportContent
Redefines the list of
ReportField s collected and sent in your reports. |
StringFormat |
reportFormat
Format in which the report should be sent
|
Class<? extends ReportSenderFactory>[] |
reportSenderFactoryClasses
Deprecated.
register with plugin loading instead
|
int |
resReportSendFailureToast
Toast shown when report sending fails
|
int |
resReportSendSuccessToast
Toast shown when a report is sent successfully
|
Class<? extends RetryPolicy> |
retryPolicyClass
Implement a custom
RetryPolicy to decide if a failed report should be resent or not. |
boolean |
sendReportsInDevMode
Set this to false if you want to disable sending reports in development mode.
|
String |
sharedPreferencesName
Name of the SharedPreferences that will host ACRA settings which you can make accessible to your users through a preferences screen:
ACRA.PREF_DISABLE_ACRA or ACRA.PREF_ENABLE_ACRA
ACRA.PREF_ALWAYS_ACCEPT
ACRA.PREF_ENABLE_DEVICE_ID
ACRA.PREF_ENABLE_SYSTEM_LOGS
Default is to use the application default SharedPreferences, as retrieved with PreferenceManager.getDefaultSharedPreferences(android.content.Context) |
boolean |
stopServicesOnCrash
If you have services which might crash on startup android will try to restart them indefinitely.
|
@NonNull public abstract String sharedPreferencesName
ACRA.PREF_DISABLE_ACRA
or ACRA.PREF_ENABLE_ACRA
ACRA.PREF_ALWAYS_ACCEPT
ACRA.PREF_ENABLE_DEVICE_ID
ACRA.PREF_ENABLE_SYSTEM_LOGS
PreferenceManager.getDefaultSharedPreferences(android.content.Context)
public abstract boolean includeDropBoxSystemTags
@NonNull public abstract String[] additionalDropBoxTags
public abstract int dropboxCollectionMinutes
@NonNull public abstract String[] logcatArguments
Arguments to be passed to the logcat command line. Default is { "-t", "100", "-v", "time" } for:
logcat -t 100 -v time
Do not include -b arguments for buffer selection, include ReportField.EVENTSLOG
and ReportField.RADIOLOG
in reportContent()
to activate alternative logcat buffers reporting.
They will use the same other arguments as those provided here.
@NonNull public abstract ReportField[] reportContent
Redefines the list of ReportField
s collected and sent in your reports.
You can also use this property to modify fields order in your reports.
The default list is ACRAConstants.DEFAULT_REPORT_FIELDS
public abstract boolean deleteUnapprovedReportsOnApplicationStart
Silent and Toast reports are automatically approved. Dialog and Notification reports require explicit approval by the user before they are sent.
On application restart the user is prompted with approval for one unsent report. So you generally don't want to accumulate unapproved reports, otherwise you will prompt them multiple times.
If this is set to true then all unapproved reports bar one will be deleted on application start. The last report is always retained because that is the report that probably just happened.
@Deprecated public abstract boolean deleteOldUnsentReportsOnApplicationStart
public abstract boolean alsoReportToAndroidFramework
@NonNull public abstract String[] additionalSharedPreferences
SharedPreferences
identifier Strings if you use others than your application's default. They will be added to the ReportField.SHARED_PREFERENCES
field.public abstract boolean logcatFilterByPid
public abstract boolean logcatReadNonBlocking
public abstract boolean sendReportsInDevMode
@NonNull public abstract String[] excludeMatchingSharedPreferencesKeys
SharedPreferences
key to exclude KV pairs from the collected SharedPreferences.
This allows you to exclude sensitive user data like passwords from being collected.@NonNull public abstract String[] excludeMatchingSettingsKeys
Settings.System
, Settings.Secure
and Settings.Global
key to exclude KV pairs from being collected.
This allows you to exclude sensitive data from being collected.@NonNull public abstract Class buildConfigClass
@Deprecated @NonNull public abstract Class<? extends ReportSenderFactory>[] reportSenderFactoryClasses
ReportSenderFactory
s with which to construct the ReportSender
s that will send the crash reports.@NonNull public abstract String applicationLogFile
ReportField.APPLICATION_LOG
to set the path/name of your application log file.public abstract int applicationLogFileLines
ReportField.APPLICATION_LOG
to set the number of latest lines of your application log file to be collected.
Default value is 100.@NonNull public abstract Directory applicationLogFileDir
ReportField.APPLICATION_LOG
to set the root for the path provided in applicationLogFile()
@NonNull public abstract Class<? extends RetryPolicy> retryPolicyClass
RetryPolicy
to decide if a failed report should be resent or not.public abstract boolean stopServicesOnCrash
@NonNull public abstract String[] attachmentUris
ACRA contains a file provider under the following Uri:
content://[applicationId].acra/[Directory]/[Path]
where [applicationId]
is your application package name, [Directory]
is one of the enum constants in Directory
in lower case and [Path]
is the relative path to the file in that directory
e.g. content://org.acra.test.acra/files/thisIsATest.txt
@NonNull public abstract Class<? extends AttachmentUriProvider> attachmentUriProvider
attachmentUris()
configuration at runtime instead of compile time.@StringRes public abstract int resReportSendSuccessToast
@StringRes public abstract int resReportSendFailureToast
@NonNull public abstract StringFormat reportFormat


2017-31-07
last modified: 2022-12-16
== !
API: acronym for Application Programming Interface. An API is the way to make software programs “easy to plug and share” with other programs.
An API is simply a group of rules (you can also call it a convention, or an agreement…) which programmers follow when writing the part of their code which is in charge of communicating with other software. These rules are then published (on a webpage for example), so that anyone who needs to connect to the program can learn what rules to follow.
Is an API simply a way to write code to interface with other programs? Yes. Why the fuss then? Having conventions on how to write a software so that somebody can plug it to its own software is one thing. APIs as an aspect of software design is a classic topic in computer science, but we are not concerned with this here.
APIs we are going to discuss are about communication between distant computers, in a business context. To understand better their business relevance, it is useful to recall a brief history of APIs:
Companies which need to exchange data is nothing new. Manufacturers, retailers, banks, … they need to exchange information at regular interval.
Sending invoices, receiving receipts for merchandise, and many other administrative records generated in the course of business.
These receipts, invoices… can be printed and mailed (this solution still exists of course).
With informatics developing in the 1970s and 1980s, a new system emerged: the exchange of information via computers: Electronic Data Interchange.
EDI EDI - Eletronic Data Interchange is not an exchange of file attachments in emails or via a file transfer on a website, because emails and websites did not exist yet! (emails and the Web were adopted by firms in the late 1990s).
Instead, exchanging data via EDI consisted in using complex electronic tools (like the fax but even more complicated) because:
each industry has its own protocol to exchange data (one protocol for logistics, one for payments, one for this or that retailer chain, etc.)
you need a dedicated device or software for each EDI protocol, and these are not given for free
EDI protocols can vary from one country to another
EDI protocols are controlled by industry associations which do not adopt innovation quickly
EDI protocols created "closed systems": a company A can connect to company B via an EDI only if the two have a pre-agreement to use this EDI.
To summarize: EDIs are fragmented, complicated to implement, slow to evolve, expensive and restricts the communication to a "club" of partners who agreed to use it.
EDIs still exist, especially in large B2B industries like transportation, but it lost in popularity in the wider economy because… APIs have arrived.
In the late 1990s and early 2000s, Internet and the World Wide Web expanded dramatically. More and more servers in different parts of the world needed to exchange data with each other, and this required to use interfaces more convenient than EDIs.
It became increasingly convenient to define simple and universal conventions that everyone could learn and follow to standardize these exchanges, for free and easily. That is what web APIs do. They are also often called:
API for short
web services
REST API (see below for this last one).
A web API extends the logic of the APIs we have seen in the beginning of this document, to software communicating via the web. To recall, an API is a convention followed when writing a software, making this software available to other software.
Note | Example: the API of Microsoft PowerPoint enables the import of Excel tables in pptx documents, because the API of Powerpoint plugs to the API of Excel. In this example Excel and Powerpoint are supposed to be installed on the same computer of course! |
A Web API is an API which enables two pieces of software to communicate, via Internet. They do not need to be installed on the same computer.
Unlike an EDI, a web API drops any industry-specific concern. Web APIs are just a convention to send and receive data over the Internet, without any saying on the content of the data.
The data sent and received can be invoices, webpages, train schedules, audio, video… whatever. Contrary to an EDI, a company creating a web API can choose to leave its access open (remember that EDIs need the two parties to have a pre-established agreement).
So that a potential client interested in using the web API of a company can set it up in a couple of clicks, instead of waiting weeks or months before a contract is signed and the EDI is setup.
Warning | Saying that APIs are open does not mean an absence of security: communication through APIs can easily be identified and encrypted, as needed. |
Two popular web API conventions emerged in the 1990s and competed for popularity:
REST APIs became ultimately the most widely adopted, because it uses the same simple principles that webpages use to be transferred over the Internet (the "http" protocol that you see in web page addresses). This is why APIs are often called "REST APIs, presented in this pedagogical video".
In 2000-2010, it became increasingly easy and natural to adopt the REST convention to make one’s software and data available to another computer. This simple evolution to ease interoperability had immense effects:
An API transforms a closed software into something that can be plugged to anything other computer or object, as long as it is connected to the Internet.
For instance, APIs were a key factor of success for SalesForce in the early 2000s. SalesForce, created in 1999, has a revenue of US$8.39 billion in 2017:
SalesForce developed a CRM as a SaaS where features of the CRM were exposed as APIs (meaning, these features could be plugged to external apps via the REST protocol).
SalesForce created a PaaS to host apps that could plug to the SalesForce CRM via the APIs developed by SalesForce. This platform is called Force.com and external developers can put their apps there, as long as they are compatible with the SalesForce API.
SalesForce takes a commission on the sales made by these third party apps hosted on Force.com, but more importantly, the platform creates an ecosystem of apps and developers around the SalesForce products which makes it hard for a customer company to switch to a different product.
Thanks to API it is now easier to add software blocks together and create new apps, even if these software blocks originate from different countries, industries, big and small.
As an extreme example: the Australian Victoria Police deployed a project for the recognition of stolen vehicles through the video recognition of licence plates on cars passing in the street (stolen vehicles get their license plates immediately recognized). This is a $86,000,000 project. An individual actually replicated this project with just 57 lines of code and a dashcam. How so? Just because he could use existing software for licence plate recognition, available as an API, instead of re-developing this by himself.
Another example: Peter Levels demonstrated the potential of APIs by building a "Luggage delivery service" just with existing apps connected together via their APIs. Without a line of code:
This service is designed by organizing several sub-services, which coordinate by communicating via their APIs.
How does communication work? Who "orchestrates" these services? Peter uses Zappier, a service whose role is to make these APIs communicate with each other. Beyond these striking examples, the lessons to be learned are:
more and more services are available via API. Do not reinvent the wheel, just use the APIs.
coordinating multiple APIs allows you to create entirely new services (not just: "manage my emails by API")
services like Zappier allow coordination / communication between APIs, but it also favors automation.
Companies and public organization own many datasets of great business interest. The use of these datasets can be free (for small projects and NGOs) or monetized if the user is an enterprise.
Without APIs, datasets can be made publicly available as docs (eg, Excel spreadsheets) to download but this is not practical (try downloading something like all_train_schedules_2000_to_2017.xls
!).
Let’s take the example of a transportation company like French SNCF which finds it interesting to publish station names, train schedules, real time information on train traffic, etc. because it could be used by other companies to build new services : how can it do it?
The data is on a server of SNCF
SNCF adds an API and its documentation, making the data available to developers able to connect to APIs, which is a basic skill in software development.
Entrepreneurs and programmers in general will be able to access the data via the API and use it, creating new services based on this train information.
Open data designates this movement to make datasets available to a broad audience, and web APIs have been a key technological ingredient in this movement.
A company can create its own APIs to "project" its services farther and stronger than just the "web page" interface. When is it a good idea to do that?
Here we must brainstorm, with two benchmarks to keep in mind. These examples are taken from Pieter Levels, a Dutch entrepreneur who specializes in creating web platforms for remote workers. He created:
Pieter Levels has implemented APIs so that users can access ("consume") these two services, with very different results:
The access of NomadList by API, without control, has resulted in siphoning its data by competitors who used it to develop copycats. (read the tweets announcing the opening of the API and its closing).
Access to RemoteOK ads by an API allows third-party platforms to integrate the RemoteOK ad catalog with their own: it amounts to free and large-scale referencing, which increases the likelihood of an ad finding a candidate (read again the tweet that announces the opening of the API).
The screenshot below summarizes the contrast between the two situations: although in both cases it involves opening its data via an API. Between NomadList and RemoteOK, the results are opposite:
Product managers must have a fine appreciation of the uses that the opening of an API will stimulate. One of the most virtuous effects is that of a "sound box": by reusing our content for their own purposes, the users of the API will unwittingly promote our content, which reinforces the efficiency of our product.
To discover new APIs, or to make your APIs easier to discover, the most well known place is the website "Programmable Web" (see also apis.io). Searching on this website, you will find APIs providing business services, or APIs of a fun and odd sort.
Still, many APIs are not listed on this website, and a google search for "info I need + API" is also a good way to find if the API you need exists. Interested in whale sightings? There is an API for that.
APIs have become central to the economy. As a result, a large number of services associated to APIs have developed to cater for all the needs of companies that use them:
how to create an API
how to manage the documentation of a large number of APIs
how to connect a wide variety of APIs
how to control and audit the security of APIs
how to monetize and API…
→ Many large firms and startups now specialize in all these domains of activity. This is the landscape of the main companies active in the API industry:
API Business Models: 20 models in 20 minutes (🕒 20 min read).
An introduction to APIs: a complete course for real beginners. A short online course, just a bit technical, on APIs. (🕒 4 hours).
Find references for this lesson, and other lessons, here.
Discover my other courses in data / tech for business or get in touch via Twitter: seinecle www.twitter.com/seinecle[seinecle] www.twitter.com/seinecle[seinecle] et in touch via Twitter: @seinecle ter.com/seinecle[@seinecle] ter.com/seinecle[@seinecle] ter.com/seinecle[@seinecle] ter.com/seinecle[@seinecle] ter.com/seinecle[@seinecle] ter.com/seinecle[@seinecle] ter.com/seinecle[@seinecle] ter.com/seinecle[@seinecle] ter.com/seinecle[@seinecle] ter.com/seinecle[@seinecle]


Bitshares-Core
3.0.0
BitShares blockchain implementation and command-line interface software
- a -
account_object_type :
graphene::chain
asset_object_type :
graphene::chain
- b -
balance_object_type :
graphene::chain
base_object_type :
graphene::chain
- c -
call_order_object_type :
graphene::chain
charge_market_fee :
graphene::chain
committee_fed_asset :
graphene::chain
committee_member_object_type :
graphene::chain
custom_object_type :
graphene::chain
- d -
disable_confidential :
graphene::chain
disable_force_settle :
graphene::chain
- f -
fba_accumulator_id_blind_transfer :
graphene::chain
fba_accumulator_id_count :
graphene::chain
fba_accumulator_id_transfer_from_blind :
graphene::chain
fba_accumulator_id_transfer_to_blind :
graphene::chain
force_settlement_object_type :
graphene::chain
- g -
global_settle :
graphene::chain
- h -
htlc_object_type :
graphene::chain
- i -
impl_account_balance_object_type :
graphene::chain
impl_account_statistics_object_type :
graphene::chain
impl_account_transaction_history_object_type :
graphene::chain
impl_asset_bitasset_data_type :
graphene::chain
impl_asset_dynamic_data_type :
graphene::chain
impl_blinded_balance_object_type :
graphene::chain
impl_block_summary_object_type :
graphene::chain
impl_budget_record_object_type :
graphene::chain
impl_buyback_object_type :
graphene::chain
impl_chain_property_object_type :
graphene::chain
impl_collateral_bid_object_type :
graphene::chain
impl_dynamic_global_property_object_type :
graphene::chain
impl_fba_accumulator_object_type :
graphene::chain
impl_global_property_object_type :
graphene::chain
impl_reserved0_object_type :
graphene::chain
impl_special_authority_object_type :
graphene::chain
impl_transaction_object_type :
graphene::chain
impl_witness_schedule_object_type :
graphene::chain
implementation_ids :
graphene::chain
- l -
limit_order_object_type :
graphene::chain
- n -
null_object_type :
graphene::chain
- o -
OBJECT_TYPE_COUNT :
graphene::chain
operation_history_object_type :
graphene::chain
override_authority :
graphene::chain
- p -
proposal_object_type :
graphene::chain
protocol_ids :
graphene::chain
- r -
relative_protocol_ids :
graphene::chain
- t -
transfer_restricted :
graphene::chain
- v -
vesting_balance_object_type :
graphene::chain
- w -
white_list :
graphene::chain
withdraw_permission_object_type :
graphene::chain
witness_fed_asset :
graphene::chain
witness_object_type :
graphene::chain
worker_object_type :
graphene::chain
Generated on Wed Mar 27 2019 15:04:33 for Bitshares-Core by
1.8.13


Author: Jarle Elshaug
Validated through IdP's:
Latest news:
With SCIM Gateway we could do user management by using REST based SCIM protocol. Gateway will then translate incoming SCIM requests and expose CRUD functionality (create, read, update and delete user/group) towards destinations using endpoint specific protocols. Gateway do not require SCIM to be used, it's also an API Gateway that could be used for other things than user provisioning.
SCIM Gateway is a standalone product, however this document shows how the gateway could be used by products like CA Identity Manager.
Using CA Identity Manager, we could setup one or more endpoints of type SCIM pointing to the gateway. Specific ports could then be used for each type of endpoint, and the SCIM Gateway would work like a "CA Connector Server" communicating with endpoints.
Instead of using IM-SDK for building our own integration for none supported endpoints, we can now build new integration based on SCIM Gateway plugins. SCIM Gateway works with IM as long as IM supports SCIM.
SCIM Gateway is based on the popular asynchronous event driven framework Node.js using JavaScript. It is firewall friendly using REST webservices. Runs on almost all operating systems, and may load balance between hosts (horizontal) and cpu's (vertical). Could even be uploaded and run as a cloud application.
Following example plugins are included:
Loki (NoSQL Document-Oriented Database)
Gives a SCIM endpoint located on SCIM Gateway
Demonstrates user provisioning towards document-oriented database
Using LokiJS for a fast, in-memory document-oriented database (much like MongoDB/PouchDB)
Default gives two predefined test users loaded using in-memory only (no persistence)
Setting {"persistence": true}
gives persistence file store (no test users)
Example of a fully functional SCIM Gateway plugin
RESTful (REST Webservice)
Demonstrates user provisioning towards REST-Based endpoint
Using plugin "Loki" as a REST endpoint
Forwardinc (SOAP Webservice)
Demonstrates user provisioning towards SOAP-Based endpoint
Using endpoint Forwardinc that comes with CA IM SDK (SDKWS) - wiki.ca.com
Shows how to implement a highly configurable multi tenant or multi endpoint solution using baseEntity
parameter
MSSQL (MSSQL Database)
Demonstrates user provisioning towards MSSQL database
SAP HANA (SAP HANA Database)
Demonstrates SAP HANA specific user provisioning
Azure AD (REST Webservices)
Azure AD user provisioning including Azure license management (App Service plans) e.g. Office 365
Using Microsoft Graph API
Using customized SCIM attributes according to Microsoft Graph API
Includes CA ConnectorXpress metafile for creating CA IM "Azure - ScimGateway" endpoint type
API (REST Webservices)
Demonstrates API Gateway/plugin functionality using post/put/patch/get/delete
None SCIM plugin, becomes what you want it to become.
Endpoint complexity could be put in this plugin, and client could instead communicate through Gateway using your own simplified REST specification.
One example of usage could be creation of tickets in ServiceDesk/HelpDesk and also the other way, closing a ticket could automatically approve/reject corresponding workflow in Identity Manager.
Node.js is a prerequisite and have to be installed on the server.
Download the windows installer (.msi 64-bit) and install using default options.
Open a command window (run as administrator)
Create your own package directory e.g. C:\my-scimgateway and install SCIM Gateway within this package.
mkdir c:\my-scimgateway
cd c:\my-scimgateway
npm init -y
npm install scimgateway --save
Please ignore any error messages unless soap WSSecurityCert functionality is needed in your custom plugin code. Module soap installation of optional dependency 'ursa' that also includes 'node-gyp' then needs misc. prerequisites to bee manually installed.
c:\my-scimgateway will now be <package-root>
index.js, lib and config directories containing example plugins have been copied to your package from the original scimgateway package located under node_modules.
If internet connection is blocked, we could install on another machine and copy the scimgateway folder.
node c:\my-scimgateway
Start a browser (note, IE does not support JSON content)
http://localhost:8880/ping
=> Health check with a "hello" response
http://localhost:8880/Users
http://localhost:8880/Groups
or
http://localhost:8880/Users?attributes=userName
http://localhost:8880/Groups?attributes=displayName
=> Logon using gwadmin/password and two users / four groups should be listed
http://localhost:8880/Users/bjensen
http://localhost:8880/Groups/Admins
=> Lists all attributes for specified user/group
"Ctrl + c" to stop the SCIM Gateway
For more functionality using browser (post/patch/delete) a REST extension/add-on is needed.
Not needed after a fresh install
Check if newer versions are available:
cd c:\my-scimgateway
npm outdated
Lists current, wanted and latest version. No output on screen means we are running the latest version.
Upgrade to latest minor version:
cd c:\my-scimgateway
npm install scimgateway
Note, always backup/copy C:\my-scimgateway before upgrading. Custom plugins and corresponding configuration files will not be affected.
To force a major upgrade (version x.*.* => y.*.*) that will brake compability with any existing custom plugins, we have to include the @latest
suffix in the install command: npm install scimgateway@latest
index.js defines one or more plugins to be started. We could comment out those we do not need. Default configuration only starts the loki plugin.
const loki = require('./lib/plugin-loki')
// const restful = require('./lib/plugin-restful')
// const forwardinc = require('./lib/plugin-forwardinc')
// const mssql = require('./lib/plugin-mssql')
// const saphana = require('./lib/plugin-saphana') // prereq: npm install hdb --save
// const api = require('./lib/plugin-api')
// const azureAD = require('./lib/plugin-azure-ad')
Each endpoint plugin needs a JavaScript file (.js) and a configuration file (.json). They both must have the same naming prefix. For SAP Hana endpoint we have:
lib\plugin-saphana.js
config\plugin-saphana.json
Edit specific plugin configuration file according to your needs.
Below shows an example of config\plugin-saphana.json
{
"scimgateway": {
"port": 8884,
"localhostonly": false,
"scim": {
"version": "1.1",
"customSchema": null,
"customUniqueAttrMapping" : {
"userName" : null,
"displayName": null
}
},
"loglevel": {
"file": "debug",
"console": "error"
},
"auth": {
"basic": {
"username": "gwadmin",
"password": "password"
},
"bearer": {
"token": null,
"jwt": {
"azure": {
"tenantIdGUID": null
},
"standard": {
"secret": null,
"publicKey": null,
"options": {
"issuer": null
}
}
}
}
},
"certificate": {
"key": null,
"cert": null,
"ca": null,
"pfx": {
"bundle": null,
"password": null
}
},
"emailOnError": {
"smtp": {
"enabled": false,
"host": null,
"port": 587,
"proxy": null,
"authenticate": true,
"username": null,
"password": null,
"sendInterval": 15,
"to": null,
"cc": null
}
}
},
"endpoint": {
"host": "hostname",
"port": 30015,
"username": "username",
"password": "password",
"saml_provider": "saml_provider_name"
}
}
Configuration file have two main JSON objects: scimgateway
and endpoint
Definitions in scimgateway
object have fixed attributes but values can be modified. This object is used by the core functionality of the SCIM Gateway.
Definitions in endpoint
object are customized according to our plugin code. Plugin typically need this information for communicating with endpoint
port - Gateway will listen on this port number. Clients (e.g. Provisioning Server) will be using this port number for communicating with the gateway. For endpoint the port is the port number used by plugin for communicating with SAP Hana.
localhostonly - true or false. False means gateway accepts incoming requests from all clients. True means traffic from only localhost (<IP_ADDRESS>) is accepted (gateway must then be installed on the CA Connector Server).
scim.version - "1.1" or "2.0". Default is "1.1". For Azure AD as IdP "2.0" should be used.
scim.customSchema - filename of JSON file located in <package-root>\config\schemas
containing custom schema attributes, see configuration notes
scim.customUniqueAttrMapping - Option for replacing mandatory userName/displayName if IdP use other attributes
scim.customUniqueAttrMapping.userName - attribute replacing userName (User object)
scim.customUniqueAttrMapping.displayName - attribute replacing displayName (Group object)
loglevel.file - error, info or debug. Output to logfile logs\plugin-saphana.log
loglevel.console - error, info or debug. Output to stdout and errors to stderr.
auth - Contains one or more authentication/authorization methods used by clients for accessing gateway. Methods are disabled by setting corresponding attributes to null
auth.basic - Basic Authentication with username/password. Note, we set a clear text password and when gateway is started password will become encrypted and updated in the configuration file.
auth.bearer - Contains misc bearer token methods for authorization of client requests.
auth.bearer.token - Shared token/secret (supported by Azure). Clear text value will become encrypted when gateway is started.
auth.bearer.jwt - Contains misc JSON Web Token (JWT) methods for authorization.
auth.bearer.jwt.azure - JWT used by Azure SyncFabric. tenantIdGUID must be set to Azure Active Directory Tenant ID.
auth.bearer.jwt.standard - Standard JWT. Using secret or publicKey for signature verification. publicKey should be set to the filename of public key or certificate pem-file located in <package-root>\config\certs
. Clear text secret will become encrypted when gateway is started. options.issuer is mandatory. Other options may also be included according to jsonwebtoken npm package definition.
certificate - If not using SSL/TLS certificate, set "key", "cert" and "ca" to null. When using SSL/TLS, "key" and "cert" have to be defined with the filename corresponding to the primary-key and public-certificate. Both files must be located in the <package-root>\config\certs
directory e.g:
"certificate": {
"key": "key.pem",
"cert": "cert.pem",
"ca": null
}
Example of how to make a self signed certificate:
openssl req -nodes -newkey rsa:2048 -x509 -sha256 -days 3650 -keyout key.pem -out cert.pem -subj "/O=Testing/OU=SCIM Gateway/CN=<FQDN>" -config "<path>\openssl.cnf"
<FQDN>
is Fully Qualified Domain Name of the host having SCIM Gateway installed
Note, when using CA Provisioning, the "certificate authority - CA" also have to be imported on the Connector Server. For self-signed certificate CA and the certificate (public key) is the same.
PFX / PKCS#12 bundle can be used instead of key/cert/ca e.g:
"pfx": {
"bundle": "certbundle.pfx",
"password": "password"
}
Note, we should normally use certificate (https) for communicating with SCIM Gateway unless we install ScimGatway locally on the manager (e.g. on the CA Connector Server). When installed on the manager, we could use http://localhost:port
or http://<IP_ADDRESS>:port
which will not be passed down to the data link layer for transmission. We could then also set {"localhostonly": true}
emailOnError - Contains configuration for sending error notifications by email. Note, only the first error will be sent until sendInterval have passed
emailOnError.smtp.cc - Comma separated list of cc email addresses
endpoint - Contains endpoint specific configuration according to our plugin code.
SEED
will override default password seeding logic.
"process.env.<ENVIRONMENT>"
where <ENVIRONMENT>
is the environment variable used. E.g. scimgateway.port could have value "process.env.PORT", then using environment variable PORT.All configuration can be set based on corresponding JSON-content in external file using plugin name as parent JSON object (supports also dot notation). Syntax will then be "process.file.<path>"
where <path>
is the file used. E.g. endpoint.password could have value "process.file./var/run/vault/secrets.json"
Example:
{
"scimgateway": {
...
"port": "process.env.PORT",
...
"loglevel": {
"file": "process.env.LOG_LEVEL_FILE",
...
"auth": {
"basic": {
"username": "process.file./var/run/vault/secrets.json",
"password": "process.file./var/run/vault/secrets.json",
...
},
"endpoint": {
...
"username": "process.file./var/run/vault/secrets.json",
"password": "process.file./var/run/vault/secrets.json",
...
}
}
secrets.json for plugin-forwardinc - example #1:
{
"plugin-forwardinc": {
"scimgateway": {
"auth": {
"basic": {
"username": "gwadmin",
"password": "password"
}
}
},
"endpoint": {
"username": "superuser",
"password": "secret"
}
}
}
secrets.json for plugin-forwardinc - example #2 (dot notation):
{
"plugin-forwardinc.scimgateway.auth.basic.username": "gwadmin",
"plugin-forwardinc.scimgateway.auth.basic.password": "password",
"plugin-forwardinc.endpoint.username": "superuser",
"plugin-forwardinc.endpoint.password": "secret"
}
Custom schema attributes can be added by plugin configuration scim.customSchema
having value set to filename of a JSON schema-file located in <package-root>/config/schemas
e.g:
"scim": {
"version": "1.1",
"customSchema": "plugin-forwardinc-schema.json"
},
JSON file have following syntax:
[
{
"name": "User",
"attributes": [...]
},
{
"name": "Group",
"attributes": [...]
}
]
Where array attributes
contains custom attribute objects according to SCIM 1.1 or 2.0 spesification e.g:
"attributes": [
{
"name": "musicPreference",
"type": "string",
"multiValued": false,
"description": "Music Preferences",
"readOnly": false,
"required": false,
"caseExact": false
},
{
"name": "populations",
"type": "complex",
"multiValued": true,
"multiValuedAttributeChildName": "population",
"description": "Population array",
"readOnly": false,
"required": false,
"caseExact": false,
"subAttributes": [
{
"name": "value",
"type": "string",
"multiValued": false,
"description": "Population value",
"readOnly": false,
"required": true,
"caseExact": false
}
]
}
]
Note, custom schema attributes will be merged into core:1.0/2.0 schema, and names must not conflict with standard SCIM attribute names.
Gateway can now be started from a command window running in administrative mode
3 ways to start:
node c:\my-scimgateway
node c:\my-scimgateway\index.js
<package-root>node .
Ctrl+c to stop
Start Windows Task Scheduler (taskschd.msc), right click on "Task Scheduler Library" and choose "Create Task"
General tab:
-----------
Name = SCIM Gateway
User account = SYSTEM
Run with highest privileges
Triggers tab:
-------------
Begin the task = At startup
Actions tab:
------------
Action = Start a program
Program/script = c:\Program Files\nodejs\node.exe
Arguments = c:\my-scimgateway
Settings - tab:
---------------
Stop the task if runs longer than = Disabled (greyed out)
Verification:
<pakage-root>\logs
On Linux systems we may also run SCIM Gateway as a Docker image (using docker-compose)
Docker Pre-requisites:
docker-ce
docker-compose
Install SCIM Gateway within your own package and copy provided docker files:
mkdir /opt/my-scimgateway
cd /opt/my-scimgateway
npm init -y
npm install scimgateway --save
cp ./config/docker/* .
docker-compose.yml <== Here is where you would set the exposed port and environment
Dockerfile <== Main dockerfile
DataDockerfile <== Handles volume mapping
docker-compose-debug.yml <== Debugging
Create a scimgateway user on your Linux VM.
adduser scimgateway
Create a directory on your VM host for the scimgateway configs:
mkdir /home/scimgateway/config
Copy your updated configuration file e.g. /opt/my-scimgateway/config/plugin-loki.json to /home/scimgateway/config. Use scp to perform the copy.
NOTE: /home/scimgateway/config is where all important configuration and loki datastore will reside outside of the running docker container. If you upgrade scimgateway you won't lose your configurations and data.
Build docker images and start it up
docker-compose up --build -d
NOTE: Add the -d flag to run the command above detached.
Be sure to confirm that port 8880 is available with a simple http request
If using default plugin-loki and we have configured {"persistence": true}
, we could confirm scimgateway created loki.db:
su scimgateway
cd /home/scimgateway/config
ls loki.db
To list running containers information:
docker ps
To list available images:
docker images
To view the logs:
docker logs scimgateway
To execute command within your running container:
docker exec scimgateway <bash command>
To stop scimgateway:
docker-compose stop
To restart scimgateway:
docker-compose start
To debug running container (using Visual Studio Code):
docker-compose -f docker-compose.yml -f docker-compose-debug.yml up -d
Start Visual Studio Code and follow these debugging instructions
To upgrade scimgateway docker image (remove the old stuff before running docker-compose up --build):
docker rm scimgateway
docker rm $(docker ps -a -q); docker rmi $(docker images -q -f "dangling=true")
Using the CA Provisioning Manager we have to configure
Endpoint type = SCIM (DYN Endpoint)
SCIM endpoint configuration example for Loki plugin (plugin-loki)
Endpoint Name = Loki
User Name = gwadmin
Password = password
SCIM Authentication Method = HTTP Basic Authentication
SCIM Based URL = http://localhost:8880
or:
SCIM Based URL = http://localhost:8880/<baseEntity>
Username, password and port must correspond with plugin configuration file. For "Loki" plugin it will be config\plugin-loki.json
"SCIM Based URL" refer to the FQDN (or localhost) having SCIM Gateway installed. Portnumber must be included. Use HTTPS instead of HTTP if SCIM Gateway configuration includes certificates.
"baseEntity" is optional. This is a parameter used for multi tenant or multi endpoint solutions. We could create several endpoints having same base url with unique baseEntity. e.g:
http://localhost:8880/clientA
http://localhost:8880/clientB
Each baseEntity should then be defined in the plugin configuration file with custom attributes needed. Please see examples in plugin-forwardinc.json
IM 12.6 SP7 (and above) also supports pagination for SCIM endpoint (data transferred in bulks - endpoint explore of users). Loki plugin supports pagination. Other plugin may ignore this setting.
Create = POST http://example.com:8880/Users
(body contains the user information)
Update = PATCH http://example.com:8880/Users/<id>
(body contains the attributes to be updated)
Search/Read = GET http://example.com:8880/Users?userName eq
"userID"&attributes=<comma separated list of scim-schema defined attributes>
Search/explore all users:
GET http://example.com:8880/Users?attributes=userName
Delete = DELETE http://example.com:8880/Users/<id>
Discovery:
GET http://example.com:8880/ServiceProviderConfigs
Specification compliance, authentication schemes, data models.
GET http://example.com:8880/Schemas
Introspect resources and attribute extensions.
Note:
Get all users (explore):
select USER_NAME from SYS.USERS where IS_SAML_ENABLED like 'TRUE';
Get a specific user:
select USER_NAME, USER_DEACTIVATED from SYS.USERS where USER_NAME like '<UserID>';
Create User:
CREATE USER <UserID> WITH IDENTITY '<UserID>' FOR SAML PROVIDER <SamlProvider>;
Delete user:
DROP USER <UserID>;
Modify user (enable user):
ALTER USER <UserID> ACTIVATE;
Modify user (disable user):
ALTER USER <UserID> DEACTIVATE;
Postinstallation:
cd c:\my-scimgateway
npm install hdb --save
Only SAML users will be explored and managed
Supported template attributes:
Currently no other attributes needed. Trying to update other attributes will then give an error message. The SCIM Provisioning template should therefore not include any other global user attribute references.
SAP Hana converts UserID to uppercase. Provisioning use default lowercase. Provisioning template should therefore also convert to uppercase.
User Name = %$$TOUPPER(%AC%)%
Using plugin-azure-ad we could do user provisioning towards Azure AD including license management e.g. O365
For testing purposes we could get an Azure free account and in addition the free Office 365 for testing license management through Azure.
Azure AD prerequisites
Application needs to be member of "User Account Administrator" when running behalf of application rather than user
Edit index.js
Uncomment startup of plugin-azure-ad, other plugins could be comment out if not needed
const azureAD = require('./lib/plugin-azure-ad')
Edit plugin-azure-ad.json
Username
and password
used to connect the SCIM Gateway must be defined.
Update tenantIdGUID
, clientID
and clientSecret
according to Azure AD prerequisites configuration.
If using proxy, set proxy.host to "http://<FQDN-ProxyHost>:<port>"
e.g "http://proxy.mycompany.com:3128"
"endpoint": {
"entity": {
"undefined": {
"tenantIdGUID": "DomainName or DirectoryID (GUID)",
"clientId": "Application ID",
"clientSecret": "Generated application key value",
"proxy": {
"host": null,
"username": null,
"password": null
}
}
}
}
Note, clientSecret and any proxy.password will become encrypted in this file on the first Azure connection.
For multi-tenant or multi-endpoint support, we may add several entities:
"endpoint": {
"entity": {
"undefined": {
...
}
"clientA": {
...
}
"clientB": {
...
}
}
}
For additional details, see baseEntity description.
Note, we should normally use certificate (https) for communicating with SCIM Gateway unless we install gateway locally on the manager (e.g. on the CA Connector Server). When installed on the manager, we could use http://localhost:port
or http://<IP_ADDRESS>:port
which will not be passed down to the data link layer for transmission. We could then also set {"localhostonly": true}
For CA Provisioning, create endpoint type "Azure - ScimGateway"
index.js
plugin-azure-ad.json
must also be known Note, metafile "Azure - ScimGateway.xml" is based on CA "Azure - WSL7" with some minor adjustments like using Microsoft Graph API attributes instead of Azure AD Graph attributes.
Using the CA Provisioning Manager we have to configure
Endpoint type = Azure - ScimGateway (DYN Endpoint)
Endpoint configuration example:
Endpoint Name = Azure-AD-8881
User Name = gwadmin
Password = password
SCIM Authentication Method = HTTP Basic Authentication
SCIM Based URL = http://localhost:8881
or
SCIM Based URL = http://localhost:8881/<baseEntity>
For details, please see section "CA Identity Manager as IdP using SCIM Gateway"
Azure AD could do automatic user provisioning by synchronizing users towards SCIM Gateway, and gateway plugins will update endpoints.
Plugin configuration file must include SCIM Version "2.0" (scimgateway.scim.version) and either Bearer Token (scimgateway.auth.bearer.token) or Azure Tenant ID GUID (scimgateway.auth.bearer.jwt.azure.tenantIdGUID) or both:
scimgateway: {
"scim": {
"version": "2.0",
...
},
...
"auth": {
...
"bearer": {
"token": "shared-secret",
"jwt": {
"azure": {
"tenantIdGUID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
...
}
...
}
...
}
bearer.token
configuration must correspond with "Secret Token" defined in Azure AD
tenantIdGUID
configuration must correspond with Azure Active Directory Tenant ID
In Azure Portal:
Azure-Azure Active Directory-Enterprise Application-<My Application>-Provisioning-Secret Token
Note, when "Secret Token" is left blank, Azure will use JWT (tenantIdGUID)
Azure-Azure Active Directory-Properties-Directory ID
User mappings attributes between AD and SCIM also needs to be configured
Azure-Azure Active Directory-Enterprise Application-<My Application>-Provisioning-Mappings
Azure AD default SCIM attribute mapping for USER have:
externalId mapped to mailNickname (matching precedence #1)
userName mapped to userPrincipalName
SCIM Gateway accepts externalId (as matching precedence) instead of userName, but userName and externalId must be mapped to the same AD attribute
e.g:
externalId mapped to mailNickname (matching precedence #1)
userName mapped to mailNickname
or:
externalId mapped to userPrincipalName (matching precedence #1)
userName mapped to userPrincipalName
Azure AD default SCIM attribute mapping for GROUP have:
externalId mapped to displayName (matching precedence #1)
displayName mapped to mailNickname
SCIM Gateway accepts externalId (as matching precedence) instead of displayName, but displayName and externalId must then be mapped to the same AD attribute
e.g:
externalId mapped to displayName (matching precedence #1)
displayName mapped to displayName
Some notes related to Azure AD:
Azure Active Directory SCIM documentation
Use the "old Portal" for adding/creating your SCIM application. Adding an application using the "new Portal" will not give an OAuth/JWT compatible app - only bearer token (Secret Token) will be used. After the app have been registered (passing the "Test phase"), we could start using the "new Portal"
Azure AD do a regular check for a "none" existing user/group. This check seems to be a "keep alive" to verify connection.
Azure AD first checks if user/group exists, if not exist they will be created (no explore of all users like CA Identity Manager)
Deleting a user in Azure AD sends a modify user {"active":"False"}
which means user should be disabled. This logic is configured in attribute mappings. Standard SCIM "DELETE" method seems not to be used.
Gateway also works as an API Gateway when using url /api
or /<baseEntity>/api
Following methods for the none SCIM based api-plugin are supported:
GET /api
GET /api?queries
GET /api/{id}
POST /api + body
PUT /api/{id} + body
PATCH /api/{id} + body
DELETE /api/{id}
Please see example plugin: plugin-api.js
For JavaScript coding editor you may use Visual Studio Code
Preparation:
lib\plugin-loki.js
and config\plugin-loki.json
and rename both copies to your plugin name prefix e.g. plugin-mine.js and plugin-mine.json (for SOAP Webservice endpoint we might use plugin-forwardinc as a template) let mine = require('./lib/plugin-mine');
Now we are ready for custom coding by editing plugin-mine.js Coding should be done step by step and each step should be verified and tested before starting the next (they are all highlighted by comments in existing code).
Template used by CA Provisioning role should only include endpoint supported attributes defined in our plugin. Template should therefore have no links to global user for none supported attributes (e.g. remove %UT% from "Job Title" if our endpoint/code do not support title)
CA Provisioning using default SCIM endpoint do not support SCIM Enterprise User Schema Extension (having attributes like employeeNumber, costCenter, organization, division, department and manager). If we need these or other attributes not found in CA Provisioning, we could define our own by using the free-text "type" definition in the multivalue entitlements or roles attribute. In the template entitlements definition, we could for example define type=Company and set value to %UCOMP%. Please see plugin-forwardinc.js using Company as a multivalue "type" definition.
Using CA Connector Xpress we could create a new SCIM endpoint type based on the original SCIM. We could then add/remove attributes and change from default assign "user to groups" to assign "groups to user". There are also other predefined endpoints based on the original SCIM. You may take a look at "ServiceNow - WSL7" and "Zendesk - WSL7".
For project setup:
Using Connector Xpress based on the original SCIM endpoint.
Delete defaults:
Group - Associations - with User Account
User Account - Attributes - Group Membership
Create new attribute:
User Account - Attributes: Groups - Flexi DN - Multivalue - groups
Create User - Group associations:
User Account - Accociations - Direct association with = Group
User Account - Accociations - with Group
Note, "Include a Reverse Association" - not needed if we don't need Group object functionality e.g list/add/remove group members
User Attribute = Physical Attribute = Groups
Match Group = By Attribute = Name
Objects Must Exist
Use DNs in Attribute = deactivated (toggled off)
Include a Reverse Association (if needed)
Group Attribute = Virtual Attribute = User Membership
Match User Account = By Attribute = User Name
Note, groups should be capability attribute (updated when account is synchronized with template):
advanced options - Synchronized = enabled (toggled on)
Plugins should have following initialization:
// mandatory plugin initialization - start
const path = require('path')
let ScimGateway = null
try {
ScimGateway = require('scimgateway')
} catch (err) {
ScimGateway = require('./scimgateway')
}
let scimgateway = new ScimGateway()
let pluginName = path.basename(__filename, '.js')
let configDir = path.join(__dirname, '..', 'config')
let configFile = path.join(`${configDir}`, `${pluginName}.json`)
let config = require(configFile).endpoint
let validScimAttr = [] // empty array - all attrbutes are supported by endpoint
// add any external config process.env and process.file
config = scimgateway.processExtConfig(pluginName, config)
// mandatory plugin initialization - end
scimgateway.exploreUsers = async (baseEntity, attributes, startIndex, count) => {
let ret = {
"Resources": [],
"totalResults": null
}
...
return ret
}
<baseurl>/client1
gives baseEntity=client1)
scimgateway.exploreGroups = async (baseEntity, attributes, startIndex, count) => {
let ret = {
"Resources": [],
"totalResults": null
}
...
return ret
}
scimgateway.getUser = async (baseEntity, userName, attributes) => {
...
return userObj
}
Note, CA Provisioning use two types of "getUser"
1. Check if user exist: attributes=userName and/or id
2. Retrive user: attributes=list of all attributes
scimgateway.createUser = async (baseEntity, userObj) => {
...
return null
}
scimgateway.deleteUser = async (baseEntity, id) => {
...
return null
}
scimgateway.modifyUser = async (baseEntity, id, attrObj) => {
...
return null
}
scimgateway.getGroup = async (baseEntity, displayName, attributes) => {
...
return retObj
}
return retObj: retObj containing group displayName and id (+ members if using default "users are member of group")
eg. using default "users are member of group":
{"displayName":"Admins","id":"Admins","members":[{"value":"bjensen","display":"bjensen"]}
eg. using "groups are member of user":
{"displayName":"Admins","id":"Admins"}
If we do not support groups, callback(null, null)
scimgateway.getGroupMembers = async (baseEntity, id, attributes) => {
let arrRet = []
...
return arrRet
}
Retrieve all users for a spesific group WHEN "user member of group". This setting is CA IM default scim endpoint configuration. This means Group having multivalue attribute members containing userName.
return ret:
ret.Resources = array to be filled with objects containing groups with current user as member
e.g [{"displayName":"Admins","members": [{ "value": bjensen}]}, {"displayName":"Employees", "members": [{ "value": bjensen}]}]
ret.totalResults = if supporting pagination attribute should be set to the total numbers of elements (group members) at the endpoint else set to null
If we do not support groups (or "user member of group"), callback(null, [])
scimgateway.getGroupUsers = async (baseEntity, groupName, attributes) => {
let arrRet = []
...
return arrRet
}
Retrieve all users for a spesific group WHEN "group member of user". This means user having multivalue attribute groups containing value GroupName
return arrRet: arrRet = array containing the userName's' e.g: [{"userName", "bjensen"}, {"userName", "jsmith"}]
If we do not support groups (or "group member of user"), then return []
scimgateway.createGroup = async (baseEntity, groupObj) => {
...
return null
})
scimgateway.deleteGroup = async (baseEntity, id) => {
...
return null
}
scimgateway.modifyGroupMembers = async (baseEntity, id, members) => {
...
return null
}
Installation gives error messages related to the module soap optional dependency to 'ursa' that also includes 'node-gyp'. These error messages can be ignored unless soap WSSecurityCert functionality is needed in custom plugin code.
Importing "certificate authority - CA" on the CA Connector Server gives a "Failure" message. After restarting the connector it will show certificate have been installed and HTTPS communication works fine.
MIT © Jarle Elshaug
[Fix]
Thanks to Luca Moretto
[Fix]
[Fix]
url.parse
[Fix]
err.name = 'DuplicateKeyError'
) when failing on creating a duplicate user[ENHANCEMENT]
[Fix]
err.name = 'DuplicateKeyError'
now gives correct status code 409 instead of defult 500 (see plugin-loki.js)
[Fix]
loglevel.colorize
is not needed)[Fix]
[ENHANCEMENT]
[Fix]
[ENHANCEMENT]
scim.customSchema
having value set to filename of a JSON schema-file located in <package-root>/config/schemas
[UPGRADE]
Configurationfiles for custom plugins should be changed
old syntax:
"scimversion": "1.1",
new syntax:
"scim": {
"version": "1.1",
"customSchema": null
},
Note, "1.1" is default, if using "2.0" the new syntax must be used.
[Fix]
[MAJOR]
[UPGRADE]
Note, this is a major upgrade (^1.x.x => ^2.x.x) and will brake compatibility with any existing custom plugins. To force a major upgrade, suffix @latest
must be include in the npm install command, but it's recommended to do a fresh install and copy any custom plugins instead of upgrading an existing package
cd c:\my-scimgateway
npm install scimgateway@latest
Custom plugins needs some changes (please see included example plugins)
scimgateway.on(xxx, function (..., callback)
replaced with scimgateway.xxx = async (...)
returning a result or throwing an errordoRequest
method having endpoint failover logic through array baseUrls/baseServiceEndpoints
defined in corresponding plugin configuration file.
attributes
included in exploreUsers and exploreGroups method[Fix]
[UPGRADE]
getUser
and getGroup
methods needs to be updated. If user/group not found then return callback(null, null)
instead of callback(err)
[Fix]
[ENHANCEMENT]
[UPGRADE]
Configurationfiles for custom plugins should be changed
old syntax:
loglevel: "debug"
new syntax:
"loglevel": {
"file": "debug",
"console": "error",
"colorize": true
}
[Fix]
[Fix]
[UPGRADE]
[Fix]
[Fix]
[Fix]
[ENHANCEMENT]
[ENHANCEMENT]
[UPGRADE]
[ENHANCEMENT]
[Fix]
[ENHANCEMENT]
[Fix]
Thanks to ywchuang
[ENHANCEMENT]
[Fix]
[Fix]
[Fix]
[FIX]
[ENHANCEMENT]
[UPGRADE]
Method getGroupMembers
must be updated for all custom plugins
Replace:
scimgateway.on('getGroupMembers', function (baseEntity, id, attributes, startIndex, count, callback) {
...
let ret = {
'Resources' : [],
'totalResults' : null
}
...
ret.Resources.push(userGroup)
...
callback(null, ret)
With:
scimgateway.on('getGroupMembers', function (baseEntity ,id ,attributes, callback) {
...
let arrRet = []
...
arrRet.push(userGroup)
...
callback(null, arrRet)
[ENHANCEMENT]
[ENHANCEMENT]
[UPGRADE]
config/plugin-xxx.json
needs to be updated regarding the new scimgateway.auth
section:
[ENHANCEMENT]
config\docker
includes docker configuration examples[ENHANCEMENT]
SEED
overrides default password seeding
"process.env.XXX"
lets environment variable XXX define the port
[UPGRADE]
config/plugin-xxx.json
needs to be updated:
[ENHANCEMENT]
plugin-loki
plugin-testmode
[UPGRADE]
lib/plugin-testmode.js
and config/plugin-testmode.json
[Fix]
[ENHANCEMENT]
[Fix]
[ENHANCEMENT]
[UPGRADE]
[Fix]
[ENHANCEMENT]
[ENHANCEMENT]
[UPGRADE]
scimgateway.on('createGroup',...
Please see example plugins for details. [Fix]
[ENHANCEMENT]
plugin-mssql
scimgateway.getArrayObject
[Fix]
[Fix]
[UPGRADE]
scimgateway.on('getGroupMembers',...
New arguments have been added "startIndex" and "count". Also a new return variable "ret". Please see example plugins for details.[Fix]
[ENHANCEMENT]
plugin-restful
[ENHANCEMENT]
<Base URL>/[baseEntity]
for multi tenant or multi endpoint flexibility
[UPGRADE]
[Doc]
[Fix]
Initial version


ValuesSeptember 13, 2015 About values that matter to me |
JavaScriptSeptember 13, 2015 Comparison between JavaScript and Ruby. |
My first week as a developerJuly 12, 2015 Some of the things we have learned so far. Between version control, GitHub and tracking changes. |
DBC experienceJuly 12, 2015 Although DBC does not want to be the menu in a restaurant where you get something offered and pay a certain price in return for it, that was exactly the way I decided to apply for the program: I simply wanted to learn coding. |


|
UMI3D Unity SDK
2.5.b.221125
A UMI3D sdk implementation using Unity
|
Abstract base class for menu display. More...
Public Member Functions | |
| abstract void | Display (bool forceUpdate=false) |
| abstract void | Hide () |
| virtual void | Clear () |
| virtual void | SetMenuItem (AbstractMenuItem menu) |
| Set Menu displayed. More... | |
| abstract int | IsSuitableFor (AbstractMenuItem menu) |
| State If the current displayer is compatible with a menuItem More... | |
| virtual void | Select () |
| Raise selection event. More... | |
| virtual void | Subscribe (UnityAction callback) |
| Subscribe a callback to the selection event. More... | |
| virtual void | UnSubscribe (UnityAction callback) |
| Unsubscribe a callback from the selection event. More... | |
| void | Select () |
| Raise selection event. More... | |
| void | Subscribe (UnityAction callback) |
| Subscribe a callback to the selection event. More... | |
| void | UnSubscribe (UnityAction callback) |
| Unsubscribe a callback from the selection event. More... | |
Public Attributes | |
| UnityEvent | onClear |
Properties | |
| AbstractMenuItem | menu [get, protected set] |
| Menu displayed. More... | |
Abstract base class for menu display.
|
virtual |
|
pure virtual |
|
pure virtual |
|
pure virtual |
State If the current displayer is compatible with a menuItem
| menu | Menu To test |
|
virtual |
Raise selection event.
Implements umi3d.common.ISelectable.
Reimplemented in umi3d.cdk.menu.view.AbstractManipulationMenuItemDisplayer.
|
virtual |
Set Menu displayed.
Reimplemented in umi3d.cdk.menu.view.AbstractManipulationMenuItemDisplayer, and umi3d.cdk.menu.view.AbstractMediaMenuItemDisplayer.
|
virtual |
Subscribe a callback to the selection event.
| callback | Callback to raise on selection |
Implements umi3d.common.ISelectable.
|
virtual |
Unsubscribe a callback from the selection event.
| callback | Callback to unsubscribe |
Implements umi3d.common.ISelectable.
| UnityEvent umi3d.cdk.menu.view.AbstractDisplayer.onClear |
|
getprotected set |
Menu displayed.


Please pick your choice of sizes?
10", $9.99
12", $12.00
14", $15.00
Please pick your choice of sauce?
No Sauce, FREE
, FREE
, $0.75
, $1.00
What toppings would you like?
No Toppings, FREE
Mushrooms, $0.50
Pepperoni, $0.50
Bacon, $0.75
Pinapple, $0.60


--- layout: default title: Teh Jigz Up - About ---
Teh Jigz Up! is a collaborate project between Daniel Lynds (@) and Kin Lane (@kinlane). We were looking for ways we could work together when it comes to storytelling and helping folks understand the world of technology around them.
It is a simple comic book format that is driven from a Google Sheet, publishe to Github using Github Pages, and what we are calling a Graffick Git. It is meant to be a storytelling format that anyone can fork and turn into their own comic strip.
The objective is to help people understand how to use Google Sheets as a data store, accessible via the API. As well as using Github and Github pages for data project management, and the free publishing of simple web sites and tools.
Teh Jigz Up! is a work in progress, and we are building it for a handful of workshops at conferences, and are looking to keep alive online. This is meant to be the Jig, where our main site can be found at Teh Jigz Up!


Level 2
Apple Catcher
Hover Crab
GO
Dust Buddy
Poetry Slam
Potter Puppet Pals Sound Board
Level 3
JumpSlide
Design Click
Guitar Hero
Paint
Flappy Birds
NYCrossing
Level 4
Catch the Dots
Asteroid Attack
Platform Game
Two to Pongle
Level 5
Bubble Burster
SuperBoss FaceOff
Climb