Klik hier niet!

Wie ben ik?

Wat kom ik vandaag zeggen?

Bookmarklets

De basis van bookmarklets

Bookmarklets: voorbeelden (1)

Readable++
Maak een pagina makkelijker om te lezen
Ga een niveau omhoog
javascript:void(location.pathname = (location.pathname + '').replace(/([^/]+\/?)$/, ''))
Test ↔ Prod
Ga van de testsite naar de productiesite en omgekeerd
javascript:(function () {
   var newHost;
   if (location.host.match(/(^|\.)example\.local$/)) {
      window.name = location.host;
      newHost = 'www.example.com';
   } else {
      newHost = window.name.match(/(^|\.)example\.local$/) ? window.name : 'example.local';
   }
   location = location.href.replace(location.host, newHost);
})()

Bookmarklets: voorbeelden (2)

Open de formulieren met GET en in een nieuwe tab
javascript:Array.prototype.slice.call(document.querySelectorAll('form:not([target="_blank"])')).forEach(
   function (f) {
      f.method = 'GET';
      f.target = '_blank';
   }
);

Bookmarklets: parameters (1)

Bookmarklets: parameters (2)

Bookmarklets: parameters (3)

Bookmarklets: voorbeelden met parameters (1)

html
javascript:(function () {
   var s = (<><![CDATA[%s]]></> + '') || getSelection() + '' || prompt('HTML:');
   location = 'data:text/html;charset=UTF-8,' + encodeURIComponent(s);
})();

Mogelijke gebruikswijzen:

  • html &rarr;
  • Voorbeeldcode selecteren → Cmd+L / Ctrl+Lhtml
  • html zonder selectie en zonder parameters: dialoogvenstertje
  • Variant: data:text/plain;charset=UTF-8 voor platte tekst; eventueel zonder encodeURIComponent om URL-encoding te ontcijferen

Bookmarklets: voorbeelden met parameters (2)

check
Valideer de huidige of de gegeven pagina:
javascript:(function () {
   var s = (<><![CDATA[%s]]></> + '') || getSelection() + '' || location;
   location = 'http://validator.w3.org/check?verbose=1;ss=1;outline=1;uri=' + encodeURIComponent(s);
   /* location = 'http://validator.nu/?doc=' + encodeURIComponent(s); */
})();
refer
Surf met deze pagina als referer:
javascript:(function () {
   var s = (<><![CDATA[%s]]></> + '') || getSelection() + '' || location;
   location = s;
})();
Bijvoorbeeld anti-hotlinkers: refer vanaf een toegelaten site en het lukt wel

Wanneer niet?

Leer meer

Bookmarklets door Jesse Ruderman
Verwijder de cookies die hier van toepassing zijn
DIY ☺
Want veel bookmarkletsites zijn verschrikkelijk gedateerd…
Userscripts.org: Power-ups for your browser
User scripts zijn zoals bookmarklets op doping, maar hebben hetzelfde doel (en vereisen Greasemonkey of ingebouwde ondersteuning)

+Q

Shell scripting

De basis van Bash

Basiscommando's

cd ~/Downloads
Ga naar de map Downloads in je gebruikersmap (~ is je home directory)
ls -lF
Toon een lijst van bestanden met 1 bestand per regel
cp -i / mv -i / rm -i
Kopieer/verplaats/verwijder (maar vraag bevestiging indien nodig)
cat test.txt
Toon de inhoud van test.txt
grep foo test.txt
Zoek foo in test.txt
egrep --color -R 'href="[^"]*login' templates/
Zoek de gegeven reguliere expressie in de map templates en al haar submappen
  • Tip: haal ack in huis: ack --html --php 'href="[^"]*login' templates/

Variabelen

x='bla bla bla'
Stel variabele x in op bla bla bla
echo "$x"
Toon variabele x
x="$(foo)"
Stel variabele x in op de uitvoer van het commando foo
x="${USER:0:3}"
Stel variabele x in op de eerste drie karakters van de variabele USER (bv. janmoesen geeft jan)
x="${x//a/o}"
Stel variabele x in op de variabele x met alle a's vervangen door o's (bv. faal geeft fool)
x="${SUDO_USER:-$USER}"
Stel variabele x in op de variabele SUDO_USER, en als die niet bestaat, op de variabele USER

Variabelen: voorbeelden

git log --author="$USER"
Toon alle Git commits die gemaakt zijn door de huidige gebruiker
today="$(date +'%Y%m%d')"; zip -qr ~/exports/"$today-$(basename "$PWD").zip" .
Gebruik de datum van vandaag (YYYYMMDD) om de huidige directory in een ZIP te steken

Structuur

if … then … fi / test / [ … ]
Wordt er aan een voorwaarde voldaan?
for x in … do … done
Loop over alle parameters en steek ze telkens in x
while … do … done
Loop zolang aan een bepaalde voorwaarde voldaan is
case … in … esac
Doe dingen op basis van een overeenkomst (zoals switch … case)

Structuur: voorbeelden

if [ -e '0wn3d.php' ]; then echo 'Time to clean up!'; fi;
Bestaat het bestand 0wn3d.php?
for x in *.jpg; do dir="${x:0:2}"; mkdir -p "$dir"; mv "$x" "$dir/"; done
Verplaats alle JPEG's naar een map die begint met de twee eerste letters van de bestandsnaam
push-all () { while [ $# -gt 0 ]; do git push "$1" HEAD; shift; done; }
Maak een functie die me toelaat om te typen: push-all origin staging testing qa

Combineren

foo | bar
Gebruik de uitvoer van foo als de invoer van bar
foo && bar
Voer bar uit als foo gelukt is
  • "gelukt" betekent: exit status 0
  • De exit status zit altijd in $?
foo || bar
Voer bar uit als foo mislukt is
foo &
Voer foo uit in de achtergrond
foo & bar & baz & wait
Voer foo, bar en baz tegelijkertijd uit wacht tot alles gedaan is

Combineren: voorbeelden (1)

find . -name '*.js' | sort -t / -k 3
Sorteer alle scripts in deze en onderliggende mappen volgens het derde deel van het pad:
./modules/animations/js/banner.js
./modules/animations/js/detail.js
./modules/channels/js/buy.js
./core/js/jquery/jquery.js
./core/js/utils.js
./cache/navigation/tinymce_link_list_en.js
whois nascom-bseen.be | grep -q '^Status:.*FREE' && echo 'KOOP DAT!'
  • Als nascom-bseen.be nog niet bestaat, bevat de uitvoer van whois de tekst Status: FREE
  • grep zal dan die tekst vinden en lukken, dus exit status 0 geven
  • Omdat grep gelukt is, zal de echo uitgevoerd worden

Combineren: voorbeelden (2)

wget -q my.example.be. || say 'EXAMPLE.BE IS OFFLINE!'
Als wget mijn site niet kan downloaden, waarschuwt mijn computer me
zip -qr foo.zip . &
Comprimeer deze hele map als foo.zip en laat me ondertussen verder werken
git push prod1 & git push prod2 & git push prod3 & wait; echo 'All done!'
Publiceer mijn site parallel op prod1, prod2 en prod3 en zeg het als het klaar is

Invoer en uitvoer

foo < x.txt
Gebruik x.txt als invoer (STDIN) voor foo
foo > x.log
Stuur de gewone uitvoer (STDOUT) van foo naar x.log
foo 2> /dev/null
Verberg de foutuitvoer (STDERR) van foo
foo &> x.log
Stuur alle uitvoer van foo naar x.log
foo <<< "$x"
Gebruik de waarde van variabele x als invoer voor foo
foo < <(ls -alF)
Gebruik de uitvoer van ls -alF als invoer voor foovergelijkbaar met ls -alF | foo

Invoer en uitvoer: voorbeelden (1)

ftp ftp://jan:test@ftp.example.be/ < publish.txt
Gebruik publish.txt als een script voor het FTP-programma:
ls
type binary
put latest-news.html
put archive.html
quit
Wat ftp betreft, heb je dat zelf "live" getypt.
php my-cron.php > a; svn update; php my-cron.php > b; diff -U4 a b
Vergelijk de uitvoer van my-cron.php voor en na een svn update
id vansevenant 2> /dev/null && echo "Here's Johnny…"
Controleer zonder zeuren of een gebruiker bestaat, en toon een eigen bericht indien ja

Invoer en uitvoer: voorbeelden (2)

wget -qO- http://tor.noreply.org/tor/status/all | awk '/^r/ { print $7; }' |\
sort -nu > ips.deny
Blokkeer binnenkomende Tor-gebruikers:
  • Download de lijst van Tor-nodes
  • Verwerk enkel regels die beginnen met r (d.w.z. exit nodes)
  • Sorteer dat resultaat numeriek en gooi de dubbels eruit
  • Sla het op in een bestand dat we gebruiken om spammers tegen te gaan
ssh prod1 mysqldump live_site | sed 's/UA-123/UA-000/g' | mysql local_site
Haal de productiedatabase over naar je lokale testsite:
  • Voer mysqldump uit op de productieserver via SSH
  • Gebruik sed om bv. de Google Analytics-ID te veranderen
  • Importeer dat resultaat lokaal met onze eigen mysql

Wachtwoorden

SSH keys opzetten

Geschiedenis (1)

Geschiedenis (2)

Opslaan

Geavanceerd voorbeeld: Chromium bijwerken

#!/bin/bash
latest_remote="$(curl --silent http://build.chromium.org/f/chromium/snapshots/chromium-rel-mac/LATEST)" || exit $?;
current_local="$(/usr/libexec/PlistBuddy -c 'print SVNRevision' /Applications/Chromium.app/Contents/Info.plist)" || exit $?;

if [ "$latest_remote" -gt "$current_local" ]; then
     src="http://build.chromium.org/f/chromium/snapshots/chromium-rel-mac/$latest_remote/chrome-mac.zip";
     dst="/Applications/Chromium.app";
     bak="/Applications/Chromium-$current_local.app";
     tmp="$(mktemp -d -t "$(basename "$src").XXX")";
     cd "$tmp" && \
     curl --silent --output chromium.zip "$src" && \
     unzip -qq chromium.zip && \
     mv "$dst" "$bak" && \
     mv chrome-mac/Chromium.app /Applications && \
     rm -rf "$tmp" "$bak";
fi;

Geavanceerd voorbeeld: backup

backup () {(
   # Configuration.
   local backup_dir="$HOME/backups";
   local date_format='%Y-%m-%d-%H-%M-%S';

   local i=0;
   for x in "$@"; do
      # Determine the name for the current backup.
      local curr_date="$(date +"$date_format")";
      local full_path="$(php -r 'echo realpath($_SERVER["argv"][1]);' "$x")";
      local curr_backup="$backup_dir/$curr_date$full_path";
      local curr_backup_dir="$(dirname "$curr_backup")";

      # Check for previous backups.
      local prev_backup='';
      shopt -s nullglob;
      for prev_backup in "$backup_dir/"*"$full_path"; do
         :
      done;

      # Back up using rsync, hard-linking unchanged files to the previous backup, if any.
      mkdir -p "$curr_backup_dir";
      echo "Now backing up:  $(basename "$full_path")";
      echo "Backing up to:   $curr_backup";
      if [ -z "$prev_backup" ]; then
         echo 'Previous backup: (none)';
         echo;
         rsync --itemize-changes --archive "$full_path" "$curr_backup_dir";
      else
         echo "Previous backup: $prev_backup";
         echo;
         rsync --itemize-changes --archive --link-dest="$(dirname "$prev_backup")" "$full_path" "$curr_backup_dir";
      fi;
      let i++;
      [ $i -eq $# ] || echo;
   done;
)}

Leer meer

$ exit

Samenvatting

kak.be/phl (→ http://jan.moesen.nu/presentaties/klik-hier-niet-fronteers-2011/)