ap

Use of ch unit considered inappropriate (in certain circumstances)

Update: The title of this post was originally a knowing nod to the considered harmful cliché. I thought it might be amusing and get a bit of attention. However it was brought to my attention by a few people I respect that the title as written might be harmful in itself, so I changed it. However I believe that the subtle point I’m trying to make still stands:

When did we start using the ch unit to specify the maximum length for a line of text? Many places you look nowadays you'll see a variation on:

.prose {
  max-inline-size: 60ch;
}

Is it because of a direct reading of Bringhurst and people (like me) who’ve quoted him:

Anything from 45 to 75 characters is widely regarded as a satisfactory length of line for a single-column page set in a serifed text face in a text size. The 66-character line (counting both letters and spaces) is widely regarded as ideal. For multiple column work, a better average is 40 to 50 characters.

I get it: there’s all that talk of ’characters’. But that’s not what Bringhurst means literally. I’ll come back to that shortly.

Firstly let’s remind ourselves about the CSS ch unit. While ch sounds like it should equate to a number of characters or a character width, that’s not strictly the case. The ch unit specifically refers to the width of the zero ’0’ character within the selected font, or 0.5em if no ’0’ is present. So unless you have a line made up entirely of zeroes, or are using a monospaced font, a width of 66ch will probably not give you a line containing 66 characters. What’s more, the rendered width of that line will vary with the font design, sometimes significantly.

Two text blocks are set to 34 ch wide, but the use of a condensed font (top) and an expanded font (bottom) makes the rendered width narrower and wider respectively.

The important part of Bringhurst’s guideline is not the ’66-characters’ but the ’satisfactory length’. This is about readability, and readability is affected by the length of a line more so than the number of characters in it.

A consistent finding is that long line lengths on screen are least preferred or judged as least easy to read [my emphasis]

With that in mind, restricting your line length using rem would be a far more appropriate unit to use:

.prose {
  max-inline-size: 30rem;
}

This would give you a line length accessibly tied to text size, but independent of font design.

But is using ch harmful?

Bringhurst’s guideline includes this little caveat: a page set in a serifed text face in a text size. This enables him to equate the number of characters in a line with its length. So if you are using a fairly standard typeface for your text then you’ll probably be fine. However that ’standard typeface’ assumption is implicit anytime you use ch to set the width of a column of text. Using rem removes that assumption and gives you what you are probably really after – a consistent, predictable limit on line length.

It didn’t surprise me to find that Eric Meyer had written about this six years ago. I’ll leave you with an important observation from his post:

If you’re working with multiple typefaces, say one for headlines and another for body copy, be careful about setting ch measures and thinking they’ll be equivalent between the two fonts. The odds are very, very high they won’t be.

So is using ch harmful? At the risk of saying it depends, it might not be harmful, but it could be, and there is a far more reliable and appropriate unit to use by way of the rem when it comes to limiting line length in a column of text.

Read or add comments




ap

Introducing TODS – a typographic and OpenType default stylesheet

Introducing TODS, an open source typography and opentype default stylesheet. One of the great things about going to conferences is the way it can spark an idea and kick start something. This project was initiated following a conversation with Roel Nieskens (of Wakamai Fondue fame) at CSS Day, where he demonstrated his Mildly Opinionated Prose Styles (MOPS).

The idea is to set sensible typographic defaults for use on prose (a column of text), making particular use of the font features provided by OpenType. The main principle is that it can be used as starting point for all projects, so doesn’t include design-specific aspects such as font choice, type scale or layout (including how you might like to set the line-length).

Within the styles is mildly opinionated best practice, which will help set suitable styles should you forget. This means you can also use the style sheet as a checklist, even if you don't want to implement it as-is.

TODS uses OpenType features extensively and variable font axes where available. It makes full use of the cascade to set sensible defaults high up, with overrides applied further down. It also contains some handy utility classes.

You can apply the TODS.css stylesheet in its entirety, as its full functionality relies on progressive enhancement within both browsers and fonts. Anything that is not supported will safely be ignored. The only possible exceptions to this are sub/superscripts and application of a grade axis in dark mode, as these are font-specific and could behave unexpectedly depending on the capability of the font.

In order to preview some of the TODS features, you can check out the preview page tods.html and toggle TODS.css on and off. (This needs more work as the text is a bit of a mish-mash of examples and instructions, and it's missing some of the utility classes and dark mode. But that’s what open source is for… feel free to fork, improve and add back into the repo.)

Walkthrough of the TODS.css stylesheet

You can download a latest version of the stylesheet from the TODS Github repo (meaning some of the code may have changed a bit).

Table of contents:

  1. Reset
  2. Web fonts
  3. Global defaults
  4. Block spacing
  5. Opentype utility classes
  6. Generic help classes
  7. Prose styling defaults
  8. Headings
  9. Superscripts and subscripts
  10. Tables and numbers
  11. Quotes
  12. Hyphenation
  13. Dark mode/inverted text

1. Reset

Based on Andy Bell’s more modern CSS reset. Only the typographic rules in his reset are used here. You might like to apply the other rules too.

html {
  -moz-text-size-adjust: none;
  -webkit-text-size-adjust: none;
  text-size-adjust: none;
}

Prevent font size inflation when rotating from portrait to landscape. The best explainer for this is by Kilian. He also explains why we still need those ugly prefixes too.

body, h1, h2, h3, h4, h5, h6, address, p, hr, pre, blockquote, ol, ul, li, dl, dt, dd, figure, figcaption, div, table, caption, form, fieldset {
  margin: 0;
}

Remove default margins in favour of better control in authored CSS.

input,
button,
textarea,
select {
  font-family: inherit;
  font-size: inherit;
}

Inherit fonts for inputs and buttons.

2. Web fonts

Use modern variable font syntax so that only supporting browsers get the variable font. Others will get generic fallbacks.

@font-face {
  font-family: 'Literata';
  src: url('/fonts/Literata-var.woff2') format('woff2') tech(variations),
       url('/fonts/Literata-var.woff2') format('woff2-variations');
  font-weight: 1 1000;
  font-stretch: 50% 200%;
  font-style: normal;
  font-display: fallback;
}

Include full possible weight range to avoid unintended synthesis of variable fonts with a weight axis. Same applies to stretch range for variable fonts with a width axis.

For main body fonts, use fallback for how the browser should behave while the webfont is loading. This gives the font an extremely small block period and a short swap period, providing the best chance for text to render.

@font-face {
  font-family: 'Literata';
  src: url('/fonts/Literata-Italic-var.woff2') format('woff2') tech(variations),
       url('/fonts/Literata-Italic-var.woff2') format('woff2-variations');
  font-weight: 1 1000;
  font-stretch: 50% 200%;
  font-style: italic;
  font-display: swap;
}

For italics use swap for an extremely small block period and an infinite swap period. This means italics can be synthesised and swapped in once loaded.

@font-face {
  font-family: 'Plex Sans';
  src: url('/fonts/Plex-Sans-var.woff2') format('woff2') tech(variations),
       url('/fonts/Plex-Sans-var.woff2') format('woff2-variations');
  font-weight: 1 1000;
  font-stretch: 50% 200%;
  font-style: normal;
  font-display: fallback;
  size-adjust:105%; /* make monospace fonts slightly bigger to match body text. Adjust to suit – you might need to make them smaller */
}

When monospace fonts are used inline with text fonts, they often need tweaking to appear balanced in terms of size. Use size-adjust to do this without affecting reported font size and associated units such as em.

3. Global defaults

Set some sensible defaults that can be used throughout the whole web page. Override these where you need to through the magic of the cascade.

body {
    line-height: 1.5;
    text-decoration-skip-ink: auto;
    font-optical-sizing: auto;
    font-variant-ligatures: common-ligatures no-discretionary-ligatures no-historical-ligatures contextual;
    font-kerning: normal;
}

Set a nice legible line height that gets inherited. The font- properties are set to default CSS and OpenType settings, however they are still worth setting specifically just in case.

button, input, label { 
  line-height: 1.1; 
}

Set shorter line heights on interactive elements. We’ll do the same for headings later on.

4. Block spacing

Reinstate block margins we removed in the reset section. We’re setting consistent spacing based on font size on primary elements within ‘flow’ contexts. The entire ‘prose’ area is a flow context, but so might other parts of the page. For more details on the ‘flow’ utility see Andy Bell’s favourite three lines of CSS.

.flow > * + * {
  margin-block-start: var(--flow-space, 1em);
}

Rule says that every direct sibling child element of .flow has margin-block-start added to it. The > combinator is added to prevent margins being added recursively.

.prose {
  --flow-space: 1.5em;
}

Set generous spacing between primary block elements (in this case it’s the same as the line height). You could also choose a value from a fluid spacing scale, if you are going down the fluid typography route (recommended, but your milage may vary). See Utopia.fyi for more details and a fluid type tool.

5. OpenType utility classes

.dlig { font-variant-ligatures: discretionary-ligatures; }
.hlig { font-variant-ligatures: historical-ligatures; }
.dlig.hlig { font-variant-ligatures: discretionary-ligatures historical-ligatures; } /* Apply both historic and discretionary */

.pnum { font-variant-numeric: proportional-nums; }
.tnum { font-variant-numeric: tabular-nums;    }
.lnum { font-variant-numeric: lining-nums; }
.onum { font-variant-numeric: oldstyle-nums; }
.zero { font-variant-numeric: slashed-zero;    }
.pnum.zero { font-variant-numeric: proportional-nums slashed-zero; } /* Apply slashed zeroes to proportional numerals */
.tnum.zero { font-variant-numeric: tabular-nums slashed-zero; }
.lnum.zero { font-variant-numeric: lining-nums slashed-zero; }
.onum.zero { font-variant-numeric: oldstyle-nums slashed-zero; }
.tnum.lnum.zero { font-variant-numeric: tabular-nums lining-nums slashed-zero; }
.frac { font-variant-numeric: diagonal-fractions; }
.afrc { font-variant-numeric: stacked-fractions; }
.ordn { font-variant-numeric: ordinal; }

.smcp { font-variant-caps: small-caps; }
.c2sc { font-variant-caps: unicase; }
.hist { font-variant-alternates: historical-forms; }

Helper utilities matching on/off Opentype layout features available through high level CSS properties.

@font-feature-values "Fancy Font Name" { /* match font-family webfont name */

    /* All features are font-specific. */
    @styleset { cursive: 1; swoopy: 7 16; }
    @character-variant { ampersand: 1; capital-q: 2; }
    @stylistic { two-story-g: 1; straight-y: 2; }
    @swash { swishy: 1; flowing: 2; wowzers: 3 }
    @ornaments { clover: 1; fleuron: 2; }
    @annotation { circled: 1; boxed: 2; }
}

Other Opentype features can have multiple glyphs, accessible via an index number defined in the font – these will be explained in documentation that came with your font. These vary between fonts, so you need to set up a new @font-font-features rule for each different font, ensuring the font name matches that of the font family. You then give each feature a custom name such as ‘swoopy’. Note that stylesets can be combined, which is why swoopy has a space-separated list of indices 7 16.

/* Stylesets */
.ss01 { font-variant-alternates: styleset(cursive); }
.ss02 { font-variant-alternates: styleset(swoopy); }

/* Character variants */
.cv01 { font-variant-alternates: character-variant(ampersand); }
.cv02 { font-variant-alternates: character-variant(capital-q); }

/* Stylistic alternates */
.salt1 { font-variant-alternates: stylistic(two-story-g); }
.salt2 { font-variant-alternates: stylistic(straight-y); }

/* Swashes */
.swsh1 { font-variant-alternates: swash(swishy); }
.swsh2 { font-variant-alternates: swash(flowing); }

/* Ornaments */
.ornm1 { font-variant-alternates: ornaments(clover); }
.ornm2 { font-variant-alternates: ornaments(fleuron); }

/* Alternative numerals */
.nalt1 { font-variant-alternates: annotation(circled); }
.nalt2 { font-variant-alternates: annotation(boxed); }

Handy utility classes showing how to access the font feature values you set up earlier using the font-variant-alternates property.

:root {
    --opentype-case: "case" off;
    --opentype-sinf: "sinf" off;
}

/* If class is applied, update custom property */
.case {
    --opentype-case: "case" on;
}

.sinf {
    --opentype-sinf: "sinf" on;
}

/* Apply current state of all custom properties, defaulting to off */
* { 
    font-feature-settings: var(--opentype-case, "case" off), var(--opentype-sinf, "sinf" off);
}

Set custom properties for OpenType features only available through low level font-feature-settings. We need this approach because font-feature-settings does not inherit in the same way as font-variant. See Roel’s write-up, including how to apply the same methodology to custom variable font axes.

6. Generic helper classes

Some utilities to help ensure best typographic practice.

.centered {
    text-align: center;
    text-wrap: balance;
}

When centring text you’ll almost always want the text to be ‘balanced’, meaning roughly the same number of characters on each line.

.uppercase {
    text-transform: uppercase;
    --opentype-case: "case" on;
}

When fully capitalising text, ensure punctuation designed to be used within caps is turned on where available, using the Opentype ‘case’ feature.

.smallcaps {
    font-variant-caps: all-small-caps;
    font-variant-numeric: oldstyle-nums;    
}

Transform both upper and lowercase letters to small caps, and use old style-numerals within runs of small caps so they match size-wise.

7. Prose styling defaults

Assign a .prose class to your running text, that is to say an entire piece of prose such as the full text of an article or blog post.

.prose {
    text-wrap: pretty;
    font-variant-numeric: oldstyle-nums proportional-nums;
    font-size-adjust: 0.507;
}

Firstly we get ourselves better widow/orphan control, aiming for blocks of text to not end with a line containing a word on its own. Also we use proportional old-style numerals in running text.

Also adjust the size of fallback fonts to match the webfont to maintain legibility with fallback fonts and reduce visible reflowing. The font-size-adjust number is the aspect ratio of the webfont, which you can calculate using this tool.

strong, b, th { 
    font-weight: bold;
    font-size-adjust: 0.514; 
}

Apply a different adjustment to elements which are typically emboldened by default, as bold weights often have a different aspect ratio – check for the different weights you may be using, including numeric semi-bolds (eg. 650). Headings are dealt with separately as the aspect ratio may be affected by optical sizing.

8. Headings

h1, h2, h3, h4 { 
    line-height: 1.1; 
    font-size-adjust: 0.514;
    font-variant-numeric: lining-nums; }

Set shorter line heights on your main headings. Set an aspect ratio for fallback fonts – check for different weights of headings. Use lining numerals in headings, especially when using Title Case.

h1 {
    font-variant-ligatures: discretionary-ligatures; 
    font-size-adjust: 0.521;
}

Turn on fancy ligatures for main headings. If the font has an optical sizing axis, you might need to adjust the aspect ratio accordingly.

h1.uppercase {
    font-variant-caps: titling-caps;
}

When setting a heading in all caps, use titling capitals which are specially designed for setting caps at larger sizes.

9. Superscripts and subscripts

Use proper super- and subscript characters. Apply to sub and sup elements as well as utility classes for when semantic sub/superscripts are not required.

@supports ( font-variant-position: sub ) {
    sub, .sub {
        vertical-align: baseline;
        font-size: 100%;
        line-height: inherit;
        font-variant-position: sub;
    }
}

@supports ( font-variant-position: super ) {
    sup, .sup {
        vertical-align: baseline;
        font-size: 100%;
        line-height: inherit;
        font-variant-position: super;
    }
}

If font-variant-position is not specified, browsers will synthesise sub/superscripts, so we need to manually turn off the synthesis. This is the only way to use a font’s proper sub/sup glyphs, however it’s only safe to use this if you know your font has glyphs for all the characters you are sub/superscripting. If the font lacks those characters (most only have sub/superscript numbers, not letters), then only Firefox (correctly) synthesises sup and sub – all other browsers will display normal characters in the regular way as we turned the synthesis off.

.chemical { 
    --opentype-sinf: "sinf" on;
}

For chemical formulae like H2O, use scientific inferiors instead of sub.

10. Tables and numbers

td, math, time[datetime*=":"] {
    font-variant-numeric: tabular-nums lining-nums slashed-zero;    
}

Make sure all numbers in tables are lining tabular numerals, adding slashed zeroes for clarity. This could usefully apply where a time is specifically marked up, as well as in mathematics.

11. Quotes

Use curly quotes and hang punctuation around blockquotes.

:lang(en) > * { quotes: '“' '”' '‘' '’' ; } /* “Generic English ‘style’” */
:lang(en-GB) > * { quotes: '‘' '’' '“' '”'; } /* ‘British “style”’ */
:lang(fr) > * { quotes: '«?0202F' '?0202F»' '“' '”'; } /* « French “style” » */

Set punctuation order for inline quotes. Quotes are language-specific, so set a lang attribute on your HTML element or send the language via a server header. Note the narrow non-breaking spaces encoded in the French example.

q::before { content: open-quote }
q::after  { content: close-quote }

Insert quotes before and after q element content.

.quoted, .quoted q {
    quotes: '“' '”' '‘' '’';
}

Punctuation order for blockquotes, using a utility class to surround with double-quotes.

.quoted p:first-of-type::before {
    content: open-quote;
}
.quoted p:last-of-type::after  {
    content: close-quote;
}

Append quotes to the first and last paragraphs in the blockquote.

.quoted p:first-of-type::before {
    margin-inline-start: -0.87ch; /* Adjust according to font */
}
.quoted p {
    hanging-punctuation: first last;
}
@supports(hanging-punctuation: first last) {
    .quoted p:first-of-type::before {
        margin-inline-start: 0;
    }
}

Hang the punctuation outside of the blockquote. Firstly manually hang punctuation with a negative margin, then remove the manual intervention and use hanging-punctuation if supported.

12. Hyphenation

Turn on hyphenation for prose. Language is required in order for the browser to use the correct hyphenation dictionary.

.prose {
    -webkit-hyphens: auto;
    -webkit-hyphenate-limit-before: 4;
    -webkit-hyphenate-limit-after: 3;
    -webkit-hyphenate-limit-lines: 2;

    hyphens: auto;
    hyphenate-limit-chars: 7 4 3;
    hyphenate-limit-lines: 2;    
    hyphenate-limit-zone: 8%;
    hyphenate-limit-last: always;
}

Include additional refinements to hyphenation. Respectively, these stop short words being hyphenated, prevent ladders of hyphens, and reduce overall hyphenation a bit. Safari uses legacy properties to achieve some of the same effects, hence the ugly prefixes and slightly different syntax.

.prose pre, .prose code, .prose var, .prose samp, .prose kbd,
.prose h1, .prose h2, .prose h3, .prose h4, .prose h5, .prose h6 {
    -webkit-hyphens: manual;
    hyphens: manual;
}

Turn hyphens off for monospace and headings.

13. Dark mode/inverted text

Reduce grade if available to prevent bloom of inverted type.

:root {
  --vf-grad: 0;
}

@media (prefers-color-scheme: dark) {
  :root {
    --vf-grad: -50;
  }
}

* {
  font-variation-settings: "GRAD" var(--vf-grad, 0);
}

Not all fonts have a grade (GRAD) axis, and the grade number is font-specific. We’re using the customer property method because font-variation-settings provides low-level control meaning each subsequent use of the property completely overrides prior use – the values are not inherited or combined, unlike with font-variant for example.

There are probably better ways of doing some of these things, and the preview page is rather lacking at the moment. Please let me know on Github, or better still fork it, edit and resubmit.

Read or add comments




ap

Newspapers & trending: Stars return to city centre

A look at what stories are trending across the West of England on 13 November 2024.





ap

Free And Cheap Things To Do This Week In London: 4-10 November 2024

Things to do for a fiver or less.



  • London
  • Free & Cheap
  • free and cheap events
  • free and cheap
  • LONDON ON A BUDGET
  • FREE AND CHEAP LISTINGS

ap

Free And Cheap Things To Do In London This Week: 11-17 November 2024

Things to do for a fiver or less.



  • London
  • Free & Cheap
  • free and cheap events
  • free and cheap
  • LONDON ON A BUDGET


ap

Newquay Lap Dance Claims Wrong

Via Lori Smith, I was alerted to this claim last week by police in Cornwall that a lap dance venue license application should be rejected because such clubs 'might' cause sexual violence. As Lori points out over on BitchBuzz, this is territory I've covered before: the widely-publicised claims that lap dance clubs in Camden caused more rape turned out to be false.

Of course the statistics for a specific area of London over a certain number of years are only that: specific to London and those years. It's dangerous to take a trend for one area, at one point in time, and generalise it to all places at all times. In order to claim that "Factor X causes Outcome Y" you need a lot more data. In the book I set out some comparisons, then, with London and other locations summarising what we know from the scientific literature, national statistics, and so on.

So what's interesting is that The Sex Myth discusses not only the situation in cities like London but also specifically, as coincidence would have it, Newquay.

Guess what? The link between lap dance and sexual violence that the police claim 'might' exist? Not only does it not exist, local media in the Southwest have already reported on this.

In 2010, the Newquay Voice obtained Devon and Cornwall Constabulary’s figures of sexual assaults. They found that the total number of recorded sexual assaults (including rapes) in and around Newquay peaked at 71 in 2005, the year before Newquay's first lap dance club opened. In 2006 however,  following its opening, the number fell to 51.

In 2007, when the town’s second lap dancing venue opened, the total number of recorded sexual assaults fell again to 41, then dropped to 27 in 2008 when a third lap dancing club opened. In 2009 the number rose slightly, but with a total of 33 offences, it is still less than half the total than before the clubs appeared.

Using publically available population data, I took these figures and calculated the incidence rate (since population varies from year to year as crime stats do, if you don't calculate a rate, the numbers are not very informative). Here are the incidence rate calculations using midyear population levels for the council of Restormel where Newquay is located:

Looking at these numbers, you'd be tempted to think that lap dancing actually reduces sexual assault. In other words the opposite of what the BBC article claims.

This like the Camden data is only a single example. Making such a broad conclusion would be rash – to conclusively demonstrate that an increase in lap dancing corresponds with a decrease in rape and sexual assault, there would have to many more such results, over longer time periods, from many places. What it does do is reinforce the same thing the statistics from Camden show: lap dancing does not correlate with higher occurrence of rape. And if there is no rise in rape, then it is impossible to claim that lap dancing “causes” rape.

Unfortunately, the myth that sex work causes violence has become so deeply embedded in media and criminology storytelling that one only needs to raise that dread spectre for the city council to take such claims seriously. In spite of the fact that the real data are easy to find and analyse, and the local papers in Cornwall have already suggested the opposite to what the police claim is true, the BBC and other media outlets don't seem to notice or care.

In the end it looks as if the council rejected the application. St Austell  and Cornwall MP Stephen Gilbert tweeted that this was "a victory for people power". And indeed if the rejection was made because the majority of residents decided they did not want it, then so be it. Nothing wrong with not liking things for the simple reason that you don't like them.

But consider that the information put about by police and reported by the BBC is misleading and poorly researched. What if, instead of the council's main criterion being what residents preferred, the decision was made because of police and media scaring people with potential crimes that turn out not to be true at all?  I don't know about the good folks of Cornwall, but where I come from, that's called lying.




ap

Should Mia Freedman Apologise?

I went to Australia last month as a guest of the Opera House for the All About Women symposium.  As part of the event, I agreed to do some media appearances on ABC, including the Drum and Q&A.

All About Women was a fantastic day and I feel privileged to have met so many interesting and talented people there, including people I would put in the category of genuine modern heroes

As for Q&A… this is the Australian equivalent of Question Time, so I went anticipating a varied panel with a wide variety of opinions jostling to be heard. I was told Tony Jones was a strong moderator, so I went expecting him to rein in the conversation if things went off-piste. This was to be Q & A's first all-woman panel and expectations were high. The topics they circulated beforehand indicated I was in for a grilling while everyone else got softball. I went, not to put too fine a point on it, loaded for bear.

I thought it went pretty well. Opinions differed. Points of view were exchanged. Margaret Thatcher died. All in all, a good night. The producers seemed very pleased with the outcome.

So imagine my surprise, weeks later, that fellow guest Mia Freedman is still flogging her commentary about the appearance as content on her site MamaMia. The topic: should she apologise for continually insulting sex workers?

During the show Mia kept falling back on sloppy, ill-thought, and pat little lines that were easily countered. I found to my surprise a lot of common ground with Germaine Greer, hardly known as a fan of sexual entertainment, on the fact that conditions of labour and not sex per se are the most pressing issue for sex workers worldwide right now. Then in comes Mia with her assumptions about the people who do sex work (men AND women) and the people who hire them (men AND women). With Tony backing her up. So much for the disinterested moderator, eh? Maybe he felt bad for her. I don't know.

Here's the thing. I agree with Mia on this: I don't think she should apologise.

Why not? Because if she did it would be insincere. My first impression when we met backstage was that she was insincere, and damn it, a successful lady editor like her should have the guts to be true to herself and stand by her opinions no matter what they are.

Because the general public needs to see what kinds of uninformed nonsense that sex workers who stick their heads above the parapet get every single day.

Because for every 100 people who visit her site, there is one who is both a parent AND a sex worker, who knows what she is saying is nonsense. Yes, that's right Mia: sex workers raise families too. It's almost as if we're people.

Because she is a magazine editor who cares deeply about hits and attention, and clearly this is delivering on every level.

Because the sort of people who think sex workers should be topics of discussion rather than active participants are fighting a losing battle.

Keep digging, Mia. I ain't gonna stop you. Keep writing off other people simply because they didn't have the privileges you did or didn't make the same choices you did, and you can't accept that. Get it off your chest, lock up your children, whatever you think you need to do. Perhaps you have some issues about sex you want to work out in public, or this wouldn't be the biggest issue on your agenda weeks after the show went to air?

Mia, you have my express permission not to apologise. No, don't thank me… I insist.




ap

News roundup: deck.js, Yahoo Kills off Maps API, Patterns for Large-Scale JavaScript Application Architecture

Listen to this week's podcast (September 9, 2011) Patterns For Large-Scale JavaScript Application Architecture Patterns For Large-Scale JavaScript Application Architecture is a lengthy article by Addy Osmani detailing some basic principles of writing a large-scale JavaScript application. It's inspired by a classic Nicholas Zakas talk outlining some of the same principles ...




ap

“That’s how we silence them”: Verstappen’s stunning Brazil win from start to finish | Formula 1

From pre-race confusion to post-race joy, from 17th on the grid to a stunning win, here's how Max Verstappen's Brazilian Grand Prix unfolded on his radio.




ap

Caption Competition 252: Frustration Martin | Caption Competition

What was this Aston Martin mechanic thinking during the Brazilian Grand Prix weekend? Can you come up with the best caption for this picture?




ap

Prospects for South Americans pursuing F1 “getting better” – Colapinto | RaceFans Round-up

In the round-up: F1 hopes for South Americans "getting better" • Verschoor back to MP for fifth F2 season • Verstappen races in charity event



  • RaceFans Round-up

ap

Every way Verstappen can clinch the championship at the Las Vegas Grand Prix | Formula 1

Max Verstappen is poised to clinch the 2024 drivers' championship if he finishes ahead of Lando Norris one more time. Here's how he can seal a fourth title at the next race.




ap

Search Central Live 2024 is coming back to the APAC region

Search Central Live is coming back to the Asia Pacific region, bringing you insights from Google Search, fun networking opportunity, and more! This year we're aiming to visit Indonesia, Malaysia, Taiwan, and Thailand.




ap

Search Central Live Jakarta and Bangkok 2024: it's a wrap

Our first two Search Central Live events in Asia this year have been wrapped up and we finished looking back at what we've learned and what we can do better.




ap

Congreso X ANIVERSARIO DE APTIJ – Madrid, 3 y 4 de noviembre de 2017

¡La APTIJ está de cumpleaños y celebra su X Aniversario! Para la ocasión se ha organizado un programa de dos días que incluye una jornada con conferencias y mesas redondas en la sede de la Comisión Europea de Madrid y un taller que estará a cargo de Esther M. Navarro-Hall: Viernes 3 de noviembre 9.00-17.30: Jornada […]




ap

En Japón tampoco atan los perros con longaniza: la situación de la interpretación judicial nipona

En la entrada de hoy quiero hacerme eco de un artículo de Takahata Sachi que se titula «Las malas condiciones desincentivan a los intérpretes judiciales», publicado en Nippon.com y que versa acerca de la situación de los intérpretes judiciales en Japón. El artículo se puede leer en español, por lo que no hay motivo para tormento […]




ap

General approach to translating Across projects out of Across

If you read my articles regularly, you are already know that I dislike Across. Across is difficult to use, does not offer feature that are readily available in other CAT tools, and rather slows me down during my work instead of … Continue reading




ap

TR?ICTIO Invoicing System development approaches the finish line

As some of you already know, the TR?ICTIO Invoicing System is a simple invoicing platform focusing on freelance translators. I have been developing the system for about 12 months and after extensive personal testing and actual use in my business, as … Continue reading




ap

API Management: The missing link for SOA success

Nearly 2 years ago I tweeted:



Well, unfortunately, I had it a bit wrong.

APIs and service do have a very direct and 1-1 relationship: an API is the interface of a service. However, what is different is that one's about the implementation and is focused on the provider, and the other is about using the functionality and is focused on the consumer. The service of course is what matters to the provider and API is what matters to the consumer.

So its clearly more than just a new name.

Services: If you build it will they come?

One of the most common anti-patterns of SOA is the one service - one client pattern. That's when the developer who wrote the service also wrote its only client. In that case there's no sharing, no common data, no common authentication and no reuse of any kind. The number one reason for SOA (improving productivity by reusing functionality as services) is gone. Its simply client-server at the cost of having to use interoperable formats like XML, JSON, XML Schema, WSDL and SOAP. 

There are two primary reasons for this pattern being so prevalent: first is due to a management failure whereby everyone is required to create services for whatever they do because that's the new "blessed way". There's no architectural vision driving proper factoring. Instead its each person or at least each team for themselves. The resulting services are only really usable for that one scenario - so no wonder no one else uses them!

Writing services that can service many users requires careful design and thinking and willingness to invest in the common good. That's against human intuition and something that will happen only if its properly guided and incentivized. The cost of writing common services must be paid by someone and will not happen by itself.

That's in effect the second reason why this anti-pattern exists: the infrastructure in place for SOA does not support or encourage reuse. Even if you had a service that is reusable how do you find out how well it works? How do you know how many people are using it? Do you know what time of day they use it most? Do you know which operations of your service get hit the hardest? Next, how do others even find out you wrote a service and it may do what they need? 

SOA Governance (for which WSO2 has an excellent product: WSO2 Governance Registry) is not focused on encouraging service reuse but rather on governing the creation and management of services. The SOA world has lacked a solution for making it easy to help people discover available services and to manage and monitor their consumption. 

API Management

What's an API? Its the interface to a service. Simple. In other words, if you don't have any services, you have no APIs to expose and manage.

API Management is about managing the entire lifecycle of APIs. This involves someone who publishes the interface of a service into a store of some kind. Next it involves developers who browse the store to find APIs they care about and get access to them (typically by acquiring an access token of some sort) and then the developers using those keys to program accesses to the service via its interface.

Why is this important? In my opinion, API Management is to SOA what Amazon EC2 is to Virtualization. Of course virtualization has been around for a long time, but EC2 changed the game by making it trivially simple for someone to get a VM. It brought self service, serendipitous consumption, and elasticity to virtualization. Similarly, API Management brings self service & serendipitous consumption by allowing developers to discover, try and use services without requiring any type of "management approval". It allows consumers to not have to worry about scaling - they just indicate the desired SLA (typically in the form of a subscription plan) and its up to the provider to make it work right. 

API Management & SOA are married at the hip

If you have an SOA strategy in your organization but don't have an API Management plan then you are doomed to failure. Notice that I didn't even talk about externally exposing APIs- even internal service consumption should be managed through an API Management system so that everyone has clear visibility into who's using what service and how much is used when. Its patently obvious why external exposition of services requires API Management.

Chris Haddad, WSO2's VP of Technology Evangelism, recently wrote a superb whitepaper that discusses and explain the connection between SOA and API Management. Check out Promoting service reuse within your enterprise and maximizing SOA success and I can guarantee you will leave enlightened.

In May this year, a blog on highscalability.com talked about how "Startups Are Creating A New System Of The World For IT". In that the author talked about open source as the foundation of this new system and SOA as the load bearing walls of the new IT landscape. I will take it to the next level and say that API Management is the roof of the new IT house.

WSO2 API Manager

We recently introduced an API Management product: WSO2 API Manager. This product comes with an application for API Providers to create and manage APIs, a store application for API Developers to discover and consume APIs and a gateway to route API traffic through. Of course all parts of the product can be scaled horizontally to deal with massive loads. The WSO2 API Manager can be deployed either for internal consumption, external consumption or both. As with any other WSO2 product, this too is 100% open source. After you read Chris' whitepaper download this product and sit it next to your SOA infrastructure (whether its from us or not) and see what happens!




ap

Congratulations Dr. Malinda Kaushalye Kapuruge!


It gives me great pleasure to post extremely belated (he completed in October last year!) congratulations to Dr. Malinda Kaushalye Kapuruge on his completing his Ph.D. in Computer Science from Swinburne University in Australia. Kau's thesis topic was "Orchestration as Organization: Using an organisational paradim to achieve adaptable business process modelling and enactment in service compositions" and was supervised by Prof. Jun Han and Dr. Alan Colman. Kau's going to stay on in Swinburne as a Research Scientist for some time.

Kaushalye worked in WSO2 for 2 years from 2006 to 2008 before going to grad school to pursue his Ph.D. work. Congratulations and good luck!

(I'm going to post a few catch up congratulations so I can be up to date :-).)




ap

¿Te apuntas al reto?

El 16 de septiembre comienza el mayor reto de marketing (en español) para traductores e intérpretes, el September Spanish Marketing Challenge. ¿Te lo vas a perder? Aquí te contamos en qué consiste. Este es el segundo año que celebramos el reto. Dos semana de trabajo...

La entrada ¿Te apuntas al reto? aparece primero en Traducción Jurídica.




ap

Synapse and WSO2 ESB myths

There are a few myths about Synapse and the WSO2 ESB I'd like to address. Its amazing they still come up.

Not an ESB?
The first and oldest myth is that Synapse is not an ESB. This dates back to the initial creation of the project - before there was even any code! Dave Chappell was at Sonic at the time and he said "This project is related to ESB , but it is not in itself an ESB".

Well, firstly, since at that time Sonic was the ESB leader, he would say that! Secondly, this was purely theoretical - no code had been written at that point. While I love the internet's ability to archive everything for years, to quote this several years later (like the ServiceMix guys do here: http://servicemix.apache.org/how-does-servicemix-compare-to-synapse.html) is disingenuous to say the least.

The fact is that Synapse - both as a pure Apache project and when packaged as the runtime engine of the WSO2 ESB is an ESB. Rather than argue about the definition of an ESB, it would be simpler to describe a few of the many usecases it is in production for:

* Getting the latest trades from a legacy financial system and reporting them to third-parties to meet regulatory requirements.
* Linking an SAP/R3 system with a .NET-based Point-of-Sale (POS) system in 40+ retails stores to distribute the latest price updates.
* Integrating between BMC Remedy, Salesforce and Peoplesoft.
* Providing a full SOA bus for a telecom operator linking to provide a common fabric for payment services, SMS top up and other integrations.
* Lightweight Service Orchestration (what we call Service Chaining) - providing simple non-persistent flows across multiple services.
* Integrating FIX messaging to existing systems.
* etc etc

In addition, the beauty of the Synapse ESB (and WSO2 ESB) is that it can also provide very high performance lightweight routing, load-balancing, failover and security management, so it is often used for high throughput scenarios as well - for example at eBay where it handles well over 1bn request/response interactions/day.

Synapse (and WSO2 ESB) only support SOAP or translate every message into SOAP
This is also a complete myth. The WSO2 ESB has a very effective model for dealing with content that only parses the content as needed. This model is based on the concept of a message formatter and builder. These objects handle the internal representation of content and are very flexible. For example, the normal approach to handling non-XML data is to keep it as a binary stream. In addition, a new transport in the WSO2 ESB (the Passthru transport) supports even higher performance routing of messages where the message body is simply passed from one HTTP endpoint to the next, while still supporting useful functions like header-based routing, authentication and authorization, logging, throttling and cacheing.

For XML data, we have an internal model that unifies SOAP and non-SOAP. What this means is that for non-SOAP payloads, there are two extra objects in memory that represent the envelope and body. This makes it very easy (and performant) to handle scenarios like taking the SOAP body and publishing it (without the SOAP wrapper) onto a JMS queue.

 Because the XML object model we use (Apache Axiom) supports streaming (via StAX), the message is only built into a tree if a mediator such as the XSLT transform requests it.

I think this is where the mistaken belief lies. This is a bit like Heisenberg's Uncertainty Principle! The act of observing a quantum level action affects the action. Similarly, if you examine the message, then if you ask for it as SOAP, we will build it into a SOAP message and give it to you. Of course that doesn't mean it was a SOAP message until you asked for it as SOAP. If you were to ask for the message as pure XML then you would get it as a pure XML element. In both cases it remains as a binary stream until the point you ask for the message. If you simply route the message out to another system, it will not have been converted to or from anything:  Synapse will simply stream the message through and out to the target.

I hope that this clears up these two myths!




ap

GNU Terry Pratchett on WSO2 ESB / Apache Synapse

If any of you are following the GNU Terry Pratchett discussion on Reddit, BBC or the Telegraph, then you might be wondering how to do this in the WSO2 ESB or Apache Synapse. Its very very simple. Here you go. Enjoy.
Loading ....




ap

Capitalisation : les pistes de la Fondapol pour réformer les retraites

Selon l'economiste Bertrand Martinot, il faut introduire une dose de capitalisation pour des raisons d'equite entre generations et d'efficience economique.




ap

A New Approach to Water Flow Algorithm for Text Line Segmentation

This paper proposes a new approach to water flow algorithm for the text line segmentation. Original method assumes hypothetical water flows under a few specified angles to the document image frame from left to right and vice versa. As a result, unwetted image frames are extracted. These areas are of major importance for text line segmentation. Method modifications mean extension values of water flow angle and unwetted image frames function enlargement. Results are encouraging due to text line segmentation improvement which is the most challenging process stage in document image processing.




ap

A Petri Nets based Approach to Specify Individual and Collaborative Interaction in 3D Virtual Environments

This work describes a methodology that supports the design and implementation of software modules, which represent the individual and collaborative three-dimensional interaction process phases. The presented methodology integrates three modeling approaches: Petri Nets, a collaborative manipulation model based on the combination of single user interaction techniques taxonomy, and object-oriented programming concepts. The combination of these elements allows for the description of interaction tasks, the sequence of interaction processes being controlled by Petri Nets with the codes generated automatically. By the integration of these approaches, the present work addresses not only the entire development cycle of both individual and collaborative three-dimensional interaction, but also the reuse of developed interaction blocks in new virtual environment projects.




ap

CSCWD: Applications and Challenges




ap

A Clustering Approach for Collaborative Filtering Recommendation Using Social Network Analysis

Collaborative Filtering(CF) is a well-known technique in recommender systems. CF exploits relationships between users and recommends items to the active user according to the ratings of his/her neighbors. CF suffers from the data sparsity problem, where users only rate a small set of items. That makes the computation of similarity between users imprecise and consequently reduces the accuracy of CF algorithms. In this article, we propose a clustering approach based on the social information of users to derive the recommendations. We study the application of this approach in two application scenarios: academic venue recommendation based on collaboration information and trust-based recommendation. Using the data from DBLP digital library and Epinion, the evaluation shows that our clustering technique based CF performs better than traditional CF algorithms.




ap

Web 2.0: Applications and Mechanisms




ap

QoS-based Approach for Dynamic Web Service Composition

Web Services have become a standard for integration of systems in distributed environments. By using a set of open interoperability standards, they allow computer-computer interaction, regardless the programming languages and operating systems used. The Semantic Web Services, by its turn, make use of ontologies to describe their functionality in a more structural manner, allowing computers to reason about the information required and provided by them. Such a description also allows dynamic composition of several Web Services, when only one is not able to provide the desired functionality. There are scenarios, however, in which only the functional correctness is not enough to fulfill the user requirements, and a minimum level of quality should be guaranteed by their providers. In this context, this work presents an approach for dynamic Web Service composition that takes into account the composition overall quality. The proposed approach relies on a heuristics to efficiently perform the composition. In order to show the feasibility of the proposed approach, a Web Service composition application prototype was developed and experimented with public test sets, along with another approach that does not consider quality in the composition process. The results have shown that the proposed approach in general finds compositions with more quality, within a reasonable processing time.




ap

Context-Aware Composition and Adaptation based on Model Transformation

Using pre-existing software components (COTS) to develop software systems requires the composition and adaptation of the component interfaces to solve mismatch problems. These mismatches may appear at different interoperability levels (signature, behavioural, quality of service and semantic). In this article, we define an approach which supports composition and adaptation of software components based on model transformation by taking into account the four levels. Signature and behavioural levels are addressed by means of transition systems. Context-awareness and semanticbased techniques are used to tackle quality of service and semantic, respectively, but also both consider the signature level. We have implemented and validated our proposal for the design and application of realistic and complex systems. Here, we illustrate the need to support the variability of the adaptation process in a context-aware pervasive system through a real-world case study, where software components are implemented using Windows Workflow Foundation (WF). We apply our model transformation process to extract transition systems (CA-STS specifications) from WF components. These CA-STSs are used to tackle the composition and adaptation. Then, we generate a CASTS adaptor specification, which is transformed into its corresponding WF adaptor component with the purpose of interacting with all the WF components of the system, thereby avoiding mismatch problems.




ap

An Approach for Feature Modeling of Context-Aware Software Product Line

Feature modeling is an approach to represent commonalities and variabilities among products of a product line. Context-aware applications use context information to provide relevant services and information for their users. One of the challenges to build a context-aware product line is to develop mechanisms to incorporate context information and adaptation knowledge in a feature model. This paper presents UbiFEX, an approach to support feature analysis for context-aware software product lines, which incorporates a modeling notation and a mechanism to verify the consistency of product configuration regarding context variations. Moreover, an experimental study was performed as a preliminary evaluation, and a prototype was developed to enable the application of the proposed approach.




ap

Hierarchical Graph-Grammar Model for Secure and Efficient Handwritten Signatures Classification

One important subject associated with personal authentication capabilities is the analysis of handwritten signatures. Among the many known techniques, algorithms based on linguistic formalisms are also possible. However, such techniques require a number of algorithms for intelligent image analysis to be applied, allowing the development of new solutions in the field of personal authentication and building modern security systems based on the advanced recognition of such patterns. The article presents the approach based on the usage of syntactic methods for the static analysis of handwritten signatures. The graph linguistic formalisms applied, such as the IE graph and ETPL(k) grammar, are characterised by considerable descriptive strength and a polynomial membership problem of the syntactic analysis. For the purposes of representing the analysed handwritten signatures, new hierarchical (two-layer) HIE graph structures based on IE graphs have been defined. The two-layer graph description makes it possible to take into consideration both local and global features of the signature. The usage of attributed graphs enables the storage of additional semantic information describing the properties of individual signature strokes. The verification and recognition of a signature consists in analysing the affiliation of its graph description to the language describing the specimen database. Initial assessments display a precision of the method at a average level of under 75%.




ap

Semantic Web: Theory and Applicationsns




ap

Algorithms for the Evaluation of Ontologies for Extended Error Taxonomy and their Application on Large Ontologies

Ontology evaluation is an integral and important part of the ontology development process. Errors in ontologies could be catastrophic for the information system based on those ontologies. As per our experiments, the existing ontology evaluation systems were unable to detect many errors (like, circulatory error in class and property hierarchy, common class and property in disjoint decomposition, redundancy of sub class and sub property, redundancy of disjoint relation and disjoint knowledge omission) as defined in the error taxonomy. We have formulated efficient algorithms for the evaluation of these and other errors as per the extended error taxonomy. These algorithms are implemented (named as OntEval) and the implementations are used to evaluate well-known ontologies including Gene Ontology (GO), WordNet Ontology and OntoSem. The ontologies are indexed using a variant of already proposed scheme Ontrel. A number of errors and warnings in these ontologies have been discovered using the OntEval. We have also reported the performance of our implementation, OntEval.




ap

Des dizaines de morts dans le sud-ouest du Pakistan après un attentat suicide

Des dizaines de morts dans le sud-ouest du Pakistan après un attentat suicide




ap

Des frappes de Tsahal ont fait plus de 50 morts au Liban et à Gaza, tirs de roquettes sur Israël

Des frappes de Tsahal ont fait plus de 50 morts au Liban et à Gaza, tirs de roquettes sur Israël




ap

La police arrête des dizaines de personnes à Amsterdam après l'interdiction de manifestations

La police arrête des dizaines de personnes à Amsterdam après l'interdiction de manifestations




ap

Gaza : au moins trois morts après une frappe israélienne sur le camp de réfugiés de Nouseirat

Gaza : au moins trois morts après une frappe israélienne sur le camp de réfugiés de Nouseirat




ap

Serbie : des manifestants demandent la démission du gouvernement après le drame de Novi Sad

Serbie : des manifestants demandent la démission du gouvernement après le drame de Novi Sad




ap

No Comment : des heurts et des incendies dans la capitale haïtienne Port-au Prince

No Comment : des heurts et des incendies dans la capitale haïtienne Port-au Prince




ap

Au moins 22 personnes tuées dans des frappes au Liban et à Gaza, et le cessez-le-feu au point mort

Au moins 22 personnes tuées dans des frappes au Liban et à Gaza, et le cessez-le-feu au point mort




ap

Trump va nommer les "faucons" Rubio et Waltz à la tête de la politique étrangère (rapports)

Trump va nommer les "faucons" Rubio et Waltz à la tête de la politique étrangère (rapports)




ap

L'aide militaire américaine à Israël va se poursuivre après un ajustement de l'aide à Gaza

L'aide militaire américaine à Israël va se poursuivre après un ajustement de l'aide à Gaza




ap

An efficient edge swap mechanism for enhancement of robustness in scale-free networks in healthcare systems

This paper presents a sequential edge swap (SQES) mechanism to design a robust network for a healthcare system utilising energy and communication range of nodes. Two operations: sequential degree difference operation (SQDDO) and sequential angle sum operation (SQASO) are performed to enhance the robustness of network. With equivalent degrees of nodes from the network's centre to its periphery, these operations build a robust network structure. Disaster attacks that have a substantial impact on the network are carried out using the network information. To identify a link between the malicious and disaster attacks, the Pearson coefficient is employed. SQES creates a robust network structure as a single objective optimisation solution by changing the connections of nodes based on the positive correlation of these attacks. SQES beats the current methods, according to simulation results. When compared to hill-climbing algorithm, simulated annealing, and ROSE, respectively, the robustness of SQES is improved by roughly 26%, 19% and 12%.




ap

A feature-based model selection approach using web traffic for tourism data

The increased volume of accessible internet data creates an opportunity for researchers and practitioners to improve time series forecasting for many indicators. In our study, we assess the value of web traffic data in forecasting the number of short-term visitors travelling to Australia. We propose a feature-based model selection framework which combines random forest with feature ranking process to select the best performing model using limited and informative number of features extracted from web traffic data. The data was obtained for several tourist attraction and tourism information websites that could be visited by potential tourists to find out more about their destinations. The results of random forest models were evaluated over 3- and 12-month forecasting horizon. Features from web traffic data appears in the final model for short term forecasting. Further, the model with additional data performs better on unseen data post the COVID19 pandemic. Our study shows that web traffic data adds value to tourism forecasting and can assist tourist destination site managers and decision makers in forming timely decisions to prepare for changes in tourism demand.




ap

An architectural view of VANETs cloud: its models, services, applications and challenges

This research explores vehicular ad hoc networks (VANETs) and their extensive applications, such as enhancing traffic efficiency, infotainment, and passenger safety. Despite significant study, widespread deployment of VANETs has been hindered by security and privacy concerns. Challenges in implementation, including scalability, flexibility, poor connection, and insufficient intelligence, have further complicated VANETs. This study proposes leveraging cloud computing to address these challenges, marking a paradigm shift. Cloud computing, recognised for its cost-efficiency and virtualisation, is integrated with VANETs. The paper details the nomenclature, architecture, models, services, applications, and challenges of VANET-based cloud computing. Three architectures for VANET clouds - vehicular clouds (VCs), vehicles utilising clouds (VuCs), and hybrid vehicular clouds (HVCs) - are discussed in detail. The research provides an overview, delves into related work, and explores VANET cloud computing's architectural frameworks, models, and cloud services. It concludes with insights into future work and a comprehensive conclusion.




ap

Smart and adaptive website navigation recommendations based on reinforcement learning

Improving website structures is the main task of a website designer. In recent years, numerous web engineering researchers have investigated navigation recommendation systems. Page recommendation systems are critical for mobile website navigation. Accordingly, we propose a smart and adaptive navigation recommendation system based on reinforcement learning. In this system, user navigation history is used as the input for reinforcement learning model. The model calculates a surf value for each page of the website; this value is used to rank the pages. On the basis of this ranking, the website structure is modified to shorten the user navigation path length. Experiments were conducted to evaluate the performance of the proposed system. The results revealed that user navigation paths could be decreased by up to 50% with training on 12 months of data, indicating that users could more easily find a target web page with the help of the proposed adaptive navigation recommendation system.