Blog

Lots of the explanations here are Tryggvi's wise words; I thought they might be useful to others, so he kindly let me copy them over!

So, customisation. As I wrote about in my last post, I got the local instance of Source fired up, and next came the steps of playing around with it, and customising it for what I need for the toolkit.

As you can see from the Code section of Source, you can 'tag' items. On the Toolkit site, I'll be renaming the 'Code' section as 'Tools', and this will be how people can look through the recommended online tools on the site. From Source, the categories of tags are currently split into 'technology tags', or 'concept tags', but I wanted to have more categories- 'data source tags', so that people can search by data source, and 'skill level' tags, for each code.

I tried first looking at this page about custom tagging in the Django documentation, but it didn't make that much sense to me. So, with the help of my trusty tech mentor Tryggvi, I started off by creating the 'models', ie. how the tags will be represented in the database.

Explanation: Django is made up of “apps”; which have special purposes; here, there is an app called “source.tags”. So, in source/tags/ there is a file models.py which describes the tags models.

In source/tags/models.py, we can see the 'technology' and 'concept' tag models:

class TechnologyTag(TagBase):
pass
class TechnologyTaggedItem(GenericTaggedItemBase):
tag = models.ForeignKey(TechnologyTag, related_name="%(app_label)s_%(class)s_techtag_items")

class ConceptTag(TagBase):
pass
class ConceptTaggedItem(GenericTaggedItemBase):
tag = models.ForeignKey(ConceptTag, related_name="%(app_label)s_%(class)s_concepttag_items")

so, following the same CamelCase notion I added:

class DataTag(TagBase):
pass
class DataTaggedItem(GenericTaggedItemBase):
tag = models.ForeignKey(DataTag, related_name="%(app_label)s_%(class)s_datatag_items")

class SkillTag(TagBase):
pass
class SkillTaggedItem(GenericTaggedItemBase):
tag = models.ForeignKey(SkillTag, related_name="%(app_label)s_%(class)s_skilltag_items")

Next came migration, as the database needs to have everything defined before items get put in, and we had updated the database here.

To migrate the database to the newest version that includes both of the new tags, I activated my virtual environment, then ran:

python manage.py schemamigration --auto source.tags

from the root folder, where manage.py lives, which told it to migrate the app called source.tags.

I got:

+ Added model tags.SkillTaggedItem
+ Added model tags.DataTaggedItem
+ Added model tags.DataTag
+ Added model tags.SkillTag
Created 0002_auto__add_skilltaggeditem__add_datataggeditem__add_datatag__add_skillt.py. You can now apply this migration with: ./manage.py migrate source.tags

...which let me know that the migration for the database schema had been successfully created.

I added the new file ( 0002_auto__add_skilltaggeditem__add_datataggeditem__add_datatag__add_skillt.py ) to my git repo, too, but decided to wait before committing it.

Next, as mentioned above, I migrated the database to make it up to date with the newest modifications, with:

python manage.py migrate

which gave me:

Running migrations for tags:
- Migrating forwards to 0002_auto__add_skilltaggeditem__add_datataggeditem__add_datatag__add_skillt.
tags:0002_auto__add_skilltaggeditem__add_datataggeditem__add_datatag__add_skillt
- Loading initial data for tags.
Installed 0 object(s) from 0 fixture(s)

which told me that the database is up to date. Next came some Django learning:

Django enforces a design pattern (a good solution to a common problem) which is called MVC, Model View Controller, which is about how to structure your code in such a way that it doesn't get messy and problematic when you change a few things. The idea is that you have the database stuff managed by one part (the model), computations and preparations by another (controller), and then user interface to show the results by the third (the view)

But, in Django specifically, other terms for the same design pattern are used; instead of MVC, it becomes MTV; Model, Template, View, where View in Django is Controller in MVC and Template in Django is the View in MVC.

What we've done so far as the 'model' part of the pattern, so next came the 'View'/ Controller part, and we started with the admin interface.

This happens in a file called admin.py, so in source/tags/admin.py, I found:

from .models import TechnologyTag, TechnologyTaggedItem, ConceptTag, ConceptTaggedItem

which is where the models are imported.

I added:

DataTag, DataTaggedItem, SkillTag, SkillTaggedItem

to import the new models that I'd created, and then I looked at how classes were created in admin.py. Here's an example:

class TechnologyTaggedItemInline(admin.StackedInline):
model = TechnologyTaggedItem

class TechnologyTagAdmin(admin.ModelAdmin):
list_display = ['name']
inlines = [
TechnologyTaggedItemInline
]

So following the same pattern, I added:

class DataTaggedItemInline(admin.StackedInline):
model = DataTaggedItem

class DataTagAdmin(admin.ModelAdmin):
list_display = ['name']
inlines = [
DataTaggedItemInline
]

class SkillTaggedItemInline(admin.StackedInline):
model = SkillTaggedItem

class SkillTagAdmin(admin.ModelAdmin):
list_display = ['name']
inlines = [
SkillTaggedItemInline
]

and at the bottom of admin.py, also added the new tags in there:

admin.site.register(DataTag, DataTagAdmin)
admin.site.register(SkillTag, SkillTagAdmin)

and started up my server, to see that the new categories of tags were now added to the main admin interface!

But, although they now appeared in the main admin interface, they didn't yet appear in the 'Add new code' section; so, I couldn't add the tags to new 'tools' or 'code' that was being added to the site.

To do this, I opened up the code models, in source/code/models.py, which has two classes defined: LiveCodeManager and another one called Code. The relevant one here is Code, and the class defines some attributes, which is what I wanted to add more of.

So taking 'Data Source Tags' as an example, I added:

data_tags = TaggableManager(verbose_name='Data Source Tags', help_text='A comma-separated list of tags listing data sources', through=DataTaggedItem, blank=True)

By doing this, I created an attribute which followed the rules of 'TaggableManager' which, judging from the name, manages the tags.

So the way tags are probably managed here is that there is one collection (table) of code objects, and another collection of tag objects; a code object can have many tag objects, and each tag object can be assigned to many code objects, ie. a many-many relationship. The way that many to many is managed in SQL databases is via a table (collection) that connects them; each row in that table will have an identifier to the code and another identifier to the tag.

So, imagining a spreadsheet where each column is a field, it becomes impossible to add a random amount of tags (unless you have some weird delimiter inside the field) which is why they move it to another table, then instead of adding more columns and extending horizontally, they add more rows and extend vertically. The 'through' item mentioned above ( through=DataTaggedItem ) is a way of defining what in the table extends vertically.

But in order to get the classes of DataTaggedItem and SkillTaggedItem, which were created in tags/model.py, we have to import them here.

So, in source/code/model.py, we added the new Items to the line:

from source.tags.models import TechnologyTaggedItem, ConceptTaggedItem, DataTaggedItem, SkillTaggedItem

to tell python where the classes/tables live.

Then, I migrated the new database; but, the View/Controllers part wasn't yet updated, which meant that although the new tag categories appeared on the main admin interface, they weren't in the 'admin' part of the 'code' section.

So, in source/code/admin.py I added the new fields to 'fieldsets':

search_fields = ('name', 'description',)
fieldsets = (
('', {'fields': (('name', 'slug'), ('is_live', 'is_active', 'seeking_contributors'), 'url', 'source_code', 'documentation', 'tags', 'technology_tags', 'concept_tags', 'data_tags', 'skill_tags', 'screenshot', 'description', ('repo_last_push', 'repo_forks', 'repo_watchers'), 'repo_master_branch', 'repo_description', 'summary',)}),

which defines what we see on our admin page.

Then, I added:

data_tags_list = form.cleaned_data['data_tags']
skill_tags_list = form.cleaned_data['skill_tags']
merged_tags = technology_tags_list + concept_tags_list + data_tags_list + skill_tags_list
if merged_tags:

to line 40, underneath:

technology_tags_list = form.cleaned_data['technology_tags']
concept_tags_list = form.cleaned_data['concept_tags']

which describes what happens when we save tags in the admin interface,

Then, I added the new tag fields, to update the looks for these fields here in the controller (which, I'm informed, is bad practice– it should be updated in the template, rather than this function)

if db_field.name in ['url','source_code','documentation','tags','technology_tags','concept_tags','data_tags','skill_tags']:
field.widget.attrs['style'] = 'width: 45em;'

So, with that all done, I ran the server again; and the new tag fields now appear in both the main admin interface, and in the 'Code' admin interface, meaning I can add new tools (code) and tag them under 4 different categories.  

Read Post

Over the past couple of weeks, I've been focusing my efforts at work on the online presence of my project, the Open Development Toolkit. I put up a holding page there at the start of the year, which runs on Jekyll and was forked from another site; I kind of love the site (you'll understand when you click the 'on' button in the top left hand corner), but it doesn't do everything I needed to do.

So, with the help of my lovely tech mentor Tryggvi, I began (and am still in) the process of restructuring things.

Firstly, to work out what I needed from the site, I wrote some user stories, thinking about the people who would be accessing the site, what they wanted to do, why they wanted to do it. I prioritised them in terms of the most important users down to the least important users, and tried to limit myself to just 6 different users, most of which have more than one story. From these, we worked out what feature they would need on the site to be able to do what they wanted to; it turns out that a few of them brought up the same feature, which was really helpful to see.

A couple of examples:

User: Journalist in aid-recipient country

I want to: find a tool to help them understand what projects the World Bank is running in their country

So that I can...investigate the relationship between the World Bank and my government

Feature: tools search function (tag: donor organisation)

Or...

User: Civil society activist/newcomer to accessing aid data

I want to: find a tool to help me understand aid flows to their country, + accompanying training materials to work through alongside

So that I can... have some support while beginning to explore the theme of aid data

Feature: tools and accompanying training materials presented together

One of the most important features was being able to clearly see, and filter through, different tools on the site, as well as having a clear online community around the toolkit which allows people to see who is out there, what they're working on, and what they've contributed to. Another was being able to link between tools and training materials in an easy way, to make it as easy as possible for users to find the resources they needed on a thematic basis.

Now, I've been assured that basically all of the features that I needed are entirely possible to create in Jekyll, the framework that I've been using so far; but I have fairly limited time, and I'm such a newbie that I imagine it would take a long time to set all of these things up! (though, I imagine, be a lot of fun.)

So, I started looking for sites which already do lots of the things I want my site to do, and one which came up pretty quickly is Source, from OpenNews. It's a community site, aiming to

amplify the impact of journalism code and the community of developers, designers, journalists, and editors who make it. 

It acts as a hub around journalism code, and seemed from first glances to do everything that I wanted the new Toolkit site to do.

To check, though, I went through my list of user stories and marked how the Source site would fulfil those requirements. I marked the ones that could be easily ticked off with the site 'as is' in green, those which would require some modification in yellow, and those which couldn't be met in red. Luckily, there were no red rows among my user stories! And the yellow ones were reasonably simple modifications.

So, having checked that, the next step was to install a local version of the site, for me to have a play with. I was really lucky to be introduced to the team behind Source at this stage, who were super kind and offered their help in anything I needed to get the site set up. It's been great having that as a back up when I've had questions, and the whole team have been really responsive and generous with their time; a brilliant example of the joys of the 'open' community. 

But to start with, I looked at Source on Github. Luckily for me, there's a pretty comprehensive 'Readme' section with installation instructions. Given my newbie status though, there were still a few things that I needed to install myself, or look up to understand fully. I'd also never used Python or Django before, so came across some pretty basic stuff for the first time. 

I started with the instructions as they read on the readme; I'd never used the command

pip-install

before, so first I had to install that, and I followed the instructions here. I already had the other dependencies from having Homebrew installed previously.

I ran

pip-install funfactory

(what a lovely name!)

and then I used these instructions on forking the repo from Github's help section.

Then, I learned about what a virtual environment was here, and how to set it up for the first time, by running

pip install virtualenvwrapper

and activated it:

source venv/bin/activate

and changed directory into /code/source, which is where I'd saved the forked directory, before following the last step:

git submodule update --init --recursive

and getting all of the development requirements,

pip install -r requirements/dev.txt

Then, I carried on with the 'Configuration' instructions. I created my own 'HMAC_KEY' and SECRET_KEY in the file /source/source/settings/local.py (and was assured they could be as silly as I liked)

and I added:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'source_app.db',
},

to the same file.

I kept running into errors though, and then realised that I didn't have MySQL, which I had assumed would be there from Homebrew. So, I followed this good advice and ran:

$ brew install mysql

And then, once I had definitely got all the dependencies, I synced:

python manage.py syncdb

and migrated articles, code and people as in the Readme.

I couldn't get the test-articles set up, but I ran 

python manage.py runserver

anyway, and, to my delight, saw my own local version of it running at  http://localhost:8000/

It was so satisfying! I've no idea how recently other people had tried going through those steps, but I filed an issue about the test articles to let them know, and got a very prompt response, saying the test articles need to be updated. 

Ta-da. And that was that. Next has been learning how to customise it, and diving more into Python and Django... coming in another blog post.

Read Post

When we talk about “open government”, it’s common to also hear talk of transparency and accountability alongside. At its simplest, a government being transparent and open about their actions is a necessary step for citizens to know what is happening in their country, and to understand what decisions are being made on their behalf. Having access to this information is also a necessary step for citizens to be able to hold government accountable for their actions, and citizens being able to take action through legal and official means when they feel a government has taken irresponsible actions is a crucial step in this chain.

So- what about in “open aid” or “open development”? One major focus of transparency in aid has been ensuring that aid projects are carried out in the most effective and efficient way; without wasting money, either through inefficient service delivery or corruption, or other means. Here, the chain of accountability that is addressed goes directly from the donor agency (eg. the UK’s Department for International Development, DFID) to their citizens (ie. UK citizens). In the case of large multilateral donors, the accountability mechanisms are perhaps more complicated, but still present.

This move towards transparency and accountablity within international development is, of course, a great development; but what about accountability to the people who are affected by aid projects? Those whose lives are completely changed by aid projects, and those who are most at need; if their lives are negatively affected by (whether intentionally or unintentionally) aid projects, where do they turn?

Read Post

I recently came across Alice Bell's rather wonderful piece, “How to tell a white person they are being racist.” Despite being written, as she states clearly, “by a white person, largely aimed at white people”, I found a lot of the points mentioned very pertinent. But in practice (for me at least) calling out racism and prejudice in general is pretty tricky, and as I realised recently, one main reason is that I'm very rarely 100% certain what particular prejudice the person is displaying at the time.

Admittedly, some displays of bigotry are pretty simple to diagnose; the employee at an airport who helpfully directed me away from the EU/UK citizen queue towards the queue for foreign nationals, for example – bingo, racial profiling.

But, say, the lawyer who upon meeting me, put a 20 euro note in my hand instead of shaking it and told me to get him a coffee and an avocado sandwich “pronto”; what was it about me that made him think it was okay to do that? Was it my gender, skin colour, age, perceived inexperience, or did I happen to evoke some other type of prejudice in him?

Because if I take the decision to call out behaviour like that when it happens to me, the main trait I don't want to display is insecurity; I want to be entirely sure that what I'm saying is correct, and I want to say it with the most confidence and self-assurance I can conjure up. That alone can be difficult; so as you can imagine, a response along the lines of:

“No, I won't get you a sandwich; your behaviour is completely unsuitable, and you're being racist...or, sexist. Or maybe ageist? You're being prejudiced, in some way...”

doesn't quite have the desired kick to it. So, I don't say anything.

Being able to name exactly what it is that I find offensive about the behaviour in question also feels like it helps my case; it makes it harder to deny or to dodge, and as I've mentioned before, for me, putting a label on a type of behaviour makes it somewhat easier to discuss. Perhaps naively, I also imagine that being more specific also helps the culprit to identify the precise point within their thinking process that led to that incorrect and ignorant assumption being made.

For me, being able to suggest a concrete way that they can prevent repeats of this behaviour in the future lends a direction to the conversation, or at least my intervention: “Don't judge people by their skin colour” for example. It's a a concrete takeaway, and it's something that, ideally, they can remember upon meeting people of colour in the future.

But “don't be prejudiced”...? What good can come out of such a general accusation, apart from a similarly general denial? And, as it's normally coming at a time when I'm struggling to be taken seriously by them, I really, really want to sound as eloquent as I possibly can be in order to debunk their assumption.

And, worst of it all, within all this comes the conscious annoyance at myself that I'm even worrying about this; as Bell points out in her article, the responsibility of calling out prejudice shouldn't ever lie upon the marginalised group in question, and as she quotes battymamzelle:

“it's incredibly inappropriate to demand that a marginalized group restructure a conversation to make things more “comfortable”; for the very people they are mobilizing against. That is the very definition of flexing one's privilege.”

And yet here I am, worrying far more than I should, about how exactly that conversation could or should or might go. So maybe I should just simply call it out irrespective of my being able to identify what exactly the prejudice being displayed actually is (actually, it might even be a mixture of multiple prejudices- lucky me!) – and just say how unsuitable and offensive I find their behaviour, and walk away. And leave them to deal with how to interpret that information, and what to do about it. 

Quite simply; it’s not my problem.

But you, dear reader; it very well could be yours. Sure, the victim identifying and calling out prejudice is a good first step; but those next steps of helping the culprit through working out how and why they have that prejudice, and what to do about it, is definitely not the victim's problem.

This is where Bell's article of advice to white people on how to tell a white person they are being racist (or prejudiced, or anything like that) comes into play. Simply being conscious and self-aware that you, yourself, are not committing those same ignorant acts is not enough – for this prejudice to stop happening, you need to play an active part in the solution.

The fact that you can ignore prejudice being displayed around you is a huge part of your privilege. Consider yourselves incredibly lucky that you can do so, and if you have any desire to use that privilege to help marginalised groups around you, step up and work with those groups to identify and educate prejudiced people around you.

Read Post

Summary: I'm on the hunt for examples of feminism and gender equality from the majority world, AKA low-income countries. I'm collecting them in this custom timeline, and tagging the stories with #mwfem. Join me! 

At the end of last year, I wrote about how, to my annoyance, most of the end of year 'feminist roundups' covered only achievements happening in the US, or in Europe. To counter this, I did my own round up of examples of feminism that happened in the 'majority world' in 2013- a term referring to what's also known as the developing world, or low-income countries, which also serves as a good reminder that the majority of people in the world live in these conditions. 

While I was doing this research, I found it harder than I had thought to come across these events. This is an excuse often used by, for example, men organising conferences with a poor showing of women speakers - “I looked, but I couldn't find any!”; - and I hate that excuse. You're looking in the wrong places, or looking in the wrong way. So instead of searching for (clearly geographically focused) hashtags related to feminism campaigns that I had come across (#fem2, #twitterfeminism, for example) - I looked for activities related to gender equality, or 'strong women', or other ways of describing what I was looking for, and in different languages, too. 

This was a lot more fruitful, but still, unsurprisingly, difficult. While the majority of the world is living in conditions of poverty, the majority of the internet is clearly not.

So, since the beginning of 2014, I've been keeping a 'custom Twitter timeline' of Majority World feminism: tweets that I've come across that relate to brilliant activities on gender equality in the majority world. I'm entirely sure that I've missed so many great activities (and all this in the certain knowledge that the majority of shows of strength and inspiration by women across the world don't make it on to the internet) but that said, there's some interesting stuff in there.

I've also made a conscious effort to try focus my online habits to material that is written by people who have different perspectives in life to me, from the majority world (ie. outside of the US + Europe). In practice, this has meant looking up international news stories in the local or national news outlets of the countries where this is happening to read (in theory) the perspective of someone who knows the culture and the country, and following people on Twitter who are based in other countries, living in different situations to me, with very different priorities and interests.

While, of course, this is nowhere near as good as being able to spend time, or visit, these countries, cultures and people, I'm learning a lot. It's one of my favourite things about Twitter; while it's a good way of keeping up to speed with topics I work on or I'm interested in, from experts in the field, it's also an incredible way of getting insights from people who have been left out of 'mainstream' media, or who are experiencing things that I don't come across in my everyday life. 

Finding out what is important to people from a wide range of backgrounds is, for me, a great way of getting perspective on what's important to me, in literally real time. Curating the examples that I come across online of women doing amazing things under the most difficult of circumstances into this custom timeline is another way of getting that perspective. 

It surprised me how much I've had to think about my habits in doing this, and how clearly geographically, and topically, focused I've been in my choices. I realised I had been focusing on material from institutions or outlets based in the UK, the US, or most likely somewhere in Europe; articles written by well-renowned experts or people with established online profiles; links tweeted by people I'd met, or whose work I'd come across (through one of the above sources, most likely), or people who had been recommended to me (eg. I'd seen online interactions between) - others I already knew. These methods were excluding so many perspectives from 'my' internet.

Now, I'm learning an incredible amount from people I've never met, about things I've never heard of, and coming across all sorts of interesting, and important, perspectives. I have a long way to go in changing my habits, (and suggestion of how to do this more are so welcome) and a whole lot more to learn, but it's been so much fun; thank you, internet! 

(If there are topics or tweets you think I should add to the custom Majority World Feminism timeline, tweet me @zararah. Thank you!) 

Read Post

image

“I'm not racist but...”

began a conversation between myself and a German man last Sunday, while at an afternoon brunch party with a mixture of people I knew and people I didn't, all of them white.

He was of the opinion that people of colour couldn't be “British” or “English”, and that this was an title reserved only for white people. I was of the opinion that he was being bigoted and racist, and I proceeded to tell him so, getting more and more worked up as he revealed increasingly racist views.

After 10 minutes of our 'discussion', during which I had asked him to define racism, used this to explain why his views were racist, and realised that he actually genuinely thought of me as having fewer rights than himself and his white friends based purely on my skin colour, nobody else at the party had joined our conversation.

The funny thing was, though, that I know that a lot of the people at that party would consider themselves politically engaged, liberal and open minded people. I would even wager that if there were a politician voicing the same views as the man at the party, or a policy about to be passed along the lines of what he was saying, they would do what they could to stand up against this prejudice, be that by signing a petition, voting, or attending a protest.

But in this case – when the social pressures of being at a party were apparently first and foremost at play – they were simply embarrassed at the perceived tense attitude that had been created, and unwilling to challenge him. They were feeling uncomfortable at the situation, and tried to steer the conversation into less polemic ground.

When I left the party soon after with a couple of friends, I discovered that they too had been shocked by the opinions voiced. The difference was, though, that they felt like it hadn't been their place to say anything, that they didn't want to make the other guests or the host feel uncomfortable, and that they didn't really know what to say. This lack of willingness to challenge something they knew to be wrong shocked and hurt me.

I sometimes use the metaphor that someone being overtly and offensively racist to me feels a bit like I've experienced physical violence; when someone treats me like a lesser human being than my white counterparts, it really does feel like being punched in the face. I'm shaking afterwards, often almost unable to speak, and feel overwhelmingly exhausted.

What I tried to explain to them is: you shouldn't have to be the one being punched in the face to do something about it.

They, as white people living in Germany, had never been on the wrong side of racism, and consequently had never experienced that biting, intensely personal rage that I feel when someone treats me, or other people of colour, in a discriminatory way. As far as I'm concerned, never having experienced it personally makes no difference to whether you can challenge discrimination or not; consider yourself incredibly lucky that you haven't been put in that position, and use your voice to stand up for those who are, at every occasion that you can. As a woman of colour, it is not my responsibility to shoulder the burden of challenging sexism and racism and xenophobia and god knows what other kinds of discrimination I might face, on my own.

Prejudice manifests itself in all sorts of ways, through offensive policies affecting the lives of millions, through exclusion or discrimination on an institutional level, and, in this case, through one man, voicing his bigoted views at a party. All of these examples are dangerous and discriminatory, and all of these people need to be held to account.

Just because you happen to be a white person, or cis-gender, or a man, or any kind of arbitrary categorisation that bafflingly means you might not face a certain type of prejudice yourself does not mean you can switch your 'good citizen' or 'social responsibility' buttons on and off dependent upon the social situation you find yourself in. I've faced prejudice in all kinds of situations and, believe it or not, the environment in which it happens doesn't make it hurt any less.

I don't get to choose where I come across these offensive and bigoted people; why should you get to choose where you challenge it? 

Read Post

I recently started learning how to code, and increasingly, I've been noticing the similarities and differences in the skills I'm developing now and those I developed at university, while studying languages.

“I'm not coding, I'm just copying and pasting” is the answer that came up when someone asked me how good my technical skills were last week. At the time I believed it, too: I was simply looking for what I wanted to make, finding the code behind it, and copying it and pasting it into the appropriate place. I wasn't creating anything new myself, but rather using the building blocks that others had already created.

But isn't that exactly what happens with spoken languages? With first language acquisition, children learn by repetition; they hear things being said around them, and repeat them. In a way, this is the oral version of 'copying and pasting'; and when children do this, we consider it to be 'speaking.'

One aspect I found difficult when starting my foray into coding was (and, this might sound incredibly obvious to those of you who can code!) not being able to recognise what language it was purely from looking at my screen. To me, it all looked the same; black screen, coloured text, incomprehensible words and symbols. Without checking what file I was in from the name or the file type, I didn't know what I was looking at, and of course the rules and the language used differs dependent upon this. I've often tried to insert a line I've seen elsewhere into a file type that doesn't recognise that language, before realising I'm 'speaking' the wrong one. This mistake reminds me of my 3 year old niece and nephew who are learning both French and English and sometimes mix up the languages within the same sentence or phrase.

It's interesting to me that the mistakes I'm making in learning to code are largely similar to first language (L1) acquisition (what babies/children do) as opposed to second language (L2) acquisition as an adult. With L2 acquisition, the mistakes can often come from, for example, falling back on L1 rules to supplement missing knowledge in the new, second language. With coding, this (for me!) is not possible. It makes sense, though, as I am learning my first coding language – although in linguistics, we learn that due to varying social, cultural and physiological developments between children and adults, the mistakes you make as a child will not be replicated as an adult. Me learning how to code seems to be proving this wrong!

Recognising patterns amongst what you're seeing, or hearing, is another common thread; realising that you can break them up into smaller blocks to perform another function is incredibly liberating, on both the coding and the speaking front. Anyone who studied spoken languages at school or university will undoubtedly remember being given a list of set phrases to use in essays, and inevitably these phrases, originally learned by rote, were broken up and used in different ways when it came to exams. So, when I was shown this Global CSS settings list for Bootstrap, it felt wonderfully familiar as the coding equivalent of this list of set phrases.

While there are other similarities between the various learning techniques, there are also some key differences. I've learned spoken languages in a variety of ways; intensive 8 hours a week of grammar for 2 years (bringing me to a basic level of Arabic); French, in small chunks since the age of 11, in France and at university; Spanish, intensively throughout 3 years and a stint in Spain, and German, exclusively by speaking and listening. The outputs of these methods have been varying in terms of the skills they've given me, but in all cases I've happily ended up with the desired skills, through what I believe to be the quickest route there.

Because of this experience, the main piece of advice I give to people wanting to learn languages is to first understand your motivation, and then choose your learning technique from there.

For example, wanting to speak German and be able to take part in conversations, but not being concerned about having good grammar, meant that speaking and listening to people and podcasts was a good technique, while wanting to learn how to read and write formal Arabic lent itself to intensive grammar lessons. So, what are my motivations with learning how to code?

I want to understand the world better.

I know that I don't yet fully understand what is possible with programming, and I see on a daily basis exciting projects and examples of programming being used to create things that astonish me. I love the idea of being able to communicate complex ideas to people in a way that they can really easily understand, or being able to help people who haven't (yet) been able to get their voices heard by decision-makers to have a say in how their world works.

So, my motivations in learning to code are complicated, and mixed, and, actually, fairly political. Clearly, this is where my stellar advice falls flat on its face; there's no learning technique here that will help me reach my goal quicker than any other.  

There is a key difference between learning a programming language, and learning a spoken language. A desire for communication seems to be the major driving force in learning any language. Whether you want to be on the receiving end of new types of communication (read books in a different language, or watch films), or whether you want to share your knowledge with others (speaking to new people, or writing for a new audience).

The crucial difference here though, is that with spoken languages, you can only communicate with someone who also knows that language. With programming languages, you can communicate with anybody. They can interact with the product of your coding without needing any understanding of how it was made; even if offline or away from a traditional computer, you can create or build things that can change people's perceptions and understandings of the world. 

And this is what I find wonderful, and beautiful, and slightly mystical, about coding.  

Read Post

Over the past couple of years I've heard and read numerous media items about the internet and its effect on linking our previously disconnected societies, on networks and their effect on our relationships, and on cyberpolitics and culture. Sadly, many of them have left me incredibly frustrated, and here's why.

I've noticed what I think might be a pattern and here is my (obviously, generalised) hypothesis: when the speaker or author is from the US or Europe, they present information as though what they're saying is applicable throughout the whole world, while actually only talking about the issue with regards to 'Western' countries. They use examples primarily from the US or Europe itself, occasionally mentioning massive events in passing like the Arab Spring, but overwhelmingly considering only points that have affected people in high-income countries such as their own.

This has been annoying me greatly in other spheres too; as I've written about before, using public platforms to discuss issues under such a narrow lens, while presenting them as though they are they are true everywhere in the world is incredibly reductive and offensive, not to mention purely factually incorrect on many levels. It was frustrating me so much that at the last talk I attended where I noticed this phenomenon, I asked the speakers whether they truly considered the issues they were discussing to be 'global' as they kept mentioning, and if so, if they could come up with some examples from outside the US and Europe, as they had all been thus far in the presentation.

Their answer: that they did consider it to be as global as they were describing, but then couldn't come up with any examples. One said it was in part due to not wanting to misappropriate others experiences, but then admitted that she didn't have experience in other cultures outside the US and Europe. This combination of answers felt unsatisfactory, to say the least. I felt like asking – but didn't – then, why use phrases like “across the world” or “globally” etc, when what you really mean is “In high-income countries like the US....”. Either way, I hope my comments made them think, if even just a little.

But then, came a book which has, happily, has restored a lot of my faith in privileged researchers and internet commentators, and makes me throw that hypothesis out of the window – “Now I know who my comrades are”, by Emily Parker. The book, which is subtitled Voices from the Internet Underground, takes a deep dive into online and offline politics and activism in three very different countries; Cuba, China and Russia. I came across it originally through an article by Mario Vargas Llosa ([en], [es]) which was already high praise, as he is one of my favourite authors.

In the book, Parker looks at how the internet has helped activists in the three different countries organise themselves and build movements, despite facing huge offline political barriers, with some only becoming activists almost by coincidence due to their online activities. What impressed me the most about the book is the author's clear and extensive experience with the three cultures in question. She didn't just parachute in there for a couple of months each to write a chapter on some activists – she lived in each of the countries (some, multiple times over), speaks the languages and really built up relationships with people there, over a period of multiple years. It's also impossible to imagine how she could have carried out such research without being caught out by the authorities without a deep understanding of how each of the cultures work.

This is, I feel, what has been missing in the work by many other internet commentators: a genuine understanding of the offline culture in the countries they're talking about, and an appreciation for how the offline society and politics affects the way people use the internet. Even on a practical level, Parker talks of “the Russian internet”, or “the Chinese internet”, making it clear that these “internets” are very different to those in other countries. Primarily, of course, due to censorship – but also in terms of most popular sites, ways that people share information, and ways that they access the internet.

I really wish that other prominent internet commentators would make the time and effort that Emily Parker has done to actually visit and learn about other cultures before making sweeping statements; yes, the internet can connect us across offline borders, but in order to really understand online behaviour, it is crucial to recognise the importance of diverse cultures and societies on people's behaviour.

The overwhelming message from the book is that the internet has allowed previously separate or disconnected people to know that there are others out there – to find out who their comrades are. The actions that people have taken as next steps (both online and offline), however, has been vastly different depending on their cultural background and their political situation. I thoroughly appreciated Parker's emphasis on the contrasts between the activists' online actions; finally, proof, research and a well-written book to back up my frustrations of 'the internet' being overwhelmingly talked about as a holistic, homogenous entity!

* If there are other books out there really analysing how diverse societies and cultures have affected online behaviour, I'd love to have recommendations of what to read next!

Read Post

A good friend of mine recently asked me for some motivational help on getting started blogging. With the best of intentions, I kicked things off by giving her a deadline for her first blog post, coupled with the ultimatum of having to pay a few euros each time she didn't meet her deadlines. This, I realise in retrospect, perhaps wasn't the most encouraging thing to do; clearly she knew that the task in hand involved writing a first post, and really, imposing ultimatums is anything but supportive in the first instance.

So, I've been thinking of other ways to encourage her into blogging. I personally use writing as a way to get things off my chest, and in all honesty, I'm torn between embarrassment and incredulity when someone tells me they read (or, shock horror, enjoyed!) something I've written on my personal blog. In a way, telling myself that actually nobody (apart from maybe my mum- hi mum!) will read it is almost a motivation for me in publishing. Funnily enough, however, writing without publishing doesn't have the same cathartic effect for me – perhaps it's simply a narcissistic flaw, or the loosely held hope that perhaps sharing my experiences will in some way have a positive effect on others.

I did a quick search to see what other resources might be already out there on this topic, but unfortunately most of them seemed concentrated purely on building up a public profile through your blogging – this is definitely not what I'm talking about! In this case, I'm thinking only about writing because you want to write, for whatever reason – writing for you, not writing to make money, or to build up an audience, or for anybody else.

Here are some initial activities; perhaps aiming to do one of these weekly or fortnightly until you've exhausted the list might be a good place to start:

Note: this is assuming that you've got yourself a blog already set up. If not, head over to Wordpress or Tumblr, or if you're not sure which is for you, check out this post from Lifehacker on choosing the blogging platform for you.

  • Make a list of your favourite blogs, and set these up to feed into an RSS Reader – I use Feedly, but here are some alternatives – so that you have an easy way to read these on a regular basis.

  • Write 1-2 sentence descriptions of why you like them, and post this list on your site under, for example, 'Recommended Reads' or 'Stuff I like'. (This would be a static page, rather than a post)

  • Have a look through these blogs and see if they have any recommended blogs themselves, or if they refer to particular writers – keep an eye out for any names that keep cropping up, and be sure to add them to your RSS feed and your posted list.

  • Spend the first 5 minutes of your day for an entire week, looking around for things you find interesting on the internet – whether this be via social media, through asking friends, anything. Make a list of particularly interesting articles and posts that you find.

  • After a week of doing this, think about whether you could write a 'roundup' post listing these articles you've found interesting. Sound good? Just a couple of sentences summing them up, or on why you found them interesting is great.

  • Make a list of topics you've been thinking about writing about – they can be anything. From specific issues to broad topics that have been on your mind – just put them down in writing, with as much detail as you feel like at the time. Keep it somewhere easy to access so that when topics come up you can drop them in straight away.

  • Your blog posts don't have to be long, or even in words! What about a picture, cartoon, animation, GIF, or photo that has inspired you? Post it on your blog with a short caption of why it caught your eye.

  • Pick one of the topics on your list of things you've been writing about, and bring it up in conversation with a friend; if you want to dive deep into a topic, then maybe someone who already knows about that topic, and if you want a new perspective on it, pick someone who might never have heard about it. Okay, so it might be a little artificial bringing up a specified topic in conversation, but your friend will understand, I promise!

  • Did that conversation spark further issues around the topic in your mind? If you feel like you have enough material to write about it, then go for it! Aim for something short – 100 or 200 words, with an accompanying picture, for example. You can always expand on the topic later.

  • If you feel like you want to do more research around that topic before writing, then spend an hour looking up more on it. Create a specified RSS feed, for example, and look at what other people are saying on it. The aim: gathering food for thought for yourself.

  • Get into a rhythm; whether this be a Sunday night activity before you let yourself go to sleep, or an activity you do with friends (for example, as part of an Iron Blogger group)

  • Rinse and repeat; see what comes up in your head as potentially interesting topics; write the topic down as soon as it does; see what others are thinking about it; read around the topic; and aim to post something (anything – a picture, a quote, a cartoon) on a regular basis.

Is there anything else you would add to this list? How did you get started blogging, or how do you keep yourself motivated to carry on?

Read Post

The worst kind of creep is he who thinks of himself as a Good Man.

He who has dedicated his life to making the world a better place, but not in a self-righteous way; merely in a pragmatic, no-regrets, taking moral responsibility kind of way.

He who is highly renowned within his field, who has done brilliant work, and had some innovative and great ideas, which have had a positive effect on the lives of many.

He who has built up a professional and personal reputation as being tolerant and respectful of others.

He who has long-established relationships with other key members of the community; supportive, positive relationships, where he's proven his loyalty on numerous occasions, and always been there for them.

He who comes across, upon first, second or third meetings, as a fascinating man, with lots of valuable experience and a willingness to share this with others, for mutual benefit.

He who listens and sympathises with others relating tales of discrimination, harassment, or creepy people.

He who, if cases of his creepy tendencies were to come out, would plead misunderstanding, and publicly apologise profusely, all while remaining convinced that his actions were misinterpreted through zero fault of his own.

He who genuinely can't fathom the idea of himself being a creep.

He who does it again, and again, and again.

Read Post