Web Design Photography

Sometimes it is hard to come up with good imagery for web design purposes. Most of us web designers probably have spent already too much time on shutterstock.com and the like. The following should be a collection of resources and methods to get a break from the usual stock images.

– get yourself a camera
– http://www.gratisography.com/
– CSS gradients and color overlays
– CSS filters

Quito – What to do / Que hacer

Secret Garden Lodge close to Machachi, south of Quito, very close to the worlds highest (in a way) volcano Cotopaxi. It’s not currently possible to enter the Cotopaxi National Park because the volcano is currently active. I have been at Secret Garden Lodge myself as a volunteer for 2 months – it’s a marvelous place, so wild, and Katherine is a great cook. 🙂 http://secretgardencotopaxi.com/

The village of Zumbahua and the Quilotoa Loop (http://blacksheepinn.com/) – this is a classic, very much countryside, the bus ride to Chugchilán was CRAZY 😀

The thermal springs of Papallacta – you could even hike from the entrance of the Cayambe – Coca National Park to Papallacta: http://www.termaspapallacta.com/

Mindo: is in the Ecuadorian Cloud Forest, about 1.5 hours by bus from Quito. A bit on the touristy side but still lovely with a lot of untouched nature. This year I biked from Quito to Mindo, it’s a stunning 2000m drop in altitude, need a good bike with full suspension, though.

Rain Forrest / Amazonia: Tena is a bit quicker and not that deep in the jungle, if you really, really want to go into this green hell, then there is the Cuyabeno National Park or the Yasuní National Park (point of departure for both is the town of Coca). – The famous Galapagos islands are nice, but expensive and need time. If you decide to go there, then I would not book a boat tour but go by speed boat to Isla Isabela, the wildest island, all the funny animals are there as well 😀

For a quick mountain hike you have Quito’s own volcano Pichincha right in front of you, its 4800m high. There is a gondola going up to a base station (Teleferico), if you feel adventurous you can go to Lloa by bus (lovely village) and then hike from the backside up to Ruco Pichincha. As all of Quito is high (~3000m and up) all the hikes are a bit rough though with weather conditions changing quickly and trails not marked.

Coast: Don’t go to Guayaquil (sorry Guayaquileños!), it’s quite a busy trade city, pirates once, pirates now, haha! Nice spots on the Coast are Montanita (more for party) or Canoa. If you decide to travel down through Ecuador I would not recommend to take the Coast journey, the Andean journey is way more interesting.

Going to Bolivia by bus: We did it some time ago – stunning experience. You have to cross Peru first, though! 😀 If you decide to travel through Ecuador by bus the route is normally Quito, Cuenca. And then you could decide to go to Machala and then Tumbes to go into Peru (coastline). The Peruvian coast is very nice, and the bus ride to Lima is stunning! The bus service is also way better on the coast, and in Peru, it’s like flying.

Food you need to taste in Quito: Choclo con Queso Fresco, Humitas, all the crazy exotic fruit shakes and juices. Quiteños, help me complete this list!

Food you need to try on the Coast: It doesn’t matter, they have delicious seafood all over the place 😀 I recommend trying Peruvian ceviche (crude fish cooked in lemon juice) or the Cazuela de camarón con salsa de maní

Sexy Web Techs

Javascript Sexyness

Plugin for scroll animation based on Greensock, currently one of the best web animation frameworks out there (http://janpaepke.github.io/ScrollMagic/)

BigVideo handles full-screen background videos (http://dfcb.github.io/BigVideo.js/)

FullPage creates a slide-like web experience (http://alvarotrigo.com/fullPage/#firstPage)

jQuery Appear let’s you do stuff when an element becomes visible (https://github.com/bas2k/jquery.appear/)

HoverIntent only triggers an animation or an action when the mouse pointer slows down and stays on the target element (http://cherne.net/brian/resources/jquery.hoverIntent.html)

jQuery Isotope rearranges items based on the vertically available space (http://isotope.metafizzy.co/)

TouchSwipe can detect gestures in javascript on touchscreen devices such as tablets and smartphones (http://labs.rampinteractive.co.uk/touchSwipe/demos/index.html)

Toolbar.js makes nifty toolbars as tooltips for you (http://paulkinzett.github.io/toolbar/)

Waypoints.js is similar to jQuery Appear (http://imakewebthings.com/waypoints/)

DoubleTapToGo: A Responsive, touch-enabled menu solution (http://osvaldas.info/drop-down-navigation-responsive-and-touch-friendly)

SVG Sexyness

SVGO optimises svg code to be included into a web page: https://web-design-weekly.com/2014/10/22/optimizing-svg-web/

All Fontawesome as SVG: https://github.com/encharm/Font-Awesome-SVG-PNG/tree/master/black/svg

python3, virtualenv and django on mac os x homebrew

brew update
brew upgrade
brew install python3

pip3 install virtualenvwrapper

add the following to your ~/.bash_profile:

export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Projects
export VIRTUALENVWRAPPER_PYTHON='/usr/local/bin/python3'
source /usr/local/bin/virtualenvwrapper.sh

Then create and activate the virtual environment:

git clone git@github.com:your-user-name/your-project.git
# or just git pull
cd /projects/your_project
mkvirtualenv your_project --python=/usr/local/bin/python3
workon your_project

You can add this to ~/.virtualenvs/your-project/bin/postactivate  so the env vars get imported to the command line directly from .envs:

#!/bin/bash
# This hook is sourced after this virtualenv is activated.

if [ -f ${PWD}/.env ]; then
    echo "activating .env..."
    set -a
    . ${PWD}/.env
    set +a
fi

In some projects there might be an .env-example file. Copy it to .env and update the sample values inside.

pip install -r requirements.txt
pip install -r requirements-dev.txt

# migrate the db
./manage.py migrate

Django Quick Deploy

The quickest way to deploy django from github

sudo su
ssh-keygen -t rsa -C "your_email@example.com"
apt-get install git
git clone git@github.com:<org>/<project>.git
apt-get install python python-dev python-pip screen
pip install -r requirements.txt
screen
./manage.py runserver 0.0.0.0:80
Ctrl+A-D

Python Django Production Deploy with Apache

  1. Create github repo and clone locally
  2. Add .gitignore
  3. create virtualenv (mkvirtualenv envname)
  4. Set the correct virtualenv in PyCharm
  5. create database & users
  6. Update database settings (see below)
  7. First commit
  8. Add site and app
  9. Second commit

Some basic stuff

sudo su
apt-get install joe apache2 git python-setuptools python-dev python3 libapache2-mod-wsgi-py3

ssh-keygen -t rsa -C "email@domain.com"
# add the public key to your github account

Install Postgresql

apt-get install postgresql-server-dev-9.1
apt-get install postgresql postgresql-client
su - postgres
psql
CREATE USER flashcards WITH PASSWORD 'xxxx';
CREATE DATABASE flashcards;
GRANT ALL PRIVILEGES ON DATABASE flashcards to flashcards;
\list
\du
\q
cd /var/www/your_project
git clone git@github.com:wbrp/your_project.git

Install virtualenv

pip install virtualenvwrapper
source /usr/local/bin/virtualenvwrapper.sh
mkvirtualenv -p /usr/bin/python3.4 venv
workon venv
pip install -r requirements.txt

settings.py:

DATABASES = {
 'default': {
 'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
 'NAME': 'mydb', # Or path to database file if using sqlite3.
 # The following settings are not used with sqlite3:
 'USER': 'myuser',
 'PASSWORD': 'password',
 'HOST': 'localhost', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
 'PORT': '', # Set to empty string for default.
 }
 }

Add to site/wsgi.py

# Activate your virtual env
activate_env=os.path.expanduser("/opt/virtual_env/flashcards/bin/activate_this.py")
execfile(activate_env, dict(__file__=activate_env))

Make WSGI work

cat > /etc/apache2/conf.d/wsgipythonpath.conf
WSGIPythonPath /opt/virtual_env/flashcards/bin/python

a2enconf /etc/apache2/conf.d/wsgipythonpath.conf
service apache2 reload

Make cert

openssl genrsa -des3 -out server.key 2048
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Add new VirtualHost

Google Spreadsheet Advanced Formulas

Pivot Tables

=query('demo-source'!A:Z;"select A,sum(C) group by A pivot B")

Sum all available lines for arbitrary number of colums per line:

=MMULT('sourcesheet'!B2:Z,TRANSPOSE(ARRAYFORMULA(COLUMN('sourcesheet'!B2:Z)^0)))

Solution Source

Query a source data range for values according to an arbitrary number of rows in the destination area:

=ARRAYFORMULA(MMULT(SIGN(<destination condition>=TRANSPOSE(<source condition>));<source data>)

Example:

=ARRAYFORMULA(MMULT(SIGN('Worksheet'!A2:A=TRANSPOSE('Source'!A2:A));'Source'!B2:D)

This is a pretty sick little piece of code – it allows you to match any type of data columns to an arbitrary list of things based on a unique key (like a sql join).
Solution Source

More powerful JOIN implementation for multiple conditions:

=arrayformula(if(len(A2:A)>0,sumif(‘other_sheet’!A:A&’other_sheet’!L:L, A2:A&“token“,‘other_sheet’!J:J),))

Explained:

  • =sumif can only accept one condition and =sumifs does not work with arrayformula
  • arrayformula is needed so that the JOIN works for dynamic lists (for example form another =query())
  • ‘other_sheet’!J:J is the column from which the values should be summed up
  • ‘other_sheet’!A:A is the column the first condition should be applied to
  • ‘other_sheet’!L:L is the column the second condition should be applied to
  • A2:A is the first condition (here it means that the cell value should equal to the corresponding value in A2:A)
  • “*token*” is the second condition (here it’s a kind of regular expression that finds the token in the cell content).
  • two or more columns as well as conditions can be concatenated according to https://productforums.google.com/forum/?#!msg/docs/OrriYjusT6k/2XSeq1FhH3oJ

Use: This is great if you have a dynamic list (for example coming from a query() and you want to match each row with a value from another table (in this example from ‘other_sheet’) based on multiple conditions. The first condition normally makes comparisons based on a unique key so that the matched rows never exceed one row.

Use =query() to filter rows of a sheet that are empty:

=query(source, "select * where A = "&char(34)&char(34)

Calculate remaining days in the current year or the current month:

=day(eomonth(today(),0))-day(today())

and

=date(year(today()),12,31)-today()

parse an european date:

=DATE(value(REGEXEXTRACT(D2,"^\d{2}\.\d{2}\.(\d{4})")),value(REGEXEXTRACT(D2,"^\d{2}\.(\d{2})")),value(REGEXEXTRACT(D2,"^(\d{2})\.")))