referenced
by Kevin Reiss at 2020-09-14 17:54:09.merged
by Kevin Reiss at 2020-09-14 17:54:09.closed
by Kevin Reiss at 2020-09-14 17:54:09.referenced
by Kevin Reiss at 2020-09-14 18:14:36.merged
by Kevin Reiss at 2020-09-14 18:14:36.closed
by Kevin Reiss at 2020-09-14 18:14:37.labeled
by James R. Griffin III at 2020-09-14 19:03:45.assigned
by James R. Griffin III at 2020-09-15 01:56:22.That's a good connection to make @kelea99 — using a standard set of colors to make it clear what the access status is would be good to reinforce things consistently across apps.
mentioned
by Kim Leaman at 2020-09-14 13:06:45.subscribed
by Kim Leaman at 2020-09-14 13:06:45.labeled
by Trey Pendragon at 2020-09-14 15:27:01.labeled
by Trey Pendragon at 2020-09-14 15:27:41.renamed
by Trey Pendragon at 2020-09-14 15:27:59.renamed
by Trey Pendragon at 2020-09-14 15:28:26.labeled
by Trey Pendragon at 2020-09-14 15:28:34.labeled
by Trey Pendragon at 2020-09-14 15:28:34.We moved the items to the Isilon in ingest_scratch
via the drive
CLI utility.
closed
by Trey Pendragon at 2020-09-14 15:29:18.assigned
by None at 2020-09-14 13:59:20.added_to_project
by None at 2020-09-14 13:59:20.moved_columns_in_project
by None at 2020-09-14 13:59:25.referenced
by None at 2020-09-14 14:02:25.referenced
by None at 2020-09-14 14:11:45.moved_columns_in_project
by None at 2020-09-14 15:21:26.closed
by None at 2020-09-14 17:17:16.moved_columns_in_project
by None at 2020-09-14 17:17:17.Coverage increased (+0.7%) to 80.828% when pulling 5a172d23feeb3cd14ec075b138da4097c245557e on admin-netids-test-env into 0432971bf85b61677fb53547cb6b43be3640ae46 on master.
head_ref_force_pushed
by None at 2020-09-14 14:11:45.renamed
by None at 2020-09-14 15:19:08.head_ref_force_pushed
by None at 2020-09-14 16:40:23.referenced
by None at 2020-09-14 17:17:16.merged
by None at 2020-09-14 17:17:16.closed
by None at 2020-09-14 17:17:17.head_ref_deleted
by None at 2020-09-14 17:17:21.moved_columns_in_project
by Trey Pendragon at 2020-09-14 16:23:51.assigned
by Trey Pendragon at 2020-09-14 16:23:55.referenced
by Trey Pendragon at 2020-09-14 17:28:30.referenced
by Trey Pendragon at 2020-09-14 17:50:05.referenced
by Trey Pendragon at 2020-09-14 17:51:23.referenced
by Trey Pendragon at 2020-09-14 18:49:42.closed
by None at 2020-09-14 19:16:17.moved_columns_in_project
by None at 2020-09-14 19:16:17.Coverage remained the same at 80.828% when pulling 359e6fe62ec73e8da6d19ed2ec43fcecbfc72d2d on headless_chrome into 57b90a532e32901759d1c949633deda04e0e31bb on master.
head_ref_force_pushed
by Trey Pendragon at 2020-09-14 18:49:43.referenced
by None at 2020-09-14 19:16:16.merged
by None at 2020-09-14 19:16:16.closed
by None at 2020-09-14 19:16:17.head_ref_deleted
by None at 2020-09-14 19:16:23.Looks like rubyzip is up-to-date now, so this is no longer needed.
closed
by None at 2020-09-14 19:17:03.moved_columns_in_project
by None at 2020-09-14 19:17:03.head_ref_deleted
by None at 2020-09-14 19:17:04.Looks like rack is up-to-date now, so this is no longer needed.
closed
by None at 2020-09-14 19:17:03.moved_columns_in_project
by None at 2020-09-14 19:17:03.head_ref_deleted
by None at 2020-09-14 19:17:05.base_ref_changed
by None at 2020-09-14 14:38:26.base_ref_changed
by None at 2020-09-14 14:38:26.base_ref_changed
by None at 2020-09-14 14:38:27.base_ref_changed
by None at 2020-09-14 14:38:28.base_ref_changed
by None at 2020-09-14 14:38:29.base_ref_changed
by None at 2020-09-14 14:38:30.base_ref_changed
by None at 2020-09-14 14:38:31.base_ref_changed
by None at 2020-09-14 14:38:32.base_ref_changed
by None at 2020-09-14 14:38:33.base_ref_changed
by None at 2020-09-14 14:38:34.base_ref_changed
by None at 2020-09-14 14:38:35.base_ref_changed
by None at 2020-09-14 14:38:35.base_ref_changed
by None at 2020-09-14 14:38:36.base_ref_changed
by None at 2020-09-14 14:38:37.base_ref_changed
by None at 2020-09-14 14:38:38.base_ref_changed
by None at 2020-09-14 14:38:39.base_ref_changed
by None at 2020-09-14 14:38:40.base_ref_changed
by None at 2020-09-14 14:38:40.base_ref_changed
by None at 2020-09-14 14:38:41.Yes, putting the text there makes a lot of sense. It's shaping up to be a short snippet (text here: https://docs.google.com/document/d/1xbjEzo4p0vcblY9-KE6Fsv73kNHj151iJysYMCSJnvc/edit).
moved_columns_in_project
by None at 2020-09-14 14:31:50.assigned
by None at 2020-09-14 14:31:56.closed
by None at 2020-09-14 14:40:46.moved_columns_in_project
by None at 2020-09-14 14:40:46.reopened
by None at 2020-09-14 17:10:16.moved_columns_in_project
by None at 2020-09-14 17:10:16.referenced
by None at 2020-09-14 17:13:51.moved_columns_in_project
by None at 2020-09-14 19:37:35.moved_columns_in_project
by None at 2020-09-14 19:37:36.closed
by Eliot Jordan at 2020-09-14 20:59:58.moved_columns_in_project
by Eliot Jordan at 2020-09-14 20:59:58.referenced
by Eliot Jordan at 2020-09-14 20:59:57.merged
by Eliot Jordan at 2020-09-14 20:59:57.closed
by Eliot Jordan at 2020-09-14 20:59:58.head_ref_deleted
by Eliot Jordan at 2020-09-14 21:00:01.labeled
by Christina Chortaria at 2020-09-14 21:15:06.I deleted the duplicates of that field for now. I didn't do anything to any other exhibits. Here are the duplicate counts:
Spotlight::CustomField.all.select{|v| v.slug.length > 30}.select{|x| x.slug.match(/\d/)}.map(&:exhibit_id).group_by{|i| i}.map{|k,v| [Spotlight::Exhibit.find(k).slug, v.count]}
=> [["cotsen", 615], ["hellenica", 194], ["music", 494], ["eastasian", 97], ["lapidus", 315], ["pudl0135", 256], ["scheide", 206], ["neareast", 92], ["pudl0058", 38], ["papyri", 337], ["Fragments", 9], ["ealtoc", 1]]
We think https://github.com/pulibrary/pomegranate/blob/master/spec/models/iiif_resource_spec.rb#L134-L149 tests the fact that new custom fields aren't created on every index. It must be creating override title custom fields elsewhere? We've also noticed some exhibits have multiple override title custom fields.
There is a valid custom field with a slug longer than 30 characters. When cleaning up do this to ensure we don't delete it mistakenly:
Spotlight::CustomField.all.select{|v| v.slug.length > 30}.select{|x| x.slug.match(/\d/)}.each do |x|
x.destroy
end
labeled
by None at 2020-09-14 16:53:20.assigned
by None at 2020-09-14 17:59:29.Unfortunately we let HB data past retention. I resolved it so we will be notified if it happens again.
closed
by None at 2020-09-14 18:07:54.referenced
by None at 2020-09-14 20:38:01.referenced
by None at 2020-09-14 20:38:02.referenced
by None at 2020-09-14 20:38:02.referenced
by None at 2020-09-14 20:38:02.Coverage remained the same at 100.0% when pulling c941ea6fb83e9a73c64ab1efe82495afc99e8528 on remove-dev-clean into 6e00f03e2bd0e30b7dfa80eb349512922397afc4 on master.
referenced
by Eliot Jordan at 2020-09-14 20:53:04.merged
by Eliot Jordan at 2020-09-14 20:53:04.closed
by Eliot Jordan at 2020-09-14 20:53:05.head_ref_deleted
by Eliot Jordan at 2020-09-14 20:53:08.assigned
by None at 2020-09-14 19:37:13.moved_columns_in_project
by None at 2020-09-14 19:37:28.referenced
by None at 2020-09-14 19:56:51.moved_columns_in_project
by None at 2020-09-14 20:09:14.closed
by Eliot Jordan at 2020-09-14 20:54:00.moved_columns_in_project
by Eliot Jordan at 2020-09-14 20:54:01.referenced
by Eliot Jordan at 2020-09-14 20:54:00.merged
by Eliot Jordan at 2020-09-14 20:54:00.closed
by Eliot Jordan at 2020-09-14 20:54:00.head_ref_deleted
by Eliot Jordan at 2020-09-14 20:54:04.Coverage remained the same at 100.0% when pulling 1d3fa6cb8ba7b9c7fe3530fe917abf7594eebb7b on 533-index-tasks into 6e00f03e2bd0e30b7dfa80eb349512922397afc4 on master.
renamed
by None at 2020-09-14 20:43:56.assigned
by None at 2020-09-14 13:46:05.renamed
by Axa Mei Liauw at 2020-09-14 13:48:09.labeled
by Kevin Reiss at 2020-09-14 14:17:38.assigned
by None at 2020-09-14 14:17:38.assigned
by Axa Mei Liauw at 2020-09-14 14:17:38.referenced
by Francis Kayiwa at 2020-09-14 17:21:39.<zeroOrMore>
as "required" (e.g. throws an error when note
is absent but is specified as zeroOrMore). I noticed this can be fixed by changing schema syntax to <optional>
.oxygen/jing:
element "descgrp" incomplete; missing required element "processinfo"
versus
nokogiri: ``` 152:0: ERROR: Expecting an element note, got nothing
152:0: ERROR: Expecting an element processinfo, got nothing
152:0: ERROR: Invalid sequence in interleave
152:0: ERROR: Element descgrp failed to validate content ```
(NB the latter two errors are somewhat redundant, since the missing elements are children of descgrp. Interpreting these error messages may take a little getting used to.)
Nokogiri::XML::Schema is an option to validate against an xsd. I'm not sure we'll need it, but it's there.
schematron (https://rubygems.org/gems/schematron)
running into installation issues: error occurred while installing libxml-ruby (1.1.4), and Bundler cannot continue
If we can get it (or another) to work, we could rewrite the local schema entirely in schematron if we need the interleave rules that Nokogiri::XML::RelaxNG skips.
Duplicate of https://github.com/pulibrary/pulmap/issues/875
marked_as_duplicate
by Eliot Jordan at 2020-09-14 16:45:48.closed
by Eliot Jordan at 2020-09-14 16:45:48.assigned
by Eliot Jordan at 2020-09-14 16:47:01.closed
by None at 2020-09-14 18:19:10.referenced
by None at 2020-09-14 18:19:09.merged
by None at 2020-09-14 18:19:09.closed
by None at 2020-09-14 18:19:10.head_ref_deleted
by None at 2020-09-14 18:19:11.Coverage remained the same at 100.0% when pulling b7d73473b0ddc0cfd470c2592beecfe1e0fac738 on harvesting-updates into 707a27f7b235d6276e0f919d6f1483ae1e0ba7a8 on master.
deployed
by Trey Pendragon at 2020-09-14 22:34:44.Coverage remained the same at 100.0% when pulling 6ea11d0c6e2eb92021acdad16408a0d15ec41039 on 886-update-readme into 707a27f7b235d6276e0f919d6f1483ae1e0ba7a8 on master.
Currently how it works: Case 1 - Borrow direct lookup succeeds The interface allows the direct request for borrow direct. This is part of the javascript flash message. The javascript updates the main form to include only the borrow direct. "We have found an item in borrow direct, do you want to request it" (Case 1 will never happen because the API is down).
Case 2 - Borrow Direct Look Up does not succeed. Allow the user to put in an Iliad loan request. "Illiad Resource sharing system and the staff will be in touch"
How we want it to work:
There will just be a row with a request and a submit. "Request via Borrow Direct or Inter Library Loan"
First call out to Borrow Direct API (only barcoded users will work) (enumerated items will be skipped) - If that succeeds respond to the user that they have made the request
May be possible to call request item to do the search and the same time
Second call out to Illiad
Response will indicate time frame. We are assuming the delivery time frames have not changed.
Will we be able to get items to off campus users?


[1]
pool , you can swim outside in the rapids and see the steam from the pool .
[2]
bedroom chalet , clean and cosy with woodland animals always in site from doors for kids .


Forecast for Dublin
This web application provides a forecast of the weather in Dublin using data
from openweathermap.org.
You can get the weather for up to five days, just select how many days to forecast
using the radio buttons below. You can also choose to include the pressure,
humidity and/or wind speed in your summary forecast.
Choose your forecast
Optional Stats
Pressure
Humidity
Wind Speed


Chocolate Pizza
POSTED ON 15 DEC 2013 / DESSERTS
For the fig-swirl: Melt butter over medium heat in a saucepan. Add brown sugar and stir to dissolve. Halve all of the fig and toss in the saucepan with water and lemon juice. Cook over medium heat, stirring frequently, until you have a chunky-jammy mixture. Add salt with one or two stirs, set aside and let cool completely.
Ice cream: In a small pot over medium heat, combine milk, and granulated sugar until sugar is completely dissolved and the milk is just barely lukewarm. Whisk in the egg yolks. Set mixture in the fridge and wait until the fig mixture is cooled.
Using an ice cream machine, pour liquids into the frozen basin and process according to manufacturer instructions, i.e.,let spin and thicken for 20 minutes before adding mascarpone, fig jam mixture, and the nuts. Continue to process for +/- 10 minutes. Pour semi-frozen mixture nto a pyrex dish or glass tupperware. Freeze for at least two hours before serving.


See a preview of our tour route, here:
*Exact tour will depend on factors such as weather, road blocks, construction, parades, demonstrations, etc.
Stops included in this tour are:
Please note, this tour will take approximatly 2 hour, including almost 3 miles of walking.
We expect all patrons to be of good enough health to walk this distance without the need for us to contact emergency assistance.
Follow Me: London is a totally legitimate business that has all the proper registration paperwork in place. We pay our workers a living wage AND all our taxes.
Registered in London with company number 50110383
Address: London, Greater London, United Kingdom


Note: to prevent the qUnit tests from auto-running:
?autorun=false
. The tests will override url settings


jQuery UI 1.11 includes a new widget, selectmenu. We've added support for using jQuery UI with AMD and Bower. We also have over 50 bug fixes.
Interested in the full details of what changed? Check out the 1.11 upgrade guide, 1.11.1 changelog, 1.11.2 changelog, 1.11.3 changelog, and 1.11.4 changelog.
jQuery UI is built for designers and developers alike. We've designed all of our plugins to get you up and running quickly while being flexible enough to evolve with your needs and solve a plethora of use cases. If you're new to jQuery UI, check out our getting started guide and other tutorials. Play around with the demos and read through the API documentation to get an idea of what's possible.
Stay informed about what's going on with jQuery UI by subscribing to our blog and following us on Twitter.


Glyph metrics are, as the name suggests, certain distances associated with each glyph that describe how to position this glyph while creating a text layout.
There are usually two sets of metrics for a single glyph: Those used to represent glyphs in horizontal text layouts (Latin, Cyrillic, Arabic, Hebrew, etc.), and those used to represent glyphs in vertical text layouts (Chinese, Japanese, Korean, Mongolian, etc.).
Note that only a few font formats provide vertical
metrics. You can test whether a given face object
contains them by using the
macro FT_HAS_VERTICAL
,
which returns true if appropriate.
Individual glyph metrics can be accessed by first loading
the glyph in a face's glyph slot, then accessing them
through the face->glyph->metrics
structure, whose type
is FT_Glyph_Metrics
.
We will discuss this in more detail below; for now, we
only note that it contains the following fields.
FT_Size_Metrics
structure.As not all fonts do contain vertical
metrics, the values of vertBearingX
,
vertBearingY
and vertAdvance
should not be considered reliable
if FT_HAS_VERTICAL
returns false.
The following graphics illustrate the metrics more clearly. In case a distance is directed, it is marked with a single arrow, indicating a positive value. The first image displays horizontal metrics, where the baseline is the horizontal axis.
For vertical text layouts, the baseline is vertical,
identical to the vertical axis. Contrary to all other
arrows, bearingX
shows a negative value in
this image.
The metrics found
in face->glyph->metrics
are normally
expressed in 26.6 pixel format (i.e., 1/64th of pixels),
unless you use the FT_LOAD_NO_SCALE
flag when
calling FT_Load_Glyph
or FT_Load_Char
. In this case, the metrics
are expressed in original font units.
The glyph slot object has also a few other interesting
fields that eases a developer's work. You can access them
through face->glyph->xxx
,
where xxx
is one of the following fields.
FT_Vector
that holds the
transformed advance for the glyph. That is useful when
you are using a transformation
through FT_Set_Transform
, as shown in the
rotated text
example of part I. Other than that, its value
is by default (metrics.horiAdvance,0), unless you
specify FT_LOAD_VERTICAL
when loading the
glyph image; it is then (0,metrics.vertAdvance).metrics.horiAdvance
that is returned in the
glyph slot is normally rounded to integer pixel
coordinates (i.e., being a multiple of 64) by the
font driver that actually loads the glyph
image. linearHoriAdvance
is a 16.16
fixed-point number that gives the value of the original
glyph advance width in 1/65536th of pixels. It can be
use to perform pseudo device-independent text
layouts.linearHoriAdvance
but for the glyph's vertical advance height. Its value
is only reliable if the font face contains vertical
metrics.The glyph image that is loaded in a glyph slot can be
converted into a bitmap, either by
using FT_LOAD_RENDER
when loading it, or by
calling FT_Render_Glyph
.
Each time you load a new glyph image, the previous one is
erased from the glyph slot.
There are situations, however, where you may need to extract this image from the glyph slot in order to cache it within your application, and even perform additional transformations and measures on it before converting it to a bitmap.
The FreeType 2 API has a specific extension that is
capable of dealing with glyph images in a flexible and
generic way. To use it, you first need to include
the FT_GLYPH_H
header file.
#include FT_GLYPH_H
You can extract a single glyph image very easily. Here some code that shows how to do it.
FT_Glyph glyph; /* a handle to the glyph image */
...
error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NORMAL );
if ( error ) { ... }
error = FT_Get_Glyph( face->glyph, &glyph );
if ( error ) { ... }
The following steps are performed.
glyph
, of
type FT_Glyph
.
This is a handle (pointer) to an individual glyph
image.FT_LOAD_RENDER
because we want to grab a scalable glyph image that we
can transform later on.FT_Glyph
object by
calling FT_Get_Glyph
.
This function returns an error code and
sets glyph
.It is important to note that the extracted glyph is in
the same format as the original one that is still in the
slot. For example, if we are loading a glyph from a
TrueType font file, the glyph image is really a scalable
vector outline. You can access the
field glyph->format
if you want to know
exactly how the glyph is modeled and stored.
A new glyph object can be destroyed with a call
to FT_Done_Glyph
.
The glyph object contains exactly one glyph image and a
2D vector representing the glyph's advance in 16.16
fixed-point coordinates. The latter can be accessed
directly as glyph->advance
Note that unlike other FreeType objects,
the library doesn't keep a list of all allocated glyph
objects.
If the glyph image is scalable (i.e.,
if glyph->format
is not equal
to FT_GLYPH_FORMAT_BITMAP
), it is possible to
transform the image anytime by a call
to FT_Glyph_Transform
.
You can also copy a single glyph image
with FT_Glyph_Copy
.
FT_Glyph glyph, glyph2; FT_Matrix matrix; FT_Vector delta; ... load glyph image in `glyph' ... /* copy glyph to glyph2 */ error = FT_Glyph_Copy( glyph, &glyph2 ); if ( error ) { ... could not copy (out of memory) ... } /* translate `glyph' */ delta.x = -100 * 64; /* coordinates are in 26.6 pixel format */ delta.y = 50 * 64; FT_Glyph_Transform( glyph, 0, &delta ); /* transform glyph2 (horizontal shear) */ matrix.xx = 0x10000L; matrix.xy = 0.12 * 0x10000L; matrix.yx = 0; matrix.yy = 0x10000L; FT_Glyph_Transform( glyph2, &matrix, 0 );
Note that the 2×2 transformation matrix is always applied to the 16.16 advance vector in the glyph; you thus don't need to recompute it.
You can also retrieve the control (bounding) box of any
glyph image (scalable or not) through
the FT_Glyph_Get_CBox
function.
FT_BBox bbox; ... FT_Glyph_Get_CBox( glyph, bbox_mode, &bbox );
Coordinates are relative to the glyph origin (0,0), using the y upwards convention. This function takes a special argument, the bbox mode, to indicate how box coordinates are expressed.
If the glyph has been loaded
with FT_LOAD_NO_SCALE
, bbox_mode
must be set to FT_GLYPH_BBOX_UNSCALED
to get
unscaled font units in 26.6 pixel format. The
value FT_GLYPH_BBOX_SUBPIXELS
is another name
for this constant.
Note that the box's maximum coordinates are exclusive, which means that you can always compute the width and height of the glyph image (regardless of using integer or 26.6 coordinates) with a simple subtraction.
width = bbox.xMax - bbox.xMin; height = bbox.yMax - bbox.yMin;
Note also that for 26.6 coordinates, if
FT_GLYPH_BBOX_GRIDFIT
is used as the bbox
mode, the coordinates are also grid-fitted, which
corresponds to the following four lines of
pseudo-code.
bbox.xMin = FLOOR( bbox.xMin ) bbox.yMin = FLOOR( bbox.yMin ) bbox.xMax = CEILING( bbox.xMax ) bbox.yMax = CEILING( bbox.yMax )
To get the bbox in integer pixel coordinates,
set bbox_mode
to FT_GLYPH_BBOX_TRUNCATE
.
Finally, to get the bounding box in grid-fitted pixel
coordinates, set bbox_mode
to FT_GLYPH_BBOX_PIXELS
.
[Computing exact bounding boxes can be done with
function FT_Outline_Get_BBox
,
at the cost of slower execution. You probably don't need
it with the possible exception of rotated glyphs.]
You may need to convert the glyph object to a bitmap once
you have conveniently cached or transformed it. This can
be done easily with
the FT_Glyph_To_Bitmap
function, which handles any glyph object.
FT_Vector origin; origin.x = 32; /* 1/2 pixel in 26.6 format */ origin.y = 0; error = FT_Glyph_To_Bitmap( &glyph, render_mode, &origin, 1 ); /* destroy original image == true */
Some notes.
FT_RENDER_MODE_DEFAULT
for an 8-bit
anti-aliased pixmap, or FT_RENDER_MODE_MONO
for a 1-bit monochrome bitmap.The new glyph object always contains a bitmap (if no
error is returned), and you must typecast its
handle to the FT_BitmapGlyph
type in order to
access its content. This type is a sort of
‘subclass’ of FT_Glyph
that
contains additional fields
(see FT_BitmapGlyphRec
).
bitmap_left
field of a
glyph slot, this is the horizontal distance from the
glyph origin (0,0) to the leftmost pixel of the glyph
bitmap. It is expressed in integer pixels.bitmap_top
field of a glyph
slot, this is the vertical distance from the glyph
origin (0,0) to the topmost pixel of the glyph bitmap
(more precise, to the pixel just above the bitmap).
This distance is expressed in integer pixels, and is
positive for upwards y.bitmap
field in a glyph slot.Unlike glyph metrics, global metrics are used to describe distances and features of a whole font face. They can be expressed either in 26.6 pixel format or in (unscaled) font units for scalable formats.
For scalable formats, all global metrics are expressed in
font units in order to be later scaled to the device
space, according to the rules described in the last
section of this tutorial part. You can access them
directly as fields of an FT_Face
handle.
However, you need to check that the font face's format is
scalable before using them. One can do it with
macro FT_IS_SCALABLE
, which returns true when
appropriate.
Here a table of the global design metrics for scalable faces.
bbox.yMax
.bbox.yMin
. This field is
negative for values below the baseline.max_advance_width
but for
vertical text layout.Notice that the values of the ascender and the descender are not reliable (due to various discrepancies in font formats), unfortunately.
Each size object also contains a scaled version of some
of the global metrics described above, to be directly
accessed through
the face->size->metrics
structure (of
type
FT_Size_Metrics
). No grid-fitting
is performed for those values. They are also
completely independent of any hinting process. In other
words, don't rely on them to get exact metrics at the
pixel level. They are expressed in 26.6 pixel format but
rounded for historical reasons.
The scaled version of the original design text height (the vertical distance from one baseline to the next). This is probably the only field you should really use in this structure. It is rounded to an integer value.
Be careful not to confuse it with the
‘height’ field in
the FT_Glyph_Metrics
structure.
Note that the face->size->metrics
structure contains other fields that are used to scale
design coordinates to device space. They are described in
the last section.
Kerning is the process of adjusting the position of two subsequent glyph images in a string of text in order to improve the general appearance of text. For example, if a glyph for an uppercase ‘A’ is followed by a glyph for an uppercase ‘V’, the space between the two glyphs can be slightly reduced to avoid extra ‘diagonal whitespace’.
Note that in theory kerning can happen both in the horizontal and vertical direction between two glyphs; however, it only happens in a single direction in nearly all cases.
Not all font formats contain kerning information, and not all kerning formats are supported by FreeType; in particular, for TrueType fonts, the API can only access kerning via the ‘kern’ table. OpenType kerning via the ‘GPOS’ table is not supported! You need a higher-level library like HarfBuzz, Pango, or ICU, since GPOS kerning requires contextual string handling.
Sometimes, the font file is associated with an additional
file that contains various glyph metrics, including
kerning, but no glyph images. A good example is the
Type 1 format where glyph images are stored in files
with extension .pfa
or .pfb
,
while kerning metrics can be found in files with extension
.afm
or .pfm
.
FreeType 2 allows you to deal with this, by
providing
the FT_Attach_File
and FT_Attach_Stream
APIs. Both functions are used to load additional metrics
into a face object by reading them from an additional
format-specific file. Here an example, opening a
Type 1 font.
error = FT_New_Face( library, "/usr/share/fonts/cour.pfb", 0, &face ); if ( error ) { ... } error = FT_Attach_File( face, "/usr/share/fonts/cour.afm" ); if ( error ) { ... could not read kerning and additional metrics ... }
Note that FT_Attach_Stream
is similar to
FT_Attach_File
except that it doesn't take a
C string to name the extra file but
an FT_Stream
handle. Also, reading a metrics file is in no way
mandatory.
Finally, the file attachment APIs are very generic and can be used to load any kind of extra information for a given face. The nature of the additional content is entirely font format specific.
FreeType 2 allows you to retrieve the kerning
information between two glyphs through
the FT_Get_Kerning
function.
FT_Vector kerning; ... error = FT_Get_Kerning( face, /* handle to face object */ left, /* left glyph index */ right, /* right glyph index */ kerning_mode, /* kerning mode */ &kerning ); /* target vector */
This function takes a handle to a face object, the indices of the left and right glyph for which the kerning value is desired, an integer, called the kerning mode, and a pointer to a destination vector that receives the corresponding distances.
The kerning mode is very similar to the bbox mode described in a previous section. It is a enumeration that indicates how the kerning distances are expressed in the target vector.
The default value is FT_KERNING_DEFAULT
,
which has value 0. It corresponds to kerning
distances expressed in 26.6 grid-fitted pixels (which
means that the values are multiples of 64). For scalable
formats, this means that the design kerning distance is
scaled, then rounded.
The value FT_KERNING_UNFITTED
corresponds to
kerning distances expressed in 26.6 unfitted pixels (i.e.,
that do not correspond to integer coordinates). It is the
design kerning distance that is scaled without
rounding.
Finally, the value FT_KERNING_UNSCALED
indicates to return the design kerning distance, expressed
in font units. You can later scale it to the device space
using the computations explained in the last section of
this part.
Note that the ‘left’ and ‘right’ positions correspond to the visual order of the glyphs in the string of text. This is important for bidirectional or right-to-left text.
In order to show off what we have just learned, we now demonstrate how to modify the example code that was provided in part I to render a string of text, and enhance it to support kerning and delayed rendering.
Adding support for kerning to our code is trivial, as long as we consider that we are still dealing with a left-to-right script like Latin. We simply need to retrieve the kerning distance between two glyphs in order to alter the pen position appropriately.
FT_GlyphSlot slot = face->glyph; /* a small shortcut */ FT_UInt glyph_index; FT_Bool use_kerning; FT_UInt previous; int pen_x, pen_y, n; ... initialize library ... ... create face object ... ... set character size ... pen_x = 300; pen_y = 200; use_kerning = FT_HAS_KERNING( face ); previous = 0; for ( n = 0; n < num_chars; n++ ) { /* convert character code to glyph index */ glyph_index = FT_Get_Char_Index( face, text[n] ); /* retrieve kerning distance and move pen position */ if ( use_kerning && previous && glyph_index ) { FT_Vector delta; FT_Get_Kerning( face, previous, glyph_index, FT_KERNING_DEFAULT, &delta ); pen_x += delta.x >> 6; } /* load glyph image into the slot (erase previous one) */ error = FT_Load_Glyph( face, glyph_index, FT_LOAD_RENDER ); if ( error ) continue; /* ignore errors */ /* now draw to our target surface */ my_draw_bitmap( &slot->bitmap, pen_x + slot->bitmap_left, pen_y - slot->bitmap_top ); /* increment pen position */ pen_x += slot->advance.x >> 6; /* record current glyph index */ previous = glyph_index; }
We are done. Some notes.
FT_Load_Glyph
instead of FT_Load_Char
.use_kerning
, which
is set to the result of the
macro FT_HAS_KERNING
. It is certainly
faster not to call FT_Get_Kerning
when we
know that the font face does not contain kerning
information.previous
with
the value 0, which always corresponds to the
‘missing glyph’ (also
called .notdef
in the PostScript world).
There is never any kerning distance associated with this
glyph.FT_Get_Kerning
. This is because the
function always sets the content of delta
to (0,0) if an error occurs.Our code begins to become interesting but it is still a bit too simple for normal use. For example, the position of the pen is determined before we do the rendering; normally, you would rather determine the layout of the text and measure it before computing its final position (centering, etc.), or perform things like word-wrapping.
Let us now decompose our text rendering function into two distinct but successive parts: The first one positions individual glyph images on the baseline, while the second one renders the glyphs. As we will see, this has many advantages.
We thus start by storing individual glyph images, as well as their position on the baseline.
FT_GlyphSlot slot = face->glyph; /* a small shortcut */ FT_UInt glyph_index; FT_Bool use_kerning; FT_UInt previous; int pen_x, pen_y, n; FT_Glyph glyphs[MAX_GLYPHS]; /* glyph image */ FT_Vector pos [MAX_GLYPHS]; /* glyph position */ FT_UInt num_glyphs; ... initialize library ... ... create face object ... ... set character size ... pen_x = 0; /* start at (0,0) */ pen_y = 0; num_glyphs = 0; use_kerning = FT_HAS_KERNING( face ); previous = 0; for ( n = 0; n < num_chars; n++ ) { /* convert character code to glyph index */ glyph_index = FT_Get_Char_Index( face, text[n] ); /* retrieve kerning distance and move pen position */ if ( use_kerning && previous && glyph_index ) { FT_Vector delta; FT_Get_Kerning( face, previous, glyph_index, FT_KERNING_DEFAULT, &delta ); pen_x += delta.x >> 6; } /* store current pen position */ pos[num_glyphs].x = pen_x; pos[num_glyphs].y = pen_y; /* load glyph image into the slot without rendering */ error = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT ); if ( error ) continue; /* ignore errors, jump to next glyph */ /* extract glyph image and store it in our table */ error = FT_Get_Glyph( face->glyph, &glyphs[num_glyphs] ); if ( error ) continue; /* ignore errors, jump to next glyph */ /* increment pen position */ pen_x += slot->advance.x >> 6; /* record current glyph index */ previous = glyph_index; /* increment number of glyphs */ num_glyphs++; }
This is a very slight variation of our previous code; we extract each glyph image from the slot, then store it, along with the corresponding position, in our tables.
Note also that pen_x
contains the total
advance for the string of text. We can now compute the
bounding box of the text string with a simple
function.
void compute_string_bbox( FT_BBox *abbox ) { FT_BBox bbox; FT_BBox glyph_bbox; /* initialize string bbox to "empty" values */ bbox.xMin = bbox.yMin = 32000; bbox.xMax = bbox.yMax = -32000; /* for each glyph image, compute its bounding box, */ /* translate it, and grow the string bbox */ for ( n = 0; n < num_glyphs; n++ ) { FT_Glyph_Get_CBox( glyphs[n], ft_glyph_bbox_pixels, &glyph_bbox ); glyph_bbox.xMin += pos[n].x; glyph_bbox.xMax += pos[n].x; glyph_bbox.yMin += pos[n].y; glyph_bbox.yMax += pos[n].y; if ( glyph_bbox.xMin < bbox.xMin ) bbox.xMin = glyph_bbox.xMin; if ( glyph_bbox.yMin < bbox.yMin ) bbox.yMin = glyph_bbox.yMin; if ( glyph_bbox.xMax > bbox.xMax ) bbox.xMax = glyph_bbox.xMax; if ( glyph_bbox.yMax > bbox.yMax ) bbox.yMax = glyph_bbox.yMax; } /* check that we really grew the string bbox */ if ( bbox.xMin > bbox.xMax ) { bbox.xMin = 0; bbox.yMin = 0; bbox.xMax = 0; bbox.yMax = 0; } /* return string bbox */ *abbox = bbox; }
The resulting bounding box dimensions are expressed in integer pixels and can then be used to compute the final pen position before rendering the string.
In general, the above function
does not compute an exact bounding box of a
string! As soon as hinting is involved, glyph
dimensions must be derived from the resulting
outlines. For anti-aliased pixmaps,
FT_Outline_Get_BBox
then yields proper
results. In case you need 1-bit monochrome bitmaps, it is
even necessary to actually render the glyphs because the
rules for the conversion from outline to bitmap can also
be controlled by hinting instructions
(cf. dropout
control).
/* compute string dimensions in integer pixels */ string_width = string_bbox.xMax - string_bbox.xMin; string_height = string_bbox.yMax - string_bbox.yMin; /* compute start pen position in 26.6 Cartesian pixels */ start_x = ( ( my_target_width - string_width ) / 2 ) * 64; start_y = ( ( my_target_height - string_height ) / 2 ) * 64; for ( n = 0; n < num_glyphs; n++ ) { FT_Glyph image; FT_Vector pen; image = glyphs[n]; pen.x = start_x + pos[n].x; pen.y = start_y + pos[n].y; error = FT_Glyph_To_Bitmap( &image, FT_RENDER_MODE_NORMAL, &pen, 0 ); if ( !error ) { FT_BitmapGlyph bit = (FT_BitmapGlyph)image; my_draw_bitmap( bit->bitmap, bit->left, my_target_height - bit->top ); FT_Done_Glyph( image ); } }
Some remarks.
FT_Glyph_To_Bitmap
with
the destroy
parameter set to 0
(false), in order to avoid destroying the original glyph
image. The new glyph bitmap is accessed through
image
after the call and is typecast to
FT_BitmapGlyph
.FT_Glyph_To_Bitmap
. This ensures
that the left
and top
fields
of the bitmap glyph object are already set to the
correct pixel coordinates in the Cartesian space.my_target_height - bitmap->top
in the
call to my_draw_bitmap
.The same loop can be used to render the string anywhere on our display surface, without the need to reload our glyph images each time.
We are now going to modify our code in order to be able to easily transform the rendered string, for example, to rotate it. First, some minor improvements.
We start by packing the information related to a single glyph image into a single structure instead of parallel arrays.
typedef struct TGlyph_ { FT_UInt index; /* glyph index */ FT_Vector pos; /* glyph origin on the baseline */ FT_Glyph image; /* glyph image */ } TGlyph, *PGlyph;
We also translate each glyph image directly after it is loaded to its position on the baseline at load time. As we will see, this has several advantages. Here is our new glyph sequence loader.
FT_GlyphSlot slot = face->glyph; /* a small shortcut */ FT_UInt glyph_index; FT_Bool use_kerning; FT_UInt previous; int pen_x, pen_y, n; TGlyph glyphs[MAX_GLYPHS]; /* glyphs table */ PGlyph glyph; /* current glyph in table */ FT_UInt num_glyphs; ... initialize library ... ... create face object ... ... set character size ... pen_x = 0; /* start at (0,0) */ pen_y = 0; num_glyphs = 0; use_kerning = FT_HAS_KERNING( face ); previous = 0; glyph = glyphs; for ( n = 0; n < num_chars; n++ ) { glyph->index = FT_Get_Char_Index( face, text[n] ); if ( use_kerning && previous && glyph->index ) { FT_Vector delta; FT_Get_Kerning( face, previous, glyph->index, FT_KERNING_MODE_DEFAULT, &delta ); pen_x += delta.x >> 6; } /* store current pen position */ glyph->pos.x = pen_x; glyph->pos.y = pen_y; error = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT ); if ( error ) continue; error = FT_Get_Glyph( face->glyph, &glyph->image ); if ( error ) continue; /* translate the glyph image now */ FT_Glyph_Transform( glyph->image, 0, &glyph->pos ); pen_x += slot->advance.x >> 6; previous = glyph->index; /* increment number of glyphs */ glyph++; } /* count number of glyphs loaded */ num_glyphs = glyph - glyphs;
Note that translating glyphs now has several advantages. The first one is that we don't need to translate the glyph bbox when we compute the string's bounding box.
void compute_string_bbox( FT_BBox *abbox ) { FT_BBox bbox; bbox.xMin = bbox.yMin = 32000; bbox.xMax = bbox.yMax = -32000; for ( n = 0; n < num_glyphs; n++ ) { FT_BBox glyph_bbox; FT_Glyph_Get_CBox( glyphs[n], ft_glyph_bbox_pixels, &glyph_bbox ); if (glyph_bbox.xMin < bbox.xMin) bbox.xMin = glyph_bbox.xMin; if (glyph_bbox.yMin < bbox.yMin) bbox.yMin = glyph_bbox.yMin; if (glyph_bbox.xMax > bbox.xMax) bbox.xMax = glyph_bbox.xMax; if (glyph_bbox.yMax > bbox.yMax) bbox.yMax = glyph_bbox.yMax; } if ( bbox.xMin > bbox.xMax ) { bbox.xMin = 0; bbox.yMin = 0; bbox.xMax = 0; bbox.yMax = 0; } *abbox = bbox; }
With the above modifications,
the compute_string_bbox
function can now
compute the bounding box of a transformed glyph string,
which allows further code simplications.
FT_BBox bbox; FT_Matrix matrix; FT_Vector delta; ... load glyph sequence ... ... set up `matrix' and `delta' ... /* transform glyphs */ for ( n = 0; n < num_glyphs; n++ ) FT_Glyph_Transform( glyphs[n].image, &matrix, &delta ); /* compute bounding box of transformed glyphs */ compute_string_bbox( &bbox );
However, directly transforming the glyphs in our sequence is not a good idea if we want to reuse them in order to draw the text string with various angles or transformations. It is better to perform the affine transformation just before the glyph is rendered.
FT_Vector start; FT_Matrix matrix; FT_Glyph image; FT_Vector pen; FT_BBox bbox; /* get bbox of original glyph sequence */ compute_string_bbox( &string_bbox ); /* compute string dimensions in integer pixels */ string_width = (string_bbox.xMax - string_bbox.xMin) / 64; string_height = (string_bbox.yMax - string_bbox.yMin) / 64; /* set up start position in 26.6 Cartesian space */ start.x = ( ( my_target_width - string_width ) / 2 ) * 64; start.y = ( ( my_target_height - string_height ) / 2 ) * 64; /* set up transform (a rotation here) */ matrix.xx = (FT_Fixed)( cos( angle ) * 0x10000L ); matrix.xy = (FT_Fixed)(-sin( angle ) * 0x10000L ); matrix.yx = (FT_Fixed)( sin( angle ) * 0x10000L ); matrix.yy = (FT_Fixed)( cos( angle ) * 0x10000L ); pen = start; for ( n = 0; n < num_glyphs; n++ ) { /* create a copy of the original glyph */ error = FT_Glyph_Copy( glyphs[n].image, &image ); if ( error ) continue; /* transform copy (this will also translate it to the */ /* correct position */ FT_Glyph_Transform( image, &matrix, &pen ); /* check bounding box; if the transformed glyph image */ /* is not in our target surface, we can avoid rendering it */ FT_Glyph_Get_CBox( image, ft_glyph_bbox_pixels, &bbox ); if ( bbox.xMax <= 0 || bbox.xMin >= my_target_width || bbox.yMax <= 0 || bbox.yMin >= my_target_height ) continue; /* convert glyph image to bitmap (destroy the glyph copy!) */ error = FT_Glyph_To_Bitmap( &image, FT_RENDER_MODE_NORMAL, 0, /* no additional translation */ 1 ); /* destroy copy in "image" */ if ( !error ) { FT_BitmapGlyph bit = (FT_BitmapGlyph)image; my_draw_bitmap( bit->bitmap, bit->left, my_target_height - bit->top ); /* increment pen position -- */ /* we don't have access to a slot structure, */ /* so we have to use advances from glyph structure */ /* (which are in 16.16 fixed float format) */ pen.x += image.advance.x >> 10; pen.y += image.advance.y >> 10; FT_Done_Glyph( image ); } }
There are a few changes compared to the original version of this code.
FT_Glyph_To_Bitmap
in order to get rid of
the transformed scalable image. Note that the image is
not destroyed if the function returns an error code
(which is why FT_Done_Glyph
is only called
within the compound statement).FT_Glyph_Transform
instead
of FT_Glyph_To_Bitmap
.It is possible to call this function several times to
render the string with different angles, or even change
the way start
is computed in order to move it
to different place.
This code is the basis of the FreeType 2
demonstration program
named ftstring.c
.
It could be easily extended to perform advanced text
layout or word-wrapping in the first part, without
changing the second one.
Note, however, that a normal implementation would use a glyph cache in order to reduce memory needs. For example, let us assume that our text string is ‘FreeType’. We would store three identical glyph images in our table for the letter ‘e’, which isn't optimal (especially when you consider longer lines of text, or even whole pages).
A FreeType demo program that shows how glyph caching can
be implemented
is ftview.c
.
In general, ‘ftview’ is the main program used
by the FreeType developer team to check the validity of
loading, parsing, and rendering fonts.
Another very useful demo program
is ftdiff.c
,
demonstrating the use and the optical results of the
various rendering and hinting modes provided by FreeType.
In particular, it also demonstrates how to do sub-pixel
positioning (for unhinted glyphs and ‘light’
hinting mode) – all code in this tutorial assumes
integer coordinates.
Scalable font formats usually store a single vectorial
image, called an outline, for each glyph in a
face. Each outline is defined in an abstract grid called
the design space, with coordinates expressed in
font units. When a glyph image is loaded, the
font driver usually scales the outline to device space
according to the current character pixel size found in
an FT_Size
object. The driver may also modify the scaled outline in
order to significantly improve its appearance on a
pixel-based surface (a process known as hinting
or grid-fitting).
This section describes how design coordinates are scaled to the device space, and how to read glyph outlines and metrics in font units. This is important for a number of things.
Design coordinates are scaled to the device space using a simple scaling transformation whose coefficients are computed with the help of the character pixel size.
device_x = design_x * x_scale device_y = design_y * y_scale x_scale = pixel_size_x / EM_size y_scale = pixel_size_y / EM_size
Here, the value EM_size
is font-specific and
corresponds to the size of an abstract square of the
design space (called the EM), which is used by
font designers to create glyph images. It is thus
expressed in font units. It is also accessible directly
for scalable font formats
as face->units_per_EM
. You should check
that a font face contains scalable glyph images by using
the FT_IS_SCALABLE
macro, which returns true
if appropriate.
When you call the
function FT_Set_Pixel_Sizes
,
you are specifying integer values
of pixel_size_x
and
pixel_size_y
FreeType shall use. The library
will immediately compute the values
of x_scale
and
y_scale
.
When you call the
function FT_Set_Char_Size
,
you are specifying the character size in
physical points, which is used, along with the
device's resolutions, to compute the character pixel size
and the corresponding scaling factors. Here, the scaling
factors can correspond to fractional ppem values.
Note that after calling any of these two functions, you
can access the values of the character pixel size and
scaling factors as fields of
the face->size->metrics
structure.
pixel_size_x
in the above
example.pixel_size_y
in the above
example.You can scale a distance expressed in font units to 26.6
pixel format directly with the help of
the FT_MulFix
function.
/* convert design distances to 1/64th of pixels */
pixels_x = FT_MulFix( design_x, face->size->metrics.x_scale );
pixels_y = FT_MulFix( design_y, face->size->metrics.y_scale );
Alternatively, you can also scale the value directly by using doubles.
FT_Size_Metrics* metrics = &face->size->metrics; /* shortcut */ double pixels_x, pixels_y; double x_scale, y_scale; /* compute floating point scale factors */ x_scale = face->size->metrics.x_scale / 65536.0; y_scale = face->size->metrics.y_scale / 65536.0; /* convert design distances to floating point pixels */ pixels_x = design_x * x_scale; pixels_y = design_y * y_scale;
You can access glyph metrics in font units simply by
specifying the FT_LOAD_NO_SCALE
bit flag
in FT_Load_Glyph
or FT_Load_Char
. The metrics returned
in face->glyph->metrics
will all be in
font units.
You can access unscaled kerning data using the
FT_KERNING_MODE_UNSCALED
mode.
Finally, a few global metrics are available directly in
font units as fields of the FT_Face
handle,
as described in section 3 of
this part.
This is the end of the second part of the FreeType tutorial. You are now able to access glyph metrics, manage glyph images, and render text much more intelligently (kerning, measuring, transforming & caching); this is sufficient knowledge to build a pretty decent text service on top of FreeType.
The demo programs in the ‘ft2demos’ bundle (especially ‘ftview’) are a kind of reference implementation, and are a good resource to turn to for answers. They also show how to use additional features, such as the glyph stroker and cache.
Last update: 13-Feb-2018


The homeworks and tournaments will happen at the first half of the semester. The homeworks will be classic comprehension programming assignments. The tournament will require you solving a two player game (like tic-tac-toe). We will play the game in class to determine the winner. All reasonable players (i.e., no crashing) will get equal credits.
HW1, due 09/12, 9.30am: .html, .lhs download
HW2, due 09/28, 9.30am: .html, .lhs download
Tournament, due 10/8, 12pm: .html
HW3, due 10/31, 9.30am: .html, .lhs download
HW4, due 11/21, 9.30am: .html, .lhs download


Installing HBase on Windows using Cygwin
Introduction
HBase is a distributed, column-oriented store, modeled after Google's BigTable. HBase is built on top of Hadoop for its MapReduce and distributed file system implementation. All these projects are open-source and part of the Apache Software Foundation.
As being distributed, large scale platforms, the Hadoop and HBase projects mainly focus on *nix environments for production installations. However, being developed in Java, both projects are fully portable across platforms and, hence, also to the Windows operating system. For ease of development the projects rely on Cygwin to have a *nix-like environment on Windows to run the shell scripts.
Purpose
This document explains the intricacies of running HBase on Windows using Cygwin as an all-in-one single-node installation for testing and development. The HBase Overview and QuickStart guides on the other hand go a long way in explaning how to setup HBase in more complex deployment scenario's.
Installation
For running HBase on Windows, 3 technologies are required: Java, Cygwin and SSH. The following paragraphs detail the installation of each of the aforementioned technologies.
Java
HBase depends on the Java Platform, Standard Edition, 6 Release. So the target system has to be provided with at least the Java Runtime Environment (JRE); however if the system will also be used for development, the Jave Development Kit (JDK) is preferred. You can download the latest versions for both from Sun's download page. Installation is a simple GUI wizard that guides you through the process.
Cygwin
Cygwin is probably the oddest technology in this solution stack. It provides a dynamic link library that emulates most of a *nix environment on Windows. On top of that a whole bunch of the most common *nix tools are supplied. Combined, the DLL with the tools form a very *nix-alike environment on Windows.
For installation, Cygwin provides the setup.exe utility that tracks the versions of all installed components on the target system and provides the mechanism for installing or updating everything from the mirror sites of Cygwin.
To support installation, the setup.exe utility uses 2 directories on the target system. The Root directory for Cygwin (defaults to C:\cygwin) which will become / within the eventual Cygwin installation; and the Local Package directory (e.g. C:\cygsetup that is the cache where setup.exe stores the packages before they are installed. The cache must not be the same folder as the Cygwin root.
Perform following steps to install Cygwin, which are elaboratly detailed in the 2nd chapter of the Cygwin User's Guide:
- Make sure you have Administrator privileges on the target system.
- Choose and create you Root and Local Package directories. A good suggestion is to use C:\cygwin\root and C:\cygwin\setup folders.
- Download the setup.exe utility and save it to the Local Package directory.
- Run the setup.exe utility,
- Choose the Install from Internet option,
- Choose your Root and Local Package folders
- and select an appropriate mirror.
- Don't select any additional packages yet, as we only want to install Cygwin for now.
- Wait for download and install
- Finish the installation
- Optionally, you can now also add a shortcut to your Start menu pointing to the setup.exe utility in the Local Package folder.
- Add CYGWIN_HOME system-wide environment variable that points to your Root directory.
- Add %CYGWIN_HOME%\bin to the end of your PATH environment variable.
- Reboot the sytem after making changes to the environment variables otherwise the OS will not be able to find the Cygwin utilities.
- Test your installation by running your freshly created shortcuts or the Cygwin.bat command in the Root folder. You should end up in a terminal window that is running a Bash shell. Test the shell by issuing following commands:
- cd / should take you to thr Root directory in Cygwin;
- the LS commands that should list all files and folders in the current directory.
- Use the exit command to end the terminal.
- When needed, to uninstall Cygwin you can simply delete the Root and Local Package directory, and the shortcuts that were created during installation.
SSH
HBase (and Hadoop) rely on SSH for interprocess/-node communication and launching remote commands. SSH will be provisioned on the target system via Cygwin, which supports running Cygwin programs as Windows services!
- Rerun the setup.exe utility.
- Leave all parameters as is, skipping through the wizard using the Next button until the Select Packages panel is shown.
- Maximize the window and click the View button to toggle to the list view, which is ordered alfabetically on Package, making it easier to find the packages we'll need.
- Select the following packages by clicking the status word (normally Skip) so it's marked for installation. Use the Next button to download and install the packages.
- OpenSSH
- tcp_wrappers
- diffutils
- zlib
- Wait for the install to complete and finish the installation.
HBase
Download the latest release of HBase from the website. As the HBase distributable is just a zipped archive, installation is as simple as unpacking the archive so it ends up in its final installation directory. Notice that HBase has to be installed in Cygwin and a good directory suggestion is to use /usr/local/ (or [Root directory]\usr\local in Windows slang). You should end up with a /usr/local/hbase-<version> installation in Cygwin.
Configuration
There are 3 parts left to configure: Java, SSH and HBase itself. Following paragraphs explain eacht topic in detail.
Java
One important thing to remember in shell scripting in general (i.e. *nix and Windows) is that managing, manipulating and assembling path names that contains spaces can be very hard, due to the need to escape and quote those characters and strings. So we try to stay away from spaces in path names. *nix environments can help us out here very easily by using symbolic links.
- Create a link in /usr/local to the Java home directory by using the following command and substituting the name of your chosen Java environment:
LN -s /cygdrive/c/Program\ Files/Java/<jre name> /usr/local/<jre name>
- Test your java installation by changing directories to your Java folder CD /usr/local/<jre name> and issueing the command ./bin/java -version. This should output your version of the chosen JRE.
SSH
Configuring SSH is quite elaborate, but primarily a question of launching it by default as a Windows service.
- On Windows Vista and above make sure you run the Cygwin shell with elevated privileges, by right-clicking on the shortcut an using Run as Administrator.
- First of all, we have to make sure the rights on some crucial files are correct. Use the commands underneath. You can verify all rights by using the LS -L command on the different files. Also, notice the auto-completion feature in the shell using <TAB> is extremely handy in these situations.
- chmod +r /etc/passwd to make the passwords file readable for all
- chmod u+w /etc/passwd to make the passwords file writable for the owner
- chmod +r /etc/group to make the groups file readable for all
- chmod u+w /etc/group to make the groups file writable for the owner
- chmod 755 /var to make the var folder writable to owner and readable and executable to all
- Edit the /etc/hosts.allow file using your favorite editor (why not VI in the shell!) and make sure the following two lines are in there before the PARANOID line:
- ALL : localhost <IP_ADDRESS>/32 : allow
- ALL : [::1]/128 : allow
- Next we have to configure SSH by using the script ssh-host-config
- If this script asks to overwrite an existing /etc/ssh_config, answer yes.
- If this script asks to overwrite an existing /etc/sshd_config, answer yes.
- If this script asks to use privilege separation, answer yes.
- If this script asks to install sshd as a service, answer yes. Make sure you started your shell as Adminstrator!
- If this script asks for the CYGWIN value, just <enter> as the default is ntsec.
- If this script asks to create the sshd account, answer yes.
- If this script asks to use a different user name as service account, answer no as the default will suffice.
- If this script asks to create the cyg_server account, answer yes. Enter a password for the account.
- Start the SSH service using net start sshd or cygrunsrv --start sshd. Notice that cygrunsrv is the utility that make the process run as a Windows service. Confirm that you see a message stating that the CYGWIN sshd service was started succesfully.
- Harmonize Windows and Cygwin user account by using the commands:
- mkpasswd -cl > /etc/passwd
- mkgroup --local > /etc/group
-
Test the installation of SSH:
- Open a new Cygwin terminal
- Use the command whoami to verify your userID
- Issue an ssh localhost to connect to the system itself
- Answer yes when presented with the server's fingerprint
- Issue your password when prompted
- test a few commands in the remote session
- The exit command should take you back to your first shell in Cygwin
- Exit should terminate the Cygwin shell.
HBase
HBase config[installation directory]- HBase uses the ./conf/hbase-env.sh to configure its dependencies on the runtime environment. Copy and uncomment following lines just underneath their original, change them to fit your environemnt. They should read something like:
- export JAVA_HOME=/usr/local/<jre name>
- export HBASE_IDENT_STRING=$HOSTNAME as this most likely does not inlcude spaces.
- HBase uses the ./conf/hbase-default.xml file for configuration. Some properties do not resolve to existing directories because the JVM runs on Windows. This is the major issue to keep in mind when working with Cygwin: within the shell all paths are *nix-alike, hence relative to the root /. However, every parameter that is to be consumed within the windows processes themself, need to be Windows settings, hence C:\-alike. Change following propeties in the configuration file, adjusting paths where necessary to conform with your own installation:
- hbase.rootdir must read e.g. file:///C:/cygwin/root/tmp/hbase/data
- hbase.tmp.dir must read C:/cygwin/root/tmp/hbase/tmp
- hbase.zookeeper.quorum must read <IP_ADDRESS> because for some reason localhost doesn't seem to resolve properly on Cygwin.
- Make sure the configured hbase.rootdir and hbase.tmp.dir directories exist and have the proper rights set up e.g. by issuing a chmod 777 on them.
Testing
This should conclude the installation and configuration of HBase on Windows using Cygwin. So it's time to test it.
- Start a Cygwin terminal, if you haven't already.
- Change directory to HBase installation using CD /usr/local/hbase-<version>, preferably using auto-completion.
-
Start HBase using the command ./bin/start-hbase.sh
- When prompted to accept the SSH fingerprint, answer yes.
- When prompted, provide your password. Maybe multiple times.
- When the command completes, the HBase server should have started.
- However, to be absolutely certain, check the logs in the ./logs directory for any exceptions.
- Next we start the HBase shell using the command ./bin/hbase shell
- We run some simple test commands
- Create a simple table using command create 'test', 'data'
- Verify the table exists using the command list
- Insert data into the table using e.g.
put 'test', 'row1', 'data:1', 'value1' put 'test', 'row2', 'data:2', 'value2' put 'test', 'row3', 'data:3', 'value3'
- List all rows in the table using the command scan 'test' that should list all the rows previously inserted. Notice how 3 new columns where added without changing the schema!
- Finally we get rid of the table by issuing disable 'test' followed by drop 'test' and verified by list which should give an empty listing.
- Leave the shell by exit
- To stop the HBase server issue the ./bin/stop-hbase.sh command. And wait for it to complete!!! Killing the process might corrupt your data on disk.
- In case of problems,
- verify the HBase logs in the ./logs directory.
- Try to fix the problem
- Get help on the forums or IRC (#hbase@freenode.net). People are very active and keen to help out!
- Stopr, restart and retest the server.
Conclusion
Now your HBase server is running, start coding and build that next killer app on this particular, but scalable datastore!


Look for information on the Course website. If you haven't yet, sign up for Piazza.
| January 24: Welcome! | ||
| January 26: Javascript types | ||
| January 29: Javascript | Prompt | Notes |
| January 31: SVG | Prompt | Notes |
| February 2: d3 | Prompt | Notes |
| February 5: d3 scales | Prompt | Notes |
| February 7: Loading data, More d3 scales | Prompt | Notes |
| February 9: d3 scales, axes | Prompt | Notes |
| February 12: Guest lecture -- Analytical Graphic Design | Slides | |
| February 14: d3 data join, line plots | Prompt | Notes |
| February 16: d3 maps, projections | Prompt | Notes |
| February 21: maps, choropleths | Prompt | Notes |
| February 23: Histograms, visual perception | Prompt | Notes |
| February 26: Histograms, making arguments | Prompt | |
| February 28: Prototype day! | Bring a working prototype to share in class. Instructions. | |
| March 2: Snow day! | ||
| March 5: Histograms, making arguments | Prompt | Notes |
| March 7: Lines, making arguments | Prompt | |
| March 9: Lines, making arguments | Prompt | |
| March 12: Can we translate to a new language? | HTML Prompt, but also load two R files. | |
| March 14: Happy π day! More R | HTML Prompt, but also load jobs.R. | |
| March 16: In-class project showcase | ||
| March 19: How to use color | ||
| March 21: Multiple regression, data integration | Prompt | |
| March 23: More regression, gradients | Prompt | |
| March 26: More regression, gradients | Prompt | |
| March 28: Stochastic gradient descent | Prompt | |
| March 30: Particle simulations, self-organizing maps | Prompt | Notes |
| [Spring break!!!] | ||
| April 9: Clustering synthetic data | Prompt | |
| April 11: Prototype day! | Bring a working prototype to share in class. Instructions. | Last-minute checklist |
| April 13: Clustering real data | Prompt | |
| April 16: SVG vs. Canvas | Prompt | |
| April 18: Linear algebra! | Prompt | Notes |
| April 20: Dimensionality Reduction | Notes (PDF) | |
| April 23: Classification | Prompt | Notes |
| April 25: Recipe visualization | Prompt | |
| April 27: Trump tweets, naive Bayes | Prompt | Notes |
| April 30: Uncertainty | Prompt | |
| May 2: More Uncertainty | Prompt | Notes |
| May 4: In-class projects | Schedule | |
| May 7: Your choice! | Prompt | |
| May 9: Class summary | ||


--- title: my take a sad plot and make it better- Uno author: Alison Hill date: '2018-06-13' slug: better-uno categories: - R tags: - ggplot2 description: Desc hacker_news_id: '' lobsters_id: '' meta_img: /images/image.jpg ---
library(tidyverse)
library(viridis) # colors!
library(beyonce) # colors!!
library(extrafont) # fonts!
ratings <- read_csv("http://bit.ly/cs631-ratings",
na = c("", "NA", "N/A"),
col_types = cols(
viewers_7day = col_number(),
series = col_factor(levels = NULL)
))
# some small wrangling
ratings_bonanza1 <- ratings %>%
mutate(ep_id = row_number(),
series = as.factor(series)) %>%
select(ep_id, viewers_7day, series)
# my colors from beyonce
mybey <- beyonce_palette(66)[c(11,10,7,6,5,4,3,1)]
# make the plot
ggplot(ratings_bonanza1, aes(x = ep_id, y = viewers_7day,
fill = series)) +
geom_col(alpha = .9) +
theme_minimal() +
ggtitle("Series 8 was a Big Setback in Viewers",
subtitle= "7-Day Viewers across All Series/Episodes") +
theme(legend.position = "bottom",
text = element_text(family = "Lato"),
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
axis.title.x = element_blank()) +
scale_fill_manual(values = mybey) +
scale_x_continuous(expand = c(0, 0)) +
guides(fill = guide_legend(nrow = 1))


The archetypical pet for Shrinking Violet or loner characters is the domestic cat. An introverted character will often also be a Kind Hearted Cat Lover. Oftentimes the cat(s) are a replacement for human interaction, or in the case of lonely single women, lovers and occasionally children.
The popularity of this trope likely occurs because cats, in contrast with dogs, are an inside pet. They don't require walks and can live their entire lives inside. As a result, they're great for people who dislike going outside. This also applies to other pets such as birds, small rodents, and reptiles, however those rarely appear in fiction (and when they do they're usually owned by "weird" characters).
This person might get called a Crazy Cat Lady, and might develop into one as they get older, but the difference is that a Crazy Cat Lady has a mental illness, while (most) Introverted Cat People do not.
The feline counterpart of Canine Companion. Contrast with Heroes Love Dogs, which this trope tends to be a foil to (with more extroverted characters preferring dogs). Related to Right-Hand Cat if the evil boss is Lonely at the Top. Super-Trope to Crazy Cat Lady.
Examples:
- An [adult swim] bumper mentions that the viewer is lonely and friendless, except for their pet cat Whiskers.
- Quiet Shrinking Violet Sakaki from Azumanga Daioh adores cute animals in general, but she has a special spot in her heart for cats. Unfortunately, cats don't like her (with Word of God being that her intimidating looks makes cats afraid of her).
- Ichimatsu from Osomatsu-san is the quietest of the sextuplets. Ichimatsu isn't fond of socializing with others. He adores cats and is most social around them (though some jokes imply his interest in cats isn't exactly chaste).
- Suzuka from Lyrical Nanoha is the resident Shrinking Violet among her friends, and her mansion is full of cats. Contrast with her far more outgoing best friend Arisa, who is a dog person.
- Kaoruko of Comic Girls is excessively shy, fragile and negative, and on the other hand she likes cats so much that the fact that her new apartment does not allow pets left her with cat withdrawal.
- As one more showcase that she is Not Good with People, Doctor Ritsuko Akagi of Neon Genesis Evangelion has a pet cat and cat-themed office furniture in her lab.
- My Roommate is a Cat: Subaru is introduced as so introverted he actively avoids people and even leaving his house unless strictly necessary. The story starts with him taking in a stray cat.
- Shota Aizawa of My Hero Academia is a grumpy, unkempt underground hero who can often be found teaching his class from inside a sleeping bag.  He's the happiest the audience has ever seen him.
- Ami Mizuno, in Sailor Moon, is a shy bookworm who doesn't make friends easily. According to her official bio, cats are her favorite animal, and she's often seen petting and cuddling with Luna.
- Adrian Veidt, aka Ozymandias, from Watchmen is Not Good with People and prefers the company of Bubastis, his genetically-engineered lynx.
- In Neither a Bird nor a Plane, it's Deku!, Katsuki Bakugou has a blue cat named Dexter who is about as prone to rage as his owner is (don't worry, he's not a Red Lantern). The cat seems to be one of Katsuki's only meaningful relationships, as he looks down on everyone else who isn't Izuku.
- In Ariel & Belle, Belle keeps to herself and is unable to socialize well with her fellow townsfolk. Her main companion is her pet cat, Cheeky.
Film — Animated
- The socially awkward protagonist of Atlantis: The Lost Empire, Milo, has a pet cat named Fluffy. Fluffy is Milo's only companion at the start of the film.
- Madame Adelaide from The Aristocats is an old rich woman who mostly spends time with her titular cats.
Film — Live Action
- In Romancing the Stone, Joan Wilder is a successful romance novelist, but has no romance in her own life. She celebrates special events with her cat, Romeo.
- In Batman Returns, Catwoman is portrayed as a socially awkward introvert whose cat is her best friend.
- In Wonder Woman 1984, Barbara Minerva is portrayed pretty much like Selina above, as in socially awkward and wearing Nerd Glasses; before she turns into Cheetah.
- Erin, the perpetually-ignored file girl in What Women Want, has a cat, which Nick discovers when he goes to her apartment to Must Make Amends when he overlooked her for a promotion.
- Filch from Harry Potter and his cat Mrs. Norris. He's a Muggle Born of Mages with resentment towards wizards, who worked as a scary groundskeeper for Hogwarts; many students fear him.
- Hermione is an Extraverted Nerd, but she is still more introverted and bookish than her two best friends and gets her own cat Crookshanks in Book Three.
- Little Women: Beth is the shyest and quietest of the four sisters. Cats is one of the things she loves the most and she is often surrounded by kittens.
- The Baby-Sitters Club: Mary Anne, the Shrinking Violet of the group, has a pet cat named Tigger and constantly tells people how cute he is. By contrast, her brash best friend Kristy has a dog.
- In one of the Cat Pack books, Carlotta offers up her kittens to a local retirement home. The seniors there don't get to out much, so the kittens will help entertain them and keep them company.
- Desperate Housewives has two examples: Mr. Whiskers (Alberta Fromm's cat, seen only in season one) and Toby. The latter used to be Ida Greenberg's cat until she died in season 4, then Karen McCluskey took care of him. Season 5 Big Bad even lampshaded this trope, saying that Karen must be lonely since she talks to her pet cat Toby.
Karen: Toby is Ida's baby.
- Criminal Minds: Emily Prentiss lives with her cat, Sergio. Sometimes, she complains about her romantic life being boring or unsatisfying.
- Lilly Rush from Cold Case has relationships go down in flames more than once due to her devotion to work, but she always has her cats.
- Mentioned during a fight between Peggy and her mother in the fifth season of Mad Men. Her very Catholic mother is quite upset that Peggy is moving in with and not marrying a Jew. When Peggy asks if her mother wants her to be alone, she replies, "Your aunt used to say 'If you're lonely, get a cat'. It'll last fifteen years, then you get another cat. That'll last fifteen years, an then you're dead."
- In Hannah Montana, Miley imagines that future in her head.
- To show that Wonder Woman's Secret Identity Diana Prince is a friendless introvert, the Wonder Woman pilot ends with her watching television with her cat.
- Played with in the case of Sally and Mr. Henderson in The Dick Van Dyke Show. Sally is a brash woman, but she's also single and unhappy about it. At least one episode had her talking to Mr. Henderson about how neither of them had anywhere to go that evening.
- In Elementary, recurring character Fiona Helbron. She is a fairly asocial, neuro-atypical programmer who was a witness in the episode "Murder Ex Machina" and later became a love interest for Sherlock. She loves cats and once meets with Sherlock at a cat café (because she isn't allowed to keep pets at her apartment).
- Star Trek:
- Spock from Star Trek: The Original Series is a Science Hero who has few friends outside his workplace. While he doesn't have a pet cat, in "Assignment: Earth", the Enterprise crew encounters a stranger named Gary Seven, who brings along a black cat. Spock holds and pets it while discussing something with Kirk, admitting that it's an attractive creature and he feels oddly drawn to it. (However, it later turns out that the cat is Gary's traveling companion and can also take the form of a young woman.)
- Reg Barclay from Star Trek: The Next Generation is a painfully shy Shrinking Violet, as well as the only person that Data's cat Spot is on friendly terms with (besides Data himself). On Star Trek: Voyager, Reg gets his own cat, Neelix.
- The Twilight Zone (1985):
- In "The Trunk", Willy Gardner has no meaningful interaction with people as the manager of the rundown Hotel Winchester. The highlight of his day is giving a stray neighborhood cat a bowl of milk.
- In "Cat and Mouse", the shy, timid Andrea Moffatt is delighted when a black tomcat comes through her window one evening. It turns out that the cat is Guillaume de Marchaux, who was cursed to become a cat during the day and can only revert to human form at night.
- In the first few seasons of Sex and the City, Miranda lived alone with her cat, and she's by far the snarkiest, most aloof of the main characters. When she starts opening up and starts living with Steve, they also get a dog.
- Jon from Garfield is routinely portrayed as a friendless Loser Protagonist with No Social Skills. His main companion is his cat Garfield, with later his dog Odie being brought into the strip too. Though he wasn't always like this, Lyman kept him company from 1978 to 83 and then Liz came in and started dating Jon since 2006.
- In Fire Emblem Echoes: Shadows of Valentia, Luthier is a socially awkward nerd who protests the idea that he's never had any friends by bragging that he's gotten very close to a local cat.
- Fire Emblem: Three Houses has Felix, who is an antisocial swordsman who spends almost all his time training and he likes cats - you get a positive response if you mention cats during teatime with him and he says in his support with Bernadetta, "I don't dislike them."
- Chase, from I'm the Grim Reaper certainly qualifies, given how introverted he is and how he adores his derpy Sphinx, whom he named "Lightstalker."
- In Sakana, Yuudai, the angry loner who pushes away anyone who tries to get close, has his cat Hime serve as the one being that he openly loves.
- In Homestuck, out of the two girls, Rose is an introverted Goth with a penchant for psychoanalysis. Naturally she's a cat lover to contrast her best friend Jade, who has a dog.
- The Simpsons: Aside from early seasons, Lisa is usually presented as a friendless loner. She has a fondness for cats and has owned several.
- Discussed in Danny Phantom where Danny mocks Vlad with "As a lonely single man in your 40s might I suggest internet dating? Or a cat?"


Stockholm Resilience Centre is an international research partner which provides scientific insights on the interactions between humans and nature. It departs from an ambition to better understand the profound imprint humans have on nature and ideas on how to deal with the resulting challenges through enhancing social-ecological resilience. One strategic area of research is urban social-ecological systems, looking at how cities can better integrate biodiversity and ecosystem services into their planning and management.
The centre also helps facilitate dialogues with policymakers and practitioners from all over the world, and contribute with innovative ideas to improve collaboration and learning between stakeholders at local, regional and national level. It has a particularly respected role as a facilitator for dialogue in the areas of governance and sustainable use of biodiversity in both a rural and urban context.


This cat happen now,
It was too purr-fect!!!
Hold down your Shift key
Check a lower item
Everything inbetween should also be set to checked
Toilet paper attack claws fluff everywhere
Just regular JavaScript
Cough hairball on conveniently placed pants.


WITNESS LIST Elections Committee January 30, 1998-10:00A Campaign Finance On: Edward Shack (Brian Eppstein) Jorge Ramirez (Texas Democratic Party) Karen Lundquist (Texas Ethics Commission) Kristin Newkirk (Texas Ethics Commission) Maxine Barkan (League of Women Voters) Stephen McDonald (Texas Democratic Party) Suzy Woodford (Common Cause) Tom "Smitty" Smith (Public Citizen) Wayne Hamilton (Repub. Party of Texas)


UNTITLE
Hi there! Now,i get my last one hour at home,oh damn it,it’s 3 minutes down..and time goes on as usual.
What you’re reading is my first blog i post via my new laptop,my first blog after i got in TJPU and Last one before i officially leave town where i lived for almost 19years and move out of house where i just found i love it so much. Nevertheless A man has got to explorer those place he’s never been and fight for a better future to prove his own unique value. So,i gotta STEP UP! i think i can do that,and i can make another story just like “From zero to hero” :D
Too many things happened those days,I experienced happiness times with my best friends and so sad moments.Overall,Its been a good memories i will never forget,i cherish those moments,i value what you guys said. And most importantly,I consider you as my best friend,I will and always think of you when i am filled with loneliness or happiness,i wanna share those feelings with you.that’s what best friends do.
hum,half an hour gone,which means i just have 30minutes to go or i just write whatever i like till i take off. :D
To tell you a secret just for my best friends.i did some kinda illegal stuff yesterday.If you wanna know the detail,call me ^^
Last a few words i feel like to say,i am good to go right now,Its hard for me,though.A whole new journey is about to start and i don’t care what in store for me.By far,for my eyes,Its happyvalley! i am coming,here i would like to give a special thanks to Mengqing Zhan.Its you that make this happen! Thank you!
Ok,let’s just say good bye and make a piece of room in your heart,I will never move out:> I promise.
Peace
‘n’
good luck


Colorwheel
Download* or
bower install colorwheel
A javascript color picker. The wheel is drawn using the Raphael js library. jQuery is used to assist with events.
The wheel size is set on creation. It supports a small set of callbacks and touch events.
It was created for the UI at Fame Driver and distributed with a MIT license.
Hope you enjoy it – John Weir
Source available on Github.
Run simple test suite.
* Requires jQuery and Raphael version 2.1.0 or greater.
Usage and methods
var cw = Raphael.colorwheel(dom_element, height_width [, segments]);
The wheel is drawn into a square, so only one dimension is required. segments is an option to increase, or decrease, the smoothness of the hue ring. 60 is the default.
cw.input(dom_element) ⇒ cw
Binds a text input for setting and receiving the color as a hex value. This will allow the user to input a hex value and update the wheel.
cw.onchange(callback) ⇒ cw
Set a callback for any change received. Callback takes one argument, a Raphael RGB color object.
cw.ondrag(start, stop) ⇒ cw
Set a start and stop callback for dragging. The callbacks take one argument, a Raphael RGB color object.
cw.color() ⇒ Raphael color object
Get the current color as RGB object
cw.color(hex_value) ⇒ cw
Set the current color via a hex value
cw.color_hsb() ⇒ Raphael color object
Get the current color as HSB object
cw.color_hsb(hsb_object) ⇒ cw
Set the current color via a Raphael h, s, b object
Callbacks
Simple example using the callback to update an element's text and css.
You are dragging the wheel
Show Source
Sizes
The wheel can be scaled to suit your needs. The large ring has larger number of segments, to make it smoother.
Show Source
A more advanced callback
When the color is changed a callback is used to change the colors of each letter below.
These letters will get cycled through... and through...
Show Source


{{ partial "header" . }} We’re so delighted to hear from you. Please drop us a line below. Send Message {{ partial "footer" . }}


JamendoFM 1.0.6
Copyright (C) 2013, Antti Pohjola Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
All application data is provided by Jamendo. You must comply with the license of the music. Please check http://www.jamendo.com for further information
Could not load content from jamendo.com. Plase check your network settings and try again


In the heart of the French Alps, in the north east of the Rhone Alps region lies the village of Les Houches. Nestled at one end of the Chamonix valley in the Mont Blanc region of the Haute Savoie Les Houches had long been the considered a mere satellite village of its much more illustrious neighbour Chamonix.


This style guide was built with Foundation for Sites. For more information on how to use this responsive front-end framework, check out the documentation, get help from the Foundation community, or request immediate technical support.
Visit the Docs Foundation Forum Technical SupportProblem: You've got tons of content, each needing different sized vertical columns, and don't know how to quick and easily get it all done. Solution: The awesome grid!
The grid is built around two key elements: rows and columns. Rows create a max-width and contain the columns, and columns create the final structure. Everything on your page that you don't give a specific structural style to should be within a row or column.
In the Grid you can nest columns down as far as you'd like. Just embed rows inside columns and go from there. Each embedded row can contain up to 12 columns.
Using this framework is easy. Here's how your code will look when you use a series of

tags to create vertical columns.

...

...

In the Grid you can nest columns down as far as you'd like. Just embed rows inside columns and go from there. Each embedded row can contain up to 12 columns.

8

8 Nested

8 Nested Again

4

4

4

As you've probably noticed in the examples above, you have access to a small, medium, and large grid. If you know that your grid structure will be the same for small devices as it will be on large devices, just use the small grid. You can override your small grid classes by adding medium or large grid classes.

2

10, last

3

9, last

Below you can find the different values we created that support the primary color variable you can change at any time in _settings.scss
This design uses Helvetica Neue for headings and paragraph text.
Headings are used to denote different sections of content, usually consisting of related paragraphs and other HTML elements. They range from h1 to h6 and should be styled in a clear hierarchy (i.e., largest to smallest)
Paragraphs are groups of sentences, each with a lead (first sentence) and transition (last sentence). They are block level elements, meaning they stack vertically when repeated. Use them as such.
Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Buttons are tied to an action of some kind, whether that button is on a cheese dispenser or launches the rocket that you're strapped to. On the web, we follow similar conventions.
These buttons are primary calls to action and should be used sparingly. Their size can be adjusted with the .tiny
, .small
, and .large
classes.
Large button
Regular button
Small button
Tiny button
These buttons are used for less important, secondary actions on a page.
Large button
Regular button
Small button
Tiny button
Use forms to allow users to interact with the site and provide information to the company.
A form should be marked up using its default HTML properties. The ones we make use of include (in hierarchical order):
Make forms great and easy to use with the following rules:

.Check out the Foundation Docs to learn about how flexible our forms are for creating different layouts. It works perfectly with the grid to meet all your form needs.
Form elements in Foundation are styled based on their type attribute rather than a class. Inputs in Foundation have another major advantage — they are full width by default. That means that inputs will run as wide as the column that contains them. However, you have two options which make these forms extremely versatile:
.medium-6
, .small-6
.<form>

Label
<input type="text" placeholder="placeholder">

Label
<input type="text" placeholder="placeholder">

Label

<input class="input-group-field" type="text" placeholder="placeholder">
.com

Select Box
<select>
<option value="good">Good</option>
<option value="better">Better</option>
<option value="best">Best</option>
</select>

Choose Your Favorite
<input type="radio" name="radio1" value="radio1" id="radio1">Red
<input type="radio" name="radio2" value="radio2" id="radio2">Blue

Check these out
<input id="checkbox1" type="checkbox">Checkbox 1
<input id="checkbox2" type="checkbox">Checkbox 2

Textarea Label
<textarea placeholder="placeholder"></textarea>

</form>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempora omnis suscipit id ut laborum recusandae molestias hic aliquid expedita! Non dicta, autem obcaecati error, id ab voluptate unde culpa nulla.
Button
Button
Button


{{if or .MatchedOffers .MatchedWants}}
{{ end }}
{{if .MatchedWants}}
{{ end }}
Good news!
{{if .MatchedOffers}}Matched Offers
There are new customers on the Open Credit Network who want what you're offering:
-
{{ range $myWant, $matchedOffers := .MatchedOffers }}
- {{ $myWant }} - See the full details and get in touch {{ end }}
{{if .MatchedWants}}
Matched Wants
There are new suppliers on the Open Credit Network who are offering what you want:
-
{{ range $myOffer, $matchedWants := .MatchedWants }}
- {{ $myOffer }} - See the full details and get in touch {{ end }}
If your wants, offers or business details have changed, please update your listing.
You can also unsubscribe from these emails by following this link.
Happy trading!
The Open Credit Network


and the virus for []. with replicon replicons replication viral RNA The are was protein {background Virol. been cell have drug from minigenome that genome margin dengue subgenomic {border-style coding hepatitis px;} #ffffff;} syncytial Ebola has norovirus proteins system HCV established expression reporter respiratory using can into used were development discovery inhibitor systems RSV antiviral cells nonstructural polyprotein structural transcription viruses DENV culture such Res. derived encephalitis fever human inhibitors not region which Dengue However, This gene polymerase replacement translation vaccine Replicons VP, disease genotype high-throughput identified infectious px; {font-family (Fig. Med. NS, These analysis entry equine font-size genes infection new protease proteins: shown two under virus, Agents Chemother. Envelope Human RNAs against cellular characterization codes compound compounds double; drugs during essential fluorescent found genomes host its lines plasmid-driven replication, research resistance review sequence stable this three treatment CHIKV Chem. Chikungunya Elsevier RdRp acting activity al. antibiotic border-color border-width but candidates cells, containment driven estimated expressing family first form harbouring high knt lead most noroviruses produced recombinant regions selectable sequences severe small-molecule solid; syndrome their then these transfected virus: vitro within years {font-style {font-weight Available COVID- Dis. Drug EBOV GFP Gen. Infect. Marburg Microbiol. NSA Nile Respiratory SINV Semliki Sindbis Togaviridae Venezuelan West [], acute all alphavirus animal at: available bold cause cellsJ. centre chronic cleaved clinical co-expression complex contain could courier; date, derivatives diseases effective either em; green infections ivermectin known leader made marker million minigenomes molecular molecule mutations nsP nsP, other potent processed protein, pt;} resource single-stranded small some trailer virusJ.


This template was made with FlexBox
"Linear search is a very simple search algorithm. In this type of search, a sequential search is made over all items one by one. Every item is checked and if a match is found then that particular item is returned, otherwise the search continues till the end of the data collection."
"A linked list is a sequence of data structures, which are connected together via links. Linked List is a sequence of links which contains items. Each link contains a connection to another link. Linked list is the second most-used data structure after array. Following are the important terms to understand the concept of Linked List."
A stack is an Abstract Data Type (ADT), commonly used in most programming languages. It is named stack as it behaves like a real-world stack, for example – a deck of cards or a pile of plates, etc. A real-world stack allows operations at one end only. For example, we can place or remove a card or plate from the top of the stack only. Likewise, Stack ADT allows all data operations at one end only. At any given time, we can only access the top element of a stack. This feature makes it LIFO data structure. LIFO stands for Last-in-first-out. Here, the element which is placed (inserted or added) last, is accessed first. In stack terminology, insertion operation is called PUSH operation and removal operation is called POP operation.
Tree represents the nodes connected by edges. We will discuss binary tree or binary search tree specifically. Binary Tree is a special datastructure used for data storage purposes. A binary tree has a special condition that each node can have a maximum of two children. A binary tree has the benefits of both an ordered array and a linked list as search is as quick as in a sorted array and insertion or deletion operation are as fast as in linked list.
Queue is an abstract data structure, somewhat similar to Stacks. Unlike stacks, a queue is open at both its ends. One end is always used to insert data (enqueue) and the other is used to remove data (dequeue). Queue follows First-In-First-Out methodology, i.e., the data item stored first will be accessed first. A real-world example of queue can be a single-lane one-way road, where the vehicle enters first, exitsfirst. More real-world examples can be seen as queues at the ticket windows and bus-stops.
Linear search is a very simple search algorithm. In this type of search, a sequential search is made over all items one by one. Every item is checked and if a match is found then that particular item is returned, otherwise the search continues till the end of the data collection.


Due to some minor language errors we are resending this message.
Feminist Majority Foundation - Equality around the world
Dear Dry,
South Wind Women’s Center [ https://org.salsalabs.com/o/1400/p/salsa/donation/common/public/?donate_page_KEY=9939 ]
The South Wind Women’s Center - a comprehensive reproductive health clinic in Wichita, Kansas, just opened last month. The new clinic is in the former clinic of Dr. Tiller, who was assassinated in his church by an anti-abortion extremist four years ago.
This new clinic is being threatened and needs our help! [ https://org.salsalabs.com/o/1400/p/salsa/donation/common/public/?donate_page_KEY=9939 ]
The clinic provides not only abortion services, but also birth control, well women exams, prenatal care, cancer screenings, STI testing and much more.
Even before it opened, the staff was being harassed and threatened. Executive Director Julie Burkhart, who previously worked for Dr. Tiller, is being stalked and her home is being picketed.
A recent audio recording was posted on YouTube that is purported to be Scott Roeder, the man who murdered Dr. Tiller. In the recording, the man identified as Roeder said of Burkhart: “It’s almost like putting a target on your back, saying, ‘Well, let’s see if you can shoot ME!’… I think eight have been shot, so we’ve got 92 to go. Maybe she’ll be number nine. I don’t know, but she’s kind of painting a target on her.”
Enough is Enough! The South Wind Women’s Center and its brave staff need more security support. Please donate today to provide critical protection for the clinic and its brave doctors and staff. [ https://org.salsalabs.com/o/1400/p/salsa/donation/common/public/?donate_page_KEY=9939 ]
Additionally, a courageous clinic doctor who flies in from out of state has been exposed by Operation Rescue and harassed with protests at her family practice in Illinois.
The Feminist Majority Foundation clinic defense team has been helping the new clinic in many different ways. Our team has traveled to Wichita several times and spent weeks on the ground helping to obtain security and to build community support. We will continue to help and we wanted to give you and all of our supporters an opportunity to help. We cannot let the terrorists win!
Will you give $5 or $500, $25 or $100, or even $5,000 today to help provide desperately needed security measures for the South Wind Women’s Center and staff? [ https://org.salsalabs.com/o/1400/p/salsa/donation/common/public/?donate_page_KEY=9939 ]
Your contribution will go directly to the clinic and personnel security measures. Let the staff know they are not alone and that people all over this nation won’t let the terrorists win.
Join with me to TRUST WOMEN. [ https://org.salsalabs.com/o/1400/p/salsa/donation/common/public/?donate_page_KEY=9939 ]
For Women’s Lives,
Ellie Smeal
Ellie Smeal
Feminist Majority Foundation President
P.S. We must not let the terrorists win. Please give as much as you can today! [ https://org.salsalabs.com/o/1400/p/salsa/donation/common/public/?donate_page_KEY=9939 ]
1600 Wilson Boulevard, Suite 801, Arlington, VA, 22209 |<PHONE_NUMBER> |<EMAIL_ADDRESS>You have received this e-mail because of your interest in women’s issues. To unsubscribe, please click here. [ http://salsa.democracyinaction.org/o/1400/p/salsa/supporter/unsubscribe/public/index.sjs?unsubscribe_page_KEY=494 ]


Profile Intro
Anthony Marshon Davis Jr. (born March 11, 1993) is an American professional basketball player for the Los Angeles Lakers of the National Basketball Association (NBA). He plays the power forward and center positions.
Davis was selected first overall in the 2012 NBA draft by New Orleans, is a six-time NBA All-Star, and has been named to three All-NBA First Teams and three NBA All-Defensive Teams. He also earned a gold medal playing with Team USA at the 2012 Summer Olympics. Davis played one season of college basketball for the University of Kentucky, when he was first team All-American and the Consensus National Player of the Year. He also won the USBWA National Freshman of the Year, NABC Defensive Player of the Year and the Pete Newell Big Man Award. Davis led the NCAA in blocks and set Southeastern Conference and NCAA Division I freshman single-season blocked shots records. He led Kentucky to a National Championship and was named Most Outstanding Player of the NCAA tournament. Davis left college for the NBA after one season and was drafted by the New Orleans Pelicans, then known as the New Orleans Hornets, and was selected that summer to play for the Team USA in the 2012 Olympics. After his rookie season, he was named to the NBA All-Rookie First Team. The next season, he became an All-Star for the first time and led the NBA in blocked shots per game. He has since become a six-time All-Star and the youngest player to score at least 59 points in an NBA game. In 2017, he was named the recipient of the NBA All-Star Game MVP Award after setting an All-Star Game scoring record of 52 points en route.
High School
Davis played high school basketball for the Perspectives Charter School who competed in the Blue Division (Chicago Public High School League) which he attended. Being a charter school with a primary focus on Math and Science with high academy pedigree, little attention was given to athletics. Davis and his friends practised basketball at a nearby church because his school didn’t have a gymnasium. Davis stood at a height of 6 feet 0 inches at the end of his freshman year. At the beginning of his sophomore year, he had added 1 more inch and finally ended the year at 6 feet 4 inches. His junior year saw him rise to 6 feet 7 inches at the onset and 6 feet 8 inches at the end of the year.
College Career
After less than one month of play, he was mentioned as a possible conference Player of the Year and National Player of the Year. He led the Wildcats to a perfect record of 16-0. The Kentucky Wildcats earned the number one overall seed in the 2012 NCAA Men’s Division I Basketball Tournament. Davis led the team to its eighth NCAA championship. He was named the 2012 Sporting News College Basketball Player of the Year, he won the U.S Basketball Writers Associations (USBWA) Robertson trophy while CBSSports.com named him their national player of the year. He also became the second freshman to win the Associated Press College Basketball Player of the Year. Davis also bagged the Naismith College Player of the Year. Davis was also named first-team All-American by the National Association of Basketball Coaches and also CBSSports.com first-team All-American. In the 2012 NCAA Tournament, Davis won the NCAA Basketball Tournament Most Outstanding Player and also was selected to the All-Tournament team, he was also named the USBWA National Freshman of the Year. The NABC Defensive Player of the Year award was also won by him.
Professional Career
Alongside the starting five of the national championship team, the Kentucky Wildcats, Davis declared for the 2012 NBA draft. The New Orleans Pelicans selected Davis as its first overall pick, making him the fifth Chicago-area first overall selection. Davis agreed to a three-year contract worth a guaranteed $16 million on July 24, 2012. Davis debuted for the Hornets on November 1, 2012, but was sidelined in subsequent games due to concussions, but returned to action after missing 11 games. In the 2013 NBA All-Star Game weekend, he played in the Rising Stars Challenge. Davis was a 2013 NBA All-Rookie First Team selection in his Rookie year, he was also the first runner-up in NBA Rookie of the Year voting. In his second year with the Hornets, he earned an NBA Player of the Week nomination that week but lost to Kevin Love. He was also a finalist for the Western Conference Player of the Week but lost out to Kevin Durant. During the 2014 NBA All-Star Game weekend, Davis competed in the Rising Star Challenge. He was picked to replace Kobe Bryant on February 7, in the 2014 All-Star Game, marking his first selection. Davis led the NBA in terms of blocks shots per game (2.82). Davis finished third in the NBA Most Improved Player Award.


Each constraint has a unique number associated with it.
Trifolia allows you to edit the constraint number, as long as the number follows the criteria specified above.
In addition to the unique constraint number, Trifolia allows constraints to have a Display Number which does not have to be unique. The Display Number can be contain letters, in addition to numbers (ex: "CAT1-2523").
Note: When creating a new constraint in the template/profile editor, the number will be displayed as AUTO until the template/profile is saved. Once the template/profile is saved, the database generates a unique number for the constraint. When the template/profile is refreshed after saving, the number generated will be shown in the constraint.