24. 6. 2019

Exiftool tips & tricks

Organize images

Organize images by years/months

exiftool -d "%Y/%m/%Y-%m-%d %H.%M.%S%%-c.%%le" "-filename<CreateDate" -r ./Photos

Download RAW files from SD card to current folder:

exiftool -d "%Y/%m/%Y-%m-%d %H.%M.%S%%-c.%%le" "-filename<CreateDate" --ext raf -r /Volumes/SD

Move all Olympus images to directory Olympus:

exiftool -r '-directory=Olympus' -if '$make eq "OLYMPUS CORPORATION"' .

Rename files to datestamp:

Filename looks like 2014-01-01 12:00:00.jpg and will append -NUM if DateTimeOriginal is the same for multiple files

exiftool '-FileName<DateTimeOriginal' -d "%Y-%m-%d %H.%M.%S%%-c.%%e" .  

Date & time

Find images in a directory that don't have a DateTimeOriginal:

exiftool -filename -filemodifydate -createdate -r -if '(not $datetimeoriginal) and $filetype eq "JPEG"' .

Update any photo that doesn't have DateTimeOriginal to have it based on file modify date:

exiftool '-datetimeoriginal<filemodifydate' -if '(not $datetimeoriginal or ($datetimeoriginal eq "0000:00:00 00:00:00")) and ($filetype eq "JPEG")' .

Set date by filename:

exiftool "-alldates<filename" $@

All metadata

Remove all metadata of a image file:

exiftool -all= -overwrite_original photo.jpg

Remove all metadata of all *.jpg files in current directory:

exiftool -all= -overwrite_original -ext *.jpg

GPS

Strip all metadata except for location (GPS):

exiftool -all= -tagsfromfile @ -gps:all *.jpg

Remove all GPS metadata of *.jpg files in current directory:

exiftool -gps:all= *.jpg

Create KML from geotagged photos:

DESKTOP=$HOME/Desktop
cat $DESKTOP/kml-start.fmt > out.kml
exiftool -n -r -q -p $DESKTOP/kml-placemark.fmt . >> out.kml
cat $DESKTOP/kml-end.fmt >> out.kml

Create CSV of Geo Information:

exiftool -csv -filename -imagesize -gps:GPSLatitude -gps:GPSLongitude ./ > long.csv

Extra

Check Shutter Count:

exiftool -ImageCount [filename]

JSON

Outputs a grouped collection of records as JSON in a directory:

exiftool -json -g /path > collectionprofile.json
1. 3. 2019

Read .env file in bash

Let's have example .env file:

example=value
example2=value

then you can read this file like this:

#!/usr/bin/env bash

set -o allexport
[[ -f .env ]] && source .env
set +o allexport

Warning: All existing variables are overridden by .env content.

28. 12. 2018

Install Netatalk 3.x on Raspberry PI

Compile Netatalk from source

Install required Packages

sudo apt install build-essential \
libevent-dev libssl-dev libgcrypt-dev libkrb5-dev libpam0g-dev \
libwrap0-dev libdb-dev libtdb-dev libmariadbclient-dev \
avahi-daemon libavahi-client-dev libacl1-dev libldap2-dev \
libcrack2-dev systemtap-sdt-dev libdbus-1-dev \
libdbus-glib-1-dev libglib2.0-dev libio-socket-inet6-perl \
tracker libtracker-sparql-1.0-dev libtracker-miner-1.0-dev

Remove old version of netatalk:

sudo apt remove netatalk

then download and extract latest version

wget http://prdownloads.sourceforge.net/netatalk/netatalk-3.1.12.tar.bz2 -qO - | tar -xj
cd netatalk-3.1.12/

Do configure!

./configure \
        --with-init-style=debian-systemd \
        --without-libevent \
        --without-tdb \
        --with-cracklib \
        --enable-krbV-uam \
        --with-pam-confdir=/etc/pam.d \
        --with-dbus-daemon=/usr/bin/dbus-daemon \
        --with-dbus-sysconf-dir=/etc/dbus-1/system.d \
        --with-tracker-pkgconfig-version=1.0
make
sudo make install
sudo reboot

Check features and paths, using netatalk -V and afpd -V.

edit /usr/local/etc/afp.conf

[Global]
; mimic model = RackMac

[Homes]
basedir regex = /home

;[My AFP Volume]
;path = /path/to/volume

;[My Time Machine Volume]
;path = /path/to/backup
;time machine = yes
sudo systemctl enable avahi-daemon
sudo systemctl enable netatalk
sudo systemctl start avahi-daemon
sudo systemctl start netatalk
27. 12. 2018

Raspberry PI, Bonjour service, SSH and AFP

Raspbian Stretch Lite (without desktop)

  1. Download Raspbian Stretch Lite
  2. Install Raspbian with etcher to SD card
  3. Boot from SD card...

Basic configuration and Wifi connection

sudo raspi-config
  1. Change User Password :-) (default user pi with password raspberry)
  2. Change Localisation Options
  3. Enable SSH in Interfacing Options
  4. Configure WiFi in Network Options and change Hostname (in my case to pi)

If you have Wifi with hidden SSID, you will need change /etc/wpa_supplicant/wpa_supplicant.conf file and add scan_ssid=1:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=CZ

network={
    ssid="HiddenWifiSSID"
    scan_ssid=1
    psk="and password :)"
}

Reboot (sudo reboot) and then check with iwgetid if you are connected to your Wifi!

Install AFP and Bonjour service

Install netatalk thats provide AppleTalk Filing Protocol (AFP) interface.

sudo apt install netatalk

Install avahi

sudo apt install avahi-daemon
sudo apt install avahi-utils
sudo update-rc.d avahi-daemon defaults

Config AFPD with /etc/avahi/services/afpd.service

<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
   <name replace-wildcards="yes">%h</name>
   <service>
        <type>_afpovertcp._tcp</type>
        <port>548</port>
   </service>
   <service>
        <type>_device-info._tcp</type>
        <port>0</port>
        <txt-record>model=RackMac</txt-record>
    </service>
</service-group>

PS: RackMac is define icon that will be shown in Finder (there is plenty other options e.g. Windows, Macintosh, TimeCapsule and so on)

Config SSH with /etc/avahi/services/ssh.service

<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
     <name replace-wildcards="yes">%h SSH</name>
     <service>
          <type>_ssh._tcp</type>
          <port>22</port>
     </service>
</service-group>

Configure avahi daemon

Then in /etc/avahi/avahi-daemon.conf change two parametters host-name and publish-workstation:

[server]
host-name=pi # this row
# ...

[publish]
publish-workstation=yes # this row

# ...

Now Awvvaaaahhhhiii

Enable afp and avahi

sudo systemctl enable netatalk
sudo systemctl enable avahi-daemon

and start them

sudo service avahi-daemon start
sudo service netatalk start

now check if everything works well with

avahi-browse -a | grep $(hostname)
23. 12. 2018

Install nodejs on Raspberry PI

First download latest version of nodejs:

wget -qO- http://nodejs.org/dist/latest/node-v12.4.0-linux-armv7l.tar.xz | tar xvz -C ./nodejs
cd nodejs

Compile from sources:

sudo cp -R bin/* /usr/bin/
sudo cp -R lib/* /usr/lib/
sudo apt update && sudo apt upgrade
sudo apt install build-essential
13. 12. 2018

Download website mirror with wget

wget --mirror \
     --convert-links \
     --adjust-extension \
     --page-requisites \
     --no-parent \
     --no-check-certificate http://example.com
26. 11. 2018

Javascript document.write replacement

Replacement of document.write can be combination of insertAdjacentHTML() method and document.currentScript property.

The insertAdjacentHTML() method of the Element interface parses the specified text as HTML or XML and inserts the resulting nodes into the DOM tree at a specified position:

The Document.currentScript property returns the <script> element whose script is currently being processed. Best position to add new HTML will be beforebegin - new HTML will be inserted before <script> itself.

<script>
  document.currentScript.insertAdjacentHTML(
    'beforebegin', 
    'this is the document.write alternative'
  );
</script>
2. 11. 2018

Život podle Charlese Bukowského

Legendární spisovatel a zastánce nevázaného života, Charles Bukowski, má pro vás 10 rad, jak žít naplno.

Nespokojte se jen tak s něčím

Pokud nevěříte, že si zasloužíte absolutně to nejlepší, nikdy to nedostanete.

„Chtěl jsem celý svět, nebo nic.“

Milujte sami sebe

Není to o tom mít narcistickou osobnost, je to o tom být spokojený sám se sebou.

„Nikdy jsem nepotkal jiného člověka, kterým bych chtěl být.“

Žijte život naplno

Pokud existuje něco šíleného, co byste jako umírající měli udělat, ať už je to cestování přes půl světa bez mapy nebo skákání z letadla s padákem - udělejte to a nečekejte.

„Hrozná není smrt, ale život lidí, kteří do smrti nežijí.“

Nebojte se bolesti, bez ní nemůžete zažít štěstí

Pocit smutku, úzkost nebo bolest je absolutně to nejhorší. Ale díky těmto špatným zkušenostem budeš cenit ty lepší mnohem víc.

„Musíš zemřít několikrát, než začneš opravdu žít.“

Buďte svým vlastním já a nebojte se to všem ukázat

Buďte sami sebou a zatraceně nikdy nemyslete na to, co by si ostatní lidé mohli myslet. Pro pana Bukowskiho to fungovalo dobře.

„Je lepší dělat nudné věci ve velkém stylu, než nebezpečné věci bez.“

Jsi silnější, než si myslíš

Když jde do tuhého, zvládnete skoro cokoliv. Nikdy se neřiďte pocitem, že něco nemůžete udělat, nebo že na to nejste dost dobří.

„Někdy si tak ráno vylezete z postele s pocitem, že to nebudete dělat, pak se ale v duchu zasmějete, kolikrát už jste se takto cítili.“

Nebojte se smrti

Buďte opatrní, zdraví, a vše dělejte s rozumem. Ale není třeba se bát smrti. Stává se to každému.

„Nosím smrt v mé levé kapse. Někdy ji vytáhnu a mluvím s ní: „Ahoj, zlato, jak se máš? Kdy přijdeš za mnou? Budu připravený.“

Důvěřujte sami sobě

Sebejistota je v podstatě klíčem ke všemu, ať už je to zabodování na rande snů nebo vyniknutí na firemním žebříčku.

„Problém se světem je, že inteligentní lidé jsou plni pochybností.“

Jsou mnohem horší věci než samota

Naučte se si užít a ocenit čas, kdy jste sami. Být s přáteli a láskami může být vynikající, ale dobré koníčky, zvědavost a sklon k tomu být sám mohou být stejně příjemné.

„Jsou horší věci, než být sám, ale často trvá desítky let, než si to člověk uvědomí - nejčastěji, když už je pozdě. A není nic horšího, než když je pozdě.“

Život běží, neber ho vždy tak vážně

Život není o dokonalosti, je to o radosti. Takže nikdy, nikdy, nikdy se nezapomeň bavit!

„Někdy je prostě potřeba čůrat do umyvadla.“