dict @ a26f850c2372718d2b69d6b258d686c68ddba5ff

ref: Better doc and makefile

It adds README explaining how to compile and install.

Makefile allows to install dict system wide.
diff --git a/Makefile b/Makefile
index 8190661729693584d1254d5ffb5cef420e25bc75..de3668f59e569efacb48a6a89cb0b04318b0309a 100644
--- a/Makefile
+++ b/Makefile
@@ -1,9 +1,23 @@
-BIN?=bin/dict
+VERSION?=$(shell cat VERSION)
+BIN?=dict
+PREFIX?=/usr/local
+BINDIR?=$(PREFIX)/bin
+SHAREDIR ?= $(PREFIX)/share/$(BIN)
+OUT=./bin/$(BIN)
+EXT=./ext/libsqlite3ext.so
+
+GO_LDFLAGS:= -s -w
+GO_LDFLAGS+= -X main.Version=$(VERSION)
+GO_LDFLAGS+= -X git.gabrielgio.me/dict/db.LibPath=$(SHAREDIR)/libsqlite3ext
 GO_BUILD=go build -v --tags "fts5"
 GO_RUN=go run -v --tags "fts5"
 
-buid: ext
-	$(GO_BUILD) -o $(BIN) ./cmd/dict/main.go
+build: ext
+	$(GO_BUILD) -ldflags "$(GO_LDFLAGS)" -o $(OUT) ./cmd/dict/main.go
+
+install:
+	install -Dm755 $(OUT) $(BINDIR)/$(BIN)
+	install -Dm644 $(EXT) $(SHAREDIR)/libsqlite3ext.so
 
 run: ext
 	$(GO_RUN) ./cmd/dict/main.go ui
@@ -14,7 +28,14 @@
 serve: ext
 	$(GO_RUN) ./cmd/dict/main.go serve
 
+version: ext
+	$(GO_RUN) ./cmd/dict/main.go version
+
+uninstall:
+	rm $(BINDIR)/$(BIN)
+	rm $(SHAREDIR)/libsqlite3ext.so
+
+
+.PHONY: ext
 ext:
 	gcc -shared -o ext/libsqlite3ext.so -fPIC ext/spellfix.c
-
-.PHONY: ext
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..f5faf7de747c2f10aaf438fb163a75fac483c69c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,78 @@
+# Iterative dictionary
+
+The goal is to provide a frictionless dictionary searching experience: you type
+and the words show up on your prompt. Not need to wait a http request to go
+through.
+
+As of right now, dict just provides a thin layer on top of sqlite's fts5[^1]
+virtual table with support of spellfix[^2] for word suggestion. 
+
+The whole database is loaded in memory for faster search and import process,
+which means that this application will consume substantial amounts of memory.
+On DE-EN dictionary, for example, it uses ~300MB, more then dict.cc tab on
+firefox (but less the most electron application out there)
+
+# Compiling
+
+You will need go, gcc and sqlite-dev, then you can just run
+
+```sh
+make
+```
+
+For development you can run:
+
+```sh
+make run     # run the ui with default values
+make import  # run the importer with default values
+make version # run the version command
+```
+
+# Installing
+
+To install locally you may run:
+
+```sh
+PREFIX=$(HOME)/.local make install
+```
+
+Or for a system wide istall:
+
+```sh
+sudo make install
+```
+
+# Usage
+
+To run the importer you will need to download dict.cc dictionary.
+First go to its request page[^3] and select your dictionary of choice.
+Once you download and unzip run the following command:
+
+```sh
+dict import --input dict.txt --output main.dict
+```
+
+Once the import process is complete[4] you can run the ui.
+
+```sh
+dict ui --database main.dict
+```
+
+# TODO
+
+- On disk operation: to reduce memory footprint we can read from the disk. We
+  would need to remove the instance response, since that is not possible
+  reading from the disk.
+- Better coloring on the list.
+- Better default path for sqlite database making use of XDG variables.
+- [optional] Multi dictionary support. Support more than one dict at once.
+- Async response. Even though in memory is fast enough most often it can have
+  some hiccups with 2 letter queries. 
+- Finish server
+- Alpine package
+
+
+[^1]: https://sqlite.org/fts5.html
+[^2]: https://www.sqlite.org/spellfix1.html
+[^3]: https://www1.dict.cc/translation_file_request.php
+[4]: It may take some time depending the size of the dictionary you selected
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000000000000000000000000000000000000..b82608c0bb54a84ae7b3d38112ccf1cb50aebe8d
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+v0.1.0
diff --git a/cmd/dict/main.go b/cmd/dict/main.go
index 5bd60961e253fce4164294ee8db575dbec452b89..9dc98cf58caa9536b14854fde509d3d164e82e11 100644
--- a/cmd/dict/main.go
+++ b/cmd/dict/main.go
@@ -1,16 +1,21 @@
 package main
 
 import (
+	"fmt"
 	"log/slog"
 	"os"
+	"path/filepath"
 
 	"github.com/urfave/cli/v2"
 
 	"git.gabrielgio.me/dict/cmd/importer"
 	"git.gabrielgio.me/dict/cmd/server"
 	"git.gabrielgio.me/dict/cmd/ui"
+	"git.gabrielgio.me/dict/db"
 )
 
+var Version = "local"
+
 func main() {
 	app := &cli.App{
 		Name:  "dict",
@@ -19,6 +24,16 @@ 		Commands: []*cli.Command{
 			importer.ImportCommand,
 			ui.UICommand,
 			server.ServeCommand,
+			{
+				Name:  "version",
+				Usage: "print current version",
+				Flags: []cli.Flag{},
+				Action: func(cCtx *cli.Context) error {
+					fmt.Printf("%s - %s\n\n", filepath.Base(os.Args[0]), Version)
+					fmt.Printf("Spellfix locaton: %s.so", db.LibPath)
+					return nil
+				},
+			},
 		},
 	}
 
diff --git a/db/db.go b/db/db.go
index 61f3bb5c2d8240e651ca80c8ff127201c7b965bc..c3699d79fe965aea28372e1b68f1950d4775fb86 100644
--- a/db/db.go
+++ b/db/db.go
@@ -9,6 +9,8 @@
 	"github.com/mattn/go-sqlite3"
 )
 
+var LibPath = "ext/libsqlite3ext"
+
 type (
 	DB struct {
 		db     *sql.DB
@@ -24,7 +26,7 @@
 func Open(filename string) (*DB, error) {
 	sql.Register("sqlite3_with_extensions", &sqlite3.SQLiteDriver{
 		ConnectHook: func(conn *sqlite3.SQLiteConn) error {
-			return conn.LoadExtension("ext/libsqlite3ext", "sqlite3_spellfix_init")
+			return conn.LoadExtension(LibPath, "sqlite3_spellfix_init")
 		},
 	})