Friday, November 26, 2021

new haven trip

 expense

nov 19 - monitor, hdmi cable, dinner
nov 22 - lunch, driving 75km
nov 26 - lunch, dinner, plane ticket, driving 75km,
nov 27 - antigen test, parking, driving 100km, ziptie
Nov 28 - Uber, baggage, hotel, car rental, phone
Nov 29 - hotel, hard drive, dollar tree
Nov 30 - hotel, home depot, dollar tree, gas

timesheet
nov 19 - drive test, packing - 12h
nov 22 - install - 8h
nov 26 - install - 8h
Nov 27 - bundle - 8h
Nov 28 - ferry to new haven - 12h
Nov 29 - mech down - 8h
Nov 30 - mech down -8h

Thursday, November 25, 2021

burp suite 1


change browser proxy to 127.0.0.1:8080

in burp suite listen to 127.0.0.1:8080

web responses are sniffed

turn intercept on to sniff one request at a time
reference:

Wednesday, November 24, 2021

Spain on a Fork









kali linux 6 bash scripting

sudo apt-get update && apt-get upgrade 
sudo apt-get install git    

$ ping 192.168.37.1 -c 1
PING 192.168.37.1 (192.168.37.1) 56(84) bytes of data.
64 bytes from 192.168.37.1: icmp_seq=1 ttl=128 time=0.751 ms

$ ping 192.168.37.1 -c 1 > ip.txt

$ cat ip.txt | grep "64 bytes"
64 bytes from 192.168.37.1: icmp_seq=1 ttl=128 time=1.07 ms

$ cat ip.txt | grep "64 bytes" | cut -d " " -f 4
192.168.37.1:

$ cat ip.txt | grep "64 bytes" | cut -d " " -f 4 | tr -d ":"
192.168.37.1

ipsweep.sh
$ chmod +x ipsweep.sh   

$./ipsweep.sh 192.168.37
192.168.37.2
192.168.37.1
192.168.37.129

$ ./ipsweep.sh 192.168.37 > ip.txt

$ cat ip.txt                                                
192.168.37.1
192.168.37.2
192.168.37.129

$ for ip in $(cat ip.txt); do sudo nmap -sS -p 80 -T4 $ip & done   

[2] 11572
[3] 11573
[4] 11574
                                                                             
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-24 16:45 EST
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-24 16:45 EST
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-24 16:45 EST
┌──(kali㉿kali)-[~/Documents]
└─$ Nmap scan report for 192.168.37.129                                  3 ⚙
Host is up (0.000039s latency).

PORT   STATE  SERVICE
80/tcp closed http

Nmap done: 1 IP address (1 host up) scanned in 0.16 seconds

[4]  + done       sudo nmap -sS -p 80 -T4 $ip
┌──(kali㉿kali)-[~/Documents]
└─$ Nmap scan report for 192.168.37.2                                    2 ⚙
Host is up (0.00043s latency).

PORT   STATE  SERVICE
80/tcp closed http
MAC Address: 00:50:56:E4:7E:27 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 0.26 seconds

[3]  + done       sudo nmap -sS -p 80 -T4 $ip
┌──(kali㉿kali)-[~/Documents]
└─$ Nmap scan report for 192.168.37.1                                    1 ⚙
Host is up (0.00045s latency).

PORT   STATE    SERVICE
80/tcp filtered http
MAC Address: 00:50:56:C0:00:08 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 0.50 seconds

[2]  + done       sudo nmap -sS -p 80 -T4 $ip

-------------------------
$ for ip in $(cat ip.txt); do sudo nmap -sS -p 80 -T4 $ip; done

Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-24 16:42 EST
Nmap scan report for 192.168.37.1
Host is up (0.0012s latency).

PORT   STATE    SERVICE
80/tcp filtered http
MAC Address: 00:50:56:C0:00:08 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 0.49 seconds
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-24 16:42 EST
Nmap scan report for 192.168.37.2
Host is up (0.00051s latency).

PORT   STATE  SERVICE
80/tcp closed http
MAC Address: 00:50:56:E4:7E:27 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 0.24 seconds
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-24 16:42 EST
Nmap scan report for 192.168.37.129
Host is up (0.000061s latency).

PORT   STATE  SERVICE
80/tcp closed http

Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds

reference:

Tuesday, November 23, 2021

kali linux 5 simple server


ifconfig get local ip address: 192.168.37.129
service apache2 start : start local server

local folder for apache2 server: var/www/html
default port: 80
service apache2 stop: stop apache2 server

host files in download folder
cd /home/kali/Downloads
python -m SimpleHTTPServer 8080
logs: Serving HTTP on 0.0.0.0 port 8080 ...

systemctl enable apache2: start apache2 server on boot up

reference:

kali linux 4



reference:

Sunday, November 21, 2021

Sunday, November 14, 2021

Georges Hobeika

selenium 11 booking bot report


sort by price

select property box

find price


pretty table report
#logs

# of hotels 25
[['Jazz on the Park Youth Hostel', 'US$234', '5.9'], ['HI NYC Hostel', 'US$252', '8.4'], ['Jazz on Columbus Circle Hostel', 'US$297', '7
.7'], ['NYC Manhattan Bedroom', 'US$470', '6.9'], ['West Side YMCA', 'US$485', '7.3'], ['Hotel Henny', 'US$525', '4.8'], ['Pod 51', 'US$
616', '8.0'], ['Night Hotel Broadway', 'US$681', '6.2'], ['Holiday Inn Express - Wall Street, an IHG Hotel', 'US$690', '7.5'], ['Pod 39'
, 'US$690', '8.3'], ['The Harlem Getaway', 'US$705', '7.4'], ['Chelsea Inn', 'US$722', '8.2'], ['Solita Soho Hotel', 'US$724', '6.8'], [
'The International Cozy Inn', 'US$725', '8.0'], ['Pod Times Square', 'US$727', '8.4'], ['Colonial House Inn', 'US$738', '8.5'], ['Orchar
d Street Hotel', 'US$758', '7.6'], ['Courtyard New York Downtown Manhattan/Financial District', 'US$769', '7.1'], ['The Gatsby Hotel', '
US$786', '7.2'], ['Hotel Newton', 'US$786', '8.2'], ['Hotel 32 32', 'US$792', '7.6'], ['Hotel Hayden New York', 'US$794', '7.9'], ['Seto
n Hotel', 'US$797', '8.5'], ['U Hotel Fifth Avenue', 'US$804', '8.1'], ['Holiday Inn Manhattan Financial District, an IHG Hotel', 'US$80
8', '8.1']]

------------------------------
#Booking/booking.py

from time import sleep
import Booking.constants as constants
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from Booking.filters import BookingFilters
from Booking.report import Report
from prettytable import PrettyTable

class Booking(webdriver.Chrome):
    def __init__(self, path=r"C:/Users/zchen/PycharmProjects/selenium", auto_close=True):
        self.driver_path = path
        self.auto_close = auto_close
        os.environ['PATH'] += self.driver_path
        super(Booking, self).__init__()

    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.auto_close:
            print('exiting...')
            self.quit()

    def open_page(self):
        self.get(constants.BASE_URL)
        print(constants.BASE_URL, 'is opened')

    ...

    def report(self):
        report_class = Report(driver=self)

        properties = self.find_elements(
            By.CSS_SELECTOR,
            'div[data-testid="property-card"]'
        )
        print("# of hotels", len(properties))

        hotel_list = report_class.report(hotels=properties)
        print(hotel_list)
        table = PrettyTable(
            field_names=["Name", "Price", "Score"]
        )
        table.add_rows(hotel_list)
        print(table)

---------------------
#Booking/report.py

from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.common.by import By

class Report:
    def __init__(self, driver:WebDriver):
        self.driver = driver

    def report(self, hotels):
        hotel_list = []
        for hotel in hotels:
            name = hotel.find_element(
                By.CSS_SELECTOR,
                'div[data-testid="title"]'
            ).get_attribute('innerHTML')

            price = hotel.find_element(
                By.CSS_SELECTOR,
                'div[data-testid="price-and-discounted-price"]'
            ).find_elements(
                By.TAG_NAME,
                'span'
            )[-1].get_attribute('innerHTML')

            score = hotel.find_element(
                By.CSS_SELECTOR,
                'div[aria-label^="Scored"]'
            ).get_attribute('innerHTML')

            hotel_list.append([name, price, score])

        return hotel_list

-------------------------
#run.py

from Booking.booking import Booking

with Booking(auto_close=False) as bot:
    bot.open_page()
    bot.change_currency(currency='USD')
    bot.select_place_to_go("New York")
    bot.select_dates('2021-11-20', '2021-11-25')
    bot.update_adult_room_number(1, 3)
    bot.search()
    bot.filters(3, 4, 5)
    bot.refresh()
    bot.report()

reference:

干热岩

Saturday, November 13, 2021

billionaire lifestyle 9

selenium 10 booking bot filters


select star rating group with css selector

loop through options in the group and check based on preference

3 to 5 stars are checked
#logs

(3, 4, 5)
6
3 checked
4 checked
5 checked

-----------------------------
#Booking/filters.py

from typing import List
from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.common.by import By

class BookingFilters:
    def __init__(self, driver:WebDriver):
        self.driver = driver

    def star_rating(self, *star_list):
        star_group = self.driver.find_element(
            By.CSS_SELECTOR,
            'div[data-filters-group="class"]'
        )

        star_elements = star_group.find_elements(
            By.CSS_SELECTOR,
            'div[data-filters-item^="class:class="]'
        )

        print(star_list)
        print(len(star_elements))

        for star in star_list:
            for star_element in star_elements:
                if str(star) in star_element.get_attribute('data-filters-item'):
                    print(star, "checked")
                    star_element.click()

----------------------
#Booking/booking.py

from time import sleep
import Booking.constants as constants
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from Booking.filters import BookingFilters

class Booking(webdriver.Chrome):
    def __init__(self, path=r"C:/Users/zchen/PycharmProjects/selenium", auto_close=True):
        self.driver_path = path
        self.auto_close = auto_close
        os.environ['PATH'] += self.driver_path
        super(Booking, self).__init__()

    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.auto_close:
            print('exiting...')
            self.quit()

    def open_page(self):
        self.get(constants.BASE_URL)
        print(constants.BASE_URL, 'is opened')

...

    def filters(self, *stars):
        filters = BookingFilters(driver=self)
        filters.star_rating(*stars)

----------------------------
#run.py

from Booking.booking import Booking

with Booking(auto_close=False) as bot:
    bot.open_page()
    #bot.change_currency(currency='GBP')
    bot.select_place_to_go("New York")
    bot.select_dates('2021-11-20', '2021-11-25')
    bot.update_adult_room_number(1, 3)
    bot.search()
    bot.filters(3, 4, 5)

reference:

Wednesday, November 10, 2021

Bon Jovi



selenium 9 booking bot update adults, room number

                                                       default booking option 2 adults, 1 room

open adult, room number selection by click button with ID

use css selector to find +/- button
use attributes to find number

numbers are updated

search results are displaced
#Booking/booking.py

from time import sleep
import Booking.constants as constants
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class Booking(webdriver.Chrome):
    def __init__(self, path=r"C:/Users/zchen/PycharmProjects/selenium", auto_close=True):
        self.driver_path = path
        self.auto_close = auto_close
        os.environ['PATH'] += self.driver_path
        super(Booking, self).__init__()

    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.auto_close:
            print('exiting...')
            self.quit()

    def open_page(self):
        self.get(constants.BASE_URL)
        print(constants.BASE_URL, 'is opened')

    def change_currency(self, currency=None):
        currency_element = self.find_element(
            By.CSS_SELECTOR,
            'button[data-tooltip-text="Choose your currency"]'
        )
        currency_element.click()

        WebDriverWait(self, 30).until(
            EC.presence_of_element_located(
                (
                    By.CSS_SELECTOR,
                    f'a[data-modal-header-async-url-param*={currency}]'
                )
            )
        )

        selected_currency_element = self.find_element(
            By.CSS_SELECTOR,
            f'a[data-modal-header-async-url-param*={currency}]'
        )
        selected_currency_element.click()

    def select_place_to_go(self, place_to_go):
        search_field = self.find_element(
            By.ID,
            "ss"
        )
        search_field.clear()
        search_field.send_keys(place_to_go)

        WebDriverWait(self, 30).until(
            EC.presence_of_element_located(
                (
                    By.CSS_SELECTOR,
                    'li[data-i="0"]'
                )
            )
        )

        first_result = self.find_element(
            By.CSS_SELECTOR,
            'li[data-i="0"]'
        )
        first_result.click()

    def select_dates(self, check_in, check_out):

        check_in_element = self.find_element(
            By.CSS_SELECTOR,
            f'td[data-date="{check_in}"]'
        )
        check_in_element.click()

        check_out_element = self.find_element(
            By.CSS_SELECTOR,
            f'td[data-date="{check_out}"]'
        )
        check_out_element.click()

    def update_adult_room_number(self, adult_num, room_num):
        expand_button = self.find_element(
            By.ID,
            'xp__guests__toggle'
        )
        expand_button.click()

        def find_current_adult_num():
            return int(self.find_element(
                By.ID,
                'group_adults'
            ).get_attribute('value'))

        def find_current_room_num():
            return int(self.find_element(
                By.ID,
                'no_rooms'
            ).get_attribute('value'))

        increase_adult_num_button = self.find_element(
            By.CSS_SELECTOR,
            'button[aria-label="Increase number of Adults"]'
        )

        decrease_adult_num_button = self.find_element(
            By.CSS_SELECTOR,
            'button[aria-label="Decrease number of Adults"]'
        )

        increase_room_num_button = self.find_element(
            By.CSS_SELECTOR,
            'button[aria-label="Increase number of Rooms"]'
        )

        decrease_room_num_button = self.find_element(
            By.CSS_SELECTOR,
            'button[aria-label="Decrease number of Rooms"]'
        )

        while find_current_room_num() != room_num:
            if find_current_room_num() > room_num:
                decrease_room_num_button.click()
            else:
                increase_room_num_button.click()

        while find_current_adult_num() != adult_num:
            if find_current_adult_num() > adult_num:
                decrease_adult_num_button.click()
            else:
                increase_adult_num_button.click()

    def search(self):
        search_button = self.find_element(
            By.CSS_SELECTOR,
            'button[data-sb-id="main"]'
        )
        search_button.click()

----------------------------
#run.py

from Booking.booking import Booking

with Booking(auto_close=False) as bot:
    bot.open_page()
    #bot.change_currency(currency='GBP')
    bot.select_place_to_go("New York")
    bot.select_dates('2021-11-15', '2021-12-15')
    bot.update_adult_room_number(1, 3)
    bot.search()

reference:

European Medieval Towns 2

Mont Saint-Michel

Kotor

手机定位

Tuesday, November 9, 2021

European Medieval Towns


Toledo 

Carcassonne

麦洛维大坝

selenium 8 booking bot select date

after destination is entered, date table opens

select <td> element with css selector

checking in and checking out dates are selected
#Booking/booking.py
 
from time import sleep
import Booking.constants as constants
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class Booking(webdriver.Chrome):
    def __init__(self, path=r"C:/Users/zchen/PycharmProjects/selenium", auto_close=True):
        self.driver_path = path
        self.auto_close = auto_close
        os.environ['PATH'] += self.driver_path
        super(Booking, self).__init__()

    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.auto_close:
            print('exiting...')
            self.quit()

    def open_page(self):
        self.get(constants.BASE_URL)
        print(constants.BASE_URL, 'is opened')

    def change_currency(self, currency=None):
        currency_element = self.find_element(
            By.CSS_SELECTOR,
            'button[data-tooltip-text="Choose your currency"]'
        )
        currency_element.click()

        WebDriverWait(self, 30).until(
            EC.presence_of_element_located(
                (
                    By.CSS_SELECTOR,
                    f'a[data-modal-header-async-url-param*={currency}]'
                )
            )
        )

        selected_currency_element = self.find_element(
            By.CSS_SELECTOR,
            f'a[data-modal-header-async-url-param*={currency}]'
        )
        selected_currency_element.click()

    def select_place_to_go(self, place_to_go):
        search_field = self.find_element(
            By.ID,
            "ss"
        )
        search_field.clear()
        search_field.send_keys(place_to_go)

        WebDriverWait(self, 30).until(
            EC.presence_of_element_located(
                (
                    By.CSS_SELECTOR,
                    'li[data-i="0"]'
                )
            )
        )

        first_result = self.find_element(
            By.CSS_SELECTOR,
            'li[data-i="0"]'
        )
        first_result.click()

    def select_dates(self, check_in, check_out):

        check_in_element = self.find_element(
            By.CSS_SELECTOR,
            f'td[data-date="{check_in}"]'
        )
        check_in_element.click()

        check_out_element = self.find_element(
            By.CSS_SELECTOR,
            f'td[data-date="{check_out}"]'
        )
        check_out_element.click()

-------------------------
#run.py

from Booking.booking import Booking

with Booking(auto_close=False) as bot:
    bot.open_page()
    #bot.change_currency(currency='GBP')
    bot.select_place_to_go("New York")
    bot.select_dates('2021-11-10', '2021-12-10')

reference:

Monday, November 8, 2021

selenium 7 booking bot input destination


select destination textbox by id

selection first option with css selector

destination is filled in
#Booking/booking.py
from time import sleep
import Booking.constants as constants
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class Booking(webdriver.Chrome):
    def __init__(self, path=r"C:/Users/zchen/PycharmProjects/selenium", auto_close=True):
        self.driver_path = path
        self.auto_close = auto_close
        os.environ['PATH'] += self.driver_path
        super(Booking, self).__init__()

    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.auto_close:
            print('exiting...')
            self.quit()

    def open_page(self):
        self.get(constants.BASE_URL)
        print(constants.BASE_URL, 'is opened')

    def change_currency(self, currency=None):
        currency_element = self.find_element(
            By.CSS_SELECTOR,
            'button[data-tooltip-text="Choose your currency"]'
        )
        currency_element.click()

        WebDriverWait(self, 30).until(
            EC.presence_of_element_located(
                (
                    By.CSS_SELECTOR,
                    f'a[data-modal-header-async-url-param*={currency}]'
                )
            )
        )

        selected_currency_element = self.find_element(
            By.CSS_SELECTOR,
            f'a[data-modal-header-async-url-param*={currency}]'
        )
        selected_currency_element.click()

    def select_place_to_go(self, place_to_go):
        search_field = self.find_element(
            By.ID,
            "ss"
        )
        search_field.clear()
        search_field.send_keys(place_to_go)

        WebDriverWait(self, 30).until(
            EC.presence_of_element_located(
                (
                    By.CSS_SELECTOR,
                    'li[data-i="0"]'
                )
            )
        )

        first_result = self.find_element(
            By.CSS_SELECTOR,
            'li[data-i="0"]'
        )
        first_result.click()

reference:

The Future Of Transport

Sunday, November 7, 2021

selenium 6 booking bot change currency


default currency is CAD

auto click currency button, and select GBP

currency is changed to GBP

select currency button by css selector

select <a> by css selector
#Booking/booking.py

from time import sleep
import Booking.constants as constants
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class Booking(webdriver.Chrome):
    def __init__(self, path=r"C:/Users/zchen/PycharmProjects/selenium", auto_close=True):
        self.driver_path = path
        self.auto_close = auto_close
        os.environ['PATH'] += self.driver_path
        super(Booking, self).__init__()

    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.auto_close:
            print('exiting...')
            self.quit()

    def open_page(self):
        self.get(constants.BASE_URL)
        print(constants.BASE_URL, 'is opened')

    def change_currency(self, currency=None):
        currency_element = self.find_element(
            By.CSS_SELECTOR,
            'button[data-tooltip-text="Choose your currency"]'
        )
        currency_element.click()

        WebDriverWait(self, 30).until(
            EC.presence_of_element_located(
                (
                    By.CSS_SELECTOR,
                    f'a[data-modal-header-async-url-param*={currency}]'
                )
            )
        )

        selected_currency_element = self.find_element(
            By.CSS_SELECTOR,
            f'a[data-modal-header-async-url-param*={currency}]'
        )
        selected_currency_element.click()

----------------------------
#run.py

from Booking.booking import Booking

with Booking(auto_close=False) as bot:
    bot.open_page()
    bot.change_currency(currency='GBP')

reference:

conditional wait

Saturday, November 6, 2021

selenium 5 booking bot 1

#logs
(venv) C:\Users\zchen\PycharmProjects\selenium>python run.py
start __init__.py

DevTools listening on ws://127.0.0.1:58774/devtools/browser/c93522ba-e462-4a03-aaa5-241da59d7535
https://www.booking.com is opened
exiting...
#Booking/booking.py

import Booking.constants as constants
import os
from selenium import webdriver

class Booking(webdriver.Chrome):
    def __init__(self, path=r"C:/Users/zchen/PycharmProjects/selenium"):
        self.driver_path = path
        os.environ['PATH'] += self.driver_path
        super(Booking, self).__init__()

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.quit()

    def open_page(self):
        self.get(constants.BASE_URL)
        print(constants.BASE_URL, 'is opened')

-----------------------
#run.py

from Booking.booking import Booking

with Booking() as bot:
    bot.open_page()
    print('exiting...')

-----------------
#Booking/__init__.py

print("start __init__.py")

-------------------
#Booking/constants.py

BASE_URL = "https://www.booking.com"

reference:

Friday, November 5, 2021

Tesla Semi

selenium 4 select onclick element, key press simulation


select button based on onclick event

send ctrl + a
#main.py

import os
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys

os.environ['PATH'] += r"C:/Users/zchen/PycharmProjects/selenium"
driver = webdriver.Chrome()
driver.get("https://www.w3schools.com/html/html_scripts.asp")
driver.implicitly_wait(30)

Button = driver.find_element(By.XPATH, "//button[contains(@onclick,'demo')]")
Button.click()

Date = driver.find_element(By.ID, "demo")
print(Date.text)

Body = driver.find_element(By.TAG_NAME, "body")
Body.send_keys(Keys.CONTROL, 'a')
Body.send_keys(Keys.CONTROL, 'c')

------------------
#logs
Fri Nov 05 2021 14:10:08 GMT-0600 (Mountain Daylight Time)

reference:

select by onclick

send key combination

Monday, November 1, 2021

Fort McMurray trip

expense
oct29 - dinner
oct31 - gorilla tape
nov1 - measure tape, lunch, driving 100km
nov2 - hotel, car, taxi, fuel
nov4 - fuel, gas

timesheet
oct29 - 12h - troubleshoot agnav
oct30 - 5h - troubleshoot agnav, packing up
nov1 - 14h - install, bundle
nov2 - 12h - survey
nov3 - 8h - field QA
nov4 - 8h - ferry back