Compare commits
22 Commits
archive-pa
...
main
Author | SHA1 | Date | |
---|---|---|---|
f3c98b3e46 | |||
d2a3d53e54 | |||
425dd6cdd2 | |||
6205d19bbb | |||
83e8868495 | |||
ffd7b06cc0 | |||
88aa2e8d11 | |||
6f3700406d | |||
01c450d93f | |||
77b856fa63 | |||
f722b41f5d | |||
4aef9c3d46 | |||
cebeaf6fdd | |||
26f89fcb29 | |||
c91d595938 | |||
c14a238f5f | |||
cf4ac9c430 | |||
e288d17eb8 | |||
06c5f6b8ff | |||
43bf72297c | |||
f3c41ab0e1 | |||
8a882f9157 |
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,2 +1 @@
|
||||
/dist
|
||||
/build
|
||||
.hugo_build.lock
|
||||
|
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "public"]
|
||||
path = public
|
||||
url = https://gitea.balki.me/balki/blog-op
|
19
Makefile
19
Makefile
@ -1,14 +1,21 @@
|
||||
ASCIINEMA_VERSION=3.8.0
|
||||
|
||||
.PHONY: update-bootstrap
|
||||
update-bootstrap:
|
||||
curl -L "https://cdn.jsdelivr.net/npm/bootstrap@5/dist/css/bootstrap.min.css" -o assets/bootstrap.min.css
|
||||
curl -L "https://cdn.jsdelivr.net/npm/bootstrap@5/dist/js/bootstrap.min.js" -o assets/bootstrap.min.js
|
||||
curl -L "https://cdn.jsdelivr.net/npm/bootstrap@5/dist/css/bootstrap.min.css" -o static/assets/bootstrap.min.css
|
||||
curl -L "https://cdn.jsdelivr.net/npm/bootstrap@5/dist/js/bootstrap.min.js" -o static/assets/bootstrap.min.js
|
||||
|
||||
.PHONY: build
|
||||
build:
|
||||
./build.sh
|
||||
.PHONY: update-asciinema
|
||||
update-asciinema:
|
||||
curl -L "https://github.com/asciinema/asciinema-player/releases/download/v$(ASCIINEMA_VERSION)/asciinema-player.css" -o static/assets/asciinema-player.css
|
||||
curl -L "https://github.com/asciinema/asciinema-player/releases/download/v$(ASCIINEMA_VERSION)/asciinema-player.min.js" -o static/assets/asciinema-player.min.js
|
||||
|
||||
.PHONY: deploy
|
||||
deploy:
|
||||
rsync -av dist desk:/var/www/balki.me
|
||||
rsync -av public desk:/var/www/balki.me
|
||||
|
||||
build:
|
||||
hugo --logLevel debug
|
||||
|
||||
serve:
|
||||
hugo server -D --bind "0.0.0.0" --navigateToChanged
|
||||
|
19
README.md
19
README.md
@ -1 +1,18 @@
|
||||
# Again blog
|
||||
# Source of balki.me
|
||||
|
||||
## Asciinema
|
||||
|
||||
Followed instructions from here: https://jenciso.github.io/blog/embedding-asciinema-cast-in-your-hugo-site/
|
||||
|
||||
Asciinema uses wasm which needs CSP unsafe-eval. Ref: https://www.aaron-powell.com/posts/2019-11-27-using-webassembly-with-csp-headers/
|
||||
|
||||
## Submodule for generated output
|
||||
|
||||
Tracking hugo generated output in git enables to see differences easily before pushing. Also helpful to compare differences after hugo version upgrade.
|
||||
Below commands help to add a public url for the web UI and also private ssh url for pushing
|
||||
|
||||
```bash
|
||||
git submodule add https://gitea.balki.me/balki/blog-op public
|
||||
cd public
|
||||
git config remote.origin.url gitea:balki/blog-op
|
||||
```
|
||||
|
6
assets/bootstrap.min.css
vendored
6
assets/bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
7
assets/bootstrap.min.js
vendored
7
assets/bootstrap.min.js
vendored
File diff suppressed because one or more lines are too long
18
build.sh
18
build.sh
@ -1,18 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
# copy assets
|
||||
cp -r assets/ dist/
|
||||
|
||||
make_page() {
|
||||
name="$1"
|
||||
title="$2"
|
||||
cp templates/index.tmpl.html "build/$name.html"
|
||||
sed -i "s/<title>/&$title/" "build/$name.html"
|
||||
pandoc "pages/$name.md" > "build/$name-content.html"
|
||||
sed -i "/<main>/r build/$name-content.html" "build/$name.html"
|
||||
cp "build/$name.html" dist/
|
||||
}
|
||||
|
||||
make_page index Home
|
||||
make_page stuff Stuff
|
||||
|
@ -1,3 +1,3 @@
|
||||
baseURL: http://blog.balki.me/
|
||||
baseURL: https://balki.me/
|
||||
languageCode: en-us
|
||||
title: Balki's Blog
|
22
content/pages/playground.md
Normal file
22
content/pages/playground.md
Normal file
@ -0,0 +1,22 @@
|
||||
---
|
||||
title: "Playground"
|
||||
date: 2023-07-22T19:56:37-04:00
|
||||
draft: true
|
||||
asciinema: true
|
||||
---
|
||||
|
||||
# Playground for hugo
|
||||
|
||||
{{< asciinema key="demo" >}}
|
||||
|
||||
There should be a asciinema cast above!
|
||||
{{< details title="Click to see sample json" >}}
|
||||
```json
|
||||
{
|
||||
"external_tracker_url": "https://github.com/caddyserver/caddy/issues",
|
||||
"external_tracker_format": "https://github.com/caddyserver/caddy/issues/{index}",
|
||||
"external_tracker_style": "numeric",
|
||||
"external_tracker_regexp_pattern": ""
|
||||
}
|
||||
```
|
||||
{{< /details >}}
|
74
content/posts/unix-socket-perms.md
Normal file
74
content/posts/unix-socket-perms.md
Normal file
@ -0,0 +1,74 @@
|
||||
---
|
||||
title: "Securing communication between webserver and app"
|
||||
date: 2024-04-19T17:31:06-04:00
|
||||
tags:
|
||||
- unix-sockets
|
||||
- tmpfiles.d
|
||||
- webserver
|
||||
categories:
|
||||
- sysadmin
|
||||
---
|
||||
|
||||
Webapps usually listen on a random tcp port and a web server forwards the
|
||||
requests to it. Webserver handles tls, static asset serving and sometimes
|
||||
authentication, bruteforce check etc., However any local user in the system can
|
||||
directly connect to the app's listen port bypassing the web server and thus
|
||||
loose the protections offered by the webserver.
|
||||
|
||||
### Unix sockets
|
||||
|
||||
Unix sockets are special files in filesystem that processes can use to
|
||||
communicate instead of tcp ports. Since they are files, filesytem ownership and
|
||||
permissions can be used to restrict which system-users can listen or connect to
|
||||
them
|
||||
|
||||
### Caddy ↔ Gitea
|
||||
|
||||
I use [Caddy][1] web server which reverse-proxies to [Gitea][2] server. For
|
||||
caddy to connect to gitea and also disallow anyother user to connect, we want a
|
||||
socket like below
|
||||
|
||||
```bash
|
||||
srw-rw---- 1 gitea caddy 0 Apr 17 21:24 /run/gitea.sock
|
||||
```
|
||||
|
||||
Unfortunately neither `user caddy` nor `user gitea`, can create such socket.
|
||||
Regular users can only create files owned by themselves. Only root can
|
||||
create/change ownership of files and folders.
|
||||
|
||||
### `tmpfiles.d` to rescue
|
||||
|
||||
[tmpfiles.d][3] provides a way to do it. Since it is run as root, it can create
|
||||
files and directories as any user.
|
||||
|
||||
```bash
|
||||
❯ cat /etc/tmpfiles.d/caddy-run-unix.conf
|
||||
d /run/gitea-caddy 0750 gitea caddy -
|
||||
```
|
||||
Above config creates below directory every time on startup.
|
||||
|
||||
```bash
|
||||
❯ sudo ls -ld /run/gitea-caddy/
|
||||
drwxr-x--- 2 gitea caddy 60 Apr 17 21:24 /run/gitea-caddy/
|
||||
```
|
||||
|
||||
With those permissions and ownership, only `user gitea` can create the socket
|
||||
in `/run/gitea-caddy` and only `user caddy` can `cd` into that directory.
|
||||
|
||||
```bash
|
||||
❯ sudo ls -l /run/gitea-caddy/web.sock
|
||||
srw-rw-rw- 1 gitea gitea 0 Apr 17 21:24 /run/gitea-caddy/web.sock
|
||||
```
|
||||
|
||||
The socket file permission can be more liberal as no other user can read into
|
||||
the `/run/gitea-caddy` directory
|
||||
|
||||
### Bonus!
|
||||
|
||||
If your app does not connect to any external services, it can even be run in a
|
||||
[private network][4].
|
||||
|
||||
[1]: https://caddyserver.com
|
||||
[2]: https://gitea.com
|
||||
[3]: https://man.archlinux.org/man/tmpfiles.d.5
|
||||
[4]: https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html#PrivateNetwork=
|
116
content/posts/vim-stt.md
Normal file
116
content/posts/vim-stt.md
Normal file
@ -0,0 +1,116 @@
|
||||
---
|
||||
title: Vim Send To Terminal
|
||||
date: 2023-07-26T15:23:22-04:00
|
||||
asciinema: true
|
||||
tags:
|
||||
- vim
|
||||
categories:
|
||||
- development
|
||||
---
|
||||
|
||||
### Semi automatic scripts with vim `:terminal`
|
||||
|
||||
<!--more-->
|
||||
|
||||
Sometimes, fully automating a task is not worth the effort. So I end up running
|
||||
a set of commands usually from a cheat sheet text file slightly modifying the
|
||||
arguments each time. I used the below in vim to send line under cursor to vim's
|
||||
`:terminal` open in a split
|
||||
```vim
|
||||
:call term_list()[0]->term_sendkeys(getline('.') .. "\<CR>")
|
||||
```
|
||||
To send another line `@:` and then for every other line `@@`. This works because, last
|
||||
command run is stored in `register :` and the last macro executed using `@` is
|
||||
stored in `register @`.
|
||||
|
||||
To do the same another day, `:call te<UP arrow>` to recall from vim's command
|
||||
history. Or better, add a function and mapping.
|
||||
|
||||
```vim
|
||||
def SendToTerminal()
|
||||
if term_list()->empty()
|
||||
echomsg "No Terminal windows found"
|
||||
return
|
||||
endif
|
||||
terms[0]->term_sendkeys(getline(.) .. "\<CR>")
|
||||
enddef
|
||||
|
||||
nnoremap <silent><leader>s call SendToTerminal()<CR>
|
||||
```
|
||||
|
||||
### More cool features
|
||||
|
||||
For most use-cases that was enough. However added a few more nice features
|
||||
which is very helpful when you need it
|
||||
|
||||
1. Support sending a range of lines (visual selection) at a time. E.g. Send a
|
||||
function block to a python shell
|
||||
2. Add a delay between lines in milliseconds. This is useful when the previous
|
||||
command reads from standard input and takes some time to complete
|
||||
3. Support sending `ctrl` characters like `ctrl d`, `ctrl c` etc,
|
||||
|
||||
```vim
|
||||
def g:SendRangeToTerminal(start_line: number, end_line: number)
|
||||
const terms = term_list()
|
||||
if terms->empty()
|
||||
echomsg "No Terminal windows found"
|
||||
return
|
||||
endif
|
||||
var line_num = start_line
|
||||
for line in getline(start_line, end_line)
|
||||
line_num += 1
|
||||
const spl_cmd = line->matchlist('\vVIMST (sleep|ctrl) ([0-9]+|[a-z])')
|
||||
if !spl_cmd->empty()
|
||||
const [_, cmd, arg1; _] = spl_cmd
|
||||
if cmd == "sleep"
|
||||
timer_start(str2nr(arg1), (_) => g:SendRangeToTerminal(line_num, end_line))
|
||||
return
|
||||
elseif cmd == "ctrl"
|
||||
terms[0]->term_sendkeys(nr2char(char2nr(arg1) - 96))
|
||||
continue
|
||||
endif
|
||||
endif
|
||||
terms[0]->term_sendkeys(line .. "\<CR>")
|
||||
endfor
|
||||
enddef
|
||||
|
||||
command -range -bar SendToTerm :call g:SendRangeToTerminal(<line1>, <line2>)
|
||||
vnoremap <silent><leader>s :SendToTerm<CR>
|
||||
nnoremap <silent><leader>s :SendToTerm<CR>
|
||||
```
|
||||
|
||||
### More cool mapping
|
||||
|
||||
Wouldn't it be nice to just double-click commands with mouse? Like a simple GUI! ;)
|
||||
|
||||
```vim
|
||||
nnoremap <silent><2-LeftMouse> :SendToTerm<CR>
|
||||
```
|
||||
|
||||
Or just hit `Enter`?
|
||||
|
||||
```vim
|
||||
nnoremap <buffer> <CR> :SendToTerm \| norm j<CR>
|
||||
```
|
||||
|
||||
Automatically add those mappings for `cheat.sh`
|
||||
```vim
|
||||
autocmd BufNewFile,BufRead cheat.sh nnoremap <buffer> <CR> :SendToTerm \| norm j<CR>
|
||||
autocmd BufNewFile,BufRead cheat.sh nnoremap <buffer> <silent><2-LeftMouse> :SendToTerm<CR>
|
||||
```
|
||||
|
||||
### Demo
|
||||
|
||||
{{< asciinema key="vimstt" >}}
|
||||
|
||||
### Using
|
||||
|
||||
Copying above snippets to your vimrc should work in a recent vim. Checked in
|
||||
ubuntu 22.04 and archlinux. Git: [repo](https://gitea.balki.me/balki/vimfun/src/branch/main/stt/stt8.vim)
|
||||
|
||||
### neovim/tmux/screen
|
||||
|
||||
Since neovim uses a different terminal API, above snippets don't work in
|
||||
neovim. [vim-slime](https://github.com/jpalardy/vim-slime) plugin (available
|
||||
since 2007!) supports different types of terminal. However it does not support
|
||||
adding delay and `ctrl` characters in text.
|
2
hugo/.gitignore
vendored
2
hugo/.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
.hugo_build.lock
|
||||
/public/
|
@ -1,103 +0,0 @@
|
||||
---
|
||||
title: Vim Send To Terminal
|
||||
date: 2023-07-15T20:18:03-04:00
|
||||
---
|
||||
|
||||
### Semi automatic scripts with vim `:terminal`
|
||||
|
||||
<!--more-->
|
||||
|
||||
For a long time, I used the below to send current line to vim's `:terminal`
|
||||
```vim
|
||||
:call term_list()[0]->term_sendkeys(getline('.') .. "\<CR>")
|
||||
```
|
||||
|
||||
This is very useful if you have a text file with complex shell commands. To run
|
||||
again, `@:` and then again, `@@`. This works because, last command run is
|
||||
stored in `register :` and the last macro executed using `@` is stored in
|
||||
`register @`. And then to run another day, do `:call te<UP arrow>` to recall
|
||||
from vim's command history.
|
||||
|
||||
Since this was very useful, I then wrapped it in a function and added a mapping
|
||||
|
||||
```vim
|
||||
def SendToTerminal()
|
||||
if term_list()->empty()
|
||||
echomsg "No Terminal windows found"
|
||||
return
|
||||
endif
|
||||
terms[0]->term_sendkeys(getline(.) .. "\<CR>")
|
||||
enddef
|
||||
|
||||
nnoremap <silent><leader>s call SendToTerminal()<CR>
|
||||
```
|
||||
|
||||
### Adding more features
|
||||
|
||||
So far good for shell commands. But when working with python, had to send a
|
||||
block of functions to the `ipython` shell. So added support for range of lines.
|
||||
But then when sending a range of lines to shell, sometimes there had to be a
|
||||
small delay (sleep) between commands so that the previous command can complete
|
||||
and not eat the rest of commands. Then finally added support for sending `ctrl`
|
||||
characters like `ctrl c`, `ctrl l`
|
||||
|
||||
```vim
|
||||
vim9script
|
||||
def SendRangeToTerminal(start_line: number, end_line: number, _ = 0)
|
||||
const terms = term_list()
|
||||
if terms->empty()
|
||||
echomsg "No Terminal windows found"
|
||||
return
|
||||
endif
|
||||
var line_num = start_line
|
||||
for line in getline(start_line, end_line)
|
||||
line_num += 1
|
||||
const spl_cmd = line->matchlist('\vVIMST (sleep|ctrl) ([0-9]+|[a-z])?')
|
||||
if !spl_cmd->empty()
|
||||
const [_, cmd, arg1; _] = spl_cmd
|
||||
if cmd == "sleep"
|
||||
timer_start(arg1->str2nr(), funcref('SendRangeToTerminal', [line_num, end_line]))
|
||||
return
|
||||
elseif cmd == "ctrl"
|
||||
terms[0]->term_sendkeys(nr2char(arg1->char2nr() - 96))
|
||||
continue
|
||||
endif
|
||||
endif
|
||||
terms[0]->term_sendkeys(line .. "\<CR>")
|
||||
endfor
|
||||
enddef
|
||||
|
||||
command -range -bar SendToTerm :call <SID>SendRangeToTerminal(<line1>, <line2>)
|
||||
vnoremap <silent><leader>s :SendToTerm<CR>
|
||||
nnoremap <silent><leader>s :SendToTerm<CR>
|
||||
```
|
||||
|
||||
Wouldn't it be nice to just double-click commands with mouse? Like a simple GUI! ;)
|
||||
|
||||
```vim
|
||||
nnoremap <silent><2-LeftMouse> :SendToTerm<CR>
|
||||
```
|
||||
|
||||
Or just `Enter`?
|
||||
|
||||
```vim
|
||||
nnoremap <buffer> <CR> :SendToTerm \| norm j<CR>
|
||||
```
|
||||
|
||||
Of course, mapping `Enter` for any file is a bad idea. So lets just map in our cheat file
|
||||
|
||||
```vim
|
||||
autocmd BufNewFile,BufRead cheat.sh {
|
||||
nnoremap <buffer> <silent><2-LeftMouse> :SendToTerm<CR>
|
||||
nnoremap <buffer> <CR> :SendToTerm \| norm j<CR>
|
||||
}
|
||||
```
|
||||
|
||||
### Demo!
|
||||
|
||||
### What about neovim/tmux/screen?
|
||||
|
||||
I am not the only one who thought about this. See
|
||||
[vim-slime](https://github.com/jpalardy/vim-slime) since 2007. However it does
|
||||
not support adding a sleep or sending arbitrary `ctrl` characters without
|
||||
additional mappings
|
@ -1,11 +0,0 @@
|
||||
{{ define "title" }}
|
||||
{{ .Title }} – {{ .Site.Title }}
|
||||
{{ end }}
|
||||
{{ define "main" }}
|
||||
<article>
|
||||
<h1 class="display-3 text-center">{{ .Title }}</h1>
|
||||
<p class="text-center"><time datetime="{{ .Date }}">{{ .Date.Format "2006-01-02" }}</time></p>
|
||||
{{ .Content }}
|
||||
</article>
|
||||
{{ end }}
|
||||
|
6
hugo/static/assets/bootstrap.min.css
vendored
6
hugo/static/assets/bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
7
hugo/static/assets/bootstrap.min.js
vendored
7
hugo/static/assets/bootstrap.min.js
vendored
File diff suppressed because one or more lines are too long
@ -3,7 +3,8 @@
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline' data: ;">
|
||||
<meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline' data: ;{{ if .Params.asciinema }}script-src 'self' 'unsafe-inline' 'unsafe-eval';{{ end }}">
|
||||
<link rel="alternate" type="application/rss+xml" href="/posts/index.xml">
|
||||
<title>
|
||||
{{- block "title" . -}}
|
||||
{{ .Site.Title }}
|
||||
@ -13,9 +14,16 @@
|
||||
<!-- Diable favicon requests: https://stackoverflow.com/a/13416784 -->
|
||||
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
|
||||
<link href="/assets/bootstrap.min.css" rel="stylesheet" >
|
||||
{{ if .Params.asciinema }}
|
||||
<link rel="stylesheet" type="text/css" href="/assets/asciinema-player.css" />
|
||||
{{ end }}
|
||||
<style>
|
||||
{{- block "styles" . -}}
|
||||
{{- end -}}
|
||||
{{ block "styles" . }}
|
||||
{{ end }}
|
||||
div.highlight pre {
|
||||
{{/* code highlighting */}}
|
||||
padding: 1rem;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="/assets/bootstrap.min.js" defer></script>
|
||||
@ -42,6 +50,8 @@
|
||||
{{ block "main" . }}
|
||||
{{ end }}
|
||||
</main>
|
||||
<hr>
|
||||
<div style="height: 300px;"><!-- This space is intentionally left blank --></div>
|
||||
</div>
|
||||
|
||||
</body>
|
24
layouts/_default/single.html
Normal file
24
layouts/_default/single.html
Normal file
@ -0,0 +1,24 @@
|
||||
{{ define "title" }}
|
||||
{{ .Title }} – {{ .Site.Title }}
|
||||
{{ end }}
|
||||
{{ define "main" }}
|
||||
<article>
|
||||
<h1 class="display-3 text-center">{{ .Title }}</h1>
|
||||
<p class="text-center"><time datetime="{{ .Date }}">{{ .Date.Format "2006-01-02" }}</time>
|
||||
{{ if .Params.tags }}
|
||||
│
|
||||
{{range .Params.tags}}
|
||||
<a class="btn btn-primary" href="/tags/{{ . | urlize }}" role="button">{{ . }}</a>
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{ if .Params.categories }}
|
||||
│
|
||||
{{range .Params.categories}}
|
||||
<a class="btn btn-secondary" href="/categories/{{ . | urlize }}" role="button">{{ . }}</a>
|
||||
{{end}}
|
||||
{{end}}
|
||||
</p>
|
||||
{{ .Content }}
|
||||
</article>
|
||||
{{ end }}
|
||||
|
@ -1,6 +1,6 @@
|
||||
{{ define "styles" }}
|
||||
a.title-link {
|
||||
text-decoration: none;
|
||||
text-decoration: none;
|
||||
}
|
||||
{{ end }}
|
||||
<div class="card mb-4">
|
20
layouts/shortcodes/asciinema.html
Normal file
20
layouts/shortcodes/asciinema.html
Normal file
@ -0,0 +1,20 @@
|
||||
<div id='{{ with .Get "key" }}{{ . }}{{ end }}'></div>
|
||||
<script src="/assets/asciinema-player.min.js"></script>
|
||||
<script>
|
||||
AsciinemaPlayer.create('/casts/{{ with .Get "key" }}{{ . }}{{ end }}.cast', document.getElementById('{{ with .Get "key" }}{{ . }}{{ end }}'), {
|
||||
{{ if .Get "cols" }}cols: "{{ .Get "cols" }}",{{ end }}
|
||||
{{ if .Get "rows" }}rows: "{{ .Get "rows" }}",{{ end }}
|
||||
{{ if .Get "autoPlay" }}autoPlay: "{{ .Get "autoPlay" }}",{{ end }}
|
||||
{{ if .Get "preload" }}preload: "{{ .Get "preload" }}",{{ end }}
|
||||
{{ if .Get "loop" }}loop: "{{ .Get "loop" }}",{{ end }}
|
||||
{{ if .Get "startAt" }}startAt: "{{ .Get "startAt" }}",{{ end }}
|
||||
{{ if .Get "speed" }}speed: "{{ .Get "speed" }}",{{ end }}
|
||||
{{ if .Get "idleTimeLimit" }}idleTimeLimit: "{{ .Get "idleTimeLimit" }}",{{ end }}
|
||||
{{ if .Get "theme" }}theme: "{{ .Get "theme" }}",{{ end }}
|
||||
{{ if .Get "poster" }}poster: "{{ .Get "poster" }}",{{ end }}
|
||||
{{ if .Get "fit" }}fit: "{{ .Get "fit" }}",{{ end }}
|
||||
{{ if .Get "terminalFontSize" }}terminalFontSize: "{{ .Get "terminalFontSize" }}",{{ end }}
|
||||
{{ if .Get "terminalFontFamily" }}terminalFontFamily: "{{ .Get "terminalFontFamily" }}",{{ end }}
|
||||
{{ if .Get "terminalLineHeight" }}terminalLineHeight: "{{ .Get "terminalLineHeight" }}",{{ end }}
|
||||
});
|
||||
</script>
|
9
layouts/shortcodes/details.html
Normal file
9
layouts/shortcodes/details.html
Normal file
@ -0,0 +1,9 @@
|
||||
{{- /*
|
||||
Template comment syntax: https://hugo.d.balki.me/templates/introduction/#comments
|
||||
collapsable section ref: https://stackoverflow.com/a/78475534
|
||||
*/ -}}
|
||||
|
||||
<details>
|
||||
<summary>{{ .Get "title" | default "Click to expand" | markdownify }}</summary>
|
||||
<div>{{ .Inner | markdownify }}</div>
|
||||
</details>
|
@ -1,3 +0,0 @@
|
||||
Welcome to my site!
|
||||
|
||||
I am Balakrishnan Balasubramanian (a) balki. Nothing much here. Checkout the nav bar above for interesting stuff.
|
@ -1,33 +0,0 @@
|
||||
# Some cool stuff I built
|
||||
|
||||
## vimtabdiff
|
||||
|
||||
Simple python script to see diff off two directories with diff of each file in a vim tab. Typically used to replace `git difftool`
|
||||
|
||||
<div class="table">
|
||||
+---------+-------------------------------------------+
|
||||
| Project | vimtabdiff |
|
||||
+---------+-------------------------------------------+
|
||||
| Tags | #python, #vim, #git |
|
||||
+---------+-------------------------------------------+
|
||||
| Github | <https://github.com/balki/vimtabdiff> |
|
||||
+---------+-------------------------------------------+
|
||||
| Gitea | <https://gitea.balki.me/balki/vimtabdiff> |
|
||||
+---------+-------------------------------------------+
|
||||
</div>
|
||||
|
||||
## grocery_guy
|
||||
|
||||
Telegram bot to manage lists.
|
||||
|
||||
<div class="table">
|
||||
+----------+----------------------------------------------------+
|
||||
| Project | grocery_guy |
|
||||
+----------+----------------------------------------------------+
|
||||
| Tags | #golang, #telegram |
|
||||
+----------+----------------------------------------------------+
|
||||
| Gitea | <https://gitea.balki.me/balki/telegram-chklistbot> |
|
||||
+----------+----------------------------------------------------+
|
||||
| Telegram | <https://t.me/grocery_guy_bot> |
|
||||
+----------+----------------------------------------------------+
|
||||
</div>
|
1
public
Submodule
1
public
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 094b566f7ea054b1b047ecf618d474988cd2c287
|
2352
static/assets/asciinema-player.css
Normal file
2352
static/assets/asciinema-player.css
Normal file
File diff suppressed because it is too large
Load Diff
1
static/assets/asciinema-player.min.js
vendored
Normal file
1
static/assets/asciinema-player.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
6
static/assets/bootstrap.min.css
vendored
Normal file
6
static/assets/bootstrap.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
7
static/assets/bootstrap.min.js
vendored
Normal file
7
static/assets/bootstrap.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
42
static/casts/demo.cast
Normal file
42
static/casts/demo.cast
Normal file
@ -0,0 +1,42 @@
|
||||
{"version": 2, "width": 211, "height": 54, "timestamp": 1690070416, "env": {"SHELL": "/bin/zsh", "TERM": "tmux-256color"}}
|
||||
[0.616662, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
|
||||
[0.651075, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1;36mblog\u001b[0m on \u001b[1;35m \u001b[0m\u001b[1;35masciinema\u001b[0m \u001b[1;31m[\u001b[0m\u001b[1;31m$\u001b[0m\u001b[1;31m!\u001b[0m\u001b[1;31m?\u001b[0m\u001b[1;31m]\u001b[0m \r\n\u001b[1;2;31m⬢\u001b[0m\u001b[1;2;31m [\u001b[0m\u001b[1;2;31mOCI\u001b[0m\u001b[1;2;31m]\u001b[0m \u001b[1;32m❯\u001b[0m \u001b[K\u001b[?2004h"]
|
||||
[2.137003, "o", "e"]
|
||||
[2.144549, "o", "\be\u001b[90mcho bye\u001b[39m\b\b\b\b\b\b\b"]
|
||||
[2.192516, "o", "\be\u001b[39mc"]
|
||||
[2.232416, "o", "\u001b[39mh"]
|
||||
[2.372576, "o", "\u001b[39mo"]
|
||||
[2.390732, "o", "\u001b[39m "]
|
||||
[2.774916, "o", "\u001b[39m\"\u001b[39m \u001b[39m \b\b"]
|
||||
[2.781599, "o", "\u001b[90m{{ .Render }}\" > layouts/index.html\u001b[39m\u001b[35D"]
|
||||
[3.091004, "o", "\u001b[39mH\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[34D"]
|
||||
[3.098663, "o", "\u001b[90meh\" | nc 127.0.0.1 8080\u001b[39m\u001b[23D"]
|
||||
[3.228845, "o", "\u001b[39me"]
|
||||
[3.42287, "o", "\u001b[39me\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[21D"]
|
||||
[3.830673, "o", "\b \b"]
|
||||
[3.849255, "o", "\u001b[90mh\" | nc 127.0.0.1 8080\u001b[39m\u001b[22D"]
|
||||
[4.059485, "o", "\u001b[39ml\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[21D"]
|
||||
[4.067668, "o", "\u001b[90ml\" | nc 127.0.0.1 8080\u001b[39m\u001b[22D"]
|
||||
[4.211281, "o", "\u001b[39ml"]
|
||||
[4.469571, "o", "\u001b[39mo\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[20D"]
|
||||
[4.477592, "o", "\u001b[90m\" | nc 127.0.0.1 8080\u001b[39m\u001b[21D"]
|
||||
[4.943674, "o", "\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[20D"]
|
||||
[4.951654, "o", "\u001b[90mworld ha ah aha\" | nc 127.0.0.1 8080\u001b[39m\u001b[36D"]
|
||||
[5.144929, "o", "\u001b[39mw"]
|
||||
[5.205373, "o", "\u001b[39mo"]
|
||||
[5.303329, "o", "\u001b[39mr"]
|
||||
[5.422771, "o", "\u001b[39ml"]
|
||||
[5.502979, "o", "\u001b[39md"]
|
||||
[6.684966, "o", "\u001b[39m\"\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[30D"]
|
||||
[7.170616, "o", "\u001b[?2004l\r\r\n"]
|
||||
[7.174019, "o", "Hello world\r\n\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
|
||||
[7.204173, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1;36mblog\u001b[0m on \u001b[1;35m \u001b[0m\u001b[1;35masciinema\u001b[0m \u001b[1;31m[\u001b[0m\u001b[1;31m$\u001b[0m\u001b[1;31m!\u001b[0m\u001b[1;31m?\u001b[0m\u001b[1;31m]\u001b[0m \r\n\u001b[1;2;31m⬢\u001b[0m\u001b[1;2;31m [\u001b[0m\u001b[1;2;31mOCI\u001b[0m\u001b[1;2;31m]\u001b[0m \u001b[1;32m❯\u001b[0m \u001b[K\u001b[?2004h"]
|
||||
[10.303159, "o", "e"]
|
||||
[10.310087, "o", "\be\u001b[90mcho \"Hello world\"\u001b[39m\u001b[17D"]
|
||||
[10.49929, "o", "\be\u001b[39mx\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[16D"]
|
||||
[10.505837, "o", "\u001b[90mport EDITOR=vim\u001b[39m\u001b[15D"]
|
||||
[10.597115, "o", "\u001b[39mi\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[14D"]
|
||||
[10.61047, "o", "\u001b[90mt()\u001b[39m\r\r\n\u001b[90mecho hi\u001b[39m\u001b[K\u001bM\u001b[6C"]
|
||||
[10.714876, "o", "\u001b[39mt"]
|
||||
[11.946849, "o", "\u001b[39m \u001b[39m \u001b[1B\r\u001b[K\u001bM\u001b[14C"]
|
||||
[11.947131, "o", "\u001b[?2004l\u001b[1B\r"]
|
184
static/casts/vimstt.cast
Normal file
184
static/casts/vimstt.cast
Normal file
@ -0,0 +1,184 @@
|
||||
{"version": 2, "width": 105, "height": 27, "timestamp": 1690255394, "env": {"SHELL": "/bin/zsh", "TERM": "tmux-256color"}}
|
||||
[0.603476, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
|
||||
[0.605686, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[44mbalki@archlinux\u001b[49m \u001b[1m\u001b[32m~/projects/mine/vimfun/stt\r\n\r\u001b[37m % \u001b[0m\u001b[37m\u001b[39m\u001b[49m\u001b[K\u001b[?2004h"]
|
||||
[1.043556, "o", "b"]
|
||||
[1.123276, "o", "\bba"]
|
||||
[1.203174, "o", "t"]
|
||||
[1.301279, "o", " "]
|
||||
[1.613306, "o", "c"]
|
||||
[1.691404, "o", "o"]
|
||||
[1.76925, "o", "m"]
|
||||
[1.917246, "o", "m"]
|
||||
[2.287072, "o", "o"]
|
||||
[2.369433, "o", "n"]
|
||||
[2.529079, "o", "."]
|
||||
[2.807484, "o", "v"]
|
||||
[2.887561, "o", "i"]
|
||||
[2.987485, "o", "m"]
|
||||
[3.570353, "o", "\u001b[?2004l\r\r\n"]
|
||||
[3.58573, "o", "\r\u001b[38;5;238m───────┬─────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\u001b[m\r\n \u001b[38;5;238m│ \u001b[0mFile: \u001b[1mcommon.vim\u001b[0m\u001b[m\r\n\u001b[38;5;238m───────┼─────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\u001b[m\r\n\u001b[38;5;238m 1\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[m\r\n\u001b[38;5;238m 2\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;81mlet\u001b[0m\u001b[38;5;231m \u001b[0m\u001b[38;5;231mg:mapleader\u001b[0m\u001b[38;5;231m = \u001b[0m\u001b[38;5;186m' '\u001b[0m\u001b[m\r\n\u001b[38;5;238m 3\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;5;81mset\u001b[0m\u001b[38;5;231m splitbelow splitright\u001b[0m\u001b[m\r\n\u001b[38;5;238m───────┴─────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\u001b[m\r\n\r\u001b[K"]
|
||||
[3.587155, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
|
||||
[3.589198, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[44mbalki@archlinux\u001b[49m \u001b[1m\u001b[32m~/projects/mine/vimfun/stt\r\n\r\u001b[37m % \u001b[0m\u001b[37m\u001b[39m\u001b[49m\u001b[K\u001b[?2004h"]
|
||||
[4.995693, "o", "v"]
|
||||
[5.055642, "o", "\bvi"]
|
||||
[5.174006, "o", "m"]
|
||||
[5.273744, "o", " "]
|
||||
[5.41173, "o", "-"]
|
||||
[5.571713, "o", "-"]
|
||||
[5.753233, "o", "c"]
|
||||
[5.931673, "o", "l"]
|
||||
[6.089803, "o", "e"]
|
||||
[6.16969, "o", "a"]
|
||||
[6.331837, "o", "n"]
|
||||
[6.47983, "o", " "]
|
||||
[6.557859, "o", "-"]
|
||||
[6.813152, "o", "S"]
|
||||
[6.984113, "o", " "]
|
||||
[7.224383, "o", "c"]
|
||||
[7.326254, "o", "o"]
|
||||
[7.446336, "o", "m"]
|
||||
[7.588254, "o", "m"]
|
||||
[7.810388, "o", "o"]
|
||||
[7.930429, "o", "n"]
|
||||
[8.108401, "o", "."]
|
||||
[8.462427, "o", "v"]
|
||||
[8.541417, "o", "i"]
|
||||
[8.608111, "o", "m"]
|
||||
[9.234495, "o", " "]
|
||||
[9.534188, "o", "-"]
|
||||
[9.784079, "o", "S"]
|
||||
[10.408508, "o", " "]
|
||||
[10.528223, "o", "s"]
|
||||
[10.686292, "o", "t"]
|
||||
[10.830104, "o", "t"]
|
||||
[11.008242, "o", "."]
|
||||
[11.245051, "o", "v"]
|
||||
[11.390101, "o", "i"]
|
||||
[11.488703, "o", "m"]
|
||||
[12.704646, "o", "\u001b[?2004l\r\r\n"]
|
||||
[12.71955, "o", "\u001b[?1000h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h"]
|
||||
[12.720463, "o", "\u001b[1;27r\u001b[27m\u001b[24m\u001b[23m\u001b[0m\u001b[H\u001b[J\u001b[2;1H▽\u001b[6n\u001b[2;1H \u001b[3;1H\u001bPzz\u001b\\\u001b[0%m\u001b[6n\u001b[3;1H \u001b[1;1H\u001b[>c"]
|
||||
[12.720681, "o", "\u001b[?25l\u001b[2;1H\u001b[94m~ \u001b[3;1H~ \u001b[4;1H~ \u001b[5;1H~ \u001b[6;1H~ \u001b[7;1H~ \u001b[8;1H~ \u001b[9;1H~ \u001b[10;1H~ \u001b[11;1H~ \u001b[12;1H~ \u001b[13;1H~ \u001b[14;1H~ \u001b[15;1H~ \u001b[16;1H~ \u001b[17;1H~ \u001b[18;1H~ \u001b[19;1H~ "]
|
||||
[12.720799, "o", "\u001b[20;1H~ \u001b[21;1H~ \u001b[22;1H~ \u001b[23;1H~ \u001b[24;1H~ \u001b[25;1H~ \u001b[26;1H~ \u001b[0m\u001b[27;88H0,0-1\u001b[9CAll\u001b[8;45HVIM - Vi IMproved\u001b[10;45Hversion 9.0.1676\u001b[11;41Hby Bram Moolenaar et al.\u001b[12;32HVim is open source and freely distributable\u001b[14;39HHelp poor children in Uganda!\u001b[15;30Htype :help iccf\u001b[34m<Enter>\u001b[0m for information \u001b[17;30Htype :q\u001b[34m<Enter>\u001b[0m to exit \u001b[18;30Htype :help\u001b[34m<Enter>\u001b[0m or \u001b[34m<F1>\u001b[0m for on-line help\u001b[19;30Htype :help version9\u001b[34m<Enter>\u001b[0m for version info\u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[14.428684, "o", "\u001b[?25l\u001b[27;78H:\u001b[1;1H\u001b[27;78H\u001b[K\u001b[27;1H:\u001b[?1000l\u001b[34h\u001b[?25h"]
|
||||
[14.830782, "o", "e"]
|
||||
[15.026614, "o", "d"]
|
||||
[15.106625, "o", "i"]
|
||||
[15.204778, "o", "t"]
|
||||
[15.268723, "o", " "]
|
||||
[15.848928, "o", "c"]
|
||||
[15.968866, "o", "h"]
|
||||
[16.026805, "o", "e"]
|
||||
[16.106825, "o", "a"]
|
||||
[16.346622, "o", "t"]
|
||||
[16.586891, "o", "."]
|
||||
[16.724942, "o", "s"]
|
||||
[16.824854, "o", "h"]
|
||||
[17.483213, "o", "\r"]
|
||||
[17.484646, "o", "\u001b[?1000h\u001b[?25l\"cheat.sh\" \u001b[27;12H\u001b[K\u001b[27;12H6L, 57B"]
|
||||
[17.493031, "o", "\u001b[1;1H\u001b[38;5;130mecho\u001b[0m\u001b[31m hi\u001b[0m\r\ndate\u001b[2;5H\u001b[K\u001b[3;1HVIMST \u001b[38;5;130msleep\u001b[0m \u001b[31m4000\u001b[0m\u001b[3;17H\u001b[K\u001b[4;1Hdate\u001b[4;5H\u001b[K\u001b[5;1H\u001b[38;5;130mecho\u001b[0m\u001b[31m bye\u001b[0m\u001b[5;9H\u001b[K\u001b[6;1HVIMST ctrl l\u001b[6;13H\u001b[K\u001b[8;45H\u001b[94m \u001b[10;45H \u001b[11;41H \u001b[12;32H \u001b[14;39H \u001b[15;30H \u001b[17;30H \u001b[18;30H \u001b[19;30H \u001b[0m\u001b[27;88H1,1\u001b[11CAll\u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[18.57496, "o", "\u001b[?25l\u001b[27;78H:\u001b[1;1H\u001b[27;1H\u001b[K\u001b[27;1H:\u001b[?1000l\u001b[34h\u001b[?25h"]
|
||||
[18.747096, "o", "v"]
|
||||
[18.865071, "o", "e"]
|
||||
[18.965219, "o", "r"]
|
||||
[19.145075, "o", "t"]
|
||||
[19.341239, "o", " "]
|
||||
[19.567871, "o", "t"]
|
||||
[19.627258, "o", "e"]
|
||||
[19.745251, "o", "r"]
|
||||
[19.960829, "o", "m"]
|
||||
[20.101664, "o", "i"]
|
||||
[20.221785, "o", "n"]
|
||||
[20.319265, "o", "a"]
|
||||
[20.459327, "o", "l"]
|
||||
[20.793599, "o", "\r"]
|
||||
[20.793953, "o", "\u001b[?1000h\u001b[?25l"]
|
||||
[20.797471, "o", "\u001b[1;54H\b\u001b[7m|\u001b[2;53H|\u001b[3;53H|\u001b[4;53H|\u001b[5;53H|\u001b[6;53H|\u001b[7;53H|\u001b[8;53H|\u001b[9;53H|\u001b[10;53H|\u001b[11;53H|\u001b[12;53H|\u001b[13;53H|\u001b[14;53H|\u001b[15;53H|\u001b[16;53H|\u001b[17;53H|\u001b[18;53H|\u001b[19;53H|\u001b[20;53H|\u001b[21;53H|\u001b[22;53H|\u001b[23;53H|\u001b[24;53H|\u001b[25;53H|\r\ncheat.sh 1,1 All \u001b[0m\u001b[1;54H \u001b[2;54H \u001b[3;54H \u001b[4;54H \u001b[5;54H \u001b[6;54H \u001b[7;54H \u001b[8;54H \u001b[9;54H \u001b[10;54H \u001b[11;54H \u001b[12;54H \u001b[13;54H \u001b[14;54H \u001b[15;54H \u001b[16;54H \u001b[17;54H \u001b[18;54H \u001b[19;54H \u001b[20;54H \u001b[21;54H \u001b[22;54H \u001b[23;54H \u001b[24;54H \u001b[25;54H \u001b[26;54H\u001b[1m\u001b[97m\u001b[42m!/bin/zsh [running] 0,0-1 All\u001b[1;54H\u001b[34h\u001b[?25h"]
|
||||
[21.340332, "o", "\u001b[?25l\u001b[0m\u001b[27;95H^W\u001b[1;54H\u001b[34h\u001b[?25h"]
|
||||
[21.396446, "o", "\u001b[?25l\u001b[1C\u001b[34h\u001b[?25h\u001b[50C\u001b[1;54H\u001b[1C\b\u001b[?25l\u001b[34h\u001b[?25h"]
|
||||
[21.398352, "o", "\u001b[?25l\u001b[15C\u001b[34h\u001b[?25h\u001b[1C\u001b[26C\u001b[1;54H\u001b[2;54H\u001b[3C"]
|
||||
[21.398702, "o", "\u001b[?25l\u001b[1;54H\u001b[44mbalki@archlinux\u001b[0m\u001b[1C\u001b[1m\u001b[32m~/projects/mine/vimfun/stt\u001b[0m\u001b[2;54H\u001b[1m\u001b[37m % \u001b[34h\u001b[?25h"]
|
||||
[21.739615, "o", "\u001b[?25l\u001b[0m\u001b[27;95H \u001b[2;57H\u001b[27;95H^Wh\u001b[2;57H"]
|
||||
[21.739691, "o", "\u001b[27;95H \u001b[1;1H\u001b[26;1H\u001b[1m\u001b[7mcheat.sh 1,1 All \u001b[0m\u001b[97m\u001b[42m!/bin/zsh [running] 1,1 Top\u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[22.89177, "o", "\u001b[?25l\u001b[0m\u001b[27;95H<20>\u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[22.931714, "o", "\u001b[?25l\u001b[27;95H \u001b[1;1H\u001b[?1000l\u001b[?1000h\u001b[34h\u001b[?25h"]
|
||||
[22.933412, "o", "\u001b[?25l\u001b[2;57Hecho hi\u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[22.936354, "o", "\u001b[?25l\u001b[3;54Hhi\u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[22.94211, "o", "\u001b[?25l\u001b[4;54H\u001b[44mbalki@archlinux\u001b[0m\u001b[1C\u001b[1m\u001b[32m~/projects/mine/vimfun/stt\u001b[0m\u001b[5;54H\u001b[1m\u001b[37m % \u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[24.507692, "o", "\u001b[?25l\u001b[0m\u001b[27;95HV\u001b[1;1H"]
|
||||
[24.508117, "o", "\u001b[27;95H1\u001b[1;1H\u001b[1C\u001b[38;5;130m\u001b[47mcho\u001b[0m\u001b[31m\u001b[47m hi\u001b[0m\u001b[47m \u001b[0m\u001b[27;1H\u001b[1m-- VISUAL LINE --\u001b[0m\u001b[27;95H\u001b[K\u001b[27;95H1\u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[24.789755, "o", "\u001b[?25l\u001b[27;95Hj\u001b[1;1H"]
|
||||
[24.790102, "o", "\u001b[27;95H2\u001b[2;1H\u001b[1;1H\u001b[38;5;130m\u001b[47me\u001b[0m\r\nd\u001b[47mate \u001b[0m\u001b[26;35H\u001b[1m\u001b[7m2\u001b[2;1H\u001b[34h\u001b[?25h"]
|
||||
[25.077917, "o", "\u001b[?25l\u001b[0m\u001b[27;95Hj\u001b[2;1H"]
|
||||
[25.078442, "o", "\u001b[27;95H3\u001b[3;1H\u001b[2;1H\u001b[47md\r\n\u001b[0mV\u001b[47mIMST \u001b[0m\u001b[38;5;130m\u001b[47msleep\u001b[0m\u001b[47m \u001b[0m\u001b[31m\u001b[47m4000\u001b[0m\u001b[47m \u001b[0m\u001b[26;35H\u001b[1m\u001b[7m3\u001b[3;1H\u001b[34h\u001b[?25h"]
|
||||
[25.353911, "o", "\u001b[?25l\u001b[0m\u001b[27;95Hj\u001b[3;1H"]
|
||||
[25.354276, "o", "\u001b[27;95H4\u001b[4;1H\u001b[3;1H\u001b[47mV\r\n\u001b[0md\u001b[47mate \u001b[0m\u001b[26;35H\u001b[1m\u001b[7m4\u001b[4;1H\u001b[34h\u001b[?25h"]
|
||||
[25.781257, "o", "\u001b[?25l\u001b[0m\u001b[27;95Hj\u001b[4;1H"]
|
||||
[25.781502, "o", "\u001b[27;95H5\u001b[5;1H\u001b[4;1H\u001b[47md\u001b[0m\u001b[5;2H\u001b[38;5;130m\u001b[47mcho\u001b[0m\u001b[31m\u001b[47m bye\u001b[0m\u001b[47m \u001b[0m\u001b[26;35H\u001b[1m\u001b[7m5\u001b[5;1H\u001b[34h\u001b[?25h"]
|
||||
[26.178059, "o", "\u001b[?25l\u001b[0m\u001b[27;95H<20>\u001b[5;1H\u001b[34h\u001b[?25h"]
|
||||
[26.238921, "o", "\u001b[?25l\u001b[27;95H5 \u001b[5;1H\u001b[27;95H \u001b[1;1H\u001b[?1000l\u001b[?1000h\u001b[38;5;130mecho\u001b[0m\u001b[31m hi\u001b[0m \r\ndate \r\nVIMST \u001b[38;5;130msleep\u001b[0m \u001b[31m4000\u001b[0m \r\ndate \u001b[5;2H\u001b[38;5;130mcho\u001b[0m\u001b[31m bye\u001b[0m \u001b[27;1H\u001b[K\u001b[26;35H\u001b[1m\u001b[7m1\u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[26.239565, "o", "\u001b[?25l\u001b[0m\u001b[5;57Hecho hi\u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[26.240481, "o", "\u001b[?25l\u001b[6;54Hhi\u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[26.246317, "o", "\u001b[?25l\u001b[7;54H\u001b[44mbalki@archlinux\u001b[0m\u001b[1C\u001b[1m\u001b[32m~/projects/mine/vimfun/stt\u001b[0m\u001b[8;54H\u001b[1m\u001b[37m % \u001b[0mdate\u001b[1;1H\u001b[34h\u001b[?25h\u001b[?25l\u001b[34h\u001b[?25h"]
|
||||
[26.250645, "o", "\u001b[?25l\u001b[9;54HMon 24 Jul 2023 11:23:41 PM EDT\u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[26.251354, "o", "\u001b[?25l\u001b[34h\u001b[?25h"]
|
||||
[26.256797, "o", "\u001b[?25l\u001b[10;54H\u001b[44mbalki@archlinux\u001b[0m\u001b[1C\u001b[1m\u001b[32m~/projects/mine/vimfun/stt\u001b[0m\u001b[11;54H\u001b[1m\u001b[37m % \u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[30.242604, "o", "\u001b[?25l\u001b[34h\u001b[?25h"]
|
||||
[30.2437, "o", "\u001b[?25l\u001b[0m\u001b[11;57Hdate\u001b[1;1H\u001b[34h\u001b[?25h\u001b[?25l\u001b[34h\u001b[?25h"]
|
||||
[30.24826, "o", "\u001b[?25l\u001b[12;54HMon 24 Jul 2023 11:23:45 PM EDT\u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[30.248916, "o", "\u001b[?25l\u001b[34h\u001b[?25h"]
|
||||
[30.254193, "o", "\u001b[?25l\u001b[13;54H\u001b[44mbalki@archlinux\u001b[0m\u001b[1C\u001b[1m\u001b[32m~/projects/mine/vimfun/stt\u001b[0m\u001b[14;54H\u001b[1m\u001b[37m % \u001b[0mecho\u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[30.254912, "o", "\u001b[?25l\u001b[14;62Hbye\u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[30.255543, "o", "\u001b[?25l\u001b[15;54Hbye\u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[30.260783, "o", "\u001b[?25l\u001b[16;54H\u001b[44mbalki@archlinux\u001b[0m\u001b[1C\u001b[1m\u001b[32m~/projects/mine/vimfun/stt\u001b[0m\u001b[17;54H\u001b[1m\u001b[37m % \u001b[1;1H\u001b[34h\u001b[?25h"]
|
||||
[32.366676, "o", "\u001b[?25l\u001b[0m\u001b[27;95HG\u001b[1;1H\u001b[27;95H \u001b[6;1H\u001b[26;35H\u001b[1m\u001b[7m6\u001b[6;1H\u001b[34h\u001b[?25h"]
|
||||
[33.622721, "o", "\u001b[?25l\u001b[0m\u001b[27;95Hk\u001b[6;1H\u001b[27;95H \u001b[5;1H\u001b[26;35H\u001b[1m\u001b[7m5\u001b[5;1H\u001b[34h\u001b[?25h"]
|
||||
[33.804893, "o", "\u001b[?25l\u001b[0m\u001b[27;95Hk\u001b[5;1H\u001b[27;95H \u001b[4;1H\u001b[26;35H\u001b[1m\u001b[7m4\u001b[4;1H\u001b[34h\u001b[?25h"]
|
||||
[38.012689, "o", "\u001b[?25l\u001b[26;35H6,8\u001b[6;8H\u001b[34h\u001b[?25h"]
|
||||
[38.359024, "o", "\u001b[?1000l\u001b[?1000h\u001b[?25l\u001b[34h\u001b[?25h"]
|
||||
[38.360913, "o", "\u001b[?25l\u001b[0m\u001b[2;57H \u001b[3;54H \u001b[4;54H \u001b[5;54H \u001b[6;54H \u001b[7;54H \u001b[8;54H \u001b[9;54H \u001b[10;54H \u001b[11;54H \u001b[12;54H \u001b[13;54H \u001b[14;54H \u001b[15;54H \u001b[16;54H \u001b[17;54H \u001b[6;8H\u001b[34h\u001b[?25h"]
|
||||
[39.454289, "o", "\u001b[?25l\u001b[26;35H\u001b[1m\u001b[7m5\u001b[5;8H\u001b[34h\u001b[?25h"]
|
||||
[39.618716, "o", "\u001b[?1000l\u001b[?1000h\u001b[?25l\u001b[34h\u001b[?25h"]
|
||||
[39.620149, "o", "\u001b[?25l\u001b[0m\u001b[2;57Hecho bye\u001b[5;8H\u001b[34h\u001b[?25h"]
|
||||
[39.621315, "o", "\u001b[?25l\u001b[3;54Hbye\u001b[5;8H\u001b[34h\u001b[?25h"]
|
||||
[39.623263, "o", "\u001b[?25l\u001b[4;54H\u001b[44mbalki@archlinux\u001b[0m\u001b[1C\u001b[1m\u001b[32m~/projects/mine/vimfun/stt\u001b[0m\u001b[5;54H\u001b[1m\u001b[37m % \u001b[5;8H\u001b[34h\u001b[?25h"]
|
||||
[40.77026, "o", "\u001b[?25l\u001b[0m\u001b[26;35H\u001b[1m\u001b[7m1,7\u001b[1;7H\u001b[34h\u001b[?25h"]
|
||||
[40.93504, "o", "\u001b[?1000l\u001b[?1000h\u001b[?25l\u001b[34h\u001b[?25h"]
|
||||
[40.936345, "o", "\u001b[?25l\u001b[0m\u001b[5;57Hecho hi\u001b[1;7H\u001b[34h\u001b[?25h"]
|
||||
[40.937653, "o", "\u001b[?25l\u001b[6;54Hhi\u001b[1;7H\u001b[34h\u001b[?25h"]
|
||||
[40.943521, "o", "\u001b[?25l\u001b[7;54H\u001b[44mbalki@archlinux\u001b[0m\u001b[1C\u001b[1m\u001b[32m~/projects/mine/vimfun/stt\u001b[0m\u001b[8;54H\u001b[1m\u001b[37m % \u001b[1;7H\u001b[34h\u001b[?25h"]
|
||||
[42.629357, "o", "\u001b[?25l\u001b[0m\u001b[26;35H\u001b[1m\u001b[7m6,12\u001b[6;12H\u001b[34h\u001b[?25h"]
|
||||
[44.032006, "o", "\u001b[?25l\u001b[0m\u001b[27;95H:\u001b[6;12H\u001b[27;95H\u001b[K\u001b[27;1H:\u001b[?1000l\u001b[34h\u001b[?25h"]
|
||||
[44.193796, "o", "q"]
|
||||
[44.393755, "o", "a"]
|
||||
[44.71981, "o", "!"]
|
||||
[45.462189, "o", "\r\u001b[?1000h\u001b[?25l\u001b[?1000l\u001b[?2004l"]
|
||||
[45.462284, "o", "\u001b[27;1H\u001b[K\u001b[27;1H\u001b[?2004l\u001b[?1l\u001b>\u001b[?1049l\u001b[34h\u001b[?25h"]
|
||||
[45.464866, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
|
||||
[45.470145, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[44mbalki@archlinux\u001b[49m \u001b[1m\u001b[32m~/projects/mine/vimfun/stt\r\n\r\u001b[37m % \u001b[0m\u001b[37m\u001b[39m\u001b[49m\u001b[K\u001b[?2004h"]
|
||||
[47.152206, "o", ":"]
|
||||
[47.614152, "o", "\b: "]
|
||||
[47.812179, "o", "T"]
|
||||
[47.892206, "o", "h"]
|
||||
[48.044315, "o", "a"]
|
||||
[48.102131, "o", "n"]
|
||||
[48.202197, "o", "k"]
|
||||
[48.320023, "o", "s"]
|
||||
[48.460466, "o", " "]
|
||||
[48.540361, "o", "f"]
|
||||
[48.618256, "o", "o"]
|
||||
[48.718252, "o", "r"]
|
||||
[48.778222, "o", " "]
|
||||
[49.134702, "o", "w"]
|
||||
[49.234434, "o", "a"]
|
||||
[49.310933, "o", "t"]
|
||||
[49.596789, "o", "c"]
|
||||
[49.734453, "o", "h"]
|
||||
[49.834509, "o", "i"]
|
||||
[49.952548, "o", "n"]
|
||||
[50.03251, "o", "g"]
|
||||
[50.352787, "o", "!"]
|
||||
[50.909101, "o", "\u001b[?2004l\r\r\n"]
|
||||
[50.914851, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
|
||||
[50.916752, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[44mbalki@archlinux\u001b[49m \u001b[1m\u001b[32m~/projects/mine/vimfun/stt\r\n\r\u001b[37m % \u001b[0m\u001b[37m\u001b[39m\u001b[49m\u001b[K\u001b[?2004h"]
|
||||
[51.490522, "o", "\u001b[?2004l\r\r\n"]
|
@ -1,35 +0,0 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline' data: ;">
|
||||
<meta http-equiv="refresh" content="5000" >
|
||||
|
||||
<title></title>
|
||||
|
||||
<!-- Diable favicon requests: https://stackoverflow.com/a/13416784 -->
|
||||
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
|
||||
<link href="assets/bootstrap.min.css" rel="stylesheet" >
|
||||
|
||||
<script src="assets/bootstrap.min.js" defer></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<nav>
|
||||
<ul class="nav">
|
||||
<li class="nav-item"><a class="nav-link" href="/"> Home </a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="https://blog.balki.me"> Blog </a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="/stuff.html"> Stuff </a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="https://gitea.balki.me/balki/blog"> Source </a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="container" >
|
||||
<main>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user