Compare commits
30 Commits
Author | SHA1 | Date |
---|---|---|
Sameer Rahmani | c0ba724ec6 | |
Sameer Rahmani | ff00004a8b | |
Sameer Rahmani | 0c3f0e3b8b | |
Sameer Rahmani | 4ddf5abc5e | |
Sameer Rahmani | 8d3a903a48 | |
Sameer Rahmani | 6597d08a3a | |
Sameer Rahmani | 1eb9f782b6 | |
Sameer Rahmani | 35296335a1 | |
Sameer Rahmani | b512d0ca2e | |
Sameer Rahmani | cd6909176b | |
Sameer Rahmani | f11aabd79f | |
Sameer Rahmani | 606f2e7a57 | |
Sameer Rahmani | e0923bbcb8 | |
Sameer Rahmani | 7da9a11727 | |
Sameer Rahmani | 4265c4fdbc | |
Sameer Rahmani | 20d3792bdb | |
Sameer Rahmani | a0fba4fe1f | |
Sameer Rahmani | b4992104c8 | |
Sameer Rahmani | 9a1d38e205 | |
Sameer Rahmani | a55d752c10 | |
Sameer Rahmani | 39629cdf31 | |
Sameer Rahmani | f4461f3cd7 | |
Sameer Rahmani | db49effa0d | |
Sameer Rahmani | 4d5206e846 | |
Sameer Rahmani | cfb55a442f | |
Sameer Rahmani | 8821cc8fa6 | |
Sameer Rahmani | 46f3ff9714 | |
Sameer Rahmani | ff13092068 | |
Sameer Rahmani | a17a32bda6 | |
Sameer Rahmani | 157786556e |
17
Cask
17
Cask
|
@ -1,17 +0,0 @@
|
||||||
(source gnu)
|
|
||||||
(source melpa)
|
|
||||||
|
|
||||||
(package-file "build.el")
|
|
||||||
|
|
||||||
(development
|
|
||||||
(depends-on "f")
|
|
||||||
(depends-on "ecukes")
|
|
||||||
(depends-on "ert-runner")
|
|
||||||
(depends-on "el-mock"))
|
|
||||||
|
|
||||||
(depends-on "mustache")
|
|
||||||
(depends-on "ht")
|
|
||||||
(depends-on "org")
|
|
||||||
(depends-on "ox-publish")
|
|
||||||
(depends-on "htmlize")
|
|
||||||
(depends-on "dracula-theme")
|
|
13
Makefile
13
Makefile
|
@ -1,14 +1,15 @@
|
||||||
clean:
|
clean:
|
||||||
rm -rf build
|
rm -rf build
|
||||||
rm -rf ./orgs/index.org ./orgs/categories/index.org ./orgs/tags/index.org
|
|
||||||
rm -rf `find . -iname "*~"`
|
rm -rf `find . -iname "*~"`
|
||||||
|
|
||||||
dev-build:
|
dev-build:
|
||||||
./build.el
|
./build.el :d docs
|
||||||
|
|
||||||
|
build: clean
|
||||||
build:
|
./build.el docs
|
||||||
LXHOME_PROD=t ./build.el
|
|
||||||
|
|
||||||
serve: build
|
serve: build
|
||||||
npx http-server -p 3003 ./build
|
npx http-server -p 3003 ./build/site-build
|
||||||
|
|
||||||
|
deploy: clean build
|
||||||
|
rsync -vlcr --delete-after ./build/site-build/* lxsameer@core.lxsameer.com:/home/lxsameer/lxsameer.com/home/
|
||||||
|
|
418
build.el
418
build.el
|
@ -1,375 +1,85 @@
|
||||||
:;exec cask emacs --no-site-file --no-site-lisp --batch -L ./ -l "$0" -f main "$(cd "$(dirname "$0")/." >/dev/null 2>&1 ; pwd -P)" "$@"
|
:;exec `echo $EMACS_PATH` --no-site-file --no-site-lisp --batch -L ./ -l "$0" -f main "$(cd "$(dirname "$0")/." >/dev/null 2>&1 ; pwd -P)" "$@"
|
||||||
;;; build.el --- The build script of my personal website
|
;;; Build.el --- The build script of my personal website -*- lexical-binding: t; -*-
|
||||||
|
;;
|
||||||
|
;; Copyright (c) 2020-2022 Sameer Rahmani & Contributors
|
||||||
|
;;
|
||||||
;;; Version: 0.1.0
|
;;; Version: 0.1.0
|
||||||
;;; Package-Version 0.1.0
|
;;; Package-Version 0.1.0
|
||||||
|
;;
|
||||||
|
;; This program is free software; you can redistribute it and/or modify
|
||||||
|
;; it under the terms of the GNU General Public License as published by
|
||||||
|
;; the Free Software Foundation, either version 3 of the License, or
|
||||||
|
;; (at your option) any later version.
|
||||||
|
;;
|
||||||
|
;; This program is distributed in the hope that it will be useful,
|
||||||
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
;; GNU General Public License for more details.
|
||||||
|
;;
|
||||||
|
;; You should have received a copy of the GNU General Public License
|
||||||
|
;; along with thnis program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
;;
|
||||||
;;; Commentary:
|
;;; Commentary:
|
||||||
;;; Code:
|
;;; Code:
|
||||||
(require 'org)
|
|
||||||
(require 'seq)
|
|
||||||
(require 'ox-html)
|
|
||||||
(require 'ox-latex)
|
|
||||||
(require 'ox-publish)
|
|
||||||
(require 'dracula-theme)
|
|
||||||
(require 'lisp/ox-template)
|
|
||||||
(require 'lisp/utils)
|
|
||||||
|
|
||||||
|
|
||||||
(setq debug-on-error t)
|
(setq debug-on-error t)
|
||||||
|
|
||||||
(defvar author-name "Sameer Rahmani"
|
(setenv "FG42_HOME" (concat (getenv "HOME") "/.fg42/"))
|
||||||
"Set this variable to your fullname.")
|
(defconst fg42/CORE_DIR (concat (getenv "FG42_HOME") "core"))
|
||||||
|
(setq user-emacs-directory (concat (getenv "FG42_HOME") "emacs.d"))
|
||||||
|
|
||||||
(defvar author-email "lxsameer@gmail.com"
|
(add-to-list 'load-path fg42/CORE_DIR)
|
||||||
"Set this varibale to your email address.")
|
|
||||||
|
|
||||||
(defvar project-root nil
|
(require 'fg42/build/utils)
|
||||||
"Root directory of the website source code.")
|
(require 'fg42/build/core)
|
||||||
|
|
||||||
|
|
||||||
(defvar orgs-files-dir "/orgs/"
|
(defconst build/usage "
|
||||||
"Path to the directory containing all the renderable org files.")
|
Usage:
|
||||||
|
|
||||||
|
build.el [PARAMS] COMMAND [...]
|
||||||
|
|
||||||
|
COMMANDS:
|
||||||
|
docs - Build the documents and convert them to HTML
|
||||||
|
|
||||||
|
PARAMS:
|
||||||
|
:d - Turns on the debug mode.
|
||||||
|
:e expr - Run the given `expr' before any operation.
|
||||||
|
")
|
||||||
|
|
||||||
|
|
||||||
(defun from-root (path)
|
(defproject lxsameer.com
|
||||||
"Return the full path of the given PATH in the project root."
|
project-root (nth 2 command-line-args-left)
|
||||||
(concat project-root path))
|
docs-root "/orgs"
|
||||||
|
usage build/usage
|
||||||
|
prod-base-url "https://lxsameer.com"
|
||||||
|
docs-pages-dir "/essays"
|
||||||
|
docs-actions '(copy-necessary-files)
|
||||||
|
docs-ignore-category-check '("thoughts.org")
|
||||||
|
docs-title "lxsameer.com"
|
||||||
|
docs-desc "The little nest of mine")
|
||||||
|
|
||||||
|
|
||||||
(defun all-org-files ()
|
(defun copy-necessary-files (build-dir base-url)
|
||||||
"Return a list of all the org files in the orgs directory."
|
"Copy the top level pages to the BUILD-DIR with BASE-URL."
|
||||||
(mapcar (lambda (x) x)
|
(copy-file (expand-file-name "orgs/coh.org" fg42/build-project-root)
|
||||||
(split-string
|
(expand-file-name "site/coh.org" build-dir))
|
||||||
(shell-command-to-string (format "find %s -iname \"*.org\"" org-directory))
|
|
||||||
"\n" t)))
|
|
||||||
|
|
||||||
(comment
|
(copy-file (expand-file-name "orgs/faq.org" fg42/build-project-root)
|
||||||
(all-org-files))
|
(expand-file-name "site/faq.org" build-dir))
|
||||||
|
|
||||||
|
(copy-file (expand-file-name "orgs/gpg.org" fg42/build-project-root)
|
||||||
|
(expand-file-name "site/gpg.org" build-dir))
|
||||||
|
|
||||||
|
(copy-file (expand-file-name "thoughts.org" fg42/build-project-root)
|
||||||
|
(expand-file-name "thoughts.org" build-dir)))
|
||||||
|
|
||||||
|
|
||||||
(defun get-all-tags ()
|
(command-> command args
|
||||||
"Return a list of all the tags in the org files."
|
((string= command "docs")
|
||||||
(seq-reduce
|
(do-command
|
||||||
;; all-tags is in (tags . tags->files) form
|
(require 'fg42/build/docs)
|
||||||
(lambda (all-tags file)
|
(fg42/build-docs build-dir))))
|
||||||
(if (get-file-global-props file "PAGE")
|
|
||||||
;; Ignore pages
|
|
||||||
all-tags
|
|
||||||
(with-temp-buffer
|
|
||||||
(insert-file-contents file)
|
|
||||||
(let ((tags (mapcar #'car (org-get-buffer-tags))))
|
|
||||||
(seq-reduce
|
|
||||||
(lambda (result tag)
|
|
||||||
(let ((tag-list (car result))
|
|
||||||
(tag->file (cdr result)))
|
|
||||||
(cons
|
|
||||||
;; Tag list
|
|
||||||
(if (member tag tag-list) tag-list (sort (cons tag tag-list) 'string<))
|
|
||||||
;; tag->file
|
|
||||||
(cons (cons tag
|
|
||||||
;; Current value of the the given tag (all the files
|
|
||||||
;; that contain that tag)
|
|
||||||
(append (list file) (cdr (assoc tag tag->file))))
|
|
||||||
tag->file))))
|
|
||||||
tags
|
|
||||||
all-tags)))))
|
|
||||||
(all-org-files)
|
|
||||||
'()))
|
|
||||||
|
|
||||||
|
|
||||||
(defun get-all-posts ()
|
|
||||||
"Return all the post org files.
|
|
||||||
Not pages."
|
|
||||||
(let ((files (all-org-files)))
|
|
||||||
(seq-reduce
|
|
||||||
(lambda (result file)
|
|
||||||
(let ((is-page? (string= (get-file-global-props file "PAGE") "true")))
|
|
||||||
(if (not is-page?)
|
|
||||||
;; It's a post
|
|
||||||
(cons
|
|
||||||
(list
|
|
||||||
;; This is not effecient since we parse the file
|
|
||||||
;; on each query, but who cares :D ?
|
|
||||||
(->epoch (get-file-global-props file "DATE"))
|
|
||||||
(get-file-global-props file "TITLE")
|
|
||||||
(replace-regexp-in-string "\\.org" ".html"
|
|
||||||
(file-name-nondirectory file)))
|
|
||||||
result)
|
|
||||||
result)))
|
|
||||||
files
|
|
||||||
'())))
|
|
||||||
|
|
||||||
|
|
||||||
(defun get-all-sorted-posts ()
|
|
||||||
"Return all posts in sorted order."
|
|
||||||
(sort
|
|
||||||
(get-all-posts)
|
|
||||||
(lambda (x y) (> (car x) (car y)))))
|
|
||||||
|
|
||||||
|
|
||||||
(comment
|
|
||||||
(get-all-sorted-posts))
|
|
||||||
|
|
||||||
|
|
||||||
(defun get-all-categories ()
|
|
||||||
"Return all the categories of the org files."
|
|
||||||
(seq-reduce
|
|
||||||
;; all-cats is in (cats . cat->files) form
|
|
||||||
(lambda (all-cats file)
|
|
||||||
(let ((is-page? (string= (get-file-global-props file "PAGE") "true"))
|
|
||||||
(cat (get-file-global-props file "CATEGORY"))
|
|
||||||
(cat-list (car all-cats))
|
|
||||||
(cat->file (cdr all-cats)))
|
|
||||||
|
|
||||||
(if (not is-page?)
|
|
||||||
(cons
|
|
||||||
;; Category list
|
|
||||||
(if (member cat cat-list) cat-list (sort (cons cat cat-list) 'string<))
|
|
||||||
;; cat->file
|
|
||||||
(cons (cons cat
|
|
||||||
;; Current value of the the given cat (all the files
|
|
||||||
;; under that category)
|
|
||||||
(append (list file) (cdr (assoc cat cat->file))))
|
|
||||||
cat->file))
|
|
||||||
all-cats)))
|
|
||||||
(all-org-files)
|
|
||||||
'()))
|
|
||||||
|
|
||||||
|
|
||||||
(comment
|
|
||||||
(get-file-global-props "./orgs/essays/serene-blah.org" "CATEGORY")
|
|
||||||
(get-all-categories))
|
|
||||||
|
|
||||||
|
|
||||||
(defun extra-headers ()
|
|
||||||
"Retun a list of extra header html tags."
|
|
||||||
(concat
|
|
||||||
"<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"))
|
|
||||||
|
|
||||||
|
|
||||||
(defun category-org-list ()
|
|
||||||
"Return a list of links to the categories in org format."
|
|
||||||
(let ((categories (get-all-categories)))
|
|
||||||
(mapconcat
|
|
||||||
(lambda (cat)
|
|
||||||
(let ((count (length (cdr (assoc cat (cdr categories))))))
|
|
||||||
(format " - [[./%s.html][%s(%s)]]" cat cat count)))
|
|
||||||
(car categories)
|
|
||||||
"\n")))
|
|
||||||
|
|
||||||
|
|
||||||
(defun tags-org-list ()
|
|
||||||
"Return a list of links to the tags in org format."
|
|
||||||
(let ((tags (get-all-tags)))
|
|
||||||
(mapconcat
|
|
||||||
(lambda (tag)
|
|
||||||
(let ((count (length (cdr (assoc tag (cdr tags))))))
|
|
||||||
(format " - [[./%s.html][%s(%s)]]" tag tag count)))
|
|
||||||
(car tags)
|
|
||||||
"\n")))
|
|
||||||
|
|
||||||
|
|
||||||
(defun latest-org-list (base-url)
|
|
||||||
"Return a list of links (using BASE-URL) to the tags in org format."
|
|
||||||
(let ((posts (get-all-sorted-posts)))
|
|
||||||
(mapconcat
|
|
||||||
(lambda (post)
|
|
||||||
(format " - [[%s/essays/%s][%s]]" base-url (nth 2 post) (nth 1 post)))
|
|
||||||
posts
|
|
||||||
"\n")))
|
|
||||||
|
|
||||||
|
|
||||||
(comment
|
|
||||||
(latest-org-list))
|
|
||||||
|
|
||||||
|
|
||||||
(defun pair-file-with-date (file)
|
|
||||||
"Return a pair for the given FILE with date as car and file as cdr."
|
|
||||||
(cons
|
|
||||||
(->epoch (get-file-global-props file "DATE"))
|
|
||||||
file))
|
|
||||||
|
|
||||||
|
|
||||||
(defun create-tag-pages (project-dir)
|
|
||||||
"Create all the tag files in the PROJECT-DIR."
|
|
||||||
(let ((tags (get-all-tags)))
|
|
||||||
(mapcar
|
|
||||||
(lambda (tag)
|
|
||||||
(let ((out (format "%s/orgs/tags/%s.org" project-dir tag))
|
|
||||||
(files (cdr (assoc tag (cdr tags)))))
|
|
||||||
(copy-template
|
|
||||||
(format "%s/templates/links_template.org" project-dir)
|
|
||||||
out
|
|
||||||
(mapconcat
|
|
||||||
(lambda (file-pair)
|
|
||||||
(format "- [[file:..%s][%s]]"
|
|
||||||
(replace-regexp-in-string (regexp-quote (from-root "/orgs")) "" (cdr file-pair) nil 'literal)
|
|
||||||
(get-file-global-props (cdr file-pair) "TITLE")))
|
|
||||||
|
|
||||||
(sort
|
|
||||||
(mapcar #'pair-file-with-date files)
|
|
||||||
(lambda (x y) (> (car x) (car y))))
|
|
||||||
"\n")
|
|
||||||
tag)))
|
|
||||||
(car tags))))
|
|
||||||
|
|
||||||
|
|
||||||
(defun create-category-pages (project-dir)
|
|
||||||
"Create all the category files in the PROJECT-DIR."
|
|
||||||
(let ((tags (get-all-categories)))
|
|
||||||
(mapcar
|
|
||||||
(lambda (tag)
|
|
||||||
(let ((out (format "%s/orgs/categories/%s.org" project-dir tag))
|
|
||||||
(files (cdr (assoc tag (cdr tags)))))
|
|
||||||
(copy-template
|
|
||||||
(format "%s/templates/links_template.org" project-dir)
|
|
||||||
out
|
|
||||||
(mapconcat
|
|
||||||
(lambda (file-pair)
|
|
||||||
(format "- [[file:..%s][%s]]"
|
|
||||||
(replace-regexp-in-string (regexp-quote (from-root "/orgs")) "" (cdr file-pair) nil 'literal)
|
|
||||||
(get-file-global-props (cdr file-pair) "TITLE")))
|
|
||||||
|
|
||||||
(sort
|
|
||||||
(mapcar #'pair-file-with-date files)
|
|
||||||
(lambda (x y) (> (car x) (car y))))
|
|
||||||
"\n")
|
|
||||||
tag)))
|
|
||||||
(car tags))))
|
|
||||||
|
|
||||||
|
|
||||||
(defun main ()
|
|
||||||
"The entry point to the build script."
|
|
||||||
|
|
||||||
;; Setup the emacs theme so htmlize can actually setup
|
|
||||||
;; the code highlighter
|
|
||||||
(load-theme 'dracula t)
|
|
||||||
(enable-theme 'dracula)
|
|
||||||
|
|
||||||
|
|
||||||
(setq project-root (car command-line-args-left))
|
|
||||||
|
|
||||||
;; We will use the org-agenda to extract all the tags
|
|
||||||
(setq org-directory (from-root orgs-files-dir))
|
|
||||||
(setq org-agenda-files (all-org-files))
|
|
||||||
|
|
||||||
(setf user-full-name author-name)
|
|
||||||
(setf user-mail-address author-email)
|
|
||||||
|
|
||||||
;; Disable default header links (top, next)
|
|
||||||
(setf org-html-home/up-format "")
|
|
||||||
(setf org-html-link-up "")
|
|
||||||
(setf org-html-link-home "")
|
|
||||||
(setf org-html-scripts "")
|
|
||||||
|
|
||||||
;; (org-babel-do-load-languages
|
|
||||||
;; 'org-babel-load-languages
|
|
||||||
;; '(
|
|
||||||
;; (emacs-lisp . t)
|
|
||||||
;; (org . t)
|
|
||||||
;; (shell . t)
|
|
||||||
;; (C . t)
|
|
||||||
;; (python . t)
|
|
||||||
;; (clojure .t)
|
|
||||||
;; (lisp . t)
|
|
||||||
;; (js . t)
|
|
||||||
;; (awk . t)))
|
|
||||||
|
|
||||||
;; ;; Never export the code block evaluation
|
|
||||||
;; (setq org-babel-default-header-args '((:eval . "never-export")))
|
|
||||||
;; (setq org-src-fontify-natively t)
|
|
||||||
|
|
||||||
(let ((build-dir (from-root "/build/"))
|
|
||||||
(base-url (if (prod-p) "https://lxsameer.com" "http://localhost:3003")))
|
|
||||||
(copy-template (from-root "/templates/index.org")
|
|
||||||
(from-root "/orgs/index.org")
|
|
||||||
(latest-org-list base-url))
|
|
||||||
|
|
||||||
(copy-template (from-root "/templates/categories.org")
|
|
||||||
(from-root "/orgs/categories/index.org")
|
|
||||||
(category-org-list))
|
|
||||||
|
|
||||||
(copy-template (from-root "/templates/tags.org")
|
|
||||||
(from-root "/orgs/tags/index.org")
|
|
||||||
(tags-org-list))
|
|
||||||
|
|
||||||
(create-tag-pages project-root)
|
|
||||||
(create-category-pages project-root)
|
|
||||||
|
|
||||||
(setq org-html-preamble #'preamble-fn)
|
|
||||||
(setq org-html-htmlize-output-type nil)
|
|
||||||
(setq org-latex-listings t)
|
|
||||||
|
|
||||||
(setq org-publish-project-alist
|
|
||||||
`(("lxsameer.com"
|
|
||||||
:base-directory ,(from-root "/orgs")
|
|
||||||
:root-directory ,project-root
|
|
||||||
:recursive t
|
|
||||||
:base-extension "org"
|
|
||||||
:publishing-directory ,build-dir
|
|
||||||
;; Exclude the blog archive index autogenerated below
|
|
||||||
;; Note that the regexp is relative to :base-directory
|
|
||||||
;; :exclude "^index.org"
|
|
||||||
:section-numbers nil
|
|
||||||
:with-author t
|
|
||||||
:with-drawers t
|
|
||||||
:html-format-drawer-function custom-drawer-format
|
|
||||||
:with-properties t
|
|
||||||
:with-tags t
|
|
||||||
:with-timestamps t
|
|
||||||
:with-toc nil
|
|
||||||
:base-url ,base-url
|
|
||||||
:html-link-home "/"
|
|
||||||
:html-head-extra ,(extra-headers)
|
|
||||||
:html-template ,(from-root "/templates/blog.html")
|
|
||||||
:html-page-preamble-template ,(from-root "/templates/page-preamble.html")
|
|
||||||
:html-post-preabmle-template ,(from-root "/templates/post-preamble.html")
|
|
||||||
:html-tags-template ,(from-root "/templates/tags.html")
|
|
||||||
:publishing-function org-html-publish-to-templated-html
|
|
||||||
:auto-sitemap t
|
|
||||||
:htmlized-source nil
|
|
||||||
:sitemap-folders ignore
|
|
||||||
:sitemap-style list
|
|
||||||
:sitemap-title "lxsameer's nest"
|
|
||||||
:sitemap-filename "sitemap.inc"
|
|
||||||
:sitemap-sort-files anti-chronologically
|
|
||||||
:html-format-headline-function headline-format
|
|
||||||
:makeindex nil)
|
|
||||||
|
|
||||||
("org->html"
|
|
||||||
:base-directory ,(from-root "/orgs")
|
|
||||||
:base-extension "org"
|
|
||||||
:publishing-directory ,build-dir
|
|
||||||
:recursive t
|
|
||||||
:publishing-function org-html-publish-to-html
|
|
||||||
:headline-levels 4
|
|
||||||
;; :html-preamble ,(use-html "templates/header.html")
|
|
||||||
;; :html-postamble ,(use-html "templates/footer.html")
|
|
||||||
:html-link-home "/"
|
|
||||||
:html-head-include-default-style nil
|
|
||||||
:html-head-include-scripts nil
|
|
||||||
:html-head-extra ,(extra-headers)
|
|
||||||
:makeindex nil)
|
|
||||||
|
|
||||||
("pdfs"
|
|
||||||
:base-directory ,(from-root "/orgs/essays")
|
|
||||||
:root-directory ,project-root
|
|
||||||
;;:publishing-directory ,(concat build-dir "/essays/")
|
|
||||||
:recursive t
|
|
||||||
:base-extension "org"
|
|
||||||
:publishing-directory ,build-dir
|
|
||||||
:publishing-function org-latex-publish-to-pdf)
|
|
||||||
|
|
||||||
|
|
||||||
("statics"
|
|
||||||
:base-directory ,project-root
|
|
||||||
:base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|svg"
|
|
||||||
:publishing-directory ,build-dir
|
|
||||||
:recursive t
|
|
||||||
:publishing-function org-publish-attachment)
|
|
||||||
("build" :components ("lxsameer.com" "statics"))))
|
|
||||||
|
|
||||||
(org-publish-project "build" t nil)
|
|
||||||
(message "Build complete.")))
|
|
||||||
|
|
||||||
|
|
||||||
(provide 'build)
|
(provide 'build)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
;;; ox-template.el --- A HTML exporter via templates for org-mode
|
;;; ox-template.el --- A HTML exporter via templates for org-mode
|
||||||
;; Copyright (C) 2021 Sameer Rahmani
|
;; Copyright (C) 2021-2022 Sameer Rahmani
|
||||||
;; Author: Sameer Rahmani <lxsameer@gnu.org>
|
;; Author: Sameer Rahmani <lxsameer@gnu.org>
|
||||||
;; URL: https://devheroes.codes/lxsameer/lxhome
|
;; URL: https://devheroes.codes/lxsameer/lxhome
|
||||||
;;
|
;;
|
||||||
|
@ -120,6 +120,9 @@ call `org-html-render-tag-template' otherwise will call ORIG-FN."
|
||||||
("head" (plist-get info :html-head-extra))
|
("head" (plist-get info :html-head-extra))
|
||||||
("base-url" (plist-get info :base-url))
|
("base-url" (plist-get info :base-url))
|
||||||
("preamble" (org-html--build-pre/postamble 'preamble info))
|
("preamble" (org-html--build-pre/postamble 'preamble info))
|
||||||
|
("title" (get-file-global-props (plist-get info :input-file) "TITLE"))
|
||||||
|
("description" (or (get-file-global-props (plist-get info :input-file) "DESC")
|
||||||
|
""))
|
||||||
("postamble" (org-html--build-pre/postamble 'postamble info)))))
|
("postamble" (org-html--build-pre/postamble 'postamble info)))))
|
||||||
(mustache-render (use-html template-name) ctx)))
|
(mustache-render (use-html template-name) ctx)))
|
||||||
|
|
||||||
|
@ -133,6 +136,7 @@ call `org-html-render-tag-template' otherwise will call ORIG-FN."
|
||||||
|
|
||||||
|
|
||||||
(defun custom-drawer-format (name content)
|
(defun custom-drawer-format (name content)
|
||||||
|
"Return the drawer format for the given drawer NAME and CONTENT."
|
||||||
(format "<section class='%s-drawer'><p>%s</p>%s</section>"
|
(format "<section class='%s-drawer'><p>%s</p>%s</section>"
|
||||||
(downcase name)
|
(downcase name)
|
||||||
(capitalize name)
|
(capitalize name)
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
;;; Commentary:
|
;;; Commentary:
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
|
(require 'org-element)
|
||||||
|
|
||||||
(defmacro comment (&rest body)
|
(defmacro comment (&rest body)
|
||||||
"Ignore the given BODY."
|
"Ignore the given BODY."
|
||||||
nil)
|
nil)
|
||||||
|
@ -30,7 +32,7 @@
|
||||||
"Return the value of the given global PROP in the given org FILE."
|
"Return the value of the given global PROP in the given org FILE."
|
||||||
(with-temp-buffer
|
(with-temp-buffer
|
||||||
(insert-file-contents file)
|
(insert-file-contents file)
|
||||||
(message (get-buffer-global-props prop))))
|
(get-buffer-global-props prop)))
|
||||||
|
|
||||||
|
|
||||||
(comment
|
(comment
|
||||||
|
|
|
@ -28,3 +28,13 @@ pre.src {
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.footdef {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.footpara {
|
||||||
|
margin: 2px 5px;
|
||||||
|
}
|
63
orgs/coh.org
63
orgs/coh.org
|
@ -4,29 +4,39 @@
|
||||||
#+DATE: 2021-02-11
|
#+DATE: 2021-02-11
|
||||||
#+TITLE: Code of Honor
|
#+TITLE: Code of Honor
|
||||||
#+PAGE: true
|
#+PAGE: true
|
||||||
|
#+DESC: A man is nothing without his honor
|
||||||
|
|
||||||
I always try to live by my code of honor. A man is nothing without his honor. “A sin is to betray your beliefs”.
|
I always try to live by my code of honor. A man is nothing without his honor. "A sin is to betray your code".
|
||||||
|
|
||||||
* Honorable life
|
* Honorable life
|
||||||
- Don’t betray your code of honor.
|
- Don't betray your code of honor.
|
||||||
- Defend your Bushido way.
|
- Defend your Bushido way.
|
||||||
- Live life as a Honorable Man.
|
- Live life as an Honorable Man.
|
||||||
- Don’t lie.
|
- Don't lie.
|
||||||
- Honesty takes courage.
|
- Honesty takes courage.
|
||||||
- Don’t talk without a knowledge to support it.
|
- Don't talk without a knowledge to support it.
|
||||||
- “Don’t argue with the crazy guy”.
|
- "Don't argue with the crazy guy".
|
||||||
- Always follow your sense of Justice
|
- Always follow your sense of Justice
|
||||||
- Feel the pain of others.
|
- Feel the pain of others.
|
||||||
- Always put your self in people’s shoe before making any decision.
|
- Always put your self in people's shoe before making any decision.
|
||||||
- A simple smile goes a long way.
|
- A simple smile goes a long way.
|
||||||
- There’s no honor in winning by cheating.
|
- There's no honor in winning by cheating.
|
||||||
- “If you fall down 7 times make sure to get up 8 times.”
|
- "If you fall down 7 times make sure to get up 8 times."
|
||||||
- Protect your promises.
|
- Protect your promises.
|
||||||
- “For a samurai everywhere is Japan.”
|
- "For a samurai everywhere is Japan."
|
||||||
- Holding back is disrespectful to your opponent.
|
- Holding back is disrespectful to your opponent.
|
||||||
- Live life in your way.
|
- Live life in your way.
|
||||||
- “Respect is earned, not given”, So earn it.
|
- "Respect is earned, not given", So earn it.
|
||||||
- “A man is much more than the job he holds and clothes he wears.”
|
- "A man is much more than the job he holds and clothes he wears."
|
||||||
|
- "If fail and you return home coz you're not good enough, you are welcome here. But if you come back because
|
||||||
|
you didn't give your all, find another home."
|
||||||
|
|
||||||
|
#+BEGIN_QUOTE
|
||||||
|
The only true wisdom is in knowing you know nothing. I am the wisest man alive, for I know one thing,
|
||||||
|
and that is that I know nothing.
|
||||||
|
|
||||||
|
–- Socrates
|
||||||
|
#+END_QUOTE
|
||||||
|
|
||||||
* Science
|
* Science
|
||||||
|
|
||||||
|
@ -47,6 +57,29 @@ I always try to live by my code of honor. A man is nothing without his honor.
|
||||||
–- [[https://en.wikipedia.org/wiki/Ibn_al-Haytham][Ibn al-Haytham]]
|
–- [[https://en.wikipedia.org/wiki/Ibn_al-Haytham][Ibn al-Haytham]]
|
||||||
#+END_QUOTE
|
#+END_QUOTE
|
||||||
|
|
||||||
|
#+BEGIN_QUOTE
|
||||||
|
Wonder is the beginning of wisdom.
|
||||||
|
|
||||||
|
–- Socrates
|
||||||
|
#+END_QUOTE
|
||||||
|
|
||||||
|
** Five basic principles of a scientist
|
||||||
|
- Question Authorities, No idea is true just because someone says so, *Including me*.
|
||||||
|
- Think for yourself. Question yourself.
|
||||||
|
- Don't believe anything just because you want to, believing something doesn't make it so. Test ideas
|
||||||
|
by evidence gained from observation and experiments. If a favorite idea failed a well designed test,
|
||||||
|
*It's wrong, get over it*.
|
||||||
|
- Follow the evidence, where ever it leads. If you have no evidence, reserve judgment.
|
||||||
|
- And *the most important* of all, remember you could be wrong, even the best scientists have been wrong
|
||||||
|
about something. every great scientist in the history made mistake. Of course they did, we are only human.
|
||||||
|
Science keeps us from fooling ourselves and *each other*
|
||||||
|
|
||||||
|
** To myself
|
||||||
|
- Being a scientist means to be underestimated or misunderstood by others. When you come across people who
|
||||||
|
ignore you, or don't take you seriously just stick to your scientific principals. Science is absolute but
|
||||||
|
people's opinion are not. Think of those scientists who had to suffer in the past for the same reason,
|
||||||
|
you're not alone.
|
||||||
|
|
||||||
* Software Engineering
|
* Software Engineering
|
||||||
|
|
||||||
- Simplicity over Complexity
|
- Simplicity over Complexity
|
||||||
|
@ -59,9 +92,9 @@ I always try to live by my code of honor. A man is nothing without his honor.
|
||||||
- Docs before new features
|
- Docs before new features
|
||||||
|
|
||||||
** Library design
|
** Library design
|
||||||
Major releases can contain backward incompatible changes. It’s better to use a different code name
|
Major releases can contain backward incompatible changes. It's better to use a different code name
|
||||||
instead of a major version number change to indicate that there going to be backward incompatible changes.
|
instead of a major version number change to indicate that there going to be backward incompatible changes.
|
||||||
Minor releases shouldn’t break the dependency versions. E.g: X(0.6.0) depends on Python(3.5.x), X(0.7.0)
|
Minor releases shouldn't break the dependency versions. E.g: X(0.6.0) depends on Python(3.5.x), X(0.7.0)
|
||||||
should depends on the same version python
|
should depends on the same version python
|
||||||
|
|
||||||
** New Feature Checklist
|
** New Feature Checklist
|
||||||
|
@ -80,4 +113,4 @@ I always try to live by my code of honor. A man is nothing without his honor.
|
||||||
+ Network
|
+ Network
|
||||||
+ External storage
|
+ External storage
|
||||||
+ Database
|
+ Database
|
||||||
+ “The Cloud”
|
+ "The Cloud"
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
#+SETUPFILE: ../../config.org
|
||||||
|
#+TAGS: Physics(p) Thoughts(t)
|
||||||
|
#+CATEGORY: Science
|
||||||
|
#+DATE: 2022-06-07
|
||||||
|
#+TITLE: Anti-matter and time
|
||||||
|
#+DESC: My random thoughts on Positron, time and negative energy
|
||||||
|
|
||||||
|
#+INCLUDE: ../../thoughts.org
|
||||||
|
|
||||||
|
*** I was thinking ... :Physics:Thoughts:
|
||||||
|
Since [[https://en.wikipedia.org/wiki/Positron][Positron]] has a negative energy according to [[https://en.wikipedia.org/wiki/Paul_Dirac][Dirac]] and it can be interpreted as an
|
||||||
|
[[https://en.wikipedia.org/wiki/Electron][Electron]] going back in time, what would happen to the [[https://en.wikipedia.org/wiki/Entropy][entropy]] of a system made out of
|
||||||
|
anti-matter?
|
||||||
|
|
||||||
|
Positron is the counterpart or the anti-particle of Electron, it has the same mass but the opposite
|
||||||
|
electric charge and negative energy. According to [[https://en.wikipedia.org/wiki/Richard_Feynman][Feynman]] we can think of Positron as an Electron
|
||||||
|
moving backward in time. Or we can think that Electron and Positron are the same thing, an Electron
|
||||||
|
that is bouncing forward in time and backward again. Bouncing between an Electron and Positron
|
||||||
|
characteristics. Anyway, according to the [[https://en.wikipedia.org/wiki/General_relativity][general relativity]], time is relative and not absolute and
|
||||||
|
two observers of the same phenomena might have different perception of time relative to their state
|
||||||
|
in spacetime. But another way of thinking about time in my head is entropy. According to the
|
||||||
|
[[https://en.wikipedia.org/wiki/Second_law_of_thermodynamics][second law of thermodynamics]] entropy of system increase overtime (to put it simply). Therefore,
|
||||||
|
future is the time with more entropy than today or simply the movement vector of time is in the same
|
||||||
|
direction as the entropy vector in our perception of time.
|
||||||
|
|
||||||
|
So, If Positron is moving back in time, does it mean that Positron's relative vector of time is
|
||||||
|
pointing the opposite direction of the entropy vector thus, entropy decreases relative to Positron's
|
||||||
|
time ??? If there's a universe made out of anti-matter, would it be just the past relative to present of
|
||||||
|
our matter based universe ???
|
||||||
|
|
||||||
|
"As always these thoughts baffles me. I have to look into it."
|
|
@ -0,0 +1,31 @@
|
||||||
|
#+SETUPFILE: ../../config.org
|
||||||
|
#+TAGS: Physics(p) Thoughts(t) Astrophysics(a)
|
||||||
|
#+CATEGORY: Science
|
||||||
|
#+DATE: 2021-04-04
|
||||||
|
#+TITLE: Beyond the big bang
|
||||||
|
#+DESC: My random thoughts on before the big bang
|
||||||
|
#+INCLUDE: ../../thoughts.org
|
||||||
|
|
||||||
|
*** I was thinking ... :Physics:Thoughts:Astrophysics:
|
||||||
|
Today, [[https://pouyacode.net/][Pouya]] and I were talking randomly about the Doppler Effect on light and whether it causes
|
||||||
|
color shift or not (Spoiler alert, [[https://www.thoughtco.com/doppler-effect-in-light-red-shift-and-blue-shift-2699033][it does]]) and how the universe was before the big bang.
|
||||||
|
|
||||||
|
After our discussion and during my workout and the post workout shower I couldn't stop thinking
|
||||||
|
about the universe before the big bang. What if the big bang is just another event in the universe,
|
||||||
|
a big big one, some thing that makes an ultra nova like zit pop in the scale of the universe ?
|
||||||
|
I mean what if there are more galaxies an objects in the universe, way way further out from the visible
|
||||||
|
universe of the stuff resulted from the big bang ? what if their gravitational forces are the reason
|
||||||
|
the universe as we know it is expanding ? If such entities exist, how they came to exist ? Do they
|
||||||
|
follow the same principles as our universe ? What a sec, is that the multiverse with no boundaries ?
|
||||||
|
|
||||||
|
Some people believe that the universe is on the surface of sphere, which means one day the light from out
|
||||||
|
own past will reach us by cycling around the giant sphere. In that case what makes the inside of the sphere ?
|
||||||
|
|
||||||
|
Who says that the universe has to have only 4 dimensions ? Many theories suggest higher dimensions. What if
|
||||||
|
the big bang is just a big big event in our visible dimensions which gave birth to our world but the universe
|
||||||
|
used to exist in other dimensions ? What if the dark energy is in fact the gravitational pull caused by entities
|
||||||
|
in other dimensions which we can't see. What if the vacuum effect in the quantum field theory is the ripples
|
||||||
|
made from event or objects in other dimensions ????
|
||||||
|
|
||||||
|
Well I just stood in the shower under the downfall of hot water and lost into my thoughts till the water started
|
||||||
|
to get cold and ruined my chain of thoughts :)).
|
|
@ -3,6 +3,7 @@
|
||||||
#+CATEGORY: Engineering
|
#+CATEGORY: Engineering
|
||||||
#+DATE: 2019-12-07
|
#+DATE: 2019-12-07
|
||||||
#+TITLE: Choosing the target platform
|
#+TITLE: Choosing the target platform
|
||||||
|
#+DESC: What platform is suitable for Serene ?
|
||||||
|
|
||||||
After wrapping my head around the [[file:rational-and-a-name.org][rational]] of [[file:my-new-programming-language.org][My new programming language]], I have
|
After wrapping my head around the [[file:rational-and-a-name.org][rational]] of [[file:my-new-programming-language.org][My new programming language]], I have
|
||||||
a big decision to make. Choose a platform.
|
a big decision to make. Choose a platform.
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
#+SETUPFILE: ../../config.org
|
||||||
|
#+TAGS: Physics(p) Thoughts(t)
|
||||||
|
#+CATEGORY: Science
|
||||||
|
#+DATE: 2021-03-16
|
||||||
|
#+TITLE: Dark matter and other life forms
|
||||||
|
#+DESC: My random thoughts on dark matter
|
||||||
|
|
||||||
|
#+INCLUDE: ../../thoughts.org
|
||||||
|
|
||||||
|
*** I was thinking ... :Physics:Thoughts:
|
||||||
|
about dark matter a bit earlier today. We know that the ordinary matter counts for
|
||||||
|
~5% of the mass of the universe and the rest is kinda on dark matter's shoulders. It doesn't
|
||||||
|
interact with light and in our knowledge almost with anything else as well yet it's there and
|
||||||
|
it's massive. We know that neutrinos which are very weakly interacting, electrically neutral particles
|
||||||
|
are part of the entity or thing that we call the "dark matter". But since it has very little mass
|
||||||
|
it would only take a relatively small amount of mass to account for all the dark matter out there.
|
||||||
|
|
||||||
|
Anyway, I was thinking that we exist because of the asymmetry of matter and anit-matter and the
|
||||||
|
matter that creates us and the entire 4.5 billion years history of the earth is just about 5% of the
|
||||||
|
universe. Galaxies that look like a disk to us in fact are more like spheres that the rest of the sphere
|
||||||
|
is fill with the dark matter. What if the rest of a galaxy that we can't see is no just random dark
|
||||||
|
matter, I mean what if there are more to a galaxy rather that the starts that we see? what if there are
|
||||||
|
planetary systems made out of the dark matter ? What if these planetary systems grew their own life form
|
||||||
|
via evolution? A life form that doesn't interact with ordinary matter (ordinary to us) and light ?
|
||||||
|
How they might be ? How we might ever learn about them ?
|
||||||
|
|
||||||
|
"As always these thoughts baffles me. I have to look into it."
|
|
@ -0,0 +1,69 @@
|
||||||
|
#+SETUPFILE: ../../config.org
|
||||||
|
#+TAGS: Life(l) Health(h)
|
||||||
|
#+CATEGORY: Life
|
||||||
|
#+DATE: 2013-10-29
|
||||||
|
#+TITLE: Fatty Liver
|
||||||
|
#+DESC: My findings on a fatty liver
|
||||||
|
|
||||||
|
#+BEgIN_QUOTE
|
||||||
|
*Disclaimer*: In no way, I'm an expert in medicine or medical science. I wrote this informal essay based
|
||||||
|
on my research in order to help myself. Read it with a grain of salt. Consult a doctor and do you own research
|
||||||
|
as well.
|
||||||
|
#+END_QUOTE
|
||||||
|
|
||||||
|
#+BEGIN_QUOTE
|
||||||
|
This post has survived several rewrites of my website. Sadly, I've lost the references for my research.
|
||||||
|
#+END_QUOTE
|
||||||
|
|
||||||
|
Years ago I used to be a professional basketball player, playing as a point guard. Some day, I broke my foot
|
||||||
|
in a match and I had to stay home for about 6 month. Back then, I thought eating more food equals to a
|
||||||
|
faster recovery from my injury ( Yeah I know I was young ). Before the injury, I was about 73Kg, and
|
||||||
|
after, I turned into a 117Kg ( Wow I knooww) monster.
|
||||||
|
|
||||||
|
Long story short afterward I tried really hard to lose weight, I couldn't lose a considerable amount of weight.
|
||||||
|
As may most of you experienced before, might lose weight in while we're on a diet, but the lost weight will find
|
||||||
|
its way back when the diet finishes.
|
||||||
|
|
||||||
|
After 3 years of that incident, I started *Kyokushin Karate*, one of the most brutal, heavy and tough sports
|
||||||
|
possible. Also I was in a diet most of the time. I lost weight a lot but as soon as I ended the diet, I
|
||||||
|
gained that lost weight again. I always was curious why is that ? Why as soon as I end the diet I gain weight
|
||||||
|
again even though I'm trying really hard. A week ago I found out the truth behind this problem.The liver,
|
||||||
|
is the most important body part responsible for storing extra energy of food as fat, and burn fat and
|
||||||
|
produce energy when body needs it. In this era, when people eat fast foods, breath poisonous air pollution
|
||||||
|
instead of clean air and lots of other reasons, Most of us are suffering from a fatty liver in different
|
||||||
|
levels. A fatty liver can't do its job perfectly, So it can't burn fat correctly and that's because
|
||||||
|
after a diet people gains weight again. No matter how hard they try.
|
||||||
|
|
||||||
|
* OK, now what's can we do ? :Life:Health:
|
||||||
|
First of all, physical workout and training is very helpful for your liver and help you burn more fat.
|
||||||
|
Second of all fatty liver have much more fat stored in its cells which causes huge damage to the liver.
|
||||||
|
In order to heal the damaged cells, there are several drugs and medicines which you should take, For example:
|
||||||
|
|
||||||
|
- Vitamin E
|
||||||
|
- Selenium
|
||||||
|
- Betaine
|
||||||
|
- Metformin
|
||||||
|
- Rosiglitazone
|
||||||
|
- Pioglitazone
|
||||||
|
|
||||||
|
Using these medicines we can easily heal our liver cells within a 3 month period. Also there is an other
|
||||||
|
material which has a really incredible effect. [[https://en.wikipedia.org/wiki/Silybum_marianum][Silybum marianum]] is a kinda rare plant which grows mostly in
|
||||||
|
dry places. Silybum marianum is one of the well known rich sources for milk thistle.
|
||||||
|
|
||||||
|
Research suggests that milk thistle extracts both prevents and repairs damage to the liver from toluene and/or
|
||||||
|
xylene. Workers who had been exposed to vapors from toluene and/or xylene for 5–20 years were given either
|
||||||
|
a standardized milk thistle extract (80% silymarin) or placebo for 30 days. The workers took the milk thistle
|
||||||
|
extract, showed significant improvement in their liver function tests (ALT and AST) and platelet counts vs
|
||||||
|
the placebo group.
|
||||||
|
|
||||||
|
LiverGol is a commercial supplement which contains a great deal of Silybum marianum. There isn't any known
|
||||||
|
side effect for this supplement[fn:1][fn:2]. I easily healed my liver using.
|
||||||
|
|
||||||
|
I tried to summarize everything and avoid blabbing, So long story short the key to a successful diet
|
||||||
|
is to have a healthy liver.
|
||||||
|
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
|
[fn:1] At least I couldn't find any side effect.
|
||||||
|
[fn:2] I don't have any affiliation with the company behind LiverGol.
|
|
@ -0,0 +1,272 @@
|
||||||
|
#+SETUPFILE: ../../config.org
|
||||||
|
#+TAGS: Git(g)
|
||||||
|
#+CATEGORY: Engineering
|
||||||
|
#+DATE: 2022-02-19
|
||||||
|
#+TITLE: Git Etiquette
|
||||||
|
#+DESC: A rather long essay on how to use Git in a civilized way
|
||||||
|
|
||||||
|
* Rational :Git:
|
||||||
|
The ability of making tools and using them is one of the many things that makes us special
|
||||||
|
and the skills to use tools properly is what makes some of us
|
||||||
|
elites.
|
||||||
|
|
||||||
|
As software engineers, interacting with [[https://git-scm.com/][Git]] is an important part of our daily life. These days
|
||||||
|
*Git* is the de facto standard of version control systems and almost everyone uses it. *Git* is
|
||||||
|
of one those special tools that every engineer has to be familiar with, since it's widely spread
|
||||||
|
in the tech world. It will be a big surprise if you find a new project or company that is not using
|
||||||
|
*Git*.
|
||||||
|
|
||||||
|
As a free software contributor, I spend all my professional career in FOSS communities and projects
|
||||||
|
and proper use of *Git* seems so natural to me. But to my surprise, every now and the I witness
|
||||||
|
how some "commercial engineers" (air quote) uses git and it makes me sad that in a commercial space
|
||||||
|
which you get paid to build technology people do so poorly. After a lot of these type of incidents
|
||||||
|
I've decided to put together a document to help improving my team's *Git* workflows. While there
|
||||||
|
are plenty of reading materials up on the internet dedicated to *Git best practices*, I thought it
|
||||||
|
might be useful to publish that document publicly to help others as well. For the lack of a better
|
||||||
|
word I've chose the title *"Git Etiquette"*. Following Git etiquette help teams to get more out of
|
||||||
|
their git workflows and avoid frustration.
|
||||||
|
|
||||||
|
I'll try to keep it short and refer to essays from others who explained it much better that me. I
|
||||||
|
borrowed some of the words from the others and I included most of them in the resources section to
|
||||||
|
best of my ability, but since I wrote the original document so long ago and that suppose to be a
|
||||||
|
private doc for few people some of the resources might have been lost.
|
||||||
|
|
||||||
|
Also, I'll add more items to the least overtime.
|
||||||
|
|
||||||
|
* Git Commits
|
||||||
|
Commits are the building blocks of version controlling via Git. It's obvious that improving the commit
|
||||||
|
quality will result in improvement in the overall quality of the repository.
|
||||||
|
|
||||||
|
** Single purpose commits
|
||||||
|
Oftentimes engineers working on something get sidetracked into doing too many things when working on
|
||||||
|
one particular thing like when you are trying to fix one particular bug and you spot another one,
|
||||||
|
and you can’t resist the urge to fix that as well. And another one. Soon, it snowballs and you end
|
||||||
|
up with so many changes all going together in one commit.
|
||||||
|
|
||||||
|
This is problematic, and it is better to keep commits as small and focused as possible for many
|
||||||
|
reasons, including:
|
||||||
|
|
||||||
|
- It makes it easier for other people in the team looking at your change, making code reviews
|
||||||
|
more efficient.
|
||||||
|
- If the commit has to be rolled back completely, it’s far easier to do so.
|
||||||
|
- It's straightforward to track these changes with your ticketing system.
|
||||||
|
- It helps you mentally parse changes you’ve made using git log.
|
||||||
|
|
||||||
|
A commit should be a wrapper for related changes. For example, fixing two different bugs should
|
||||||
|
produce two separate commits. Small commits make it easier for other team members to understand
|
||||||
|
the changes and roll them back if something went wrong. With tools like the staging area and the
|
||||||
|
ability to stage only parts of a file, Git makes it easy to create very granular commits.
|
||||||
|
|
||||||
|
** Commit Messages
|
||||||
|
On many occasions we need to inspect the *Git* history to find something. A commit, specific changes,
|
||||||
|
find clues about errors or even to find the engineer who made a certain change. I have bittersweet
|
||||||
|
experience when it comes to dealing with commit messages in the Git history of projects. Let me
|
||||||
|
demonstrate with real examples.
|
||||||
|
|
||||||
|
I saw it many times in commercial teams that engineers don't bother with writing a proper and useful
|
||||||
|
Git commit message. For some reason that is beyond my understanding, they think having *"I hate my
|
||||||
|
life!"* as commit message for a commit with ~1200 lines of change in a repository with more than
|
||||||
|
~300k commits (at the time) that is used by about 200 engineers is a cool thing to do. I came across
|
||||||
|
this commit message long ago when I was trying to figure out why a service malfunctions. This commit
|
||||||
|
message wasn't helpful at all and I had to read through the diff to figure out whether or not that
|
||||||
|
commit is the root of the issue. I can tell so many stories like this one but for the sake of this
|
||||||
|
essay one would be enough.
|
||||||
|
|
||||||
|
But let's have a look at real Git history of a repository that I don't like at all (using =--one-line=
|
||||||
|
flag):
|
||||||
|
|
||||||
|
#+BEGIN_SRC
|
||||||
|
2683332a333a Update tests
|
||||||
|
3315442a4983e Remove icon from manage header
|
||||||
|
aa234e8aa83f8 test fix
|
||||||
|
29c35ba3adcee Class migration
|
||||||
|
fbde3a265ab3f Migrate header styles
|
||||||
|
01eaac4b4cc13 tests
|
||||||
|
8d004a970eef7 fix tests
|
||||||
|
d2890dfdc360 add tests
|
||||||
|
91c2aa31720f2 add test for notice variable
|
||||||
|
135a2df25e86a fix tests
|
||||||
|
3aa4101546a93 refactor
|
||||||
|
0eaae58006f51 add test for global variable
|
||||||
|
3ae7ee7297104 remove unnecessary check
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
These commits are taken from a repository with more than 400k commits and many active contributors
|
||||||
|
in a commercial space (Don't worry, the SHAs are not the original SHAs).
|
||||||
|
|
||||||
|
In the other hand, few weeks ago I pulled from the [[https://llvm.org/][LLVM]] repository and built in again (I do this weekly)
|
||||||
|
and tried to build the [[https:://serene-lang.org][Serene compiler]] (a programming language that I'm working on) against that.
|
||||||
|
But the compilation failed with an error like "Identifier is unknown". I grepped the Git logs of LLVM
|
||||||
|
repository and saw a commit and all of a sudden smiled and praised the author in my mind. Here is
|
||||||
|
the commit message (I removed the commit details):
|
||||||
|
|
||||||
|
#+BEGIN_SRC
|
||||||
|
Date: Wed Jan 12 11:20:18 2022 -0800
|
||||||
|
|
||||||
|
[mlir] Finish removing Identifier from the C++ API
|
||||||
|
|
||||||
|
There have been a few API pieces remaining to allow for a smooth transition for
|
||||||
|
downstream users, but these have been up for a few months now. After this only
|
||||||
|
the C API will have reference to "Identifier", but those will be reworked in a followup.
|
||||||
|
|
||||||
|
The main updates are:
|
||||||
|
* Identifier -> StringAttr
|
||||||
|
* StringAttr::get requires the context as the first parameter
|
||||||
|
- i.e. `Identifier::get("...", ctx)` -> `StringAttr::get(ctx, "...")`
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
It was so obvious how to fix my issue by looking at this fantastic commit message.
|
||||||
|
|
||||||
|
Which one would you rather read? Which one helps you understand what happened in any specific commit ?
|
||||||
|
|
||||||
|
According to [[https://cbea.ms/git-commit/][Chris Beams]], A well-crafted Git commit message is the best way to communicate the context
|
||||||
|
about a change to other engineers (and our future selves). A diff will tell you what changed,
|
||||||
|
but only the commit message can properly tell you why.
|
||||||
|
|
||||||
|
Peter Hutterer [[https://who-t.blogspot.com/2009/12/on-commit-messages.html][makes this point]] well:
|
||||||
|
|
||||||
|
#+begin_quote
|
||||||
|
Re-establishing the context of a piece of code is wasteful. We can’t avoid it completely, so our
|
||||||
|
efforts should go to [[https://www.osnews.com/story/19266/wtfsm/][reducing it]] [as much] as possible. Commit messages can do exactly that and
|
||||||
|
as a result, a commit message shows whether a developer is a good collaborator.
|
||||||
|
#+end_quote
|
||||||
|
|
||||||
|
If you ever used =git log= or any other Git sub command that requires interactions with commits
|
||||||
|
(which many of them do), you'll understand what a valuable asset, a well written commit message
|
||||||
|
is.
|
||||||
|
|
||||||
|
The Git history is just bunch of commits in a certain order. It's up to the engineers to make the
|
||||||
|
most of it. With the growth of any project, maintenance becomes an issue and the messier your history
|
||||||
|
is the harder it is to maintain the project. Also it would be painful for other to be involved in the
|
||||||
|
project too.
|
||||||
|
|
||||||
|
|
||||||
|
There are seven easy rules that you can follow to rock your commit messages:
|
||||||
|
|
||||||
|
1. Separate subject from body with a blank line
|
||||||
|
2. Limit the subject line to 50 characters
|
||||||
|
3. Capitalize the subject line
|
||||||
|
4. Do not end the subject line with a period
|
||||||
|
5. Use the imperative mood in the subject line
|
||||||
|
6. Wrap the body at 72 characters
|
||||||
|
7. Use the body to explain what and why vs. how
|
||||||
|
|
||||||
|
I highly recommend to read the [[https://cbea.ms/git-commit/][How to Write a Git Commit Message]] post from Chris Beams that
|
||||||
|
explain these rules in depth.
|
||||||
|
|
||||||
|
** Commit early, commit often
|
||||||
|
Git works best, and works in your favor, when you commit your work often. Instead of waiting to
|
||||||
|
make the commit perfect, it is better to work in small chunks and keep committing your work. Personally,
|
||||||
|
I have found it much easier to have smaller commits that group together related changes. This way
|
||||||
|
you can easily revert commits that you don't like and cherry pick those that you want and avoid dealing
|
||||||
|
with un-necessary changes that comes in a commit.
|
||||||
|
|
||||||
|
If you are working on a feature branch that could take some time to finish, it helps you keep
|
||||||
|
your code updated with the latest changes so that you avoid conflicts.
|
||||||
|
|
||||||
|
Also, Git only takes full responsibility for your data when you commit. It helps you from losing work,
|
||||||
|
reverting changes, and helping trace what you did when using =git-reflog=.
|
||||||
|
|
||||||
|
|
||||||
|
** Don’t commit generated files
|
||||||
|
This one is fairly obvious, but many times I had to look at the history to figure out who has committed
|
||||||
|
an auto generated file or a massive file into the repository.
|
||||||
|
|
||||||
|
Generally, only those files should be committed that have taken manual effort to create, and cannot
|
||||||
|
be re-generated. Files can be re-generated at will, can be generated any time, and normally don’t
|
||||||
|
work with line-based diff tracking as well. It is useful to add a =.gitignore= file in your
|
||||||
|
repository’s root to automatically tell Git which files or paths you don’t want to track.
|
||||||
|
|
||||||
|
* Don’t alter published history
|
||||||
|
Once a commit has been merged to an upstream default branch (and is visible to others), it is strongly
|
||||||
|
advised not to alter history. Git and other VCS tools to rewrite branch history, but doing so is
|
||||||
|
problematic for everyone who has access to the repository. While =git-rebase= is a useful feature,
|
||||||
|
it should only be used on branches that only you are working with (Private branches).
|
||||||
|
|
||||||
|
One of the key aspects of Git is its distributed nature. Meaning that everyone can have their own
|
||||||
|
repositories and push their commits to their own fork and send pull requests to others to pull from
|
||||||
|
their repositories. This process is centralized these days via Git hosting services (While the
|
||||||
|
provide the forking functionality, that is not a common thing to do in a commercial and closed source
|
||||||
|
project) specially in the commercial space that causes engineers to share feature branches. It
|
||||||
|
happens to me many time in different roles that some one force pushed to a public (within the org)
|
||||||
|
branch and screwed everyone's workflow. For your the sake of your peace of mind and others sanity,
|
||||||
|
*DO NOT CHANGE THE PUBLIC HISTORY*.
|
||||||
|
|
||||||
|
It's kind of a joke, but if you are a public force pusher, I'll end my friendship with you.
|
||||||
|
|
||||||
|
|
||||||
|
Having said that, there would inevitably be occasions where there’s a need for a history rewrite
|
||||||
|
on a published branch. Extreme care must be practiced while doing so.
|
||||||
|
|
||||||
|
* Merge VS Rebase
|
||||||
|
|
||||||
|
The golden rule is to never rebase on public branches and always merge to public branches.
|
||||||
|
When it comes to merge vs rebase, there are two simple rules.
|
||||||
|
|
||||||
|
*Note:* It's better to use squash and merge instead of normal merge because in projects with
|
||||||
|
many contributors, it is easier to maintain a Git history on the main branch that contains
|
||||||
|
one commit per feature.
|
||||||
|
|
||||||
|
** Don’t change other people’s history
|
||||||
|
You must never ever destroy other peoples history. You must not rebase commits other people did.
|
||||||
|
Basically, if it is not your branch you can't rebase it. Notice that this really is about other
|
||||||
|
people's history, not about other people's code. If you want to pull down some changes from other
|
||||||
|
developers into your branch, it’s fine to rebase, because it’s their code but it’s your history.
|
||||||
|
So you can go wild on the rebase thing on it, even though you didn't write the code, as long as
|
||||||
|
the commit itself is your private one.
|
||||||
|
|
||||||
|
Minor clarification: once you've published your history in a public branch, other people may be
|
||||||
|
using it, and so now it's clearly not your private history anymore. So the minor clarification
|
||||||
|
really is that it's not just about *your commit*, it's also about it being private to your tree,
|
||||||
|
and you haven't pushed it out and announced it yet.
|
||||||
|
|
||||||
|
** Don’t expose your unfinished work to public
|
||||||
|
Keep your own history readable. Some people do this by just working things out in their head first,
|
||||||
|
and not making mistakes. but that's very rare, and for the rest of us, we use =git rebase= etc
|
||||||
|
while we work on our problems. So =git rebase= is not wrong. But it's right only if it's
|
||||||
|
*YOUR VERY OWN PRIVATE* git tree.
|
||||||
|
|
||||||
|
If you're still in the =git rebase= phase, you don't push it out. If it's not ready, you don't
|
||||||
|
tell the public at large about it. Don’t push your changes to a shared feature branch or the main
|
||||||
|
branch.
|
||||||
|
|
||||||
|
Don’t merge upstream changes at random points. If you’re working on a shared feature branch,
|
||||||
|
don’t pull down the changes when they are not verified and finalized. It will put your history
|
||||||
|
in an inconsistent state because your history will contain some changes which might get
|
||||||
|
removed upstream and later on when you push your changes you’re going to put back those removed
|
||||||
|
changes again.
|
||||||
|
|
||||||
|
* Conclusion
|
||||||
|
This essay was just a superficial try to explain some of the etiquette of Git that we need to
|
||||||
|
follow when we're collaborating on a project with others. At the end of the day we are looking
|
||||||
|
to make it easier for ourselves to develop software and following certain rules will help us to
|
||||||
|
get there faster and makes the process more pleasant.
|
||||||
|
|
||||||
|
* References and Resources
|
||||||
|
- https://www.kernel.org/doc/html/v4.10/process/submitting-patches.html
|
||||||
|
The kernel community is one of the biggest communities of paid and volunteer contributors
|
||||||
|
that are using Git intensively with a really high traffic. In order to manage the development
|
||||||
|
process and keep the productivity that has really strict guidelines which some of them can
|
||||||
|
be useful for us.
|
||||||
|
|
||||||
|
|
||||||
|
- https://chris.beams.io/posts/git-commit/
|
||||||
|
Chris Beams made a research about the best practices around the commit messages
|
||||||
|
By reviewing many projects, his article is one the most referenced articles in this field.
|
||||||
|
|
||||||
|
|
||||||
|
- https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
|
||||||
|
Another short but widely referenced article on best practices around Git commit messages
|
||||||
|
|
||||||
|
|
||||||
|
- https://yarchive.net/comp/linux/commit_messages.html
|
||||||
|
Who can be better to follow on Git best practices rather than Linus Torvalds himself?
|
||||||
|
|
||||||
|
|
||||||
|
- https://lwn.net/Articles/328438/
|
||||||
|
A famous email from Linus Torvalds describing how to maintain a git tree from merge vs
|
||||||
|
rebase perspective
|
||||||
|
|
||||||
|
|
||||||
|
- https://www.atlassian.com/git/tutorials/merging-vs-rebasing
|
||||||
|
Atlasians guidelines on merge vs rebase
|
|
@ -3,6 +3,7 @@
|
||||||
#+CATEGORY: Engineering
|
#+CATEGORY: Engineering
|
||||||
#+DATE: 2019-11-25
|
#+DATE: 2019-11-25
|
||||||
#+TITLE: My new programming language
|
#+TITLE: My new programming language
|
||||||
|
#+DESC: This is the story of my journey through the world of programming languages
|
||||||
|
|
||||||
As a software engineer, one of my joys in life is to learn new things. I can't describe the
|
As a software engineer, one of my joys in life is to learn new things. I can't describe the
|
||||||
pleasure of learning a new technology or stepping forward in the world of science. If you experienced
|
pleasure of learning a new technology or stepping forward in the world of science. If you experienced
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
#+SETUPFILE: ../../config.org
|
||||||
|
#+TAGS: Mathematics(m) series(s)
|
||||||
|
#+CATEGORY: Science
|
||||||
|
#+DATE: 2022-09-07
|
||||||
|
#+TITLE: On Mathematics - Preface
|
||||||
|
#+DESC: Often, we avoid things that are unknown to us and surprisingly mathematics is one of them.
|
||||||
|
|
||||||
|
* Preface :Mathematics:series:
|
||||||
|
In this long essay, I will explore the wonderful world of mathematics in hope of drawing a more clear
|
||||||
|
picture of what mathematics really is and emphasis the importance of mathematical thinking as a skill
|
||||||
|
that can drastically change one's life for the better.
|
||||||
|
|
||||||
|
Throughout school, I was an average student. Or better to say I started school strongly and finished
|
||||||
|
up university poorly (just above the failure line). Many factors were involved in such a process.
|
||||||
|
When I think back, probably the most important reason was that I was interested in subjects which
|
||||||
|
I could understand the applications of it in real life. As I grew older, the true purpose and
|
||||||
|
application of different subjects moved away from my understanding, and gradually I have lost
|
||||||
|
interest in them. For example, even though I always like maths because of its puzzle like nature,
|
||||||
|
I couldn't understand why I'm learning about calculus and in what way it is useful for me? At the
|
||||||
|
same time, I found my interest in programming and since I could understand and directly see the
|
||||||
|
application and usefulness of it in my daily activities, I grew to like more and more.
|
||||||
|
|
||||||
|
It was only a few years after graduating from the university that I began to understand mathematics
|
||||||
|
and science truly. I took me several years and to be frank, I think I have more to understand still.
|
||||||
|
But the bright side of things was that, everything fell in place, things started to click and the
|
||||||
|
cloud of confusion and distortion were cleared from my vision. Regret found its way to my heart,
|
||||||
|
and I wished I knew all this while I was in high school or university. I thought, I'm late to the
|
||||||
|
game and everyone else already knows about all this. It turned out that I was wrong.
|
||||||
|
|
||||||
|
Most of us live our lives without the need to resort to mathematics, or at least that is what we
|
||||||
|
think. We don't see the need to use mathematics in different aspects of our daily life. Usually,
|
||||||
|
there is no gap that requires mathematics to fill it. To someone with a basic understanding of
|
||||||
|
mathematics, it might sound normal. But it puts cringe on the faces of those who understand the
|
||||||
|
way of mathematics and science.
|
||||||
|
|
||||||
|
The way of science and mathematics is what that makes the difference. It helps us to think better,
|
||||||
|
avoid common pitfalls in life, and live better in general. In this series of essays, I will explore
|
||||||
|
“the way of science and mathematics” and will do my best to help you gain a clear understanding of
|
||||||
|
what mathematical thinking means and how to achieve such a skill.
|
|
@ -3,6 +3,7 @@
|
||||||
#+CATEGORY: Engineering
|
#+CATEGORY: Engineering
|
||||||
#+DATE: 2019-12-01
|
#+DATE: 2019-12-01
|
||||||
#+TITLE: Rational and a name
|
#+TITLE: Rational and a name
|
||||||
|
#+DESC: The rational behind Serene
|
||||||
|
|
||||||
*This post is a draft and I'll finish it gradually*
|
*This post is a draft and I'll finish it gradually*
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
#+SETUPFILE: ../../config.org
|
||||||
|
#+TAGS: Serene Languages
|
||||||
|
#+CATEGORY: Engineering
|
||||||
|
#+DATE: 2021-04-13
|
||||||
|
#+TITLE: Serene on the LLVM
|
||||||
|
#+DESC: The rational behind Serene
|
||||||
|
|
||||||
|
|
||||||
|
As you may know, I'm trying to build [[./my-new-programming-language.org][my new programming language]], after a ton of study and many experiments, I finally made
|
||||||
|
the decision on what platform I'll target for *Serene*. Here are the history and the
|
||||||
|
rational behind this decision.
|
||||||
|
|
||||||
|
* A little bit of history :Languages:Serene:
|
||||||
|
After the initial effort on [[./choosing-the-target-platform.org][choosing the right platform]]. I studied a bit about the
|
||||||
|
GraalVM and experiment with it. While it's a nice tool and I see a bright future for
|
||||||
|
it, I wasn't happy with some aspects of it. The most important one being the fact
|
||||||
|
that Oracle is behind it (Why? Well, don't open that door :D) and some other technical
|
||||||
|
reasons which I get to them later. So I looked around again and re-evaluated my
|
||||||
|
choices. I came across the [[https://llvm.org][LLVM]]. Previously I didn't pay much attention to the LLVM because
|
||||||
|
I was blinded by the *GraalVM* and the fact the both work the same theoretically. I mean
|
||||||
|
using both, we need to create the compiler frontend and they would take care of the
|
||||||
|
backend for us (more or less). Initially, one of the reasons why I've picked the *GraalVM*
|
||||||
|
over *LLVM* was due to its support for the *LLVM* itself, and it seemed obvious that
|
||||||
|
later on we can bridge the LLVM world to *Serene*'s world via *GraalVM*. But It was
|
||||||
|
quite the opposite.
|
||||||
|
|
||||||
|
This time, I looked into the *LLVM* more thoroughly and boy I was (still am) Impressed,
|
||||||
|
well designed tools and libraries to build a compiler. In compare to the *GraalVM* it
|
||||||
|
is very mature, well documented and quite modular. Aaand using the *LLVM* I still can
|
||||||
|
use *GraalVM* via its support for LLVM IR. Long story short the more I've read
|
||||||
|
about *LLVM* the more I got obsessed with it. So I've decide to move away from *GraalVM*
|
||||||
|
and start playing with *LLVM*.
|
||||||
|
|
||||||
|
|
||||||
|
* The challenge of the language again
|
||||||
|
With moving away from the *GraalVM*, I had to choose a host language again. While the
|
||||||
|
official language of the **LLVM* is *C++* I tried to avoid it, since I'm not skilled
|
||||||
|
enough in *C++*, So after a series of experiments (which all of them are available
|
||||||
|
in dedicated branches on the repo) I tried, *Rust*, *C*, *C++* (First attempt) and *Golang*.
|
||||||
|
I wrote the parser and an interpreter as an experiment and also to evaluate the
|
||||||
|
facilities of the language when it comes to working with the **LLVM API**. After many
|
||||||
|
iterations, I ended up using *Golang* to create an interpreter with a *FFI* interface
|
||||||
|
so we can write the compiler in *Serene* itself.
|
||||||
|
|
||||||
|
At the same time I started a journey into mathematics to learn more about the
|
||||||
|
different type systems in theory and different options that we might have for *Serene*
|
||||||
|
(I'll write about that separately in the future). Most of my day went to my studies
|
||||||
|
and I felt really good. But I always had a voice in my head that kept bugging me about
|
||||||
|
[[https://mlir.llvm.org][MLIR]]. I kinda watched a few introductory talks on it before and I had a rough idea
|
||||||
|
about what it is and what it does. In order to shut that voice up, I've decided to
|
||||||
|
look it up and read more about it, while I'm blocked by my math study and to my surprise,
|
||||||
|
it totally blew me away. MLIR is such a brilliant tool, made out of the experience
|
||||||
|
gained in making several languages and compilers, and follows some conventional and
|
||||||
|
well designed principles to build intermediate representation languages.
|
||||||
|
|
||||||
|
After I read more and more about the *MLIR* which by the way it's a sub project
|
||||||
|
of the *LLVM*, I still firmly believed that using *Golang* with should create
|
||||||
|
an interpreter as a bootstrap language an then provide a FFI interface via
|
||||||
|
the interpreter to use *MLIR*'s *C API* to interact with it. How naive I was.
|
||||||
|
|
||||||
|
During the course of my study on *MLIR*, I came across a beautiful thing called
|
||||||
|
[[https://llvm.org/docs/TableGen/][TableGen]]. It's part of the LLVM and designed to generate *C++* based on some
|
||||||
|
description in general. It's a generic tool which developers write backends
|
||||||
|
for, in order to generate code for specific purposes and in the case of
|
||||||
|
*MLIR* to generate IR [[https://mlir.llvm.org/docs/Dialects/LLVM/][dialects]]. The way MLIR utilizes the TableGen to generate
|
||||||
|
dialects and a majority of the operations and types is truly amazing. It makes
|
||||||
|
the cumbersome task of making a multi-layer IR quite straightforward. *MLIR*
|
||||||
|
singlehandedly changed my mind about the approach I want to take to build
|
||||||
|
the compiler. All of a sudden *C++* seemed like a reliable option. So I've
|
||||||
|
decided to give it a go. I revived the old C++ branch, forked into a branch
|
||||||
|
called =mlir= and started to work with it a bit. Made a prototype and enhanced it.
|
||||||
|
After a lot of consideration I finally decided to merge the =mlir= branch into the
|
||||||
|
=master= and move the *Golang* implementation into its own branch =golang-impl=.
|
||||||
|
|
||||||
|
I'm cleaning up the C++ implementation at the moment and I'll be adding a semantic
|
||||||
|
analysis phase to the compiler and I'll be aiming for a minimal lambda calculus
|
||||||
|
implementation to wire up everything in their most minimal state as the foundation
|
||||||
|
and build upon it.
|
||||||
|
|
||||||
|
Also I'll write another essay dedicated to the technical aspects of why LLVM and
|
||||||
|
MLIR are great for our use cases in more detail.
|
|
@ -3,6 +3,7 @@
|
||||||
#+CATEGORY: Engineering
|
#+CATEGORY: Engineering
|
||||||
#+DATE: 2020-01-03
|
#+DATE: 2020-01-03
|
||||||
#+TITLE: Serene (simple versoin)
|
#+TITLE: Serene (simple versoin)
|
||||||
|
#+DESC: Overview of the simple version of Serene
|
||||||
|
|
||||||
As you might already know I'm working on [[file:my-new-programming-language.org][my own programming language]]
|
As you might already know I'm working on [[file:my-new-programming-language.org][my own programming language]]
|
||||||
for a while now. I'm still on early stages and working on [[file:choosing-the-target-platform.org][choosing the right platform]]
|
for a while now. I'm still on early stages and working on [[file:choosing-the-target-platform.org][choosing the right platform]]
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#+CATEGORY: Engineering
|
#+CATEGORY: Engineering
|
||||||
#+DATE: 2019-04-26
|
#+DATE: 2019-04-26
|
||||||
#+TITLE: Transaction Variants
|
#+TITLE: Transaction Variants
|
||||||
|
#+DESC: A quick overview of different transaction variants in a RDBM
|
||||||
|
|
||||||
In this post I want to talk about different variants of [[https://en.wikipedia.org/wiki/Database_transaction][database transactions]], I assume you already
|
In this post I want to talk about different variants of [[https://en.wikipedia.org/wiki/Database_transaction][database transactions]], I assume you already
|
||||||
know about database transactions. So, let's cut to the chase.
|
know about database transactions. So, let's cut to the chase.
|
||||||
|
|
|
@ -47,7 +47,7 @@ Here is a list of questions people usually ask me.
|
||||||
advise. Whatever you do, try to be scientificly literate.
|
advise. Whatever you do, try to be scientificly literate.
|
||||||
|
|
||||||
** Where is your hang out place up on the internet ?
|
** Where is your hang out place up on the internet ?
|
||||||
I'm an [[https://en.wikipedia.org/wiki/Internet_Relay_Chat][IRC]] user and I usually hang out in the irc://freenode.net/#5hit channel.
|
I'm an [[https://en.wikipedia.org/wiki/Internet_Relay_Chat][IRC]] user and I usually hang out in the irc://libera.chat/#5hit channel.
|
||||||
|
|
||||||
|
|
||||||
* Science
|
* Science
|
||||||
|
|
|
@ -5,11 +5,4 @@
|
||||||
#+TITLE: GPG Information
|
#+TITLE: GPG Information
|
||||||
#+PAGE: true
|
#+PAGE: true
|
||||||
|
|
||||||
I use GPG heavily. There might be some expired or fake keys of mine on key servers but here is [[https://dl.lxsameer.com/lxsameer.pub.gpg][My Current Key:]]
|
I use GPG heavily. There might be some expired or fake keys of mine on key servers but here is [[https://dl.lxsameer.com/lxsameer.pub.gpg][My Current Key]] (Fingerprint ~6F3F A93B 4BD9 C3CA EF38 77E6 384A 12C3 1023 3CC5~)
|
||||||
|
|
||||||
#+BEGIN_SRC
|
|
||||||
pub rsa4096 2020-01-03 [SC] [expires: 2022-01-02]
|
|
||||||
75B126C50711BF7F4816D451B775967058BB835C
|
|
||||||
uid [ unknown] Sameer Rahmani (For more info refer to: lxsameer.com) <lxsameer@gnu.org>
|
|
||||||
sub rsa4096 2020-01-03 [E] [expires: 2022-01-02]
|
|
||||||
#+END_SRC
|
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
#+SETUPFILE: ../config.org
|
|
||||||
#+OPTIONS: toc:nil
|
|
||||||
#+EXPORT_FILE_NAME: index.html
|
|
||||||
#+DATE: 2021-02-11
|
|
||||||
#+TITLE: The little nest of mine
|
|
||||||
#+PAGE: true
|
|
||||||
|
|
||||||
Welcome to my little piece of the world. I'm a software engineer by day and an armature scientist by night
|
|
||||||
who lives by his [[./coh.org][Code of Honor]]. I write about my thoughts and researches. The views expressed here are my
|
|
||||||
personal views and not of those organizations that I might be associated with. Most of my time goes to developing
|
|
||||||
free software either by contributing to other projects or by working on my own stuff which you can find
|
|
||||||
them on [[https://devheroes.codes][devheroes]].
|
|
||||||
|
|
||||||
If you're interested in my work and research feel free to contact me to have a friendly chat Or share you thoughts
|
|
||||||
with me via email (check my [[./gpg.org][GPG]] info page). If you have a question for me, you might be able to find the answer to it
|
|
||||||
in the [[./faq.org][FAQs]] page.
|
|
||||||
|
|
||||||
* Recent updates:
|
|
||||||
- [[http://localhost:3003/essays/serene-simple-version.html][Serene (simple versoin)]]
|
|
||||||
- [[http://localhost:3003/essays/choosing-the-target-platform.html][Choosing the target platform]]
|
|
||||||
- [[http://localhost:3003/essays/rational-and-a-name.html][Rational and a name]]
|
|
||||||
- [[http://localhost:3003/essays/my-new-programming-language.html][My new programming language]]
|
|
||||||
- [[http://localhost:3003/essays/transaction-variants.html][Transaction Variants]]
|
|
|
@ -1,23 +0,0 @@
|
||||||
#+TITLE: lxsameer's nest
|
|
||||||
|
|
||||||
- [[file:thoughts.org][Inner world]]
|
|
||||||
- [[file:essays/serene-simple-version.org][Serene (simple versoin)]]
|
|
||||||
- [[file:essays/choosing-the-target-platform.org][Choosing the target platform]]
|
|
||||||
- [[file:essays/rational-and-a-name.org][Rational and a name]]
|
|
||||||
- [[file:tags/Serene.org][Serene]]
|
|
||||||
- [[file:tags/Languages.org][Languages]]
|
|
||||||
- [[file:essays/my-new-programming-language.org][My new programming language]]
|
|
||||||
- [[file:categories/Engineering.org][Engineering]]
|
|
||||||
- [[file:tags/Databases.org][Databases]]
|
|
||||||
- [[file:essays/transaction-variants.org][Transaction Variants]]
|
|
||||||
- [[file:faq.org][FAQ]]
|
|
||||||
- [[file:gpg.org][Code of Honor]]
|
|
||||||
- [[file:coh.org][Code of Honor]]
|
|
||||||
- [[file:categories/nil.org][<<<title>>>]]
|
|
||||||
- [[file:categories/SLA.org][SLA]]
|
|
||||||
- [[file:tags/ASDK.org][ASDK]]
|
|
||||||
- [[file:tags/BD.org][BD]]
|
|
||||||
- [[file:tags/ABD.org][ABD]]
|
|
||||||
- [[file:tags/index.org][index]]
|
|
||||||
- [[file:categories/index.org][index]]
|
|
||||||
- [[file:index.org][blah]]
|
|
|
@ -1,16 +1,25 @@
|
||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>{{title}}</title>
|
||||||
|
<meta name="description" content="lxsameer's nest">
|
||||||
|
<meta name="keywords" content="software engineering, physics, computer science, lisp, compilers">
|
||||||
|
<meta name="author" content="Sameer Rahmani">
|
||||||
|
<meta property="og:title" content="{{title}}" />
|
||||||
|
<meta property="og:description" content="{{description}}" />
|
||||||
|
|
||||||
{{{head}}}
|
{{{head}}}
|
||||||
<link rel="stylesheet" href="{{base-url}}/assets/styles/dark.css?1">
|
<link rel="stylesheet" href="{{base-url}}/assets/styles/dark.css?{{version}}">
|
||||||
<link rel="stylesheet" href="{{base-url}}/assets/styles/main.css?1">
|
<link rel="stylesheet" href="{{base-url}}/assets/styles/main.css?{{version}}">
|
||||||
<link rel="stylesheet" href="{{base-url}}/assets/styles/arta.css?1">
|
<link rel="stylesheet" href="{{base-url}}/assets/styles/arta.css?{{version}}">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<header>
|
<header>
|
||||||
<nav style="text-align: center;">
|
<nav style="text-align: center;">
|
||||||
<a href="/">HOME</a> | <a href="/categories/">Categories</a> | <a href="/tags/">Tags</a> | <a href="/coh.html">Code of Honor</a>
|
<a href="/">HOME</a> | <a href="/categories/">Categories</a> | <a href="/tags/">Tags</a> | <a href="/coh.html">Code of Honor</a> | <a href="/rss.xml">RSS</a>
|
||||||
</nav>
|
</nav>
|
||||||
<hr/>
|
<hr/>
|
||||||
</header>
|
</header>
|
||||||
|
@ -24,7 +33,7 @@
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<span>© 2010-2021 Sameer Rahmani</span><br/>
|
<span>© 2008-2023 Sameer Rahmani</span><br/>
|
||||||
<span>Built with <a href="https://www.gnu.org/software/emacs/">Emacs Lisp</a> and <a href="https://orgmode.org/">org-mode</a>.</span><br/>
|
<span>Built with <a href="https://www.gnu.org/software/emacs/">Emacs Lisp</a> and <a href="https://orgmode.org/">org-mode</a>.</span><br/>
|
||||||
<span><a href="https://devheroes.codes/lxsameer/lxhome">https://devheroes.codes/lxsameer/lxhome</a></span>
|
<span><a href="https://devheroes.codes/lxsameer/lxhome">https://devheroes.codes/lxsameer/lxhome</a></span>
|
||||||
</footer>
|
</footer>
|
|
@ -4,4 +4,4 @@
|
||||||
#+PAGE: true
|
#+PAGE: true
|
||||||
#+TITLE: Categories
|
#+TITLE: Categories
|
||||||
|
|
||||||
<<<links>>>
|
<<<:links>>>
|
|
@ -0,0 +1,30 @@
|
||||||
|
#+SETUPFILE: ../config.org
|
||||||
|
#+OPTIONS: toc:nil
|
||||||
|
#+EXPORT_FILE_NAME: index.html
|
||||||
|
#+DATE: 2021-02-11
|
||||||
|
#+TITLE: The little nest of mine
|
||||||
|
#+PAGE: true
|
||||||
|
#+DESC: All about lxsameer's experience in science and engineering
|
||||||
|
#+MACRO: buymebook @@html:<a href="$1" target="_blank"><img src="$2" alt="Buy Me A Book" style="height: 60px !important;width: 217px !important;"></a>@@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Welcome to my little piece of the world. I'm a software engineer by day and an amateur scientist by night
|
||||||
|
who lives by his [[./coh.org][Code of Honor]]. I write about my thoughts and researches. The views expressed here are my
|
||||||
|
personal views and not of those organizations that I might be associated with. Most of my time goes to developing
|
||||||
|
free software either by contributing to other projects or by working on my own stuff which you can find
|
||||||
|
them on [[https://devheroes.codes][devheroes]]. I spend the majority of my time these days working on the [[https://serene-lang.org/][Serene compiler]] and I have
|
||||||
|
a video series on my [[https://www.youtube.com/c/lxsameer][Youtube channel]].
|
||||||
|
|
||||||
|
|
||||||
|
If you're interested in my work and research feel free to contact me to have a friendly chat or share your thoughts
|
||||||
|
with me via email (check my [[./gpg.org][GPG]] info page) orrrr you can [[https://www.buymeacoffee.com/lxsameer][buy me a book]] :P.
|
||||||
|
|
||||||
|
# {{{buymebook(https://www.buymeacoffee.com/lxsameer,https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png)}}}
|
||||||
|
|
||||||
|
If you have a question for me, you might be able to find the answer to it
|
||||||
|
in the [[./faq.org][FAQs]] page.
|
||||||
|
|
||||||
|
|
||||||
|
* Recent updates:
|
||||||
|
<<<:links>>>
|
|
@ -1,7 +1,7 @@
|
||||||
#+SETUPFILE: ../../config.org
|
#+SETUPFILE: ../../config.org
|
||||||
#+OPTIONS: toc:nil
|
#+OPTIONS: toc:nil
|
||||||
#+TITLE: <<<title>>>
|
#+TITLE: <<<:title>>>
|
||||||
#+PAGE: true
|
#+PAGE: true
|
||||||
|
|
||||||
|
|
||||||
<<<links>>>
|
<<<:links>>>
|
|
@ -0,0 +1,10 @@
|
||||||
|
#+SETUPFILE: ../config.org
|
||||||
|
#+OPTIONS: toc:nil
|
||||||
|
#+EXPORT_FILE_NAME: index.html
|
||||||
|
#+DATE: 2021-02-11
|
||||||
|
#+TITLE: The little nest of mine
|
||||||
|
#+HTML_LINK_HOME: <<<:base-url>>>
|
||||||
|
#+PAGE: true
|
||||||
|
#+DESC: All about lxsameer's experience in science and engineering
|
||||||
|
|
||||||
|
<<<:posts>>>
|
|
@ -5,4 +5,4 @@
|
||||||
#+TITLE: Tags
|
#+TITLE: Tags
|
||||||
|
|
||||||
|
|
||||||
<<<links>>>
|
<<<:links>>>
|
|
@ -1,19 +0,0 @@
|
||||||
#+SETUPFILE: ../config.org
|
|
||||||
#+OPTIONS: toc:nil
|
|
||||||
#+EXPORT_FILE_NAME: index.html
|
|
||||||
#+DATE: 2021-02-11
|
|
||||||
#+TITLE: The little nest of mine
|
|
||||||
#+PAGE: true
|
|
||||||
|
|
||||||
Welcome to my little piece of the world. I'm a software engineer by day and an armature scientist by night
|
|
||||||
who lives by his [[./coh.org][Code of Honor]]. I write about my thoughts and researches. The views expressed here are my
|
|
||||||
personal views and not of those organizations that I might be associated with. Most of my time goes to developing
|
|
||||||
free software either by contributing to other projects or by working on my own stuff which you can find
|
|
||||||
them on [[https://devheroes.codes][devheroes]].
|
|
||||||
|
|
||||||
If you're interested in my work and research feel free to contact me to have a friendly chat Or share you thoughts
|
|
||||||
with me via email (check my [[./gpg.org][GPG]] info page). If you have a question for me, you might be able to find the answer to it
|
|
||||||
in the [[./faq.org][FAQs]] page.
|
|
||||||
|
|
||||||
* Recent updates:
|
|
||||||
<<<links>>>
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
#+begin_quote
|
||||||
|
I think a lot when I have a bit of time to spare. I like to write them down and
|
||||||
|
research about them if possible. These are just my thoughts, wrong or right, doesn't
|
||||||
|
matter. It doesn't matter, I think a lot...
|
||||||
|
|
||||||
|
This post is a part of my thoughts series.
|
||||||
|
#+END_quote
|
Loading…
Reference in New Issue