2011-01-26

The only interesting answers are those that destroy the questions

Susan Sontag

2010-12-20

A Julian Assange quote.

«What are the differences between Mark Zuckerberg and me? I give private information on corporations to you for free, and I’m a villain. Zuckerberg gives your private information to corporations for money and he’s Man of the Year.»

— Julian Assange on SNL

2010-12-10

Yoann Bourgeois encore, avec des balles, sur france3.

2010-12-10

Step Motion Flight par la compagnie Yoann Bourgeois

2010-11-17

Format-standard

Rosab propose une interface zoomable pour son nouveau numéro. En Flash™, avec un antialiasing pas très heureux et une tendance à pédaler un peu. Principe intéressant, quoi qu'il en soit. Ma propre tentative javascript s'était soldée par un scroll horizontal multidirectionnel mais à une seule dimension. Scroll rendu délicat par une surface de scroll trop importante.

2010-11-16

currybetdotnet

currybetdotnet is Martin Belam’s blog about information architecture, journalism and digital media. Martin Belam works for the Guardian as Information Architect on the guardian.co.uk website.

2010-11-15

Roger Excoffon et la fonderie Olive

On en parle beaucoup a beaucoup parlé un peu partout. Sur Le Typographe (deux fois) et 2 ou 3 choses, entre autres lieux fréquentables. À mon tour doc ;

Ypsilon éditeur publie Roger Excoffon et la fonderie Olive.

Christian Schwartz – à moins que ce ne fût Paul Barnes – disait l'autre jour sur twitter :

Just received our studio copy of “Roger Excoffon et la fonderie Olive”. BRILLIANT. My favorite book of the year.

Sandra Chamaret (venue récemment en workshop Design d'information à l'ESAC), Julien Gineste, Sébastien Morlighem en sont les auteurs apparemment très inspirés.

Pour mémoire – et on notera le référentiel états-unien assez paradoxalement marqué – Ken Barber (House Industries) disait :

Typetheory : What typeface do you look at and say, “I wish I had created that!”
Ken Barnes : Anything by Roger Excoffon.

Anything / Choc

2010-11-10

Le design graphique est un langage qui communique des idées, des émotions et des valeurs. C’est une langue vivante qui ne peut évoluer et s’épanouir que lorsqu’on maîtrise parfaitement sa syntaxe et qu’on connait son vocabulaire.

Le design graphique est partout. Les supports se multiplient, mais son rôle demeure : donner du sens, expliquer, convaincre.

Le design graphique a la responsabilité d’agir et de participer à la société comme source de richesse, de culture et de fierté.

Société des designers graphiques du Québec

2010-11-03

Django : gestion de médias externes

Sur bitbucket, un gestionnaire d'uploads / sélecteur de médias pour django : django-adminfiles

Voir sur viméo la démo du fonctionnement côté admin django.

Et pour l'embed d'élements dans les pages publiques (parsing de html brut), djangoembed sur pypi.

2010-11-03

Sentry provides you with a generic interface to view and interact with your error logs. By default, it will catch any exception thrown by Django and store it in a database. With this it allows you to interact and view near real-time information to discover issues and more easily trace them in your application.

Sentry

2010-11-02

Art direction is about evoking the right emotion, it’s about creating that connection to what you’re seeing and experiencing.

Dan Mall captures the perfect definition of art direction in A List Apart 317. (via 9-bits)

2010-10-25

In graphic design, nothing is what it actually is. Everything other than content is representative of something else. Additionally, much of the content is also merely representative of something other than what it actually is.

Design View / Andy Rutledge - The Design Lesson

2010-10-22

Sergio Alves, young designer from Porto.

via butdoesitfloat

2010-10-15

2010-09-14

Sass - Syntactically Awesome Stylesheets

Quelques références pour Sass, extension ruby de génération de css, qui permete l'utilisation de variables, règles imbriquées, mixins, imports en ligne, génération de png base-64, etc. :

Sass et sa documentation ;

Compass : mixins, includes et « framework » pour sass ;

Lemonade : bientôt intégré à Sass, un générateur de sprites.

2010-09-07

After nearly five years in which Vollkorn became famous in the web and world it gets two crispy sisters : Italic and Bold-Italic.

— Friedrich Althausen, Typographer and Type Designer, Weimar, Germany

2010-08-23

Django makemessages

Le layout de l'application est similaire à celui décrit par Zachary Voase ici: http://blog.zacharyvoase.com/2010/03/05/django-uwsgi-nginx/#configuration

Tout est question de chemin…

``` export PROJECT_NAME="myproject" export VIRTUAL_ENV="myprojectenv"

```

Créer un répertoire locale à la racine du projet

``` workon $VIRTUAL_ENV cdvirtualenv cd $PROJECT_NAME mkdir locale

```

Créer un répertoire par localisation dans locale

cd locale mkdir fr en

Configurer le LOCALE_PATHS dans les settings de Django

``` LOCALE_PATHS = (
SITE_ROOT / 'locale' )

```

Lancer le makemessages

```

parsing des applications et des templates

DJANGO_SETTINGS_MODULE="$PROJECT_NAME.settings.development" PYTHONPATH=".." django-admin.py makemessages --settings=$PROJECT_NAME.settings.development -s -a $ import sys, warnings, os, fnmatch, glob, shutil, codecs, md5 $ processing language fr

pour parser également les js

DJANGO_SETTINGS_MODULE="$PROJECT_NAME.settings.development" PYTHONPATH=".." django-admin.py makemessages --settings=$PROJECT_NAME.settings.development -s -a -d djangojs -e.html,.js

```

Compiler les messages traduits

DJANGOSETTINGSMODULE="$PROJECTNAME.settings.development" PYTHONPATH=".." django-admin.py compilemessages --settings=$PROJECTNAME.settings.development

2010-08-23

compiling .po messages from Django

djangoninja:

to enable that, set LOCALE_PATH in your settings pointing to directory containing locales, e.g.

import os SITE_ROOT = os.path.dirname(os.path.abspath(__file__)) LOCALE_PATHS = ( os.path.join(SITE_ROOT, 'locale') )

2010-08-04

Créer une table des matières avec django

À nettoyer, modifier, améliorer… Emprunté au snippet MediaWikiMarkup

Usage :

{{ object.html_text|createToc }}

Code :

```

-- coding: utf-8 --

from django.template import Library import re from django.template.defaultfilters import slugify, striptags

register = Library()

_headerPat = re.compile(ur"<Hh(.?)>(.?)", re.UNICODE) _tagPat = re.compile(ur"<.*?>", re.UNICODE)

def createToc(text, extractToc=None, noToc=None):

# Get all headlines for numbering them and adding funky stuff like [edit]
# links - this is for later, but we need the number of headlines right now
matches = _headerPat.findall(text)
numMatches = len(matches)


# if there are fewer than 4 headlines in the article, do not show TOC
# unless it's been explicitly enabled.
enoughToc = (numMatches >= 3)

# headline counter
headlineCount = 0

# Ugh .. the TOC should have neat indentation levels which can be
# passed to the skin functions. These are determined here
toc = []
head = {}
sublevelCount = {}
levelCount = {}
toclevel = 0
level = 0
prevlevel = 0
toclevel = 0
prevtoclevel = 0
refers = {}
refcount = {}
wgMaxTocLevel = 5

for match in matches:
    headline = match[2]

    if toclevel:
        prevlevel = level
        prevtoclevel = toclevel

    level = matches[headlineCount][0]

    if enoughToc:
        if level > prevlevel:
            toclevel += 1
            sublevelCount[toclevel] = 0
            if toclevel < wgMaxTocLevel:
                toc.append(u'\n<ul class="toc">')
        elif level < prevlevel and toclevel > 1:
            # Decrease TOC level, find level to jump to

            if toclevel == 2 and level < levelCount[1]:
                toclevel = 1
            else:
                for i in range(toclevel, 0, -1):
                    if levelCount[i] == level:
                        # Found last matching level
                        toclevel = i
                        break
                    elif levelCount[i] < level:
                        toclevel = i + 1
                        break
            if toclevel < wgMaxTocLevel:
                toc.append(u"</li>\n")
                toc.append(u"</ul>\n</li>\n" * max(prevtoclevel - toclevel, 0))
        else:
            if toclevel < wgMaxTocLevel:
                toc.append(u"</li>\n")

        levelCount[toclevel] = level

        # count number of headlines for each level
        sublevelCount[toclevel] += 1

    # The canonized header is a version of the header text safe to use for links
    canonized_headline = slugify(headline)


    # strip out HTML
    tocline =  striptags(headline)

    # Save headline for section edit hint before it's escaped
    headline_hint = tocline
    canonized_headline = slugify(tocline)
    refers[headlineCount] = canonized_headline

    # count how many in assoc. array so we can track dupes in anchors
    if canonized_headline not in refers:
        refers[canonized_headline] = 1
    else:
        refers[canonized_headline] += 1
    refcount[headlineCount] = refers[canonized_headline]

    # Create the anchor for linking from the TOC to the section
    anchor = canonized_headline;
    if refcount[headlineCount] > 1:
        anchor += u'_' + unicode(refcount[headlineCount])

    if enoughToc:
        toc.append(u'\n<li class="toclevel-')
        toc.append(unicode(toclevel))
        toc.append(u'"><a href="#')
        toc.append(anchor)
        toc.append(u'">')
        toc.append(u'<span class="toctext">')
        toc.append(tocline)
        toc.append(u'</span></a>')

    # give headline the correct <h#> tag
    if headlineCount not in head:
        head[headlineCount] = []
    h = head[headlineCount]
    h.append(u'<h')
    h.append(unicode(level))
    h.append(u' id="')
    h.append(anchor)
    h.append('">')
    h.append(matches[headlineCount][1].strip())
    h.append(headline.strip())
    h.append(u'</h')
    h.append(unicode(level))
    h.append(u'>')

    headlineCount += 1

if enoughToc:
    if toclevel < wgMaxTocLevel:
        toc.append(u"</li>\n")
        toc.append(u"</ul>\n</li>\n" * max(0, toclevel - 1))
    #toc.insert(0, u'<table id="toc" class="toc" summary="Contents"><tr><td><div id="toctitle"><h2>Contents</h2></div>')
    toc.append(u'</ul>\n')

# split up and insert constructed headlines

if extractToc is not None:
    full = []
    if enoughToc :
        full += toc
    full = u''.join(full)
    return full
else:
    blocks = _headerPat.split(text)

    i = 0
    len_blocks = len(blocks)

    full = []
    while i < len_blocks:
        j = i/4
        full.append(blocks[i])
        if enoughToc and not i :
            if noToc is not None :
                full += toc
            toc = None
        if j in head and head[j]:
            full += head[j]
            head[j] = None
        i += 4
    full = u''.join(full)
    return full

"""
return text
"""

register.filter(createToc)

```