...
 
Commits (2)
*.pyc
venv/
*.pid
output
public
venv
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Title: inventory
Date: 2019/09/10
# pages inventory
* [styleguide](/pages/styleguide.html)
* [re_searchable notes](/category/re-search-able_notes.html)
* [modes of address](/category/modes_of_address.html)
* [thesis (tangible tools)](/category/thesis.html)
......@@ -7,20 +7,16 @@ tangible.tools is for projects by [Colm O'Neill](colm.be).
---
This space is intended as a place to publish drafts and notes that will build my graduation projects. I'm a firm believer the development philosophy of [*release early, release often*](https://en.wikipedia.org/wiki/Release_early%2C_release_often) for both a tighter feedback loop, but also to hold myself up to a higher standard. There shouldn't be anything in my graduation projects that couldn't be said publicly. More importantly, there shouldn't be anything in the projects that is not argued and explained properly. Publishing my writings and research as it is beiging built brings this condition to the foreground.
This space is intended as a place to publish drafts and notes <strike>that will build my graduation projects</strike> [2019 edit: that build or support my research projects]. I'm a firm believer the development philosophy of [*release early, release often*](https://en.wikipedia.org/wiki/Release_early%2C_release_often) for both a tighter feedback loop, but also to hold myself up to a higher standard. There shouldn't be anything in my <strike>graduation</strike> projects that couldn't be said publicly. More importantly, there shouldn't be anything in the projects that is not argued and explained properly. Publishing my writings and research as it is being built brings this condition to the foreground.
## ∴ say ⌢ do
This research project intends to highlight the importance of different modes of address; the term *modes of address* can be explained as: the *way* we talk. In the case of a service, a device or a tool; the way it talks. I must also consider the theme in the perspective of the tone of the writings for my research, so is this pages genesis.
## crosspublish
<strike>This research project intends</strike> [A research thread tries to continue] to highlight the importance of different modes of address; the term *modes of address* can be explained as: the *way* we talk. In the case of a service, a device or a tool; the way it talks. I must also consider the theme in the perspective of the tone of the writings for my research, so is this pages genesis.
<strike>## crosspublish
This work happens in the context of the graduation project of the Masters in Media Design and Communication of the Piet Zwart Institute in Rotterdam. The PZI has an [internal wiki](https://pzwiki.wdka.nl/mediadesign/Main_Page) on which we share an publish work. I maintain [my own space](https://pzwiki.wdka.nl/mediadesign/User:Colm) there, where you will find archives and versions of the texts that are on tangible.tools
The aim of this site is to be more outwards facing, for the project, and for visitors. I keep the versions up to date using this [crosspublish script](https://github.com/colmoneill/prototypes/blob/master/cross-publish/__crosspublish.py).
The aim of this site is to be more outwards facing, for the project, and for visitors. I keep the versions up to date using this [crosspublish script](https://github.com/colmoneill/prototypes/blob/master/cross-publish/__crosspublish.py).</strike>
## get in touch
Please do get in touch if you have questions or contributions. mail [at] colm [dot] be
Cheers!
Title: Roles and values of research and research methodologies in product / interaction design
Date: 2019/04/07
Template: slidy
<!--
cd /home/colm/git/tangible.tools/content/re-search-able_notes
pandoc 2019_04_07-roles-and-values-of-research.md --from=Markdown --to=Slidy -o 2019_04_07-roles-and-values-of-research.md.slidy.md
paste to head of new doc:
Title: ITC — role and value of research methodologies
Date: 2019/04/07
Template: slidy
Status: published
-->
# Discuss the role and value of research and research methodologies in product / interaction design ?
<!--
To respond to the topic of this presentation, I think the most comprehensive way of working is to use an example, a case study. I'd like to talk about the Low Tech Magazine. For some context, the Low Tech Magazine is an Amsterdam based publication that prints regularly since 2012. The subject of the Low Tech Magazine is Low Tech. Low Tech exists as a counterpart to High Tech. We call sophisticated, cutting edge products High Tech, (meaning High technology) because they can be considered the most advanced technology available. The Low Tech Magazine isn't anti technology really it only exists to discursively consider what infrastructure, resources and dependencies advanced technology requires. The case study I'd like present is about the new Low Tech Magazine's website and it's infrastructure.
Like many print publications today, a magazines website is very important. If the print is the cornerstone of the publication, the website may be the hub. It's where most people find out about the magazine, where a lot of interaction happens between the publisher and the readers, and it also is a space that allows for shorter form, more experimental publishing. While the print magazines focused on Low Tech, the team wanted to reconsider their website with a similar looking glass, they began a research project with the question of how the Low Tech's Magazines website could better embody the Low Tech ideology.
-->
# LOW TECH MAGAZINE
### solar server project
— a case study
#
![](../images/solar-low-tech-mag/mag_highres.jpg)
#
![](../images/solar-low-tech-mag/triptique.png)
#
![](../images/solar-low-tech-mag/CERN_Server_03.jpg)
#
![](../images/solar-low-tech-mag/solar-powered-server-detail-2.png)
#
![](../images/solar-low-tech-mag/sps_panel.png)
# Website screenshot
![](../images/solar-low-tech-mag/low-tech1.png)
# Website screenshot
![](../images/solar-low-tech-mag/low-tech-crop.png)
# Website screenshot
![](../images/solar-low-tech-mag/low-tech2.png)
# Website screenshot
![](../images/solar-low-tech-mag/low-tech0.png)
# Website screenshot
![](../images/solar-low-tech-mag/low-tech3.png)
#
![](../images/solar-low-tech-mag/whyoffline_screenshot.png)
# Research methodologies employed:
* critical thinking
* interdisciplinary (project ethos confronted to technical designs)
* high risk taking
* live experimentation
* release early, release often
* open communication
# Derived value from the research itself
* By sharing the research process,
* by allowing for critical thought and risk taking,
* by experimenting with the live website,
Low Tech Mag's website and server infrastructure redesign directly exposed the value of open research methodologies for their end products, print and web.
Title: ITC — role and value of research methodologies
Date: 2019/04/07
Template: slidy
Status: draft
<div class="slide section level1">
<p>Title: Roles and values of research and research methodologies in product / interaction design Date: 2019/04/07 Template: slidy Status: draft</p>
<!--
cd /home/colm/git/tangible.tools/content/re-search-able_notes
pandoc 2019_04_07-roles-and-values-of-research.md --from=Markdown --to=Slidy -o 2019_04_07-roles-and-values-of-research.md.slidy.md
paste to head of new doc:
Title: ITC — role and value of research methodologies
Date: 2019/04/07
Template: slidy
Status: published
-->
</div>
<div id="discuss-the-role-and-value-of-research-and-research-methodologies-in-product-interaction-design" class="slide section level1">
<h1>Discuss the role and value of research and research methodologies in product / interaction design ?</h1>
<!--
To respond to the topic of this presentation, I think the most comprehensive way of working is to use an example, a case study. I'd like to talk about the Low Tech Magazine. For some context, the Low Tech Magazine is an Amsterdam based publication that prints regularly since 2012. The subject of the Low Tech Magazine is Low Tech. Low Tech exists as a counterpart to High Tech. We call sophisticated, cutting edge products High Tech, (meaning High technology) because they can be considered the most advanced technology available. The Low Tech Magazine isn't anti technology really it only exists to discursively consider what infrastructure, resources and dependencies advanced technology requires. The case study I'd like present is about the new Low Tech Magazine's website and it's infrastructure.
Like many print publications today, a magazines website is very important. If the print is the cornerstone of the publication, the website may be the hub. It's where most people find out about the magazine, where a lot of interaction happens between the publisher and the readers, and it also is a space that allows for shorter form, more experimental publishing. While the print magazines focused on Low Tech, the team wanted to reconsider their website with a similar looking glass, they began a research project with the question of how the Low Tech's Magazines website could better embody the Low Tech ideology.
-->
</div>
<div id="low-tech-magazine" class="slide section level1">
<h1>LOW TECH MAGAZINE</h1>
<h3 id="solar-server-project">solar server project</h3>
<p>— a case study</p>
</div>
<div id="section" class="slide section level1">
<h1></h1>
<p><img src="../images/solar-low-tech-mag/mag_highres.jpg" /></p>
</div>
<div id="section-1" class="slide section level1">
<h1></h1>
<p><img src="../images/solar-low-tech-mag/triptique.png" /></p>
</div>
<div id="section-2" class="slide section level1">
<h1></h1>
<p><img src="../images/solar-low-tech-mag/CERN_Server_03.jpg" /></p>
</div>
<div id="section-3" class="slide section level1">
<h1></h1>
<p><img src="../images/solar-low-tech-mag/solar-powered-server-detail-2.png" /></p>
</div>
<div id="section-4" class="slide section level1">
<h1></h1>
<p><img src="../images/solar-low-tech-mag/sps_panel.png" /></p>
</div>
<div id="website-screenshot" class="slide section level1">
<h1>Website screenshot</h1>
<p><img src="../images/solar-low-tech-mag/low-tech1.png" /></p>
</div>
<div id="website-screenshot-1" class="slide section level1">
<h1>Website screenshot</h1>
<p><img src="../images/solar-low-tech-mag/low-tech-crop.png" /></p>
</div>
<div id="website-screenshot-2" class="slide section level1">
<h1>Website screenshot</h1>
<p><img src="../images/solar-low-tech-mag/low-tech2.png" /></p>
</div>
<div id="website-screenshot-3" class="slide section level1">
<h1>Website screenshot</h1>
<p><img src="../images/solar-low-tech-mag/low-tech0.png" /></p>
</div>
<div id="website-screenshot-4" class="slide section level1">
<h1>Website screenshot</h1>
<p><img src="../images/solar-low-tech-mag/low-tech3.png" /></p>
</div>
<div id="section-5" class="slide section level1">
<h1></h1>
<p><img src="../images/solar-low-tech-mag/whyoffline_screenshot.png" /></p>
</div>
<div id="research-methodologies-employed" class="slide section level1">
<h1>Research methodologies employed:</h1>
<ul>
<li>critical thinking</li>
<li>interdisciplinary (project ethos confronted to technical designs)</li>
<li>high risk taking</li>
<li>live experimentation</li>
<li>release early, release often</li>
<li>open communication</li>
</ul>
</div>
<div id="derived-value-from-the-research-itself" class="slide section level1">
<h1>Derived value from the research itself</h1>
<ul>
<li>By sharing the research process,</li>
<li>by allowing for critical thought and risk taking,</li>
<li>by experimenting with the live website,</li>
</ul>
<p>Low Tech Mag’s website and server infrastructure redesign directly exposed the value of open research methodologies for their end products, print and web.</p>
</div>
Date: 2019/09/02
Title: Digital Media Design
#### BSc in Digital Marketing with Analytics
## Course schedule:
* Wednesdays from 11.00 → 13.00 (room A211)
* Thursdays from 11.00 → 12.00 (room A211)
### Week 1
Developing design senses
Date: 2019/09/02
Title: Marketing Communications in a Digital Era
#### MSc Digital Marketing
## Course schedule:
* Thursdays from 9.00 → 11.00 (room A210)
### Week 1
Design senses
Date: 2019/09/02
Title: Visual Language and Media
#### BA Media and PR
## Course schedule:
* Wednesdays from 10.00 → 11.00 (room A100) — Lecture
* Thursdays from 14.00 → 16.00 (room A310) — Practical
### Week 1
Developing design senses
Date: 2019/09/02
Title: Design Practice & Professional Development
#### BA Product design innovation
## Course schedule:
* Thursdays from 14.00 → 16.00 (room D413)
### Week 1
Developing design senses
Date: 2019/09/02
Title: International Design Movements
#### BA Product design innovation
## Course schedule:
* Fridays from 9.00 → 11.00 (room D516)
### Week 1
Developing design senses
Date: 2019/09/02
Title: Enterprise & Leadership
#### BA Product design innovation
## Course schedule:
* Fridays from 12.00 → 13.00 (room D516)
### Week 1
Practical tools for Enterprise & Leadership
Simple Footnotes
================
A Pelican plugin to add footnotes to blog posts.
When writing a post or page, add a footnote like this:
Here's my written text[ref]and here is a footnote[/ref].
This will appear as, roughly:
Here's my written text<sup>1</sup>
1. and here is a footnote ↩
Inspired by Andrew Nacin's [Simple Footnotes WordPress plugin](http://wordpress.org/plugins/simple-footnotes/).
Requirements
============
Needs html5lib, so you'll want to `pip install html5lib` before running.
Should work with any content format (ReST, Markdown, whatever), because
it looks for the `[ref]` and `[/ref]` once the conversion to HTML has happened.
Stuart Langridge, http://www.kryogenix.org/, February 2014.
from .simple_footnotes import *
#!/usr/bin/env python
# -*- coding: utf-8 -*- #
from pelican import signals
import html5lib
RAW_FOOTNOTE_CONTAINERS = ["code"]
def getText(node, recursive = False):
"""Get all the text associated with this node.
With recursive == True, all text from child nodes is retrieved."""
L = [u'']
for n in node.childNodes:
if n.nodeType in (node.TEXT_NODE, node.CDATA_SECTION_NODE):
L.append(n.data)
else:
if not recursive:
return None
L.append(getText(n) )
return u''.join(L)
def sequence_gen(genlist):
for gen in genlist:
for elem in gen:
yield elem
def parse_for_footnotes(article_or_page_generator):
all_content = [
getattr(article_or_page_generator, attr, None) \
for attr in [u'articles',u'drafts',u'pages'] ]
all_content = [ x for x in all_content if x is not None ]
for article in sequence_gen(all_content):
if u"[ref]" in article._content and u"[/ref]" in article._content:
content = article._content.replace(u"[ref]", u"<x-simple-footnote>").replace(u"[/ref]", u"</x-simple-footnote>")
parser = html5lib.HTMLParser(tree=html5lib.getTreeBuilder(u"dom"))
dom = parser.parse(content)
endnotes = []
count = 0
for footnote in dom.getElementsByTagName(u"x-simple-footnote"):
pn = footnote
leavealone = False
while pn:
if pn.nodeName in RAW_FOOTNOTE_CONTAINERS:
leavealone = True
break
pn = pn.parentNode
if leavealone:
continue
count += 1
fnid = u"sf-%s-%s" % (article.slug, count)
fnbackid = u"%s-back" % (fnid,)
endnotes.append((footnote, fnid, fnbackid))
number = dom.createElement(u"sup")
number.setAttribute(u"id", fnbackid)
numbera = dom.createElement(u"a")
numbera.setAttribute(u"href", u"#%s" % fnid)
numbera.setAttribute(u"class", u"simple-footnote")
numbera.appendChild(dom.createTextNode(unicode(count)))
txt = getText(footnote, recursive=True).replace(u"\n", u" ")
numbera.setAttribute(u"title", txt)
number.appendChild(numbera)
footnote.parentNode.insertBefore(number, footnote)
if endnotes:
ol = dom.createElement(u"ol")
ol.setAttribute(u"class", u"simple-footnotes")
for e, fnid, fnbackid in endnotes:
li = dom.createElement(u"li")
li.setAttribute(u"id", fnid)
while e.firstChild:
li.appendChild(e.firstChild)
backlink = dom.createElement(u"a")
backlink.setAttribute(u"href", u"#%s" % fnbackid)
backlink.setAttribute(u"class", u"simple-footnote-back")
backlink.appendChild(dom.createTextNode(u'\u21a9'))
li.appendChild(dom.createTextNode(u" "))
li.appendChild(backlink)
ol.appendChild(li)
e.parentNode.removeChild(e)
dom.getElementsByTagName(u"body")[0].appendChild(ol)
s = html5lib.serializer.HTMLSerializer(omit_optional_tags=False, quote_attr_values='legacy')
output_generator = s.serialize(html5lib.treewalkers.getTreeWalker(u"dom")(dom.getElementsByTagName(u"body")[0]))
article._content = u"".join(list(output_generator)).replace(
u"<x-simple-footnote>", u"[ref]").replace(u"</x-simple-footnote>", u"[/ref]").replace(
u"<body>", u"").replace(u"</body>", u"")
def register():
signals.article_generator_finalized.connect(parse_for_footnotes)
signals.page_generator_finalized.connect(parse_for_footnotes)
import unittest
from simple_footnotes import parse_for_footnotes
class PseudoArticleGenerator(object):
articles = []
class PseudoArticle(object):
_content = ""
slug = "article"
class TestFootnotes(unittest.TestCase):
def _expect(self, input, expected_output):
ag = PseudoArticleGenerator()
art = PseudoArticle()
art._content = input
ag.articles = [art]
parse_for_footnotes(ag)
self.assertEqual(art._content, expected_output)
def test_simple(self):
self._expect("words[ref]footnote[/ref]end",
('words<sup id="sf-article-1-back"><a title="footnote" '
'href="#sf-article-1" class="simple-footnote">1</a></sup>end'
'<ol class="simple-footnotes">'
u'<li id="sf-article-1">footnote <a href="#sf-article-1-back" class="simple-footnote-back">\u21a9</a></li>'
'</ol>'))
def test_no_footnote_inside_code(self):
self._expect("words<code>this is code[ref]footnote[/ref] end code </code> end",
"words<code>this is code[ref]footnote[/ref] end code </code> end")
if __name__ == '__main__':
unittest.main()
\ No newline at end of file
# -*- coding: utf-8 -*-
import os
import shutil
import sys
import datetime
from invoke import task
from invoke.util import cd
from pelican.server import ComplexHTTPRequestHandler, RootedHTTPServer
from pelican.settings import DEFAULT_CONFIG, get_settings_from_file
SETTINGS_FILE_BASE = 'pelicanconf.py'
SETTINGS = {}
SETTINGS.update(DEFAULT_CONFIG)
LOCAL_SETTINGS = get_settings_from_file(SETTINGS_FILE_BASE)
SETTINGS.update(LOCAL_SETTINGS)
CONFIG = {
'settings_base': SETTINGS_FILE_BASE,
'settings_publish': 'publishconf.py',
# Output path. Can be absolute or relative to tasks.py. Default: 'output'
'deploy_path': SETTINGS['OUTPUT_PATH'],
# Remote server configuration
'production': 'colm@colm.be:22',
'dest_path': '/var/www/tangible.tools',
# Port for `serve`
'port': 8000,
}
@task
def clean(c):
"""Remove generated files"""
if os.path.isdir(CONFIG['deploy_path']):
shutil.rmtree(CONFIG['deploy_path'])
os.makedirs(CONFIG['deploy_path'])
@task
def build(c):
"""Build local version of site"""
c.run('pelican -s {settings_base}'.format(**CONFIG))
@task
def rebuild(c):
"""`build` with the delete switch"""
c.run('pelican -d -s {settings_base}'.format(**CONFIG))
@task
def regenerate(c):
"""Automatically regenerate site upon file modification"""
c.run('pelican -r -s {settings_base}'.format(**CONFIG))
@task
def serve(c):
"""Serve site at http://localhost:$PORT/ (default port is 8000)"""
class AddressReuseTCPServer(RootedHTTPServer):
allow_reuse_address = True
server = AddressReuseTCPServer(
CONFIG['deploy_path'],
('', CONFIG['port']),
ComplexHTTPRequestHandler)
sys.stderr.write('Serving on port {port} ...\n'.format(**CONFIG))
server.serve_forever()
@task
def reserve(c):
"""`build`, then `serve`"""
build(c)
serve(c)
@task
def preview(c):
"""Build production version of site"""
c.run('pelican -s {settings_publish}'.format(**CONFIG))
@task
def livereload(c):
"""Automatically reload browser tab upon file modification."""
from livereload import Server
build(c)
server = Server()
# Watch the base settings file
server.watch(CONFIG['settings_base'], lambda: build(c))
# Watch content source files
content_file_extensions = ['.md', '.rst']
for extension in content_file_extensions:
content_blob = '{0}/**/*{1}'.format(SETTINGS['PATH'], extension)
server.watch(content_blob, lambda: build(c))
# Watch the theme's templates and static assets
theme_path = SETTINGS['THEME']
server.watch('{}/templates/*.html'.format(theme_path), lambda: build(c))
static_file_extensions = ['.css', '.js']
for extension in static_file_extensions:
static_file = '{0}/static/**/*{1}'.format(theme_path, extension)
server.watch(static_file, lambda: build(c))
# Serve output path on configured port
server.serve(port=CONFIG['port'], root=CONFIG['deploy_path'])
@task
def publish(c):
"""Publish to production via rsync"""
c.run('pelican -s {settings_publish}'.format(**CONFIG))
c.run(
'rsync --delete --exclude ".DS_Store" -pthrvz -c '
'{} {production}:{dest_path}'.format(
CONFIG['deploy_path'].rstrip('/') + '/',
**CONFIG))