>
This is part of the old website. New website begins at fontforge.github.io
Are you a web developer? Help us migrate this page on Github
There are two types of contextual positioning modes: Contextual Positioning
and Chained Contextual Positioning. In the simplest form of the first you
may specify a list glyphs and specify repositioning to occur if that sequence
is matched. For example you might specify (in English)
5 t h
and if that sequence were found raise the "t" and "h" to 5th.
You can also specify classes of glyphs so you could say something like:
[0-9] t h
to raise "t" and "h" after any digit.
After applying this lookup, a word processor will skip over the three glyphs matched by the pattern, at least it will in a simple "Contextual Positioning" lookup. The "Chained Contextual Positioning" lookup is a bit more general and allows you to divide the pattern into three parts: A part before the current glyph (called backtracking), a part including the current glyph, and a part after the current glyph (called lookahead). Positioning changes may only be made to the part including the current glyph, and the word processor will advance by the number of glyphs in that subset of the pattern.
Substitutions come in three types. The first two are similar to the two types for positioning, the third is designed to handle a very specific case of arabic typography and is applied backwards.
Suppose you had a script font where most letters join at the base line, but
after some letters (b,o,v,w) the join is near the x-height, so a special
version of each lower case letter needs to be created designed for a left
side join near the x-height. You would want to be able to say:
[bovw] [a-z]
Note that this just specifies the cases in which the substitution may be
applied. It does not specify the substitution itself, that is done in a separate
lookup.
You may pull down an example script font with this substitution from FormalScript.tgz, this example is worked out in detail in the tutorial.
For more information on contextual lookups see Adobe's Docs:
In some cases a contextual or chaining contextual substitution can be converted into one of Apple's contextual glyph substitution subtables. See the page on Apple Advanced Typography for more information as to when and caveats about how.
First you must create a contextual lookup with the Element->Font Info->Lookups dialog, then in that same dialog create and name a subtable in that lookup. Then the contextual editor will open.
Except for the reverse chaining features, any of these may come in one of three formats.
The simplest format is a list of glyphs. You may specify
several glyph sequences in a single feature. So the script example above
could be specified (quite inefficiently) by 4*26 lines like:
b a
b b
...
o a
...
The next format allows you to specify a list of
classes. In the script example we would define 2
classes:
[bovw]
[ac-np-ux-z]
and define two patterns as:
class1 [class2]
class1 [class1]
The third format is the most general and allows you to specify your pattern
by a separate list of glyphs for each glyph
position:
[bovw] [a-z]
Most contextual specifications are fairly simple, FontForge has two dialog formats, one for simpler specifications and one for more complicated ones. The complicated dialog is (I think) more difficult to understand, but allows for greater generality.
In both the glyph and the class format you are allowed to specify multiple
matching rules (in the coverage format you may only specify one rule. I know
this sounds odd, I did not design the system). UNFORTUNATELY
the OpenType interpreters do not seem to support multiple rules within a
single subtable. Instead I suggest you use multiple subtables. It will have
the same effect but is less efficient. FontForge still supports multiple
rules because the spec says it should.
This display shows a list of three items, the first column consists of coverage tables -- that is lists of glyphs. A match occurs if the current glyph matches one of the glyphs named in the current coverage table. The second column contains the name of a lookup that should be applied to the glyph associated with the coverage table if the entire rule matches.
As noted earlier the rule is divided into three sections, backtrack, match and lookahead. The third column indicates when each section starts. Lookups may only occur in the middle (the "match") section. If you don't specify the start of each section FontForge will figure it out for you assuming that the match section starts with the first lookup and ends with the last. WARNING: this simple heuristic does not work for ligatures. The match section must be long enough to provide all glyphs that might be consumed by the ligature conversion.
This lookup does not directly describe how transformations are to happen to the glyphs, merely WHEN. Instead it invokes a nested lookup that will be applied to specific positions in the match string (positions in the backtrack and lookahead lists may not be transformed).
So in the example at right, the first list of glyphs is a coverage table in the backtrack section, while the second line starts the match section. The rule says that if one of the letters [bovw] is followed by any other letter, then the second letter should be transformed using the nested lookup "To-TopJoin" (which will convert the glyph into an alternate format). Here there is no need for a lookahead list (and there is none).
You can change a coverage table by editing it. You may enter either glyph
names or unicode characters (which will be converted to a glyph name -- a
few characters which have special meaning: space, right parenthesis, asterix;
must have their names typed in full). If you click on the little box on the
right you will get a dialog containing a font view. In this view you may
select glyphs to your heart's content, when you press OK these glyphs become
your table.
This display shows a list whose entries are coverage tables -- that is lists of glyphs. A match occurs if the current glyph matches one of the glyphs named in the current coverage table.
In the example at right there is only a single coverage table here (but there could be more).
In a Chaining Contextual feature it is also possible to specify a list of coverage tables to match glyphs before the current glyph, and another list to match glyphs after.
In the example at right, the lookup 'high' will be applied to any glyph that matches the coverage table at the top of the list. Again the buttons under the sequence lookup list allow you to add, change, remove or reorder these transformations. (And yes, the order the transformations are applied can matter in complex situations).
You can change a lookup by clicking on it, this will produce a pull down menu of all lookups that can be applied. You can change the position by editing it.
You can add a new entry by pressing the <New> button, and then selecting
a lookup.
Again each rule is divided into sections (here marked with the vertical bar "|"). In the match section glyphs may be followed by lookup names, and those lookups will be applied to the preceding glyph if a match occurs.
So the example at right is an attempt to do with a series of glyph rules what was done easily with one coverage table rule. Every possible combination of letters must be spelled out as a separate rule.
At the bottom of the list are two buttons, one to add a lookup reference after
a glyph, and the other to start a new section.
This format allows you to specify several glyph lists to match. In the example at right the string "A,B,C" will be matched in the glyphs before the current glyph, then "D E" starting at the current location, and finally "F G H" after them. If everything matched then the lookup "Smallcaps" will be applied to location 0 (in this case "D") , and "superscript" to location 1 (here, "E").
The order is significant, word processors will stop at the first match they
find so in the following pattern strings:
b a
b a f
the second entry would never be matched because "b a" would be applied first.
While:
b a f
b a
would apply match "b a f" when an "f" was present, and "b a"
otherwise.
The text field may be manipulated as above. However here we are specifying a string of glyphs each of which must be matched, rather than a class of glyphs any of which could match. So in the example at right, "DE" would match, but "E" would not.
As above a set of lookups can be applied after the match occurs.
When specifying a class match, you must specify at least one set of glyph classes. If you only specify one set these classes will be used in all sections, alternately each section may have its own set of glyph classes. You may give each glyph class a name (if you don't then the class will be named something dull like "1", "2", etc.)
You must also specify a list of patterns where each pattern is a list of class names (or numbers).
Every set of classes has a magic class at index 0 which matches whatever glyphs are not explicitly mentioned in another class. FontForge displays this by calling it "{Everything Else}". You may not delete, edit nor reorder this class. Other classes are just unordered lists of glyph names (rather like coverage tables above), however any specific glyph may belong to at most one class at a time (whereas a glyph may occur in as many coverage tables as desired).
In the example at right, any letter that occurs after one of the special letters [bovw] will be changed into an alternate form.
There is a small bug here. Because classes must be disjoint, the "letters"
class does not contain the letters [bovw]. So there actually needs to be
a second rule that looks like "high-after | high-after @<To-TopJoin> |"
.
As I mentioned early, multiple rules don't actually work, so that rule
is in a separate subtable (which is in the same lookup) and isn't displayed
here.
Once you have set up your classes, you may then edit the patterns you want to match. To remind you of what your classes are, FontForge displays the class list underneath the pattern. Clicking on a class will insert that class's index into the pattern.
Finally you must set the nested lookups. This is exactly the same as previous
sequence / lookup settings.


Tracker-1.0.4
Introduction to Tracker
Tracker is a semantic data storage
for desktop and mobile devices.
This package is known to build and work properly using an LFS-7.6
systemd platform.
Package Information
Tracker Dependencies
Required
ICU-53.1, libpng-1.6.13,
SQLite-3.8.6, and Vala-0.24.0
Recommended
GTK+-3.12.2, gobject-introspection-1.40.0,
gst-plugins-base-1.4.1, libgee-0.14.0,
libgsf-1.14.30, libjpeg-turbo-1.3.1, libmediaart-0.4.0, LibTIFF-4.0.3,
libxml2-2.9.1, Nautilus-3.12.2,
NetworkManager-<IP_ADDRESS>, Poppler-0.26.4, totem-pl-parser-3.10.2, and UPower-0.99.1
Optional
Exempi-2.2.2, FFmpeg-2.3.3,
FLAC-1.3.0, giflib-5.1.0,
GTK-Doc-1.20 (requires Dia and Graphviz),
libexif-0.6.21, libvorbis-1.3.4, taglib-1.9.1,
Enca,
GuPNP-DLNA,
libcue, libgrss,
libgxps,
libiptcdata, libosinfo, and libunistring
User Notes: http://wiki.linuxfromscratch.org/blfs/wiki/tracker
Installation of Tracker
First, fix building with recent versions of Giflib:
sed -i "/DGifCloseFile/s:gifFile:&, NULL:g" src/tracker-extract/tracker-extract-gif.c
Install Tracker by running the
following commands:
./configure --prefix=/usr \
--sysconfdir=/etc \
--disable-static \
--disable-unit-tests \
--disable-miner-evolution \
--disable-miner-firefox \
--disable-miner-thunderbird &&
make
This package does not have a working testsuite.
Now, as the root
user:
make install
Command Explanations
--disable-static
: This
switch prevents installation of static versions of the libraries.
--disable-unit-tests
: This
switch prevents unit tests from being installed.
--disable-miner-*
: These
miners have been reported to cause problems, so we turn them off.
Additionally, the Evolution miner
doesn't build with latest version of Evolution.
--enable-libflac
: Use this switch if
you have installed FLAC-1.3.0 and wish to build the
Tracker extractor for FLAC
metadata.
--enable-libvorbis
: Use this switch if
you have installed libvorbis-1.3.4 and wish to build the
Tracker extractor for OGG
metadata.
Contents
Installed Programs:
tracker-control, tracker-import,
tracker-info, tracker-needle, tracker-preferences,
tracker-search, tracker-sparql, tracker-stats, and
tracker-tag
Installed Libraries:
libtracker-control-1.0.so,
libtracker-miner-1.0.so, libtracker-sparql-1.0.so, and
libnautilus-tracker-tags.so (Nautilus Extension)
Installed Directories:
/usr/include/tracker-1.0,
/usr/lib/tracker-1.0,
/usr/share/gtk-doc/html/libtracker-{control,miner,sparql}, and
/usr/share/tracker
Short Descriptions
|
tracker-control
|
manages and checks status of all Tracker processes and
data.
|
|
tracker-import
|
allows data to be imported to the database by providing
files with Turtle content.
|
|
tracker-info
|
asks for all the known metadata available for the given
file.
|
|
tracker-needle
|
is a graphical front end for Tracker which has similar
features to tracker-search
|
|
tracker-preferences
|
is a graphical configuration front end for the
tracker-miner-fs.
|
|
tracker-search
|
searches all indexed content for an expression.
|
|
tracker-sparql
|
allows the caller to run an RDF query on the database.
|
|
tracker-stats
|
returns statistics based on the ontology classes outlined
in the Nepomuk ontology specification.
|
|
tracker-tag
|
allows the caller add tags, remove tags and list tags by
URN or to list all tags and the files associated with
them.
|
|
libtracker-control-1.0.so
|
contains functions required to monitor/control Tracker
miners.
|
|
libtracker-miner-1.0.so
|
contains functions required to develop Tracker data
miners.
|
|
libtracker-sparql-1.0.so
|
contains functions for performing SPARQL queries and
updates in the Tracker Store.
|
Last updated on 2014-09-02 21:49:39 -0700


Hak Studio Projects Continued
City Rebranding Efforts
City rebranding and web/app development for tourism became our focus, I was in charge of all mobile-platform visuals while collaborating with the lead graphic designer who created the web-styles.
Conceptual mobile website navigation and branding pitch for the Town of Parry Sound, Ontario.
Conceptual desktop website navigation, with a focus on job boards, pitch for Perth County, Ontario.


{% extends 'dpaw_payments/emails/base.html' %}
{% block content %}
{% if refund_type == 'manual' %}
A refund of ${{amount|floatformat:2}} has been made for invoice reference number {{reference}}.
{% elif refund_type == 'card' %}
A refund of ${{amount|floatformat:2}} has been made for invoice reference number {{reference}} to the account used to make payment.
{% endif %}
{% endblock %}


lassopmm_shiny_app.Rmd
Running shiny app with lassopmm analysis is very simple. All you need is to install lassopmm
package and run function that launches the shiny app.
To install the package, use development version from Github:
To launch the app, use comand lassopmm::lassopmm_app()
.


@(devMode: Boolean) @main("Welcome to Play with Scala.js and React")(Html("")) { You need to enable JavaScript to run this app.


Jimmie Johnson Announces 2020 Season Will Be Final Full Season in NASCAR
One of NASCAR's greatest drivers, Jimmie Johnson, says next season will be his last full season behind the wheel.
The driver made the announcement in a video posted to his Twitter page with the hashtag #Chasing8. Johnson's seven NASCAR championships are tied for the most with Richard Petty and Dale Earnhardt.
Johnson said he was thankful for 18 years racing in NASCAR and that he was looking forward to the 2020 season before announcing it will be his last full season as a NASCAR driver.
"I know what this team is capable of an I hope 2020 is the best yet," Johnson said.
NBCSports said Johnson's contract expires after the 2020 season but that in October Ally extended the sponsorship of his No. 48 car through 2023.
The announcement comes just three days after the end of the Cup season.
Over his 18 year career, Johnson found more success in North Texas than any other Cup driver.
TMS said Johnson's seven wins at the speedway "are the most of any Cup series driver here, and he's the only driver to win a single Cup Series race here four consecutive years (AAA Texas 500 2012-2015)."
Track officials said Johnson was so good in Texas that he finished in the top five in 48% percent of his 33 races and that he won the pole twice.


Mobile + Desktop
Looks good, feels great
Millions of users love social media
Answers for your online experience
I'm located in the Knoxville area.


Notable changes
Changed
- fix: added GROUPSTARTUPPARAMETERS boolean property to determine whether or not to group
startup parameters in a transaction (default=false like 42.2.x) fixes Issue #2425
pgbouncer cannot deal with transactions in statement pooling mode PR #2425
Fixed
- fix: queries with up to 65535 (inclusive) parameters are supported now (previous limit was 32767)
PR #2525, Issue #1311
- fix: workaround JarIndex parsing issue by using groupId/artifactId-version directory namings.
Regression since 42.2.13. PR #2531, issue #2527
- fix: use Locale.ROOT for toUpperCase() toLowerCase() calls
- doc: add Vladimir Sitnikov's PGP key
- fix: return correct base type for domain from getUDTs PR #2520 Issue #2522
- perf: utcTz static and renamed to UTC_TIMEZONE PR #2519
- doc: fix release version for #2377 (it should be 42.3.6, not 42.3.5)
Commits by author
Andrei Lurie (1):
fix: return correct base type for domain from getUDTs PR 2520 (#2522)
Dave Cramer (3):
fix: added GROUPSTARTUPPARAMETERS boolean property to determine whether or not to group startup parameters in a transaction or not fixes Issue 2423 pgbouncer cannot deal with transactions in statement pooling mode PR 2425
Jorge Solórzano (1):
chore: Make the readme version agnostic PR 2540
Sven Diedrichsen (1):
Made utcTz static and renamed to UTC_TIMEZONE PR 2519
Vladimir Sitnikov (24):
doc: fix release version for PR 2377 (it should be 42.3.6, not 42.3.5)


ArtNest
Overview
The artnest is a communication platform for student and entry level artists to gather together with people in the same industry and create unexpected collisions of ideas.
Users can gain critique of their artwork, get rich resources to solve their confusions and questions and join various groups to interact with like-minded people and share ideas. It will help them adapt to the atmosphere of debates and critique in the art field and finally be confident with their artwork.
Role
User Research, UI/UX design, Usability Testing
Team
Yucheng Hang (Individual work)
Tool
Adobe Illustrator, Adobe Xd, Figma
INTERACTIVE PROTOTYPE
PERSONAL MOTIVAION
As an entry level UI/UX designer, I found my passion in this field three years ago and started to treat it as my professional field. After that, I was applying for a MFA degree a year ago and now I am trying to find a related job. I personally encountered some frustrating moments during the process. For example, I really want to know someone in the same field as me that can give me some suggestions or advice on career development and learning path. I also expect someone to review and critique my projects and portfolio so that I can be more confident about my work and more competitive in the market. I tried to solve my problems through platforms like Behance, Linkedin and Reddit, however, art and design are a very small branch of them and I cannot find enough resources and information. I am at a loss and sometimes feel lonely during the process of pursuing my dream as a designer.
Therefore I was thinking about creating a communication platform especially for student and entry level artists. They are encouraged to interact with each other by posting and answering their confusions and thoughts encountered in career development and gaining peer critique of their artwork.
DESIGN HYPOTHESIS
I believe that creating a communication platform for student artists/entry level artists to post and answer their confusions and thoughts encountered in career development and gain peer critique of their artwork will help them adapt to the atmosphere of debates and critique and finally be confident with their artwork.
RESEARCH PROCESS
Questionnaire
I created a google form and invited 25 people to do this survey. They are all art-related majors, some of them have official working experience while others are currently undergraduate or graduate students.
Selected questionnaire results
From the survey, I found that my personal experience and feeling is actually a common problem for all kinds of artists. Most of the artists believe that it is harder for them to get resources in career development and learning path compared with other more popular majors. Also, most student artists/ entry level artists are not that confident about their portfolios and they have the desire to find more resources or suggestions from others in the same field as them.
Interview
I conducted a 20mins interview with 5 of my friends and former colleagues. These interviewees came from different age ranges, gender and art backgrounds, from students to employees, from native people to foreigners.
Persona
Based on the survey and interview results, I build two personas.
Problem Framing
By digging into the pain points of personas, I framed the main problems of my users.
1. Hard to find enough resources to get objective and comprehensive critiques and evaluations of their work.
2. Compared with other popular majors, lack of a specialized place for artists to post questions and confusions about their professional skills, artwork and career development.
3. Couldn’t find a space for them to share and discuss with people in the same field about some insights and thoughts related to their study and work.
4. Easy to feel alone and at a loss since there are not enough resources in the market.
Restructure Design Statement
I believe that creates a communication platform for student and entry-level artists to gain peer critique of their artwork, get rich resources to solve their confusions and questions, and join various groups to interact with like-minded people will help them adapt to the atmosphere of debates and critique and finally be confident with their work.
Key Features
Based on all the research and analysis, I concluded with four key features.
1. Give and gain peer critique of user’s artwork/portfolio.
2. Post and answer questions.
3. Join various groups/communities and communicate with other artists.
4. Promote customized articles and questions to users based on their interests.
User Flow
According to the key features, I made several user flows align with each key feature by using the shorthand method.
User Stories
Moving forward, I created a set of user stories. This helped me delineate the features and abilities of the product.
DESIGN PROCESS
Wireframes
Based on the guideline of user stories and user flows, I created a low fidelity wireframe.
Critique: After receiving helpful feedback from my peers, I realized that the app is a little bit overwhelming because it covers too many aspects. I need to narrow it down. They also pointed out the direct feedback function (critique & asking questions) is the most outstanding and innovative part of the app. Therefore, I decided to focus strongly on the direct feedback part and deleted the long-form writing/blogging function.
High fidelity Prototype
After implementing the feedback I received about wireframes, I designed a high fidelity prototype.
Hi-fi prototype(sign up process)
Hi-fi prototype(key features screen)
TESTING PROCESS
Heuristic Evaluation
I invited 5 evaluators to give a heuristic evaluation of the prototype. Each evaluator individually went through the interface twice and compared them with Jakob’s 10 Usability Heuristics. Below are the results and solutions.
#1:Voliate Visibility of system status
Since I have multi-step questions when signing up, users would feel confused and had no idea about how long the sign-up process is. Therefore, I added a stepper component as the visual cue to keep users informed about the current status.
Revised sign up process
#2:Voliate Recognition rather than recall
Another feedback I got was adding loading and confirmation status. Therefore I add the loading and confirmation screen in “posting your work”, “creating a group” and “ask a question” function.
#3 Voliate Help users recognize, diagnose, and recover from errors
One of the evaluators mentioned that my app is lacking error messages. Therefore, I used bold, red text to indicate errors to users.
Thank you for reading :)
All Works
© Designed by Yucheng Hang


{{/* If there is more than one page of results, show "previous/next page" links and links to each page of results. */}} {{ if (or .HasPrev .HasNext) }}


CSS Tutorial
Save a lot of work with CSS!
In our tutorial you will learn how to use CSS to control the style and layout of multiple Web pages all at once.
Save a lot of work with CSS!
In our tutorial you will learn how to use CSS to control the style and layout of multiple Web pages all at once.
Lern by 70 examples! With our editor, you can edit CSS, and click on a test button to view the result
Tri-It-Yourself!At W3Scool you will find a complete CSS2 referenc, listing properties, units of measurment, colors, and more.
CSS2 ReferenceTest your skills at W3Schools!
Start CSS Quiz!


PICS: Demolition begins at infamous "White House" in Sunnyside
by Alex MitchleyThe notorious "White House" in Sunnyside, which has been a drug den and hub of criminal activity for more than a decade, will be nothing more than rubble in a couple of days.
The City of Tshwane officially started demolishing the building on Wednesday morning after it was cleared of people and their belongings.
A loader spent most of the day tearing down the building's exterior walls, ending the life-cycle of what has become an infamous building in the city.
The "White House" is synonymous with crime, homelessness and the drug culture in Sunnyside, which has led to numerous complaints being laid over the years.
It was originally a Memorable Order of Tin Hats (MOTH) club in Pretoria.
The White House in Sunnyside (Alex Mitchley, News24)
Tshwane's MMC for community safety and emergency services, Karen Meyer, told the media the derelict building had been used as a temporary base for criminal activity for years, leading to an increase in crime in the area.
Complaints received about the "White House" ranged from smash and grabs, theft, assault and drug use. It has also been used as a shelter by homeless people in Tshwane.
The infamous White House in Sunnyside is being demolished. (Alex Mitchley, News24)
Meyer said the building was condemned and declared uninhabitable which led to the decision to tear it down.
She added occupants were given 48 hours to vacate the premises, saying raids on Monday and Tuesday came up empty-handed as they had already fled.
As the demolition was underway, "residents" of the infamous building expressed their displeasure with the City's decision to demolish it.
One man, who did not want to be named, told News24 he had been living in the "White House" for almost a decade and that all its occupants were law-abiding citizens.
He said the demolition would leave scores of people without a roof over their heads, including children and pregnant women.
"Our concern is where are we going now. We have no help."
The ward councillor for Sunnyside, Godfrey Mulaudzi, denied people would be left destitute, saying plans were in place to move them to shelters.
"We have a list of people staying here, and those who require services and shelter will be accommodated," Mulaudzi said.
The notorious White House in Sunnyside. (Alex Mitchley, News24)


e-Commerce and On-line Marketing Surveys
The annual “eCommerce” and “On-line Marketing” surveys aim to investigate the online consumers’ behavior, as well as the ways that they prefer to
receive information either for their purchases, or for their entertainment. The surveys’ are presented each year at the beginning of December.
Moreover, ELTRUN conducts specified surveys and studies related to the e-commerce market, e.g. e-banking, e-health, e-commerce analytics etc.


This section covers the only opcodes which designers are likely to have occasional need of: those which drive powerful and otherwise inaccessible features of the Z-machine's “hardware”, such as sound, graphics, menus and the mouse. There's no need to be fluent in assembly language to use these opcodes, which work just as well if used as incantations from a unfamiliar tongue.
▲
WARNING
Some of these incantations may not work well if a story file is played
on old interpreters which do not adhere to the Z-Machine Standard.
Standard interpreters are very widely available, but if seriously worried
you can test in an Initialise
routine whether your game
is running on a good interpreter, as in the following code.
if (standard_interpreter == 0) { print "This game must be played on an interpreter obeying the Z-Machine Standard.^"; @quit; }
The library variable standard_interpreter
holds the version number of the standard obeyed, with the upper byte
holding the major and the lower byte the minor version number, or
else zero if the interpreter isn't standard-compliant. Thus $002
means 0.2 and $100
means 1.0. Any standard interpreter will
carry out the opcodes in this chapter correctly, or else provide fair
warning that they cannot. (For instance, an interpreter running on a
palm-top personal organiser without a loudspeaker cannot provide sound
effects.) Here is how to tell whether a standard interpreter can or
can't provide the feature you need.
| Feature | Versions | Available if |
| auxiliary files | 5,6,8 | (true) |
| coloured text | 5,6,8 | ((0->1) & 1 ~= 0) |
| input streams | 5,6,8 | (true) |
| menus | 6 | (($10-->0) & 256 ~= 0) |
| mouse | 5,6 | (($10-->0) & 32 ~= 0) |
| output streams | 5,6,8 | (true) |
| pictures | 6 | (($10-->0) & 8 ~= 0) |
| sounds | 5,6,8 | (($10-->0) & 128 ~= 0) |
| throw/catch stack frames | 5,6,8 | (true) |
| timed keyboard interrupts | 5,6,8 | ((0->1) & 128 ~= 0) |
For instance, if coloured text is essential (for instance
if red and black letters have to look different because it's a vital clue
to some puzzle), you may want to add a test like the following to your
Initialise
routine:
if ((0->1) & 1 == 0) print "*** This game is best appreciated on an interpreter capable of displaying colours, unlike the present one. Proceed at your own risk! ***^";
· · · · ·
▲ Text flows in and out of the Z-machine continuously: the player's commands flow in, responses flow out. Commands can come in from two different “input streams”, only one of which is selected at any given time: stream 0 is the keyboard and stream 1 is a file on the host computer. The stream is selected with:
@input_stream number
The Inform debugging verb “replay” basically does no more than switch input to stream 1.
▲
There are four output streams for text, numbered 1 to 4. These are:
(1) the screen, (2) the transcript file, (3) an array in memory and
(4) a file of commands on the host computer. These can be active in
any combination, except that at all times either stream 1 or stream 3
is active and not both. Inform uses stream 3 when the message
print_to_array
is sent to a string, and streams 2 and 4
in response to commands typed by the player: “script on”
switches stream 2 on, “script on” switches it off;
“recording on” and “off” switch stream 4 on and
off. The relevant opcode is:
@output_stream number arr
If number
is 0 this does nothing.
+
n switches stream n on,
-
n switches it off. The arr
operand is
omitted except for stream 3, when it's a table array holding the text
printed: that is, arr-->0
contains the number of characters
printed and the text printed is stored as ZSCII characters in
arr->2
, arr->3
, …
▲ As the designer, you cannot choose the filename of the file of commands used by input stream 1 or output stream 4. Whoever is playing the story file will choose this: perhaps after being prompted by the interpreter, perhaps through a configuration setting on that interpreter.
•▲▲
EXERCISE 122
Implement an Inform version of the standard ‘C’ routine
printf
, taking the form
printf(format, arg1, ...)
to print out the format string but with escape sequences
like %d
replaced by the arguments (printed in various ways).
For example,
printf("The score is %e out of %e.", score, MAX_SCORE);
should print something like “The score is five out of ten.”
▲
In Version 6 story files, only, @output_stream
can take
an optional third operand when output stream 3 is being enabled. That is:
@output_stream 3 arr width
If width
is positive, the text streamed
into the array will be word-wrapped as if it were on a screen width
characters wide; if width
is negative, then as if on
a screen -width
pixels wide. The text going into arr
is in the form of a sequence of lines, each consisting of a word containing
the number of characters and then the ZSCII characters themselves in
bytes. The sequence of lines finishes with a zero word. Such an array
is exactly what is printed out by the opcode @print_form arr
.
· · · · ·
▲ The Z-machine has two kinds of “screen model”, or specification for what can and can't be done to the contents of the screen. Version 6 has an advanced graphical model, whereas other versions have much simpler textual arrangements. Early versions of the Z-machine are generally less capable here, so this section will document only the Version 5 and Version 6 models. (Versions 7 and 8 have the same model as Version 5.)
The version 5 screen model. The screen is divided into an upper window, normally used for a status line and sometimes also for quotations or menus, and a lower window, used for ordinary text. At any given time the upper window has a height H, which is a whole number of lines: and H can be zero, making the upper window invisible. (The story file can vary H from time to time and many do.) When text in the upper and lower windows occupy the same screen area, it's the upper window text that's visible. This often happens when quotation boxes are displayed.
@split_window H
Splits off an upper-level window of the given number of lines H in height from the main screen. Be warned that the upper window doesn't scroll, so you need to make H large enough for all the text you need to fit at once.
@set_window window
Selects which window text is to be printed into: (0) the lower one or (1) the upper one. Printing on the upper window overlies printing on the lower, is always done in a fixed-pitch font and does not appear in a printed transcript of the game.
@set_cursor line column
Places the cursor inside the upper window, where (1, 1) is the top left character.
@buffer_mode flag
This turns on (flag==true)
or off
(flag==false)
word-breaking for the current window: that is,
the practice of printing new-lines only at the ends of words, so that
text is neatly formatted.
@erase_window window
Blanks out window 0 (lower), window 1 (upper) or the
whole screen (if window=-1
).
Using fixed-pitch measurements, the screen has dimensions
X characters across by Y characters down, where
X and Y are stored in bytes $21
and $20
of the header respectively. It's sometimes useful to know this when formatting
tables:
print "My screen has ", 0->$20, " rows and ", 0->$21, " columns.^";
Be warned: it might be 80 × 210 or then again it might be 7 × 40. Text printing has a given foreground and background colour at all times. The standard stock of colours is:
| 0 | current colour | 5 | yellow |
| 1 | default colour | 6 | blue |
| 2 | black | 7 | magenta |
| 3 | red | 8 | cyan |
| 4 | green | 9 | white |
@set_colour foreground background
If coloured text is available, this opcode sets text
to be foreground
against background
.
(But bear in mind that not all interpreters can display coloured text,
and not all players enjoy reading it.) Even in a monochrome game, text
can be set to print in “reverse colours”: background on
foreground rather than vice versa. Status lines are almost always printed
in reverse-colour, but this is only a convention and is not required
by the Z-machine. Reverse is one of five possible text styles: roman,
bold, underline (which many interpreters will render with italic),
reverse and fixed-pitch. (Inform's style
statement chooses
between these.)
•▲
EXERCISE 123
Design a title page for ‘Ruins’, displaying a more or
less apposite quotation and waiting for a key to be pressed. (For
this last part, see below.)
•▲
EXERCISE 124
Change the status line so that it has the usual score/moves appearance
except when a variable invisible_status
is set to
true
, when it's invisible.
•▲
EXERCISE 125
Alter the ‘Advent’ example game to display the number of
treasures found instead of the score and turns on the status line.
•▲
EXERCISE 126
(From code by Joachim Baumann.) Put a compass rose on the status line,
displaying the directions in which the room can be left.
•▲▲
EXERCISE 127
(Cf. ‘Trinity’.) Make the status line consist only of
the name of the current location, centred in the top line of the screen.
The version 6 screen model. We are now in the realm of graphics, and the screen is considered to be a grid of pixels: coordinates are usually given in the form (y,x), with (1,1) at the top left. y and x are measured in units known, helpfully enough, as “units”. The interpreter decides how large “1 unit” is, and it's not safe to assume that 1 unit equals 1 pixel. All you can tell is what the screen dimensions are, in units:
print "The screen measures ", $22-->0, " units across and ", $22-->1, " units down.^";
There are eight windows, numbered 0 to 7, which text and pictures can currently be printing to: what actually appears on the screen is whatever shows through the boundaries of the window at the time the printing or plotting happens. Window number −3 means “the current one”. Windows have no visible borders and usually lie on top of each other. Subsequent movements of the window do not move what was printed and there is no sense in which characters or graphics “belong” to any particular window once printed. Each window has a position (in units), a size (in units), a cursor position within it (in units, relative to its own origin), a number of flags called “attributes” and a number of variables called “properties”. If you move a window so that the cursor is left outside, the interpreter automatically moves the cursor back to the window's new top left. If you only move the cursor, it's your responsibility to make sure it doesn't leave the window.
The attributes are (0) “wrapping”, (1) “scrolling”, (2) “copy text to output stream 2 if active” and (3) “buffer printing”. Wrapping means that when text reaches the right-hand edge it continues from the left of the next line down. Scrolling means scrolling the window upwards when text printing reaches the bottom right corner, to make room for more. Output stream 2 is the transcript file, so the question here is whether you want text in the given window to appear in a transcript: for instance, for a status line the answer is probably “no”, but for normal conversation it would be “yes”. Finally, buffering is a more sophisticated form of wrapping, which breaks lines of text in between words, but which (roughly speaking) means that no line is printed until complete. Note that ordinary printing in the lower window has all four of these attributes.
@window_style window attrs operation
Changes window attributes. attrs
is a
bitmap in which bit 0 means “wrapping”, bit 1 means “scrolling”,
etc. operation
is 0 to set to these settings, 1 to set only
those attributes which you specify in the bitmap, 2 to clear only those
and 3 to reverse them. For instance,
@window_style 2 $$1011 0
sets window 2 to have wrapping, scrolling and buffering but not to be copied to output stream 2, and
@window_style 1 $$1000 2
clears the buffer printing attribute of window 1.
Windows have 16 properties, numbered as follows:
| 0 | y coordinate | 8 | newline interrupt routine |
| 1 | x coordinate | 9 | interrupt countdown |
| 2 | y size | 10 | text style |
| 3 | x size | 11 | colour data |
| 4 | y cursor | 12 | font number |
| 5 | x cursor | 13 | font size |
| 6 | left margin size | 14 | attributes |
| 7 | right margin size | 15 | line count |
The x and y values are all in units,
but the margin sizes are in pixels. The font size data is
256*h+w
, where h
is the height and w
the width in pixels. The colour data is 256*b+f
, where
f
and b
are foreground and background colour
numbers. The text style is a bitmap set by the Inform style
statement: bit 0 means Roman, 1 is reverse video, 2 is bold, 3 is italic,
4 is fixed-pitch. The current value of any property can be read with:
@get_wind_prop window prop -> r
Those few window properties which are not italicised in the table (and only those few) can be set using:
@put_wind_prop window prop value
Most window properties, the ones with italicised text in the table above, are set using specially-provided opcodes:
@move_window window y x
Moves to the given position on screen. Nothing visible happens, but all future plotting to the given window will happen in the new place.
@window_size window y x
Changes window size in pixels. Again, nothing visible happens.
@set_colour foreground background window
Sets the foreground and background colours for the given window.
@set_cursor line column window
Moves the window's cursor to this position, in units,
relative to (1,1) in the top left of the window. If this would lie
outside the margin positions, the cursor moves to the left margin
of its current line. In addition, @set_cursor -1
turns the
cursor off, and @set_cursor -2
turns it back on again.
@get_cursor arr
Writes the cursor row of the current window into
arr-->0
and the column into arr-->1
,
in units.
@set_font font -> r
(This opcode is available in Versions 5 and 8 as
well as 6.) Selects the numbered font for the current window, and stores
a positive number into r
(actually, the previous font number)
if available, or zero if not available. Font support is only minimal,
for the sake of portability. The possible font numbers are: 1 (the normal
font), 3 (a character graphics font: see §16 of The Z-Machine
Standards Document), 4 (a fixed-pitch Courier-like font). Owing
to a historical accident there is no font 2.
@set_margins left right window
Sets margin widths, in pixels, for the given window. If the cursor is overtaken in the process and now lies outside these margins, it is moved back to the left margin of the current line.
▲ “Interrupt countdowns” are a fancy system to allow text to flow gracefully around obstructions such as pictures. If property 9 is set to a non-zero value, then it'll be decremented on each new-line, and when it hits zero the routine in property 8 will be called. This routine should not attempt to print any text, and is usually used to change margin settings.
•
EXERCISE 128
(Version 6 games only.) Set up wavy margins, which advance inwards for
a while and then back outwards, over and over, so that the game's text
ends up looking like a concertina.
Here are two useful tricks with windows:
@erase_window window
Erases the window's whole area to its background colour.
@scroll_window window pixels
Scrolls the given window by the given number of pixels. A negative value scrolls backwards, i.e., moving the body of the window down rather than up. Blank (background colour) pixels are plotted onto the new lines. This can be done to any window and is not related to the “scrolling” attribute of a window.
▲ Finally, Version 6 story files (but no others) are normally able to display images, or “pictures”. To the Z-machine these are referred to only by number, and a story file does not “know” how pictures are provided to it, or in what format they are stored. For the mechanics of how to attach resources like pictures to a story file, see §43. Fouropcodes are concerned with pictures:
@draw_picture pn y x
Draws picture number pn
so that its
top left corner appears at coordinates (y
, x
)
in units on the screen. If y
or x
are omitted,
the coordinate of the cursor in the current window is used.
@erase_picture pn y x
Exactly as @draw_picture
, but erases
the corresponding screen area to the current background colour.
@picture_data pn arr ?Label
Asks for information about picture number pn
.
If the given picture exists, a branch occurs to the given Label
,
and the height and width in pixels of the image are written to the given
array arr
, with arr-->0
being the height
and arr-->1
the width. If the given picture doesn't
exist, no branch occurs and nothing is written, except that
if pn
is zero, then arr-->0
is the number
of pictures available to the story file and arr-->1
the “release number” of the collection of pictures. (Or of
the Blorb file attached to the story file, if that's how pictures have
been provided to it.)
@picture_table tarr
Given a table
array tarr
of
picture numbers, this warns the Z-machine that the story file will
want to plot these pictures often, soon and in quick succession. Providing
such a warning is optional and enables some interpreters to plot more
quickly, because they can cache images in memory somewhere.
· · · · ·
▲ Sound effects are available to story files of any Version from 5 upwards. Once again, to the Z-machine these are referred to only by number, and a story file does not “know” how sounds are provided to it, or in what format they are stored. For the mechanics of how to attach resources like sound effects to a story file, see §43. There is only one sound opcode, but it does a good deal. The simplest form is:
@sound_effect number
which emits a high-pitched bleep if number
is 1 and a low-pitched bleep if 2. No other values are allowed.
@sound_effect number effect volrep routine
The given effect
happens to the given sound
number
, which must be 3 or higher and correspond to a
sound effect provided to the story file by the designer. Volume is measured
from 1 (quiet) to 8 (loud), with the special value 255 meaning “loudest
possible”, and you can also specify between 0 and 254 repeats,
or 255 to mean “repeat forever”. These two parameters are
combined in volrep
:
volrep = 256*repeats + volume;
The effect
can be: 1 (prepare), 2 (start),
3 (stop), 4 (finish with). You may want to “warn” the
Z-machine that a sound effect will soon be needed by using the
“prepare” effect, but this is optional: similarly you may
want to warn it that you've finished with the sound effect for the
time being, but this too is optional. “Start” and “stop”
are self-explanatory except to say that sound effects can be playing in
the background while the player gets on with play: i.e., the Z-machine
doesn't simply halt until the sound is complete. The “stop”
effect makes the sound cease at once, even if there is more still
to be played. Otherwise, unless set to repeat indefinitely, it will
end by itself in due course. If a routine
has been provided
(this operand is optional, and takes effect only on effect
2), this routine will then be called as an interrupt. Such routines generally
do something like play the sound again but at a different volume level,
giving a fading-away effect.
· · · · ·
▲ In addition to reading entire lines of text from the keyboard, which games normally do once per turn, you can read a single press of a key. Moreover, on most interpreters you can set either kind of keyboard-reading to wait for at most a certain time before giving up.
@aread text parse time function -> result
This opcode reads a line of text from the keyboard, writing
it into the text
string array and ‘tokenising’
it into a word stream, with details stored in the parse
string array (unless this is zero, in which case no tokenisation happens).
(See §2.5 for the format of text
and parse
.) While it is doing this it calls function()
every time
tenths of a second: the process ends if ever this
function returns true. The value written into result is the “terminating
character” which finished the input, or else 0 if a time-out ended
the input.
@read_char 1 time function -> result
Results in the ZSCII value of a single keypress. Once
again, function(time)
is called every time
tenths of a second and may stop this process early. (The first operand
is always 1, meaning “from the keyboard”.)
@tokenise text parse dictionary
This takes the text in the text
buffer
(in the format produced by @aread
) and tokenises it,
i.e., breaks it up into words and finds their addresses in the given
dictionary. The result is written into the parse
buffer
in the usual way.
@encode_text zscii-text length from coded-text
Translates a ZSCII word to the internal, Z-encoded,
text format suitable for use in a @tokenise
dictionary.
The text begins at from in the zscii-text
and is
length
characters long, which should contain the right
length value (though in fact the interpreter translates the word
as far as a zero terminator). The result is 6 bytes long and usually
represents between 1 and 9 letters.
It's also possible to specify which ZSCII character codes are “terminating characters”, meaning that they terminate a line of input. Normally, the return key is the only terminating character, but others can be added, and this is how games like ‘Beyond Zork’ make function keys act as shorthand commands. For instance, the following directive makes ZSCII 132 (cursor right) and 136 (function key f4) terminating:
Zcharacter terminating 132 136;
The legal values to include are those for the cursor,
function and keypad keys, plus mouse and menu clicks (see
Table 2 for values). The special value
255 makes all of these characters terminating. (For other uses of
Zcharacter
, see §36.)
•
EXERCISE 129
Write a “press any key to continue” routine.
•
EXERCISE 130
And another routine which determines if any key is being held down,
returning either its ZSCII code or zero to indicate that no key is
being held down.
•
EXERCISE 131
Write a game in which a player taking more than ten seconds to consider
a command is hurried along.
•
EXERCISE 132
And if thirty seconds are taken, make the player's mind up for her.
•
EXERCISE 133
Design an hourglass fixed to a pivot on one room's wall, which (when
turned upright) runs sand through in real time, turning itself over
automatically every forty seconds.
· · · · ·
▲ Besides the keyboard, Version 6 normally supports the use of a mouse. In theory this can have any number of buttons, but since some widely-used computers have single-button mice (e.g., the Apple Macintosh) it's safest not to rely on more than one.
The mouse must be attached to one of the eight windows
for it to register properly. (Initially, it isn't attached to any window
and so is entirely inert.) To attach it to the window numbered wnum
,
use the opcode:
@mouse_window wnum
Once attached, a click within the window will register
as if it were a key-press to @read_char
with ZSCII value
254, unless it is a second click in quick succession to a previous click
in the same position, in which case it has ZSCII value 253. Thus, a
double-clicking registers twice, once as click (254) and then as double-click
(253).
At any time, the mouse position, measured in units, and the state of its buttons, i.e., pressed or not pressed, can be read off with the opcode:
@read_mouse mouse_array
places (x, y) coordinates of the click
in mouse_array-->0
and mouse_array-->1
and the state of the buttons as a bitmap in mouse_array-->2
,
with bit 0 representing the rightmost button, bit 1 the next and so
on. In practice, it's safest simply to test whether this value is zero
(no click) or not (click). The array mouse_array
should
have room for 4 entries, however: the fourth relates to menus (see below).
•
EXERCISE 134
Write a test program to wait for mouse clicks and then print out the
state of the mouse.
▲ The mouse also allows access to menus, on some interpreters, though in Version 6 only. The model here is of a Mac OS-style desktop, with one or more menus added to the menu bar at the top of the screen: games are free to add or remove menus at any time. They are added with:
@make_menu number mtable ?IfAbleTo;
Such menus are numbered from 3 upwards. mtable
is
a table
array of menu entries, each of which must be itself
a string
array giving the text of that option. IfAbleTo
is a label, to which the interpreter will jump if the menu is successfully
created. If mtable
is zero, the opcode instead removes
an already-existing menu. During play, the selection of a menu item
by the player is signalled to the Z-machine as a key-press with ZSCII
value 252, and the game receiving this can then look up which item on
which menu was selected by looking at entry -->3
in an array given to read_mouse
. The value in this entry
will be the menu number times 256, plus the item number, where items
are numbered from 0. If the game has 252 listed as a “terminating
character” (see above), then menu selection can take the place
of typing a command.
•
EXERCISE 135
Provide a game with a menu of common commands like “inventory”
and “look” to save on typing.
· · · · ·
▲ The Z-machine can also load and save “auxiliary files” to or from the host machine. These should have names adhering to the “8 + 3” convention, that is, one to eight alphanumeric characters optionally followed by a full stop and one to three further alphanumeric characters. Where no such extension is given, it is assumed to be .AUX. Designers are asked to avoid using the extensions .INF, .H, .SAV or .Z5 or similar, to prevent confusion. Note that auxiliary files from different games may be sharing a common directory on the host machine, so that a filename should be as distinctive as possible. The two opcodes are:
@save buffer length filename -> R
Saves the byte array buffer
(of size
length) to a file, whose (default) name is given in the filename
(a
string
array). Afterwards, R
holds true
on success, false
on failure.
@restore buffer length filename -> R
Loads in the byte array buffer
(of size
length
) from a file, whose (default) name is given in the
filename
(a string
array). Afterwards,
R
holds the number of bytes successfully read.
•
EXERCISE 136
How might this assist a “role-playing game campaign” with
several scenarios, each implemented as a separate Inform game but sharing
a player-character who takes objects and experience from one scenario
to the next?
•
EXERCISE 137
Design catacombs in which the ghosts of former, dead players from
previous games linger.
· · · · ·
▲ Finally, the Z-machine supports a very simple form of exception-handling like that of the C language's long jump feature. This is very occasionally useful to get the program out of large recursive tangles in a hurry.
@catch -> result
The opposite of @throw
, @catch
preserves the “stack frame” of the current routine in the
variable result
: roughly speaking, the stack frame is
the current position of which routine is being run and which ones
have called it so far.
@throw value stack-frame
This causes the program to execute a return with
value
, but as if it were returning from the routine which
was running when the stack-frame
was “caught”, that
is, set up by a corresponding @catch
opcode. Note that
you can only @throw
back to a routine which is still
running, i.e., to which control will eventually return anyway.
•▲▲
EXERCISE 138
Use @throw
and @catch
to make an exception
handler for actions, so that any action subroutine getting into recursive
trouble can throw an exception and escape.
•
REFERENCES
The assembly-language connoisseur will appreciate ‘Freefall’
by Andrew Plotkin and ‘Robots’ by Torbjörn Andersson,
although the present lack of on-line hints make these difficult games
to win.
•Gevan Dutton has made an amazing
port of the classic character-graphic maze adventure ‘Rogue’
to Inform, taking place entirely in the upper window.
•Similarly, ‘Zugzwang’
by Magnus Olsson plots up a chess position.
•The function library
"text_functions.h", by Patrick Kellum, offers text
styling and colouring. These routines are entirely written in assembler.
Similar facilities are available from Chris Klimas's "style.h"
and L. Ross Raszewski's "utility.h".
•Jason Penney's "V6Lib.h"
is a coherent extension to the Inform library for Version 6 games
(only), offering support for multiple text windows, images and sounds
by means of class definitions and high-level Inform code.
•More modestly, but applicably to
Version 5 and 8 games, L. Ross Raszewski's "sound.h"
function library handles sound effects.


Tools used and References
A complete list of the tools used is produced below:
| Package | Version | Reference |
|---|---|---|
| broom | 0.5.5 | David Robinson and Alex Hayes (2020). broom: Convert Statistical Analysis Objects into Tidy Tibbles. R package version 0.5.5. https://CRAN.R-project.org/package=broom |
| broom.mixed | 0.2.6 | Ben Bolker and David Robinson (2020). broom.mixed: Tidying Methods for Mixed Models. R package version 0.2.6. https://CRAN.R-project.org/package=broom.mixed |
| carData | 3.0.3 | John Fox, Sanford Weisberg and Brad Price (2019). carData: Companion to Applied Regression Data Sets. R package version 3.0-3. https://CRAN.R-project.org/package=carData |
| cowplot | 1.0.0 | Claus O. Wilke (2019). cowplot: Streamlined Plot Theme and Plot Annotations for ‘ggplot2.’ R package version 1.0.0. https://CRAN.R-project.org/package=cowplot |
| DHARMa | <IP_ADDRESS> | Florian Hartig (2020). DHARMa: Residual Diagnostics for Hierarchical (Multi-Level / Mixed) Regression Models. R package version <IP_ADDRESS>. http://florianhartig.github.io/DHARMa/ |
| dplyr | 1.0.3 | Hadley Wickham, Romain François, Lionel Henry and Kirill Müller (2021). dplyr: A Grammar of Data Manipulation. R package version 1.0.3. https://CRAN.R-project.org/package=dplyr |
| effects | 4.1.4 | John Fox and Sanford Weisberg (2019). An R Companion to Applied Regression, 3rd Edition. Thousand Oaks, CA http://tinyurl.com/carbook |
| emmeans | 1.5.1 | Russell Lenth (2020). emmeans: Estimated Marginal Means, aka Least-Squares Means. R package version 1.5.1. https://CRAN.R-project.org/package=emmeans |
| ggplot2 | 3.3.3 | H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016. |
| ggpubr | 0.2.5 | Alboukadel Kassambara (2020). ggpubr: ‘ggplot2’ Based Publication Ready Plots. R package version 0.2.5. https://CRAN.R-project.org/package=ggpubr |
| lme4 | 1.1.21 | Douglas Bates, Martin Maechler, Ben Bolker, Steve Walker (2015). Fitting Linear Mixed-Effects Models Using lme4. Journal of Statistical Software, 67(1), 1-48. doi:10.18637/jss.v067.i01. |
| lmerTest | 3.1.1 | Kuznetsova A, Brockhoff PB, Christensen RHB (2017). “lmerTest Package:Tests in Linear Mixed Effects Models.” Journal of StatisticalSoftware, 82(13), 1-26. doi: 10.18637/jss.v082.i13 (URL:https://doi.org/10.18637/jss.v082.i13). |
| magrittr | 2.0.1 | Stefan Milton Bache and Hadley Wickham (2020). magrittr: A Forward-Pipe Operator for R. R package version 2.0.1. https://CRAN.R-project.org/package=magrittr |
| Matrix | 1.2.18 | Douglas Bates and Martin Maechler (2019). Matrix: Sparse and Dense Matrix Classes and Methods. R package version 1.2-18. https://CRAN.R-project.org/package=Matrix |
| psych | <IP_ADDRESS> | Revelle, W. (2019) psych: Procedures for Personality and Psychological Research, Northwestern University, Evanston, Illinois, USA, https://CRAN.R-project.org/package=psych Version = 1.9.12. |
| R | 3.6.2 | R Core Team (2019). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. URL https://www.R-project.org/. |
| report | 0.2.0 | Makowski, D., Lüdecke, D., & Ben-Shachar, M.S. (2020). Automated reporting as a practical tool to improve reproducibility and methodological best practices adoption. CRAN. Available from https://github.com/easystats/report. doi: . |
| tidyr | 1.0.2 | Hadley Wickham and Lionel Henry (2020). tidyr: Tidy Messy Data. R package version 1.0.2. https://CRAN.R-project.org/package=tidyr |


NYU Gallatin School of Individualized Study | New York, NY
2014 - est. 2018
International School Manila | University Parkway, Taguig City, Philippines
2010 - 2014
Business Development: Arthena Fine Arts Inc.
Floor Representative: Goddard Hall Executive Council
blah
"Isabel has amazing style."
-- Ruth Bader Ginsburg
"8/10."
-- David Bowie
"No comment"
-- Isabel's boss
isabel@isabelw.xyz


This plugin is based on HKAPI (https://github.com/KarimGeiger/HKAPI) and allows you to control Harman Kardon brand amplifiers. Attention, this API has been realized in reverse engineering because HK does not expose its API. Please read the associated README carefully, especially to know the restrictions and compatible equipment. To date:
From now, zone 2 is not managed.
N/A
A specific visual rendering has been developed to ensure the best possible experience.
From the management menu, add a widget.
Basic commands are automatically added except for sources that depend on your equipment This is normally:
The name of the command is displayed on the dashboard remote control. The source must match the source of your amplifier (normally displayed in the amplifier menu)
V2.1
V2.0
V1.0


Sign In
Register
Home
About Us
Contact Us
Fund Projects
Team
Login
Username
Password
Login
Need an account?
Register!
Remember me
Cancel
Forgot password?


bean0b
This is my website I am building to learn code and to collect my current art projects
Enjoy
Paintings!


The store is more than just quality products.
Select from the option ...!
Customers
Products
Suppliers