Je m’appelle Thibaut Assus, j’ai 30 ans, je suis freelance en développement web et ma technologie de prédilection est le Ruby on Rails. J’ai maintenant un peu d’expérience dans le domaine du freelancing et ce document a pour but de partager avec vous une partie de cette expérience.
# Install homebrew. | |
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)" | |
# Acquire compiled dependencies. | |
brew install python libxml2 mysql libmemcached openssl swig jpeg redis elasticsearch | |
# Start services. | |
mkdir -p ~/Library/LaunchAgents | |
ln -nfs /usr/local/Cellar/mysql/*/homebrew.mxcl.mysql.plist ~/Library/LaunchAgents/ | |
ln -nfs /usr/local/Cellar/redis/*/homebrew.mxcl.redis.plist ~/Library/LaunchAgents/ |
# -*- coding: utf-8 -*- | |
"""Add permissions for proxy model. | |
This is needed because of the bug https://code.djangoproject.com/ticket/11154 | |
in Django (as of 1.6, it's not fixed). | |
When a permission is created for a proxy model, it actually creates if for it's | |
base model app_label (eg: for "article" instead of "about", for the About proxy | |
model). |
Dear soon-to-be-former user, | |
We've got some fantastic news! Well, it's great news for us anyway. You, on | |
the other hand, are fucked. | |
We've just been acquired by: | |
'use strict'; | |
var pkg = require('./package.json'); | |
var gulp = require('gulp'); | |
var utils = require('gulp-util'); | |
var source = require('vinyl-source-stream'); | |
var isWatching = false; | |
var isProduction = process.env.NODE_ENV === 'production'; |
var casper = require('casper').create(); | |
var utils = require('utils'); | |
var phpMyAdminUrl = casper.cli.args[0]; | |
var phpMyAdminCredentials = { | |
pma_username: casper.cli.options.user, | |
pma_password: casper.cli.options.password | |
}; | |
if (!phpMyAdminUrl || !phpMyAdminCredentials.pma_username || !phpMyAdminCredentials.pma_password) { | |
casper.echo('Invalid parameters. Usage: casperjs monitor_slave.js http://example.com/phpMyAdmin --user=foo --password=bar'); |
import logging | |
l = logging.getLogger('django.db.backends') | |
l.setLevel(logging.DEBUG) | |
l.addHandler(logging.StreamHandler()) |
Créer des applications partagées pérennes qui peuvent être déployées à grande échelle.
Partagées
signifie que différents utilisateurs vont pouvoir interagir et "travailler" ensemble sur l'application
Grande échelle
, en 2013, signifie que des dizaines à des millions de personnes peuvent utiliser l'application. Une majorité de plateforme doit être accessibles (ordis de bureaux, portables, tablettes, téléphones mobiles) de préférence à moindre coût et donc sans avoir à tout refaire pour chaque appareil.
Vivant dans un monde régit par certaines lois physiques, il sera raisonnable de supposer que le réseau de communication est au pire ouvert. La sécurité de l'application ne devra pas supposer le contrôle du réseau, même dans si l'environnement de déploiement est considéré contrôlé.
Pérennes
signifie que l'arrivée de nouveaux appareils sur le marché ne remet pas en cause plus de 1% du temps de développement. Personne ne peut prévoir le futur ; il conviendra de garder un œil ouvert sur les ten
var casper = require("casper").create({ | |
//loadImages: false, | |
//logLevel: 'debug', | |
verbose: true | |
}); | |
var utils = require('utils'); | |
/* ----- test parameters ----- */ |
# Applies Q.nbind to all redis operations and returns a wrapped client | |
_ = require("underscore")._ | |
Q = require "q" | |
nbindOps = (client) -> | |
functions = _.functions client | |
# All the ops are available as upper/lowercase functions, I exploit this | |
# to filter out the Redis operations from the other functions of the client | |
# |