shad-go/digitalclock/README.md
Arseny Balobanov a931e8cc27 readme fixes
2020-02-22 02:43:06 +03:00

3.9 KiB
Raw Blame History

digitalclock

В этой задаче нужно написать http server, который по запросу /?time=hh:mm:ss вернет PNG с данным временем.

Сервер должен слушать порт, переданный через аргумент -port.

Примеры

Запуск:

$ digitalclock -port 6029

После запуска можно открыть в браузере http://localhost:6029/?time=15:04:05 и получить png наподобие этой:

Image description

Если параметр time не задан (или равен ""), сервен должен вернуть текущее время. В этом случае при обновлении страницы картинка должна меняться.

В запросе также нужно поддержать параметр 1 <=k <= 30, который отвечает за увеличение картинки в k раз:

http://localhost:6029/?time=15:04:05?k=15

Image description

На невалидных time и k сервер должен возврщать произвольное сообщение об ошибке и http status 400 (Bad Request):

$ curl -i "http://localhost:6029/?k=100" 
HTTP/1.1 400 Bad Request
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
Date: Fri, 14 Feb 2020 02:02:41 GMT
Content-Length: 10

invalid k

В случае успеха приложение должно возвращать http status 200 (OK), а также проставлять http header Content-Type: image/png:

$ curl -i "http://localhost:6029/"                   
HTTP/1.1 200 OK
Content-Type: image/png
Date: Fri, 14 Feb 2020 02:08:19 GMT
Content-Length: 193
...

Формат

hh:mm:ss

В ./symbols.go определены строковые константы, кодирующие цифры и двоеточие. Один символ константы (отличный от '\n') - 1 пиксель. '.' должны кодироваться в белый цвет, '1' - в бирюзовый (переменная Cyan в ./symbols.go). Все константы имеют одинаковую высоту h, все цифры имеют одинаковую ширину w.

k отличный от 1 (default) превращает каждый пиксель p картинки в блок k x k пикселей p. Высота результирующей картинки - h * k, ширина - (6 * w + 2 * w_colon) * k, где w_colon ширина константы, соответствующей ':'.

Проверка решения

Для запуска тестов нужно выполнить следующую команду:

go test -v ./digitalclock/...

Запуск программы

go run -v ./digitalclock/... -port 6029

Компиляция

go install ./digitalclock/...

После выполнения в $GOPATH/bin появится исполняемый файл с именем digitalclock.

Walkthrough

  1. парсинг аргументов командной строки https://gobyexample.com/command-line-flags
  2. http server: https://p.go.manytask.org/00-intro/lecture.slide#23
  3. url params: https://golang.org/pkg/net/url/#URL.Query
  4. форматирование времени: https://gobyexample.com/time-formatting-parsing
  5. работа с картинками: https://golang.org/pkg/image/

Пример, создания простой png размера 5x5:

package main

import (
        "image"
        "image/color"
        "image/png"
        "os"
)

func main() {
        img := image.NewRGBA(image.Rect(0, 0, 5, 5))
        img.Set(2, 2, color.RGBA{255, 0, 0, 255})
        f, _ := os.Create("/tmp/img.png")
        png.Encode(f, img)
}