Compare commits

..

No commits in common. "main" and "gh-pages" have entirely different histories.

58 changed files with 1670 additions and 28196 deletions

3
.gitignore vendored
View File

@ -11,6 +11,3 @@ package.json
*.gemspec
.jekyll-cache
.vscode
# Local Netlify folder
.netlify

1
404.md
View File

@ -6,3 +6,4 @@ permalink: /404
Sorry, we can't find that page that you're looking for. You can try again by going [back to the homepage]({{ site.baseurl }}/).
[<img src="{{ site.baseurl }}/images/404.jpg" alt="Constructocat by https://github.com/jasoncostello" style="width: 400px;"/>]({{ site.baseurl }}/)

View File

@ -1,4 +1,4 @@
source "https://rubygems.org"
gem 'github-pages'
gem "webrick", "~> 1.9.1"
gem "webrick", "~> 1.7"

View File

@ -1,65 +1,51 @@
GEM
remote: https://rubygems.org/
specs:
activesupport (8.0.2)
base64
benchmark (>= 0.3)
bigdecimal
concurrent-ruby (~> 1.0, >= 1.3.1)
connection_pool (>= 2.2.5)
drb
i18n (>= 1.6, < 2)
logger (>= 1.4.2)
minitest (>= 5.1)
securerandom (>= 0.3)
tzinfo (~> 2.0, >= 2.0.5)
uri (>= 0.13.1)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
base64 (0.2.0)
benchmark (0.4.1)
bigdecimal (3.2.1)
activesupport (6.0.5)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
zeitwerk (~> 2.2, >= 2.2.2)
addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0)
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.12.2)
coffee-script-source (1.11.1)
colorator (1.1.0)
commonmarker (0.23.11)
concurrent-ruby (1.3.5)
connection_pool (2.5.3)
csv (3.3.5)
dnsruby (1.72.4)
base64 (~> 0.2.0)
logger (~> 1.6.5)
simpleidn (~> 0.2.1)
drb (2.2.3)
commonmarker (0.23.5)
concurrent-ruby (1.1.10)
dnsruby (1.61.9)
simpleidn (~> 0.1)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
ethon (0.16.0)
ethon (0.15.0)
ffi (>= 1.15.0)
eventmachine (1.2.7)
eventmachine (1.2.7-x64-mingw32)
execjs (2.10.0)
faraday (2.13.1)
faraday-net_http (>= 2.0, < 3.5)
json
logger
faraday-net_http (3.4.0)
net-http (>= 0.5.0)
ffi (1.17.2)
execjs (2.8.1)
faraday (2.3.0)
faraday-net_http (~> 2.0)
ruby2_keywords (>= 0.0.4)
faraday-net_http (2.0.3)
ffi (1.15.5)
ffi (1.15.5-x64-mingw-ucrt)
ffi (1.15.5-x64-mingw32)
ffi (1.15.5-x64-unknown)
forwardable-extended (2.6.0)
gemoji (4.1.0)
github-pages (232)
github-pages-health-check (= 1.18.2)
jekyll (= 3.10.0)
jekyll-avatar (= 0.8.0)
jekyll-coffeescript (= 1.2.2)
jekyll-commonmark-ghpages (= 0.5.1)
jekyll-default-layout (= 0.1.5)
jekyll-feed (= 0.17.0)
gemoji (3.0.1)
github-pages (226)
github-pages-health-check (= 1.17.9)
jekyll (= 3.9.2)
jekyll-avatar (= 0.7.0)
jekyll-coffeescript (= 1.1.1)
jekyll-commonmark-ghpages (= 0.2.0)
jekyll-default-layout (= 0.1.4)
jekyll-feed (= 0.15.1)
jekyll-gist (= 1.5.0)
jekyll-github-metadata (= 2.16.1)
jekyll-github-metadata (= 2.13.0)
jekyll-include-cache (= 0.2.1)
jekyll-mentions (= 1.6.0)
jekyll-optional-front-matter (= 0.3.2)
@ -86,34 +72,32 @@ GEM
jekyll-theme-tactile (= 0.2.0)
jekyll-theme-time-machine (= 0.2.0)
jekyll-titles-from-headings (= 0.5.3)
jemoji (= 0.13.0)
kramdown (= 2.4.0)
jemoji (= 0.12.0)
kramdown (= 2.3.2)
kramdown-parser-gfm (= 1.1.0)
liquid (= 4.0.4)
liquid (= 4.0.3)
mercenary (~> 0.3)
minima (= 2.5.1)
nokogiri (>= 1.16.2, < 2.0)
rouge (= 3.30.0)
nokogiri (>= 1.13.4, < 2.0)
rouge (= 3.26.0)
terminal-table (~> 1.4)
webrick (~> 1.8)
github-pages-health-check (1.18.2)
github-pages-health-check (1.17.9)
addressable (~> 2.3)
dnsruby (~> 1.60)
octokit (>= 4, < 8)
public_suffix (>= 3.0, < 6.0)
octokit (~> 4.0)
public_suffix (>= 3.0, < 5.0)
typhoeus (~> 1.3)
html-pipeline (2.14.3)
html-pipeline (2.14.2)
activesupport (>= 2)
nokogiri (>= 1.4)
http_parser.rb (0.8.0)
i18n (1.14.7)
i18n (0.9.5)
concurrent-ruby (~> 1.0)
jekyll (3.10.0)
jekyll (3.9.2)
addressable (~> 2.4)
colorator (~> 1.0)
csv (~> 3.0)
em-websocket (~> 0.5)
i18n (>= 0.7, < 2)
i18n (~> 0.7)
jekyll-sass-converter (~> 1.0)
jekyll-watch (~> 2.0)
kramdown (>= 1.17, < 3)
@ -122,28 +106,27 @@ GEM
pathutil (~> 0.9)
rouge (>= 1.7, < 4)
safe_yaml (~> 1.0)
webrick (>= 1.0)
jekyll-avatar (0.8.0)
jekyll-avatar (0.7.0)
jekyll (>= 3.0, < 5.0)
jekyll-coffeescript (1.2.2)
jekyll-coffeescript (1.1.1)
coffee-script (~> 2.2)
coffee-script-source (~> 1.12)
coffee-script-source (~> 1.11.1)
jekyll-commonmark (1.4.0)
commonmarker (~> 0.22)
jekyll-commonmark-ghpages (0.5.1)
commonmarker (>= 0.23.7, < 1.1.0)
jekyll (>= 3.9, < 4.0)
jekyll-commonmark-ghpages (0.2.0)
commonmarker (~> 0.23.4)
jekyll (~> 3.9.0)
jekyll-commonmark (~> 1.4.0)
rouge (>= 2.0, < 5.0)
jekyll-default-layout (0.1.5)
jekyll (>= 3.0, < 5.0)
jekyll-feed (0.17.0)
rouge (>= 2.0, < 4.0)
jekyll-default-layout (0.1.4)
jekyll (~> 3.0)
jekyll-feed (0.15.1)
jekyll (>= 3.7, < 5.0)
jekyll-gist (1.5.0)
octokit (~> 4.2)
jekyll-github-metadata (2.16.1)
jekyll-github-metadata (2.13.0)
jekyll (>= 3.4, < 5.0)
octokit (>= 4, < 7, != 4.4.0)
octokit (~> 4.0, != 4.4.0)
jekyll-include-cache (0.2.1)
jekyll (>= 3.7, < 5.0)
jekyll-mentions (1.6.0)
@ -214,49 +197,46 @@ GEM
jekyll (>= 3.3, < 5.0)
jekyll-watch (2.2.1)
listen (~> 3.0)
jemoji (0.13.0)
gemoji (>= 3, < 5)
jemoji (0.12.0)
gemoji (~> 3.0)
html-pipeline (~> 2.2)
jekyll (>= 3.0, < 5.0)
json (2.12.2)
kramdown (2.4.0)
kramdown (2.3.2)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.4)
listen (3.9.0)
liquid (4.0.3)
listen (3.7.1)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
logger (1.6.6)
mercenary (0.3.6)
mini_portile2 (2.8.9)
minima (2.5.1)
jekyll (>= 3.5, < 5.0)
jekyll-feed (~> 0.9)
jekyll-seo-tag (~> 2.1)
minitest (5.25.5)
net-http (0.6.0)
uri
nokogiri (1.18.8)
mini_portile2 (~> 2.8.2)
minitest (5.16.2)
nokogiri (1.13.6-x64-mingw-ucrt)
racc (~> 1.4)
nokogiri (1.18.8-x64-mingw-ucrt)
nokogiri (1.13.6-x64-mingw32)
racc (~> 1.4)
nokogiri (1.18.8-x86_64-linux-gnu)
nokogiri (1.13.6-x64-unknown)
racc (~> 1.4)
nokogiri (1.13.6-x86_64-linux)
racc (~> 1.4)
octokit (4.25.1)
faraday (>= 1, < 3)
sawyer (~> 0.9)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (5.1.1)
racc (1.8.1)
rb-fsevent (0.11.2)
rb-inotify (0.11.1)
public_suffix (4.0.7)
racc (1.6.0)
rb-fsevent (0.11.1)
rb-inotify (0.10.1)
ffi (~> 1.0)
rexml (3.4.1)
rouge (3.30.0)
rubyzip (2.4.1)
rexml (3.2.5)
rouge (3.26.0)
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
safe_yaml (1.0.5)
sass (3.7.4)
sass-listen (~> 4.0.0)
@ -266,17 +246,24 @@ GEM
sawyer (0.9.2)
addressable (>= 2.3.5)
faraday (>= 0.17.3, < 3)
securerandom (0.4.1)
simpleidn (0.2.3)
simpleidn (0.2.1)
unf (~> 0.1.4)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
typhoeus (1.4.1)
thread_safe (0.3.6)
typhoeus (1.4.0)
ethon (>= 0.9.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
tzinfo (1.2.10)
thread_safe (~> 0.1)
unf (0.1.4)
unf_ext
unf_ext (0.0.8.2)
unf_ext (0.0.8.2-x64-mingw-ucrt)
unf_ext (0.0.8.2-x64-mingw32)
unf_ext (0.0.8.2-x64-unknown)
unicode-display_width (1.8.0)
uri (1.0.3)
webrick (1.9.1)
webrick (1.7.0)
zeitwerk (2.6.0)
PLATFORMS
x64-mingw-ucrt
@ -286,7 +273,7 @@ PLATFORMS
DEPENDENCIES
github-pages
webrick (~> 1.9.1)
webrick (~> 1.7)
BUNDLED WITH
2.3.17

View File

@ -4,7 +4,7 @@ description: Dumpyard for my thoughts!
footer-links:
dribbble:
email: n.suryap@gmail.com
email: neophytenuggets@proton.me
facebook:
flickr:
github: cool-mist
@ -43,9 +43,14 @@ sass:
plugins:
- jekyll-sitemap # Create a sitemap using the official Jekyll sitemap gem
- jekyll-feed # Create an Atom feed using the official Jekyll feed gem
- jekyll-seo-tag
- jekyll-paginate
include: ['_pages']
paginate: 6
paginate_path: /page:num/
# Exclude these files from your production _site
exclude:
- Gemfile
@ -53,6 +58,4 @@ exclude:
- LICENSE
- README.md
- CNAME
- package-lock.json
- deploy.sh

14
_includes/svg-icons.html Normal file
View File

@ -0,0 +1,14 @@
{% if site.footer-links.dribbble %}<a href="https://dribbble.com/{{ site.footer-links.dribbble }}"><i class="svg-icon dribbble"></i></a>{% endif %}
{% if site.footer-links.email %}<a href="mailto:{{ site.footer-links.email }}"><i class="svg-icon email"></i></a>{% endif %}
{% if site.footer-links.facebook %}<a href="https://www.facebook.com/{{ site.footer-links.facebook }}"><i class="svg-icon facebook"></i></a>{% endif %}
{% if site.footer-links.flickr %}<a href="https://www.flickr.com/{{ site.footer-links.flickr }}"><i class="svg-icon flickr"></i></a>{% endif %}
{% if site.footer-links.github %}<a href="https://github.com/{{ site.footer-links.github }}"><i class="svg-icon github"></i></a>{% endif %}
{% if site.footer-links.instagram %}<a href="https://instagram.com/{{ site.footer-links.instagram }}"><i class="svg-icon instagram"></i></a>{% endif %}
{% if site.footer-links.linkedin %}<a href="https://www.linkedin.com/in/{{ site.footer-links.linkedin }}"><i class="svg-icon linkedin"></i></a>{% endif %}
{% if site.footer-links.pinterest %}<a href="https://www.pinterest.com/{{ site.footer-links.pinterest }}"><i class="svg-icon pinterest"></i></a>{% endif %}
{% if site.footer-links.rss %}<a href="{{ site.baseurl }}/feed.xml"><i class="svg-icon rss"></i></a>{% endif %}
{% if site.footer-links.twitter %}<a href="https://www.twitter.com/{{ site.footer-links.twitter }}"><i class="svg-icon twitter"></i></a>{% endif %}
{% if site.footer-links.stackoverflow %}<a href="http://stackoverflow.com/{{ site.footer-links.stackoverflow }}"><i class="svg-icon stackoverflow"></i></a>{% endif %}
{% if site.footer-links.youtube %}<a href="https://youtube.com/{{ site.footer-links.youtube }}"><i class="svg-icon youtube"></i></a>{% endif %}
{% if site.footer-links.googleplus %}<a href="https://plus.google.com/{{ site.footer-links.googleplus }}"><i class="svg-icon googleplus"></i></a>{% endif %}
{% if site.footer-links.playconsole %}<a href="https://play.google.com/store/apps/dev?id={{ site.footer-links.playconsole }}"><i class="svg-icon playconsole"></i></a>{% endif %}

View File

@ -2,30 +2,51 @@
<html>
<head>
<title>{% if page.title %}{{ page.title }} {% endif %}{{ site.name }} {{ site.description }}</title>
{% seo title=false %}
{% include meta.html %}
<link rel="stylesheet" type="text/css" href="{{ site.baseurl }}/assets/style.css" />
<link rel="alternate" type="application/rss+xml" title="{{ site.name }} - {{ site.description }}" href="{{ site.baseurl }}/feed.xml" />
<link rel="canonical" href="{{ site.url }}{{ page.url }}" />
<meta name="theme-color" content="#000000">
<link rel="icon" type="image/png" sizes="32x32" href="{{ site.baseurl }}/images/favicon.png">
</head>
<body>
<div class="wrapper-main">
<div class="one-fourth">
</div>
<div id="main" class="one-half">
<div class="site-info">
<h1 class="site-name"><a href="{{ site.baseurl }}/">{{ site.name }}</a></h1>
<div id="bar"></div>
<div class="wrapper-container">
<div class="wrapper-masthead">
<div class="container">
<header class="masthead clearfix">
<a href="{{ site.baseurl }}/" class="site-avatar"><img src="{{ site.baseurl }}/images/site-avatar.png" alt="{{ site.title }}" /></a>
</div>
<div class="nav-links">
<a id="nav-home" href="{{ site.baseurl }}/">Home</a>
<a id="nav-about" href="{{ site.baseurl }}/about">About</a>
<a id="nav-rss" href="{{ site.baseurl }}/feed.xml" target="_blank">RSS Feed</a>
</div>
<div class="site-info">
<h1 class="site-name"><a href="{{ site.baseurl }}/">{{ site.name }}</a></h1>
<p class="site-description">{{ site.description }}</p>
</div>
<nav>
<a href="{{ site.baseurl }}/">Home</a>
<a href="{{ site.baseurl }}/about">About</a>
<a href="{{ site.baseurl }}/archive">Archive</a>
<a href="{{ site.baseurl }}/search">Search</a>
</nav>
</header>
</div>
</div>
<div class="wrapper-main">
<div id="main" role="main" class="container">
{{ content }}
</div>
<div class="one-fourth">
</div>
<div class="wrapper-footer">
<div class="container">
<footer class="footer">
{% include svg-icons.html %}
</footer>
</div>
</div>
</div>

View File

@ -3,7 +3,9 @@ layout: default
---
<article class="page">
<h1>{{ page.title }}</h1>
<div class="entry">
{{ content }}
</div>

View File

@ -3,17 +3,55 @@ layout: default
---
<article class="post detailed">
<h1>{{ page.title }}</h1>
<div>
<p class="author_title">{{ page.date | date: "%B %e, %Y" }}</p>
{% if page.last_modified_at %}
<p class="author_title" datetime="{{ page.last_modified_at | date_to_xmlschema }}">(Updated: {{ page.last_modified_at | date: "%b %-d, %Y" }})</p>
{% endif %}
<div class="post-tags">
{% if post %}
{% assign categories = post.categories %}
{% else %}
{% assign categories = page.categories %}
{% endif %}
{% for category in categories %}
<a href="{{site.baseurl}}/categories/#{{category|slugize}}">{{category}}</a>
{% unless forloop.last %}&nbsp;{% endunless %}
{% endfor %}
</div>
</div>
<h1>{{ page.title }}</h1>
<div class="entry">
{{ content }}
</div>
<hr />
<div class="comments">
<b>Have something to say?</b>
Send an email with your comments to <u>n.suryap@gmail.com</u>.
</div>
<hr/>
<div class="comments">
<b>Have something to say? You can ...</b>
<br/>
<ul>
{% if page.discussion %}
<li>Comment on the below box by authorizing the <a href=https://giscus.app> Gisqus </a> app on your github account.</li>
<li>Comment directly on the <a href="https://github.com/cool-mist/bbb/discussions/{{ page.discussion }}">github discussion page for this article</a>.</li>
{% endif %}
<li>Send an email with your comments to <u>neophytenuggets@proton.me</u>.</li>
</ul>
</div>
{% if page.discussion %}
<script src="https://giscus.app/client.js"
data-repo="cool-mist/bbb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMTkzNTk1MTI="
data-mapping="number"
data-term="{{page.discussion}}"
data-reactions-enabled="0"
data-emit-metadata="0"
data-input-position="bottom"
data-theme="light_tritanopia"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous"
async>
</script>
{% endif %}
</article>

View File

@ -4,11 +4,31 @@ permalink: /about/
title: About
---
<div class="entry" id="archives">
<ul>
<li> I'm a software developer from India, born in late 90s.</li>
<li> Views expressed here are my own and not endorsed, shared etc by my place of work, friends etc</li>
<li> My github is <a href="https://github.com/cool-mist" target="_blank">@coolmist</a></li>
<li> You can reach out to me via email <b class="hilite">n.suryap@gmail.com</b></li>
<li> You can reach out to me via email <b>neophytenuggets@protonmail</b></li>
<li> My public key is
<pre>
<code style="color:black">
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEY8PVmhYJKwYBBAHaRw8BAQdANxcKoo0fqmW62F2tQ7F0GPWkpGs/HQUyhR77
R2mgsY20JVN1cnlhIDxuZW9waHl0ZW51Z2dldHNAcHJvdG9ubWFpbC5tZT6ImQQT
FgoAQRYhBGixkTCdlU1PIjiQZSHehx95aKkIBQJjw9WaAhsDBQkDw4BOBQsJCAcC
AiICBhUKCQgLAgQWAgMBAh4HAheAAAoJECHehx95aKkIZB8A+wfMy7gqISQGXrIc
FiiwCzfoqzQfnJozLdaOA4MvU8RcAP9gY6U1Bm8LQDijr3LCFm7raLjBNBNwrWQg
cWuuqbiJDrg4BGPD1ZoSCisGAQQBl1UBBQEBB0AkrwBdf8M3EdsykIcYMBejeSHs
iiQGTLhZrYuvXtoNSgMBCAeIfgQYFgoAJhYhBGixkTCdlU1PIjiQZSHehx95aKkI
BQJjw9WaAhsMBQkDw4BOAAoJECHehx95aKkIF6sA/01X0YnHTjUo7nUaBzk4ub+3
Ub3FKJTeSooaQ39Y3V3QAQDH407drRMw3OgnRiSKDXsbjGhAec7vQip768acjYbq
Aw==
=Ioiu
-----END PGP PUBLIC KEY BLOCK-----
</code>
</pre></li>
</ul>
</div>

33
_pages/archive.md Normal file
View File

@ -0,0 +1,33 @@
---
layout: page
permalink: /archive/
title: Posts Archive
---
<div id="archives">
<section id="archive">
<h3>Most Recent Posts</h3>
{%for post in site.posts %}
{% unless post.next %}
<ul class="this">
{% else %}
{% capture month %}{{ post.date | date: '%B %Y' }}{% endcapture %}
{% capture nmonth %}{{ post.next.date | date: '%B %Y' }}{% endcapture %}
{% capture year %}{{ post.date | date: '%Y' }}{% endcapture %}
{% capture nyear %}{{ post.next.date | date: '%Y' }}{% endcapture %}
{% if year != nyear %}
</ul>
<h2 style="text-align:left;">{{ post.date | date: '%Y' }}</h2>
<ul class="past">
{% endif %}
{% if month != nmonth %}
<h3 style="text-align:left;">{{ post.date | date: '%B %Y' }}</h3>
{% endif %}
{% endunless %}
<p><b><a href="{{ site.baseurl }}{{ post.url }}">{% if post.title and post.title != "" %}{{post.title}}{% else %}{{post.excerpt |strip_html}}{%endif%}</a></b> - {% if post.date and post.date != "" %}{{ post.date | date: "%e %B %Y" }}{%endif%}</p>
{% endfor %}
</ul>
<h3>Oldest Posts</h3>
</section>
</div>

21
_pages/search.md Normal file
View File

@ -0,0 +1,21 @@
---
layout: page
title: Search
permalink: /search/
---
<div id="search-container">
<input type="text" id="search-input" placeholder="Search through the blog posts...">
<ul id="results-container"></ul>
</div>
<script src="{{ site.baseurl }}/assets/simple-jekyll-search.min.js" type="text/javascript"></script>
<script>
SimpleJekyllSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('results-container'),
searchResultTemplate: '<div style="text-align: left !important;"><a href="{url}"><h1 style="text-align:left !important;">{title}</h1></a><span style="text-align:left !important;">{date}</span></div>',
json: '{{ site.baseurl }}/search.json'
});
</script>

View File

@ -4,6 +4,13 @@ title: The OSI Model
categories: ["networks"]
---
The OSI model lays down specifications on how to think about achieving inter-process communication across machines. This article goes over breaking down the
what and why of this model and introduces the readers to some of the jargon surrounding this topic.
![OSI Outline]({{site.base_url | absolute_url}}/images/osi-outline.png)
------
# The Mail Analogy
It is useful to generalize by drawing comparisons with the [postal system](https://en.wikipedia.org/wiki/Mail) when it comes to understanding inter-process communication across machines.
@ -98,4 +105,4 @@ It is common practice to abbreviate the layers as **L4**, **L7** and so on.
Developers program at the application layer and have constructs in the programming language that would talk to the Transport Layer of the machine. For the most part, the Transport layer's behavior is governed by the **[Internet Protocol Suite (TCP/IP)](https://en.wikipedia.org/wiki/Internet_protocol_suite)**. It is important to have a practical understanding of TCP/IP which would prove useful in a variety of situations.
More on this in the next article!
More on this in the next article!

View File

@ -4,6 +4,14 @@ title: Connections
categories: ["networks"]
---
The Internet Protocol Suite consists of multiple protocol specifications that are implemented by almost all computers and other network devices. One primary abstraction available to the developers to process communication scenarios is a **connection**. The developer would get typically get hold of a connection object and send and receive messages through it from the application layer.
Available to the application developer are 2 widely used connection protocols - [Transmission Control Protocol](https://en.wikipedia.org/wiki/Transmission_Control_Protocol) and [User Datagram Protocol](https://en.wikipedia.org/wiki/User_Datagram_Protocol). While both the protocols are in general use, TCP is the most common. It is also the protocol that developers are mostly going to concern themselves with. Therefore, this post will focus on TCP.
There is abundant literature on the exact packet structure at different layers on the internet. This post will limit itself to discussing TCP connections - what are they and how to use and reason about them in your applications.
---------------
Let's start with some definitions.
## Network

View File

@ -4,6 +4,10 @@ title: A Dimensional Odyssey
categories: ["books"]
---
My thoughts on the 1884 novella **Flatlands - a romance in many dimensions by Edwin Abbot Abbot**. This book teaches us on how to think about the 4<sup>th</sup> dimension.
--------
[Edwin Abbot Abbot](https://en.wikipedia.org/wiki/Edwin_Abbott_Abbott) was an English master by profession and had studied and published works on Mathematics, Philology and Theology during his lifetime of which [Flatlands](https://en.wikipedia.org/wiki/Flatland) is one such work under the Mathematical fiction genre.
The book follows the adventures of a Square that lives in a 2-dimensional world.

View File

@ -4,6 +4,10 @@ title: DNS Basics
categories: ["networks"]
---
Today, computers run useful processes that other users would use using their computer device. Examples of such processes are the google search engine, the amazon online store, your favorite flight operator's booking service and so on. How does your computer know where these processes are running?
---------------
## Where is my coffee?
You are in _Coffee Land_ on a business visit and feel like drinking coffee after a long day at work. You want to go to a restaurant. You decide you would walk into _Quality Coffee_ after spending some time consulting your colleagues.

View File

@ -4,6 +4,10 @@ title: An Alternate Temporal Convention
categories: ["ideas"]
---
My proposal of an alternate convention for how we split and view the 24 hours in a day.
--------
## The Problem
A day is composed of 24 hours. In most places, the 24 hours on weekdays are roughly divided as follows. Times are in [24-hour clock](https://en.wikipedia.org/wiki/24-hour_clock) format.

View File

@ -4,6 +4,10 @@ title: Man's Search For Meaning
categories: ["books"]
---
A summary of what to expect from the book of the same name. The author of this book - Viktor Frankl is a Holocaust survivor who later goes on to publicize and practice Logotherapy with success.
--------
## Concentration Camps
The first part of the book is about the punishment, torture, humiliation, starvation, dehumanization and finally, death faced by the concentration camp prisoners, and observation of their psychology - from the time they are inducted into the camp, to the time when they are liberated. To survive in such a totalitarian system, the prisoners had to go behind the backs of fellow prisoners.

View File

@ -4,6 +4,10 @@ title: Wordle Solutions
categories: ["random"]
---
My nitpickiest article yet on "Why you shouldn't brag your Wordle accomplishments"
--------
## The Game
[Wordle](https://www.powerlanguage.co.uk/wordle/) is a clever little word game. No doubt about it. I absolutely enjoy playing it once in a while. If you haven't yet played this game, please do so before reading further.
@ -28,4 +32,4 @@ I whimsically made [Wordle Solutions](https://wordle.neophyte.me). *[Edit - this
The page lists three words at all times, yesterday's word, today's word and tomorrow's word in that order. This is because the current word of the day is dependent on the player's current geographical location.
The complete list of words is [here](https://raw.githubusercontent.com/cool-mist/WordleWords/main/words.json). As per the list, the last word is _**shave**_ and would happen on <u>25 October 2027</u>.
The complete list of words is [here](https://raw.githubusercontent.com/cool-mist/WordleWords/main/words.json). As per the list, the last word is _**shave**_ and would happen on <u>25 October 2027</u>.

View File

@ -4,6 +4,10 @@ title: Science in Fiction
categories: ["ideas"]
---
Diving into some ways how Science Fiction can incorporate the concepts of dimensions of space and time, and at the same time stay grounded to actual science.
--------
## 4th Dimension of Space
**1. Objects can appear out of nowhere and vanish as if they never existed**

View File

@ -4,6 +4,10 @@ title: The Quantum Series
categories: ["books"]
---
A summary of the books and analysis of some of the plot points in the Quantum trilogy by the American author Douglas Phillips.
--------
The first few sections are spoiler free, and there is a warning before you read any spoilers.
## Quantum Incident

View File

@ -4,6 +4,10 @@ title: Eating Animals - Should we stop ?
categories: ["books"]
---
Eating animals: Should we stop by Jonathan Safran Foer is a case for changing our food habits to reduce suffering for the animals.
--------
## Family farmed meat
Meat was traditionally family farmed. The animals (cows, pigs or hens) were raised with love and care in a stress-free environment. These animals were given pastures to graze and grains to feed on according to their biological needs. Their social and emotional needs were taken care of too. Strict attention was paid to the hygiene in such farms.

View File

@ -4,6 +4,10 @@ title: No Rules.. Rules
categories: ["books"]
---
About the Netflix culture and what theyve gotten right to be a successful company
--------
## The Culture
This book by Reed Hastings (CEO of Netflix as of writing this article), co-written by Erin Meyer is best summarized by - leadership at Netflix inculcating the following three practices to form a successful culture.

View File

@ -4,6 +4,10 @@ title: Blogging
categories: ["ideas"]
---
An opinionated article on the topic!
--------
# Definitions
- __Blog__ - Generally a collection of one's absurd ideas. Marketed as 'interesting' ideas instead.

View File

@ -4,6 +4,9 @@ title: Is your Smartphone secure enough?
categories: ["ideas"]
---
Looking at common ways on how we 'lock' our smartphones, to argue that we don't pay enough attention to security anymore!
--------
# The Premise
That we don't think enough about security. I'm outlining the most common options used by people to lock their phones, listed in the order in which they first appeared.
@ -68,4 +71,4 @@ Stop using fingerprints or facial recognition techniques. Not only are these les
Use a pattern if you can remember to clean the smudges on the phone regularly. Also, change your pattern regularly (I would recommend doing this every month).
Use a number lock with numbers shuffled across attempts. Come up with an arbitrary number and make efforts to remember it. Make sure you change the password every 6 months.
Use a number lock with numbers shuffled across attempts. Come up with an arbitrary number and make efforts to remember it. Make sure you change the password every 6 months.

View File

@ -4,6 +4,10 @@ title: Will there be 128-bit computers?
categories: ["ideas"]
---
You are probably reading this on a 64-bit computer or a smartphone (a smartphone is technically a computer). What does 64 mean here? Were there other types? Will there be more?
--------
# The language of processors
**Processors** (generally referred to as *microprocessors* <sub>because <sub>they <sub>are <sub>small</sub></sub></sub></sub>) are to computers what the thinking part of a human brain is to humans.
@ -94,4 +98,4 @@ Recall that computers work well with powers of 2. So instead of a 33-bit compute
That's how exponents work! The answer should be pretty clear now - we probably don't have that many 'things' to distinguish and address.
We don't need a 128-bit processor!!
We don't need a 128-bit processor!!

View File

@ -4,6 +4,10 @@ title: Blink, and you'll still not miss it!
categories: ["books"]
---
My thoughts (rant??) on Blink, by Malcolm Gladwell.
--------
# What's in it?
I recently read [Blink by Malcolm Gladwell](https://en.wikipedia.org/wiki/Blink:_The_Power_of_Thinking_Without_Thinking). This book was gifted to me, as well as to all my colleagues at work. Fear of missing out drove me into reading this book.
@ -22,4 +26,4 @@ The book is 0.5 pages of the above claims, and 269.5 pages of cherry-picked exam
This should not have been a book.
This should have just been distributed as a pamphlet!
This should have just been distributed as a pamphlet!

View File

@ -4,7 +4,12 @@ title: How to communicate securely?
categories: ["mathematics", "cryptography"]
---
This is part 1 of a series on communicating securely.
How can you communicate securely? How do you make sure nobody (apart from the intended recipient) gets
to know what you said?
--------
This is part 2 of a series on communicating securely.
- [Part-1]({{site.base_url | absolute_url}}/securecommunication)
- [Part-2]({{site.base_url | absolute_url}}/reallysecure)
- [Part-3]({{site.base_url | absolute_url}}/finallysecure)

View File

@ -4,6 +4,10 @@ title: How to communicate securely? - 2
categories: ["ideas", "cryptography"]
---
How do we do that now? - For real! this time.
--------
This is part 2 of a series on communicating securely.
- [Part-1]({{site.base_url | absolute_url}}/securecommunication)
- [Part-2]({{site.base_url | absolute_url}}/reallysecure)
@ -58,4 +62,24 @@ The safest method I would recommend would be to use [PGP tools](https://en.wikip
- Share the public key with anyone who wishes to communicate with you. Keep the private key a secret.
- Decrypt received messages (that were originally encrypted with your public key), using your private key.
The next post will cover specific details on encrypting and decrypting messages using the afore mentioned steps.
The next post will cover specific details on encrypting and decrypting messages using the afore mentioned steps. For now, the following is my public key in case you wish to communicate with me through email at **neophytenuggets@proton.me**
(Unencrypted messages will be silently deleted :P)
```
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEY8PVmhYJKwYBBAHaRw8BAQdANxcKoo0fqmW62F2tQ7F0GPWkpGs/HQUyhR77
R2mgsY20JVN1cnlhIDxuZW9waHl0ZW51Z2dldHNAcHJvdG9ubWFpbC5tZT6ImQQT
FgoAQRYhBGixkTCdlU1PIjiQZSHehx95aKkIBQJjw9WaAhsDBQkDw4BOBQsJCAcC
AiICBhUKCQgLAgQWAgMBAh4HAheAAAoJECHehx95aKkIZB8A+wfMy7gqISQGXrIc
FiiwCzfoqzQfnJozLdaOA4MvU8RcAP9gY6U1Bm8LQDijr3LCFm7raLjBNBNwrWQg
cWuuqbiJDrg4BGPD1ZoSCisGAQQBl1UBBQEBB0AkrwBdf8M3EdsykIcYMBejeSHs
iiQGTLhZrYuvXtoNSgMBCAeIfgQYFgoAJhYhBGixkTCdlU1PIjiQZSHehx95aKkI
BQJjw9WaAhsMBQkDw4BOAAoJECHehx95aKkIF6sA/01X0YnHTjUo7nUaBzk4ub+3
Ub3FKJTeSooaQ39Y3V3QAQDH407drRMw3OgnRiSKDXsbjGhAec7vQip768acjYbq
Aw==
=Ioiu
-----END PGP PUBLIC KEY BLOCK-----
```

View File

@ -4,7 +4,11 @@ title: How to communicate securely? - 3
categories: ["ideas", "cryptography"]
---
This is part 3 of a series on communicating securely.
How do we do that practically?
--------
This is part 2 of a series on communicating securely.
- [Part-1]({{site.base_url | absolute_url}}/securecommunication)
- [Part-2]({{site.base_url | absolute_url}}/reallysecure)
- [Part-3]({{site.base_url | absolute_url}}/finallysecure)
@ -123,3 +127,4 @@ There is always going to be a hierarchy of power and it would always be possible
The assymetric key cryptographic techniques to encrypt messages are literally a law of nature, discovered through the language of Mathematics.
We should use it to our advantage!!
Details about my public key and contact details can be found in the **[About]({{site.base_url | absolute_url}}/about)** page.

View File

@ -1,9 +1,16 @@
---
layout: post
title: The No Hello Nonsense!
discussion: 4
categories: ["ideas", "rant"]
---
In a mood to roast the pretentious no-hello movement
If you are not familiar with the term no-hello, you probably work with nice people
(Necessary, but not a sufficient condition 🤷).
--------
# Not just hello! Just ask the question
@ -33,7 +40,7 @@ send them a message is presented with a small non-intrusive floating dialog box
| https://nohello.net - Please don't say just hello, send the entire message
| Please write your question in your initial IM (https://nohello.net)
# OK, that's enough
# OK, that's enough 😠
[Instant messaging](https://en.wikipedia.org/wiki/Instant_messaging) apps are designed to be asynchronous.
The sender can send a message and it is not necessary for the receiver to immediately respond to the said message.

View File

@ -1,41 +0,0 @@
---
layout: post
title: Do you own your books?
categories: ["books"]
---
It is no secret that [one single company](https://en.wikipedia.org/wiki/Amazon_Kindle) has monopolized the ebook medium. Thirst for money eventually has led to some unethical practices - Absolute power corrupts absolutely. In particular, I will draw your attention towards DRM practices.
[Digital Rights Management](https://en.wikipedia.org/wiki/Digital_rights_management) is an umbrella term referring to practices that enforces the rights to digital content. For example a consumer of a DRM protected music video will not be able to make copies of, or distribute that video - making sure that the only way to access that content is by trying to make sure it is purchased from the authorized publisher. DRM originated along with the rise of internet in the late 90s and early 2000s. While there are [campaigns against the enforcement of DRM](https://www.fsf.org/campaigns/drm.html) across all domains of digital content, I will only be talking about DRMs in ebook distribution in this post.
**What happens when ebooks are DRM protected?**
1. The seller can now control how you open and read your books. You probably would have to purchase another device sold by the same distributor, or download an app from them to open this book. This takes away your freedom. You can no longer open it in your preferred device using your preferred software. Imagine if the store you purchased your physical book from imposed that you can only read the book when using the glasses that they also sell!
2. Now that the seller has full control over how you read, they can now add trackers and collect data as you read. How long did you take to read a single chapter? Did you read some portions again? Did you read a book again? How often do you read? What genres do you fancy? What time of the day are you most likely to read? Imagine someone sitting next to you while reading a physical book, jotting down each and every action of yours.
3. Now that they have the data, they can use it for targetted advertisements. Hey!, you seem to like fantasy books a lot, you should try this... You seem to come back to this series a lot, here is a collectors edition with a special foreword that you shouldn't miss. Let me share your preferences with this other company so that they can show you advertisements related to you when you are on their site browsing videos. Now imagine the hypothetical person sitting next to you selling whatever information they collected back to the seller so that they can better target you!
Data = More profit for the seller
**Why do ebooks need DRM?**
Collecting such data, and later selling it for profit sounds like breach of privacy and unethical. Why do companies do it then?
If one asked this question to the Amazon Kindle team, one would get the following answer -
- Because we want to protect the Author's intellectual property. You see, if we were to freely distribute the digital books without DRM, it is possible for anyone with a copy to redistribute it. This leads to more people reading the book without paying its author their due. With the help of DRM, we can strictly control the number of copies sold as it can only be read in our device or our software. This also prevents redistribution as each copy is associated with exactly one owner. The book can be opened only when they are logged in to our softwares. Brilliant isn't it???
Hmmmm, not exactly, for 2 reasons -
1. All DRM has been broken into and made void. People who want to pirate and redistribute books do so regardless of the existense of DRM. This proves that DRM is not doing the intended job of protecting the author.
2. It is easier to handle an ebook without DRM, than with it. A DRM protected book brings in a lot of restrictions on how it is read. It is the pirates who can read the book freely. If anything, DRM encourages piracy because people who pay have a worse experience compared to those who pirate.
So what is the real reason companies sell ebooks with DRM?
DRM......Personal Data........PROFIT!!
If you see yourself reading DRM protected books, you should get paid. You share your data which is turned into money by the seller. You need to be compensated! If not, I might just buy my digital books from stores that sell the open [EPUB](https://en.wikipedia.org/wiki/EPUB) version that can be viewed on any device and on any software.
NOTE - I do not encourage piracy of ebooks. There are online stores that sell ebooks in the EPUB version so that they are interoperable and without any trackers. Buy your books to support the author. Don't get the DRM protected ones because they are a little cheap!

View File

@ -1,148 +0,0 @@
---
layout: post
title: Unfair fixtures!
categories: ["ideas", "cricket"]
---
[IPL](https://en.wikipedia.org/wiki/2023_Indian_Premier_League) is the biggest cricket event in the world. The format of the game is generally
a double round robin followed by a double eliminator with the top 4 teams to decide the ultimate winner - modelled after the well recognized
"Group Stage followed by Playoffs" format.
**Group Stage**
Group Stage is used to seed the teams. A round robin format is when each team plays against every other team. This is pretty good. If
there are less number of teams, the fixture could include a double round robin instead, where each team plays against every other team
twice.
Let us assume that there are a total of 8 teams in the tournament.
Then each team has 7 opponents. Each team has to play each of those 7 teams twice, which means each team would play 14 games.
In total, the total number of games in the double round robin fixtures is going to be the number of teams in the tournament times
the number of matches played by each team, which is 14 times 8 = 112.
But not quite, you see out of the 14 games played by team 1, 2 of them are against team 2. We should not make the mistake of counting
that game again while calculating the total games played by team 2. That is - team 1 vs team 2 is the same as team 2 vs team 1. In the
above calculation, we have effectively counted each game twice - once as team 1 vs team 2 and once as team 2 vs team 1. Therefore the
total number of games is actually half of the above figure which is **56**.
At this point, as each team has already played twice against another, I would consider it fair to simply call the top team at the end
of this as the winner of the tournament.
But people like watching close games - regardless of the skill level of the players. Under such a premise, the seeding done above could be put
to use to set up as many close games as possible.
**The Playoffs**
One way to set up the playoff matches is to pick the top teams of the tournament (preferably the top 4) and make them play against each other.
To make it fairer to the top performing teams, we could pit the top team against the bottom team and pit the second team against the
second-last team. It is likely that the first two teams are going to go to the finals based on what we might have already seen in the
double round robin group stage. But hey... there could be "upsets".
A better alternative for playoffs follows..
Consider this setup for the top 4 seeded teams.
- Game 1: Team 1 plays against Team 2.
- Game 2: Team 3 plays against Team 4.
- Game 3: Winner of Game 1 plays against Winner of Game 2.
- Game 4: Loser of Game 1 plays against Loser of Game 2. Loser of this game is eliminated.
- Game 5: Winner of Game 4 plays against Loser of Game 3.
- Game 6: Winner of Game 5 plays against Winner of Game 3.
Winner of Game 6 is the winner of the tournament. The final is between a team that has won all its games, against a team
that has lost exactly one game. If a team loses 2 games, then it is eliminated. This format also ensures that a team doesn't
go out on a single freak loss after playing the entire group stage properly. This format - is called a **double-eliminator**
since each team needs to lose twice to leave the tournament.
But most importantly, we now have mitigated the possibility of upsets!
> Note that to run a double-eliminator, one needs a number of teams that can be expressed as an exponent of 2 - 4, 8, 16 and so on.
Each game generates a winner and a loser who plays subsequently, or generates a winner and eliminates the other team. At the end of
the round where only a winner is generated, we would need a corresponding winner from another game to pair up in the next round.
This is only possible if halving the total number of teams after every such stage still leaves a number of teams that is divisible by 2.
**What does IPL do?**
IPL generally runs a double round robin for the Group stage and then a funky partial double eliminator for the Playoffs as follows.
- Game 1: Team 1 vs Team 2.
- Game 2: Team 3 vs Team 4. Loser is eliminated.
- Game 3: Winner of Game 2 vs Loser of Game 1.
- Game 4: Winner of Game 3 vs Winner of Game 1.
The top 2 teams get 2 chances. The bottom 2 teams are eliminated on their first loss. Pretty sure that the organizers would simply
explain this unfairness away by saying that the top teams are better than the bottom two and deserve more chances than the bottom
teams.
Traditionally there are 8 teams. That means 56 group stage matches and 4 playoff games resulting in a total of 60 games. This format
is pretty stupid spending more than 90 percent of the games on seeding only to finish off the tournament in a matter of 4 games.
IPL 2023 had 10 teams. If the organizers did what they normally do, the tournament would have ended up even more crazy -
10 teams double round robin = 90 games in the group stage.
4 teams "funky" partial double eliminator = 4 games in the playoffs.
A total of 94 games with 90 games in the group stage!!
The only reason the organizers do this is because more matches - especially those that are guaranteed to take place without eliminations
(basically all group stage games) are money making machines - stadium tickets, and advertisements. The fairness of the fixtures isn't even
the 10th most important thing in this context.
Surprisingly though, IPL 2023 did something less crazy with 10 teams, the group stage had 70 games. And the playoffs 4.
70!??
How are there 70 games? If each team plays against the other team once, there should be 45 games. If they play twice, there should be 90.
How did each team play a fractional number of games against the other?
**More Teams = More Unfairness**
To figure this out, I started investigating the fixtures more deeply. Unfortunately, the organizing committee simply has a PDF file containing
the list of fixtures. That is not an easy format for anyone interesting in doing data analysis. Therefore, I took a detour trying to
parse and extract out this data in a more machine readable form. That took some time, but it was worth it. (The code is available
[here](https://github.com/cool-mist/ipl-data)).
Once I had the data in the right format, I could see that each team played exactly 14 games each. Clearly implying that they played atleast some
of them more than once as there are only 9 other teams.
I picked a team at random - Mumbai Indians, and looked at the games they have played.
They have played 2 games against the following teams and 1 game with the remaining teams. This means 5 times 2 plus 4 = 14.
- Gujarat Titans
- Royal Challengers Bangalore
- Punjab Kings
- Sunrisers Hyderabad
- Chennai Super Kings
I picked up another team - Delhi Capitals, and they played the same type of games, exactly 2 games against the same 5 teams above.
In fact, by bruteforcing my way through the entire team list, we can see that there have been 2 hidden groups. Group 1 is the group listed
above. The other Group 2 is
- Rajasthan Royals
- Lucknow Super Giants
- Delhi Capitals
- Kolkata Knight Riders
- Mumbai Indians
Each team played a single game against members of the same group, and 2 games against the opposite group.
Somehow, they have made this even less fair than how it already is. To ensure that one side does not get to win too many games in the group stage,
the two virtual groups above have to be balanced. This balancing is probably done using the results of the previous year, but that doesn't mean
anything in this volatile tournament where players switch sides every year.
**A Fairer Alternative**
I propose below, a fairer alternative to the above nonsense, for 10 teams.
- A single round robin group stage for a total of 45 games.
- Eliminate the bottom 2 teams. A proper double elimination with the top 8 teams for a total of 14 games.
This brings the total number of games to 59! 1 Less than what IPL has been doing with 8 teams previously.
If required, we can throw in another game to identify the 3rd place in the playoffs as well to round it up to 60.
(The double eliminator for 8 teams with an optional 3rd place playoff is shown below).
![Double Eliminator]({{site.base_url | absolute_url}}/images/doubleeliminator.png)

View File

@ -1,173 +0,0 @@
---
layout: post
title: On Atheism
categories: ["ideas"]
---
## Definition ##
Simply put, it is the *absence of belief* in God(s).
This definition assumes that we have already defined what God(s) is/are. I will get to that later. However, the first point that needs to be stressed is that atheism stands for an absence of belief, rather than a presence of a belief in any premise. In fact, atheism does not claim anything at all for itself.
## Froggists ##
Lets say there are two friends - Ajith and Vijay. Vijay shows a closed box and claims that there are 4 frogs in that box. Ajith is skeptical of that claim. Vijay says he simply believes in it as it provides comfort and happiness to him, and doesn't require any more empirical evidence to be confinced of its truth.
If we were to categorize people who behave like Vijay, we could call them *Froggists*.
Now Ajith could say "Hey! that box is too small, and I cannot hear anything. I don't believe you!". At this point he is a *A-Froggist*. This is because he is casting suspicion on Vijay's claim using reasonably good logic. Note that he does not claim the opposite - that there are not 4 frogs in the box.
This is similar to the position of an atheist on the subject of God(s). An Atheist simply doubts the claims of God(s)' existence, and does not believe in the claims until and unless presented with convincing evidence.
Ajith could also have said "Hey! that box is too small, I cannot hear anything, there is no way it can hold 4 frogs".
Now, he has become an *Anti-Froggist*. He now has a new claim to prove - that the frogs do not exist.
This is *not* the atheist position.
## More Definitions ##
Now that I've clarified what I consider to be the most misunderstood or misrepresented concept when it comes to atheism, I will now try to lay down the definitions of some of the other terms surrounding it.
#### God ####
With a capital G, is generally understood as some kind of entity that is ascribed one or more of the following properties.
1. Benevolent, Kind, Loving.
1. Onmipresent - Is present everywhere.
1. Omniscient - Knows everything.
1. Omnipotent - All powerful with unlimited ability.
1. Supernatural - outside the realm of the known / understood space.
1. Punishes you for your wrong-doings.
1. Listens to your prayers, accepts offerings and grants favors.
#### Religion ####
I see this as a logical organization of a set of closely related beliefs. Not every single person in a given religion hold the exact same beliefs. But a majority of beliefs from the religion are held by a majority of people. These principal beliefs that characterize a religion are unique enough that they can be distinguished from another religion.
#### Holy scriptures ####
The basis of the foundational beliefs of most Religions. Sometimes, there could be more than one such scripture for a religion.
#### Theism ####
The stance that is characterized by a belief in the existence of God(s) and its influence over people. Theists believe that God(s) created this universe, is present everywhere, sees us all, is all powerful, would punish you for wrongdoings, listens to your prayers, accepts sacrifices in exchange of granting useful wishes, and most importantly, works in mysterious ways!
#### Deism ####
The stance that is characterized by a belief in supernatural God(s) that played a role in the creation of the universe, but have no effect on the day to day life of human beings. Deists belive that worship and prayers are futile, and are indistinguishable from the Atheist in what they believe about everyday life.
#### Anti-Theism ####
The stance that God(s) do not exist as defined in Theism. Similar to theists, they carry the burden of proof on their shoulders.
#### Agnosticism ####
Agnosticism is derived from the Greek word [gnostikos](https://en.wikipedia.org/wiki/Agnosticism) meaning knowledge. Agnosticism means absence of knowledge.
A Theist can be gnostic (have knowledge) of the existence of God(s), or can be agnostic (do not have knowledge) of the existence of God(s).
An Atheist does not claim anything, and therefore, the term agnostic doesn't really apply as a prefix to an Atheist.
An Anti-Theist, again, can be gnostic, or agnostic.
## Why be an Atheist? ##
Listing some of them below in no particular order. Note that Atheism is the default position for any human being by definition. Any other position would require some convicing to take up.
#### Broad and inconsistent definition ####
The definition of God(s) is very broad and does not appear consistent across religions (and sometimes, even within the adherents of the same religion).
In such a situation, the default stance of not believing anything makes the most sense. Until all the religions in the world come together to iron out the inconsistencies and present a coherent narrative, a conversation about whether theism is true or not would not be meaningful. An Atheist believes in one less god compared to a theist. A Hindu does not believe in the myths of Jesus' rebirth, nor do they believe in the messages of the prophet Mohammed. Likewise a Christian does not believe in Vishnu or Krishna, and so on.
#### Burden of proof ####
Going back to the [Froggists](#froggists) analogy, the onus is on Vijay to prove that the box has 4 frogs. That is to say - the burden of proof lies with the theist. Until proven, the default stance is again a rational stance.
#### God of the gaps ####
Often, the argument of a God(s) is invoked as a way to explain away some unknown that is waiting to be explained by Science. As time progresses, this is becoming more and more difficult, and therefore, in the words of Neil Degrasse Tyson, God(s) of such nature may well be an ever receding pocket of scientific ignorace.
#### Suffering ####
Cancer in children? How is that an act of benevolence?
## Some FAQs I get asked a lot ##
#### Isn't Atheism just another Religion then? ####
No. Atheism is the opposite of being in a Religion. Just like 'a switched off TV' is not a 'TV channel', or 'not having any hobby' is not a 'hobby', not believing in God(s) is not a belief, and not subscribing to any Religion is not a Religion.
#### Where do Atheists get their morality from? ####
Morality, to me feels like an emergent property of a civilization that keeps evolving. As Richard Dawkins said in his book [The God Delusion](https://en.wikipedia.org/wiki/The_God_Delusion), there is a moral *Zeitgeist* that keeps shifting in a positive direction inspite of all the teachings from any scriptures. Few centuries ago, slavery was legal in America, women all over the world would not receive most rights that they enjoy today, widowed women in India were forced to jump into fires. All of that has changed now, and we all agree it has changed for the good.
Next, the way this question is asked, oftentimes implies that religious people are good, only because of a belief in a God(s) that could punish them for not being good. That, I think is horrible compared to being good on our own. Any time someone asks me this question, my answer is always - if God(s) is proven to not exists, will your behavior turn to evil?
Lastly, morality derived from few ancient scriptions could be dangerously outdated and could be harmful. Instead, morality should be something that is discussed, debated and arrived at, in a society.
#### Why are Atheists so arrogant? ####
Atheists are not arrogant because of Atheism. Atheists are just like any other person and the proportion of a certain quality in Atheists should be same as the general public. Looking at relative numbers, relative to the group, there aren't any more atheistic kind people, than there are of theists. There aren't more atheistic criminals compared to theistic criminals and so on.
#### Hitler and Stalin were Atheists!! ####
It is not clear if Hitler was an Atheist. Stalin definitely was, but the reason for 'behaving badly' is not derivable from an absence of belief in a diety. On the other hand, there are lot of examples of religiously triggered violence that has killed millions of people throughout human century, whose root causes are directly derivable from the specific beliefs of the religion.
#### What if you are wrong and have hell waiting for you when you die? ####
This is a variation of the [Pascal's wager](https://en.wikipedia.org/wiki/Pascal%27s_wager). As already established, there are a large number of religions and Atheists differ from theists almost always by belief in one less God / Group of Gods. In such a scenario, I would argue that, being wrong would be more problematic for the theist, than the atheist. Imagine a Hindu dying only to find that the Christian myths are real. In such a case, an Atheist is better placed in terms of punishment because not only is the theist not believing in Christ, the theist also believed in a wrong religion, further infuriating the dieties of the true religion.
## Why be a Theist? ##
Inspite of the above merits, I also want to look at some reasons why someone would be a theist.
#### Personal experience ####
I had an experience with a God that felt real, helped me with (such and such..).
This is often the most common reason I hear, and the one that makes the most sense for anyone to be a theist. You cannot argue with personal experience and as long as that experience belongs to this person, and they think it is real, it is really fine to be a theist.
Practically, no such person is ever going to doubt their beliefs, and no Atheist is ever going to accept personal experience of another person as evidence of the existence of God(s).
To each their own and everyone is happy (theoretically).
#### Everything ought to have a root cause ####
Take any object and you have a creator of that. The question "Who created this" can result in an infinite regress, and a way to stop that would be to presume that the final Creator of all things is God(s). The problem with this is that we still have to explain why the final Creator exists (who created God(s)?). By explaining away the unknowns with God(s), we haven't explained anything at all, as there is one additional thing now to explain.
#### Things are designed so perfectly, this cannot be by chance ####
This is also known as the *Argument From Design* and [Thomas Aquinas](https://open.library.okstate.edu/introphilosophy/chapter/aquinass-five-proofs-for-the-existence-of-god/) is famous for using this argument. A response to this is the same as the previous one, we still need to explain God(s).
This argument proposes a false dichotomy by assuming that absence of intelligent design is random chance.
Processes of evolution are already well understood and honest biologists have no problems explaining how something as complex as the human eye came to be from simplicity and non-random evolutionary processes of natural selection. The process of evolution is also not intelligent, as evident from the fact that, for example, humans have a [Recurrent Laryngeal Nerve](https://en.wikipedia.org/wiki/Recurrent_laryngeal_nerve) that connects the throat and the brain only after a detour via the heart!!
#### Argument from Anxiety ####
Like the argument from Personal experience, this is something that cannot be rebuked, and is a harmless reason for belief, as long as people keep their God(s) to themselves.
Without a belief in an all-knowing care taker, all of us will drown in anxiety. My mother wouldn't be at peace when I'm travelling on my bike in traffic, if not for the fact that she prayed to her God(s) of choice for my safety. The more I think on these lines, the more I think Religion might well be a necessary thing to evolve in a civilization. I'm making claims on whether praying helps or not, but just that the people are probably better off believing in something.
Ofcourse, Atheists exist and like me, do not feel it necessary to hold this belief. But I would be lying if I do not acknowledge my anxiety right after becoming an atheist. Will my parents live another day? Will I survive this journey? Will someone rob me? It is not completely overcome to this day, while I have gotten a lot better at it. It probably takes some maturity to understand and deal with such anxiety from unknowns. All of this is a result of a theistic upbringing though, and someone brought up an atheist might do better in my opinion.
#### Other arguments ####
There are other sophisticated arguments for the existence of God(s), which I acknowledge exist, and hope to address in the future articles. Right now, I will simply add this disclaimer here so that I do not get accused of only addressing, what a theist might perceive as, weak arguments from their arsenal.
## Why be a Deist? ##
These were the atheists of yesterday, who could observe that prayers do not work, but couldn't explain away the complex "design" of the the world around them. This stance is undertandable under those circumstances.
## Why be an Agnostic? ##
Everyone, generally speaking, are Agnostic, because the claim of God(s) can neither be proven or disproven (at least that is how it looks so far). Most Atheists are agnostic of whether God(s) exist or not.
There is also a class of agnostics, who claim they occupy the "middle ground" between atheism and theism. While that doesn't make any sense, I can understand the reason for them saying so, as this acts as a shield under politically charged circumstances - where both parties assume an agnostic is not challenging their stance. This is just a confusion tactic, and the fact whether someone is an agnostic or not, is perpendicular to the fact that whether someone is an atheist or not.
## Why be an Anti-Theist? ##
Theism is an unfalsifiable claim. Sometimes, it might make sense to directly challenge or provoke theists by assuming this stance that God(s) do not exist. Personally, I don't think Anti-Theism is useful in most situations, as this introduces the burden of proof on both sides, and both sides cannot prove or disprove their stance.
## In Conclusion... ##
This is just a superfluous article outlining my thought process in this matter at best. While writing this, I badly wanted to expound on certain arguments or issues in greater detail. However, I want to budget my time rightly so that I don't spend too much time today on writing this post. Hopefully more will follow later!!

View File

@ -1,52 +0,0 @@
---
layout: post
title: Ridiculous fixtures!
categories: ["ideas", "cricket"]
---
Previously, [I've argued]({{site.base_url | absolute_url}}/whatwasthatipl) how the IPL 2023 fixtures were set up to maximize profit. While that is not a bad thing for a tournament organized by private enterprise like the [BCCI](https://en.wikipedia.org/wiki/Board_of_Control_for_Cricket_in_India), the [ICC](https://en.wikipedia.org/wiki/International_Cricket_Council) has pulled off something similar with the [2023 Cricket World Cup](https://en.wikipedia.org/wiki/2023_Cricket_World_Cup) now.
- There were 10 teams in the tournament.
- The tournament had 48 matches.
- There was single group round robin for the 10 teams - for a total of 45 games.
- The top 4 teams played 3 knockout games (semi-finals and final) for a total of 3 games.
Again, we see a skew in the number of games played in the Group Stage vs the Playoffs.
- Most of the games in the Group Stage were boring to watch.
- All of a sudden a three match knockout simply broke the hearts of many fans in the 3 countries that got eliminated.
- There was no advantage for teams that performed well in the group stage. The 4 teams that qualified out of the Group Stage are on equal footing during the Playoffs.
- Ironically, the team that won all its games in the Group Stage, ended up losing the tournament to a team that was on the verge of elimintation during the group stage.
As usual, I'm personally biased towards the [Double Elimination Tournament Bracket](https://en.wikipedia.org/wiki/Double-elimination_tournament) (from my previous post) for any type of tournament because I feel the Group Stage should end with providing an advantage for the teams that performed well.
It may/may not have an impact in the tournament under discussion as the team that wins all its games and loses in the finals does not get another chance in the double elimination format as well. However, given that there are a lot more of the Playoff games, it is not clear what would happen. Regardless, the most important thing that this solves (for me) would be - place the teams higher in the Group Stage, in the advantageous Upper Bracket. Give some incentive to the teams for performing well in the group stage.
A question therefore arises -
### What was the point of the Group Stage in this tournament, if it is not going to provide an advantage to the top performers in the Playoffs? ###
Similar to IPL, the incentive here is still money. It is no secret that BCCI is the most powerful cricket council in the world, and influences a lot of ICC's operations. For example, BCCI's earning cut from ICC's revenue is [about 40%](https://www.firstpost.com/firstcricket/sports-news/icc-financial-model-2024-27-bccis-lion-share-and-other-boards-income-explained-12867062.html). The second highest share goes to England at 7%, followed by Australia at 6%. Other boards agree to this because BCCI is probably responsible for generating the most income to ICC.
Therefore, lets assume that ICC = BCCI for the rest of the article.
India has the largest fan base for cricket. BCCI gets money from the matches played by India from advertisers, and broadcast rights. BCCI tries to maximize the games played by India. Given that this edition of the tournament also happened in India, it is likely BCCI gets a cut out of every game that was played. Leading to BCCI coming up with a single round robin Group stage with 10 teams!! That way, India plays a guaranteed 9 games and potentially 11 games (which is what happened) of the 48 games.
If the "BCCI wants more money" narrative is not convicing enough thus far, I've added a couple more facts below that acts as evidence in favour.
1. Even the recently concluded [ICC Men's T20 World Cup](https://en.wikipedia.org/wiki/ICC_Men%27s_T20_World_Cup) has such an atrocious fixture. In order to maximize the number of games of India, as well as the number of guaranteed India vs Pakistan games in the tournament (of which there is a high demand in both India and Pakistan due to prior rivalry and recent political issues), there were *2 Group stages!!*
2. In a country where [Decolonization](https://en.wikipedia.org/wiki/Decolonization) and nationalist sentiments are rising (or propagated by the ruling parties), there isn't much discourse on decolonizing the sport that Indians watch and love - *Cricket is a colonial sport*. This is easily explained by the fact that the head of BCCI (a body managing a colonial sport), is the [son of a prominent politician from the nationalist party in India](https://en.wikipedia.org/wiki/Jay_Shah).
### Why do a lot of Indians who watch Cricket don't care about this? ###
Why aren't the fans able to influence the BCCI to conduct a sport that is fair, close and interesting?
With the different sizes of the ground, the different rules across tournaments, the different balls being used, the different pitches, why aren't the fans talking about the absurdity of the tracked statistics?
I have the following hypothesis - Indians who watch cricket, generally do not understand the rules of the game as long as India wins. They do not have an understanding of what makes a game fair as long as India wins. Whenever India loses, they regurgutate the post-match analyses of other experts of the game to their friends during lunch.
The experts who do understand the game are not allowed to raise a voice because BCCI is their employer, and BCCI wouldn't want to reduce the number of games, attempt to make changes to the rules, or fund other countries with the money they have to make the games more closer.
It is only going to be a matter of time, until most of the other boards are bullied in ICC so that very few competitive teams remain and most of the tournaments are won by India - most of the money in BCCI's bank accounts.
To most Indians, cricket falls under the same category as some of the other entertainment options - Soap Operas, Big Boss etc. It is a welcome distraction from their otherwise tough lives. Absurdity is easily excused. They do not care about the game as long as India wins.

View File

@ -1,59 +0,0 @@
---
layout: post
title: The Tragedy of Subscription business models
categories: ["ideas", "media", "piracy", "subscription", "greedy"]
---
Over the last decade, I see a lot of businesses adopting the [subscription business model](https://en.wikipedia.org/wiki/Subscription_business_model) to generate a steady stream of revenue. A subscription model is when the company provides access to its produces or services for a subscription fee charged periodically. The service is stopped when the customer stops paying.
This model makes a lot of sense for services that require constant effort from the service provider - either in generating content, or maintaining the infrastructure itself. For example,
- Newspapers or periodicals
- Television
- Internet services
- Taxis/buses
- Rented house
- Cook
- House maids
I'm happy to subscribe because they provide real value to me.
## When do they not work? ##
Who doesn't like a steady stream of income. Therefore, companies have taken this model too far, so much that, a lot of companies have started earning money without providing any value. The most obvious example is the **subscription-ification** of conventional media, by the streaming services.
- Music
- Movies
- Books
- Games
This is their standard operating procedure.
1. People like a certain creator, and would purchase their content.
2. Intermediate platforms come in as a way for customers to discover and buy content. They rope in successful content creators in the respective fields and showcase their content.
3. The platform itself becomes too big that they become a launchpad for upcoming artists.
4. The platform offers a subscription model to consume the content. Customers have to pay every month to listen to a song they like, or rewatch their favourite movie, or reread a book, or replay a mission from their game.
5. The platform starts degrading the service provided for the free-tier, in an attempt to force (and succeed in) more customers to subscribe.
6. Customers are now the customers of the platform, and not of the creator.
7. Creator's cut in the subscription profit slowly gets insignificant compared to the platform itself.
Often, I'm only interested in a certain movie, or a certain set of songs. Why can't I buy them like the good old days? Owning a DVD of a movie clearly offers much more flexibility to how I wan't to consume it without relying on the platform's application. I never had the fear of suddenly losing my copy of the book because the platform decided to ban it. The source code of a game is written once. Why then do I need to periodically pay when the source code in fact runs on a computer that I own?
Sometimes, the show that I purchased a Netflix subscription for, might have gotten cancelled, or worse, moved to a different platform. I'm now stuck with an useless subscription with no compensation.
I could go on and on, but the meta point I care about here is a loss of ownership, on what I purchase. It instead lies at the hands of the service providers who can affect my content consumption experience. They can also make sure that it would be difficult for me to switch platforms. A customer with 100 books from the Amazon Prime ebook subscription is probably going to continue paying even if Amazon decides to increase the subscription fee. It is becoming increasingly difficult for me to **buy a product and own it**.
Subscription models for conventional media, only make the experience difficult for the customers who subscribe. There are sellers (both offline and online) that allow buying and owning physical and digital media. It might be difficult to find them out though, owing to the omniprescence of subscriptions. It is no surprise then, that there are people who, being completely capable of purchasing content, resort to piracy (and might support the authors in other ways possible - merchandise, concert, watching a movie in theatre, donations etc).
Finally, there are some subscription services, that are simply.........
## Ridiculoussssssss!! ##
The companies responsible for these products have almost zero expenses after the initial purchases, but would still want to make more money.
- Academic Journals. On top of losing access, the subscription money generally does not even support the authors.
- Cars. You need an active subscription or the car doors won't open next time.
- Printers, the printer wouldn't print anymore.
- Text editing and presentation software (Microsoft Office). You cannot read word documents, or make lame power point presentations
- *Might add more examples in the future when I remember*

View File

@ -1,54 +0,0 @@
---
layout: post
title: Really 'Sweet' Syndication
---
People on the internet write a lot of stuff. How do you keep up with it... <b class="hilite">securely</b>?
I don't want to be creating an account or share my email address to whichever site I visit.
## Enter [RSS](https://en.wikipedia.org/wiki/RSS)
Short for <b class="hilite">Really Simple Syndication</b>, it is a specification to share your blog or podcast or whatever so that others can subscribe to it anonymously. The subscribers will be updated whenever a new article is published without the publisher (the blog writer, or podcast creator) having to store and spam everyone's inboxes.
## How does it work?
It really does live up to its name. Along with your website, you publish an `XML` document that contains the metadata about your website. This document is typically hosted at `site-name/feed.xml`.
For example, consider the below XML for a blog named <b class="hilite">The Coffee Blog</b>.
```xml
<rss>
<channel>
<title>The Coffee Blog</title>
<link>https://thecoffeeblog.com</link>
<description>All about coffee</description>
<language>en-us</language>
<item>
<title>How to brew coffee</title>
<link>https://thecoffeeblog.com/how-to-brew-coffee</link>
<description>Learn how to brew the perfect cup of coffee.</description>
<pubDate>Mon, 10 Jun 2025 12:00:00 GMT</pubDate>
<guid isPermaLink="false">12345</guid>
</item>
<item>
<title>Best coffee beans</title>
<link>https://thecoffeeblog.com/best-coffee-beans</link>
<description>Discover the best coffee beans for your taste.</description>
<pubDate>Tue, 11 Jun 2025 12:00:00 GMT</pubDate>
<guid isPermaLink="false">12346</guid>
<!-- More items can be added here as and when new blog posts are ready-->
</channel>
</rss>
```
There is bunch of metadata about the website itself followed by a list of `<item>` elements. Each `<item>` represents a blog post or an article. The `<title>`, `<link>`, `<description>`, `<pubDate>`, and `<guid>` elements provide information about the article.
The subscribers can now use a software that downloads this file periodically (lets say every 5 minutes) and checks for new `<item>` elements. If there are new items, it can notify the user about the new articles. Note how there is a `<link>` element in each `<item>`. This is a convenient way for the subscriber to discover new content once it is available.
<b>You</b> are the <b class="hilite">Subscriber</b>. The software that does this download-and-compare operation is called a <b class="hilite">RSS Reader</b>. The document is called an <b class="hilite">RSS Feed</b> and the process of sharing articles this way is called <b class="hilite">Syndication</b>. The blog poster only updates this file everytime a new post is created. All subscribers eventually get notified about the new post.
Some popular RSS readers are [Feedly](https://feedly.com/), [Inoreader](https://www.inoreader.com/), and [The Old Reader](https://theoldreader.com/). These are paid services that allow you to subscribe to multiple RSS feeds and read them in one place. There are also free and open-source alternatives like [Tiny Tiny RSS](https://tt-rss.org/) that you can self-host.
If you know how to program, you can write your own RSS reader, it is not that hard.

View File

@ -1,155 +0,0 @@
---
layout: post
title: How do I publish articles?
---
Content on the internet is rendered on your web browsers because it is written in a format that browsers understand. HTML (HyperText Markup Language) is the standard format for web content.
The following is a simple HTML document:
```html
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Blog Post</title>
</head>
<body>
<h1>Welcome to My Blog</h1>
<p>This is my first blog post.</p>
<p>Stay tuned for more updates!</p>
</body>
</html>
```
It consists of bunch of tags that define the content and the hierarchichal structure of a page. You can copy paste the content above into a file named `index.html` and open it in your web browser to see how it looks. It should show something like this
![HTML Example]({{site.base_url | absolute_url}}/images/html-example.png)
Now, if you see the address bar, it should say something like `file:///path/to/your/index.html`. This means that the file is being served from your local machine using the `file://` protocol. To make it accessible on the internet, you first need to convert it into `http://` protocol.
Doing that is easy, you have to create a <b class="hilite">Web server</b> and serve the `index.html` file using that. A web server is a software that listens to requests on a specific [port]({{site.base_url | absolute_url}}/tcp) on your machine. It then sends the contents of the requested file back to the browser using the `http://` protocol.
We can use the built-in python web server to do this. Open a terminal, navigate to the directory where your `index.html` file is located and run the following command:
```bash
$> python3 -m http.server 8000
```
You should see the following on the terminal
```
➜ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
```
Now head over to your web browser and type `http://localhost:8000` in the address bar. You should see your HTML page rendered in the browser.
At this point, you could ask your friend to open the same URL in their browser, and..... they will see this
![HTML Example]({{site.base_url | absolute_url}}/images/html-example2.png)
So what happened is that, your computer is only accessible from your computer. When your friend tries to access `localhost`, they see something else. What you now need is a <b class="hilite">Domain name</b> for yourself and redirect the traffic for requests to that domain to your computer.
My previous article on [Domain Name System]({{site.base_url | absolute_url}}/dns) explains how to do that. Once you have a domain name, you can point it to your computer's IP address and your friend can access your web server using that domain name.
Except - don't do that. Exposing your personal computer to the internet is not a good idea. Instead, you can rent a computer from a cloud provider and run the web server on that machine. Such a computer doesn't need to be powerful and should be very cheap to rent. These computers will always be on and you don't have to worry about keeping your personal computer online.
Now lets assume you have rented such a computer, logged into it and created a file named `index.html` in your directory, started a web server, created a domain name and pointed it to this computer. You can now share the url `http://my-domain-name.tld` with your friends.
Except - they will now see this
![HTML Example]({{site.base_url | absolute_url}}/images/html-example3.png)
Their browser is now screaming that this is a insecure connection. I lied when I said that you can use `http://` protocol. Instead, what you really need is an `https://` protocol. You need to prove to the browser that whatever the browser sees is indeed coming from `my-domain-name.tld` and not some other website. This proof cannot be served via http and instead requires https.
In order to be `https://`, you need to be certified by a Certificate Authority (CA). A CA is an organization that issues digital certificates to verify the identity of websites. You can get a certificate from a CA and install it on your web server to enable https. [Let's Encrypt](https://letsencrypt.org/) is a free CA that provides certificates for your domain name. It is widely used and trusted by browsers.
The simple example using python code no longer cuts it and at this point, you should just give up. Seek help from a tech-savvy friend or a professional to set up your web server with https on your rented computer.
But if you are really interested to know how to do it yourself, then here are the steps. First go and install [Certbot](https://certbot.eff.org/), which is a tool that helps you obtain and install SSL/TLS certificates from Let's Encrypt. What is a TLS certificate you ask? it is just another fancy name for the certificate. You should be familiar with updating nameserver records on your domain registrar and......, wait a minute, you first need to learn how to run the nginx or apache web server software. Let me explain how to do that first ...
![Eternity]({{site.base_url | absolute_url}}/images/eternity.png)
And thats it. So simple!
In summary -
1. Create `.html` files with your content.
2. Register a domain name for yourself and get a certificate provisioned that identifies your domain.
3. Run a web server to serve those files over `http(s)://` protocol using the certificate you got in the previous step.
4. Copy your files to the web server directory so that they can be served to the world.
# How do I do it
Now that you know everything you need to know, to publish a blog from scratch, I'll tell you what I do.
The fundamentals are the same, however handcrafting `.html` files is tedious. Also, you need to add some bling to your site with colors and animations and formatting and so on. The styling of the page is done using CSS (Cascading Style Sheets) and the animations are done using JavaScript. And so you would have to create some `.css` files and `.js` files respectively to make your site look good.
I offload the content generation work to a static site generator (SSG) software. (You don't have to create `.ssg` files now, this is different). The software allows me to write my content in a simple format called Markdown - (written in `.markdown` or `.md` files). So suppose I want to write a blog about publishing blogs, I would write a markdown document with the following content
```markdown
---
layout: post
title: How do you publish blogs?
---
Content on the internet is rendered on your web browsers because it is written
in a format that browsers understand. HTML (HyperText Markup Language) is the
standard format for web content. The following is a simple HTML document:
```
And this automatically creates a new entry in the list of posts on my blog.
![Home]({{site.base_url | absolute_url}}/images/home_example.png)
And at the same time render the individual post as well in its dedicated link.
![Page]({{site.base_url | absolute_url}}/images/page_example.png)
The SSG software requires that I also specify the layout of all the pages in a separate file (for example the name of the site, and the logo etc at the top) so that it copies it over to all the posts. Hence, setting up the blog in this way entails a time-consuming one-time effort. Once things are set up, I can just write my content in markdown files and then generate the site.
Well, before I generate the site, I would want to see how it all looks. So I run the following command on my terminal to run a live preview of the entire site while I'm developing. Whenever I make changes to the markdown, it is automatically applied and I can see the changes in real-time.
```sh
$> bundle exec jekyll serve
Configuration file: /home/chips/projects/bbb/_config.yml
Source: /home/chips/projects/bbb
Destination: /home/chips/projects/bbb/_site
Incremental build: disabled. Enable with --incremental
Generating...
Jekyll Feed: Generating feed for posts
done in 0.343 seconds.
Auto-regeneration: enabled for '/home/chips/projects/bbb'
Server address: http://127.0.0.1:4000
Server running... press ctrl-c to stop.
```
Then I visit `http://localhost:4000` on my computer and see how it looks as I edit my new post.
Once I'm happy, I run the following commands to copy over the generated site to the web server directory of the rented computer I have.
```bash
$> bundle exec jekyll build
```
```bash
$> rsync -Pr _site/ potato@neophyte.me:~/site/blog
```
The above commands creates the site and copies over the entire site to the `neophyte.me` server using the `rsync` command.
This automatically updates the <a href="https://blog.neophyte.me" target="_blank">`https://blog.neophyte.me`</a> website.
I can time how long it takes for the above commands to run - which identifies how long it takes to publish a blog post. To do that, I will first copy the 2 commands to a single script called `deploy.sh` and then run it with the `time` command.
```sh
$> time ./deploy.sh
real 0m1.236s
user 0m0.572s
sys 0m0.133s
```
The important part is the time tagged as `real`. In this case it is `0m1.236s`, which means it took <b class="hilite">1.236 seconds</b> to publish this blog post.
So that is my workflow now a days - I write a blog post in a simple markdown format that generally reads like a text file and then once I'm happy, I update my site in about 2 seconds.

95
_sass/_darcula.scss Normal file
View File

@ -0,0 +1,95 @@
.highlight {
background-color: #1e1c3f;
padding: 7px 7px 7px 10px;
overflow: auto;
font-size: 95%;
}
code {
font-family:'Bitstream Vera Sans Mono','Courier', monospace;
color: #d8d8d8;
}
.highlighter-rouge {
background-color: #FAFAFA;
color: #FF554A;
font-size: 16px;
}
.highlight .hll { background-color: #f1fa8c }
.highlight { background: #282a36; color: #f8f8f2 }
.highlight .c { color: #6272a4 } /* Comment */
.highlight .err { color: #f8f8f2 } /* Error */
.highlight .g { color: #f8f8f2 } /* Generic */
.highlight .k { color: #ff79c6 } /* Keyword */
.highlight .l { color: #f8f8f2 } /* Literal */
.highlight .n { color: #f8f8f2 } /* Name */
.highlight .o { color: #ff79c6 } /* Operator */
.highlight .x { color: #f8f8f2 } /* Other */
.highlight .p { color: #f8f8f2 } /* Punctuation */
.highlight .ch { color: #6272a4 } /* Comment.Hashbang */
.highlight .cm { color: #6272a4 } /* Comment.Multiline */
.highlight .cp { color: #ff79c6 } /* Comment.Preproc */
.highlight .cpf { color: #6272a4 } /* Comment.PreprocFile */
.highlight .c1 { color: #6272a4 } /* Comment.Single */
.highlight .cs { color: #6272a4 } /* Comment.Special */
.highlight .gd { color: #8b080b } /* Generic.Deleted */
.highlight .ge { color: #f8f8f2; text-decoration: underline } /* Generic.Emph */
.highlight .gr { color: #f8f8f2 } /* Generic.Error */
.highlight .gh { color: #f8f8f2; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #f8f8f2; font-weight: bold } /* Generic.Inserted */
.highlight .go { color: #44475a } /* Generic.Output */
.highlight .gp { color: #f8f8f2 } /* Generic.Prompt */
.highlight .gs { color: #f8f8f2 } /* Generic.Strong */
.highlight .gu { color: #f8f8f2; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #f8f8f2 } /* Generic.Traceback */
.highlight .kc { color: #ff79c6 } /* Keyword.Constant */
.highlight .kd { color: #8be9fd; font-style: italic } /* Keyword.Declaration */
.highlight .kn { color: #ff79c6 } /* Keyword.Namespace */
.highlight .kp { color: #ff79c6 } /* Keyword.Pseudo */
.highlight .kr { color: #ff79c6 } /* Keyword.Reserved */
.highlight .kt { color: #8be9fd } /* Keyword.Type */
.highlight .ld { color: #f8f8f2 } /* Literal.Date */
.highlight .m { color: #bd93f9 } /* Literal.Number */
.highlight .s { color: #f1fa8c } /* Literal.String */
.highlight .na { color: #50fa7b } /* Name.Attribute */
.highlight .nb { color: #8be9fd; font-style: italic } /* Name.Builtin */
.highlight .nc { color: #50fa7b } /* Name.Class */
.highlight .no { color: #f8f8f2 } /* Name.Constant */
.highlight .nd { color: #f8f8f2 } /* Name.Decorator */
.highlight .ni { color: #f8f8f2 } /* Name.Entity */
.highlight .ne { color: #f8f8f2 } /* Name.Exception */
.highlight .nf { color: #50fa7b } /* Name.Function */
.highlight .nl { color: #8be9fd; font-style: italic } /* Name.Label */
.highlight .nn { color: #f8f8f2 } /* Name.Namespace */
.highlight .nx { color: #f8f8f2 } /* Name.Other */
.highlight .py { color: #f8f8f2 } /* Name.Property */
.highlight .nt { color: #ff79c6 } /* Name.Tag */
.highlight .nv { color: #8be9fd; font-style: italic } /* Name.Variable */
.highlight .ow { color: #ff79c6 } /* Operator.Word */
.highlight .w { color: #f8f8f2 } /* Text.Whitespace */
.highlight .mb { color: #bd93f9 } /* Literal.Number.Bin */
.highlight .mf { color: #bd93f9 } /* Literal.Number.Float */
.highlight .mh { color: #bd93f9 } /* Literal.Number.Hex */
.highlight .mi { color: #bd93f9 } /* Literal.Number.Integer */
.highlight .mo { color: #bd93f9 } /* Literal.Number.Oct */
.highlight .sa { color: #f1fa8c } /* Literal.String.Affix */
.highlight .sb { color: #f1fa8c } /* Literal.String.Backtick */
.highlight .sc { color: #f1fa8c } /* Literal.String.Char */
.highlight .dl { color: #f1fa8c } /* Literal.String.Delimiter */
.highlight .sd { color: #f1fa8c } /* Literal.String.Doc */
.highlight .s2 { color: #f1fa8c } /* Literal.String.Double */
.highlight .se { color: #f1fa8c } /* Literal.String.Escape */
.highlight .sh { color: #f1fa8c } /* Literal.String.Heredoc */
.highlight .si { color: #f1fa8c } /* Literal.String.Interpol */
.highlight .sx { color: #f1fa8c } /* Literal.String.Other */
.highlight .sr { color: #f1fa8c } /* Literal.String.Regex */
.highlight .s1 { color: #f1fa8c } /* Literal.String.Single */
.highlight .ss { color: #f1fa8c } /* Literal.String.Symbol */
.highlight .bp { color: #f8f8f2; font-style: italic } /* Name.Builtin.Pseudo */
.highlight .fm { color: #50fa7b } /* Name.Function.Magic */
.highlight .vc { color: #8be9fd; font-style: italic } /* Name.Variable.Class */
.highlight .vg { color: #8be9fd; font-style: italic } /* Name.Variable.Global */
.highlight .vi { color: #8be9fd; font-style: italic } /* Name.Variable.Instance */
.highlight .vm { color: #8be9fd; font-style: italic } /* Name.Variable.Magic */
.highlight .il { color: #bd93f9 } /* Literal.Number.Integer.Long */

86
_sass/_highlights.scss Normal file
View File

@ -0,0 +1,86 @@
.highlight {
background-color: #1e1c3f;
padding: 7px 7px 7px 10px;
overflow: auto;
font-size: 90%;
}
code {
font-family:'Bitstream Vera Sans Mono','Courier', monospace;
color: #d8d8d8;
}
.highlighter-rouge {
background-color: #FAFAFA;
color: #FF554A;
}
.highlight .c { color: #586E75 } /* Comment */
.highlight .err { color: #93A1A1 } /* Error */
.highlight .g { color: #93A1A1 } /* Generic */
.highlight .k { color: #859900 } /* Keyword */
.highlight .l { color: #93A1A1 } /* Literal */
.highlight .n { color: #93A1A1 } /* Name */
.highlight .o { color: #859900 } /* Operator */
.highlight .x { color: #CB4B16 } /* Other */
.highlight .p { color: #93A1A1 } /* Punctuation */
.highlight .cm { color: #586E75 } /* Comment.Multiline */
.highlight .cp { color: #859900 } /* Comment.Preproc */
.highlight .c1 { color: #586E75 } /* Comment.Single */
.highlight .cs { color: #859900 } /* Comment.Special */
.highlight .gd { color: #2AA198 } /* Generic.Deleted */
.highlight .ge { color: #93A1A1; font-style: italic } /* Generic.Emph */
.highlight .gr { color: #DC322F } /* Generic.Error */
.highlight .gh { color: #CB4B16 } /* Generic.Heading */
.highlight .gi { color: #859900 } /* Generic.Inserted */
.highlight .go { color: #93A1A1 } /* Generic.Output */
.highlight .gp { color: #93A1A1 } /* Generic.Prompt */
.highlight .gs { color: #93A1A1; font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #CB4B16 } /* Generic.Subheading */
.highlight .gt { color: #93A1A1 } /* Generic.Traceback */
.highlight .kc { color: #CB4B16 } /* Keyword.Constant */
.highlight .kd { color: #268BD2 } /* Keyword.Declaration */
.highlight .kn { color: #859900 } /* Keyword.Namespace */
.highlight .kp { color: #859900 } /* Keyword.Pseudo */
.highlight .kr { color: #268BD2 } /* Keyword.Reserved */
.highlight .kt { color: #DC322F } /* Keyword.Type */
.highlight .ld { color: #93A1A1 } /* Literal.Date */
.highlight .m { color: #2AA198 } /* Literal.Number */
.highlight .s { color: #2AA198 } /* Literal.String */
.highlight .na { color: #93A1A1 } /* Name.Attribute */
.highlight .nb { color: #E91E63 } /* Name.Builtin */
.highlight .nc { color: #268BD2 } /* Name.Class */
.highlight .no { color: #CB4B16 } /* Name.Constant */
.highlight .nd { color: #268BD2 } /* Name.Decorator */
.highlight .ni { color: #CB4B16 } /* Name.Entity */
.highlight .ne { color: #CB4B16 } /* Name.Exception */
.highlight .nf { color: #268BD2 } /* Name.Function */
.highlight .nl { color: #93A1A1 } /* Name.Label */
.highlight .nn { color: #93A1A1 } /* Name.Namespace */
.highlight .nx { color: #B39DDB } /* Name.Other */
.highlight .py { color: #93A1A1 } /* Name.Property */
.highlight .nt { color: #268BD2 } /* Name.Tag */
.highlight .nv { color: #268BD2 } /* Name.Variable */
.highlight .ow { color: #859900 } /* Operator.Word */
.highlight .w { color: #93A1A1 } /* Text.Whitespace */
.highlight .mf { color: #2AA198 } /* Literal.Number.Float */
.highlight .mh { color: #2AA198 } /* Literal.Number.Hex */
.highlight .mi { color: #2AA198 } /* Literal.Number.Integer */
.highlight .mo { color: #2AA198 } /* Literal.Number.Oct */
.highlight .sb { color: #586E75 } /* Literal.String.Backtick */
.highlight .sc { color: #2AA198 } /* Literal.String.Char */
.highlight .sd { color: #93A1A1 } /* Literal.String.Doc */
.highlight .s2 { color: #2AA198 } /* Literal.String.Double */
.highlight .se { color: #CB4B16 } /* Literal.String.Escape */
.highlight .sh { color: #93A1A1 } /* Literal.String.Heredoc */
.highlight .si { color: #2AA198 } /* Literal.String.Interpol */
.highlight .sx { color: #2AA198 } /* Literal.String.Other */
.highlight .sr { color: #DC322F } /* Literal.String.Regex */
.highlight .s1 { color: #2AA198 } /* Literal.String.Single */
.highlight .ss { color: #2AA198 } /* Literal.String.Symbol */
.highlight .bp { color: #268BD2 } /* Name.Builtin.Pseudo */
.highlight .vc { color: #268BD2 } /* Name.Variable.Class */
.highlight .vg { color: #268BD2 } /* Name.Variable.Global */
.highlight .vi { color: #268BD2 } /* Name.Variable.Instance */
.highlight .il { color: #2AA198 } /* Literal.Number.Integer.Long */

53
_sass/_reset.scss Normal file
View File

@ -0,0 +1,53 @@
/***************/
/* MEYER RESET */
/***************/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
// HTML5 display-role reset for older browsers
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
// Apply a natural box layout model to all elements
// from: http://www.paulirish.com/2012/box-sizing-border-box-ftw/
*, *:before, *:after {
-moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;
}

20
_sass/_svg-icons.scss Normal file

File diff suppressed because one or more lines are too long

27
_sass/_variables.scss Normal file
View File

@ -0,0 +1,27 @@
//
// VARIABLES
//
// Colors
$blue: #4183C4;
// Grays
$black: #000;
$darkerGray: #222;
$darkGray: #333;
$gray: #666;
$lightGray: #eee;
$white: #fff;
// Font stacks
$helvetica: Helvetica, Arial, sans-serif;
$helveticaNeue: "Helvetica Neue", Helvetica, Arial, sans-serif;
$georgia: Georgia, serif;
// Mobile breakpoints
@mixin mobile {
@media screen and (max-width: 640px) {
@content;
}
}

6
assets/simple-jekyll-search.min.js vendored Normal file
View File

@ -0,0 +1,6 @@
/*!
* Simple-Jekyll-Search v1.7.2 (https://github.com/christian-fei/Simple-Jekyll-Search)
* Copyright 2015-2018, Christian Fei
* Licensed under the MIT License.
*/
!function(){"use strict";var f={load:function w(t,e){var n=function r(){return window.XMLHttpRequest?new window.XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP")}();n.open("GET",t,!0),n.onreadystatechange=function i(e,n){return function(){if(4===e.readyState&&200===e.status)try{n(null,JSON.parse(e.responseText))}catch(t){n(t,null)}}}(n,e),n.send()}};(function y(t){if(!function e(t){return!!t&&"undefined"!=typeof t.required&&t.required instanceof Array}(t))throw new Error("-- OptionsValidator: required options missing");if(!(this instanceof y))return new y(t);var r=t.required;this.getRequiredOptions=function(){return r},this.validate=function(e){var n=[];return r.forEach(function(t){"undefined"==typeof e[t]&&n.push(t)}),n}});var n=function g(t,e){var n=e.length,r=t.length;if(n<r)return!1;if(r===n)return t===e;t:for(var i=0,o=0;i<r;i++){for(var u=t.charCodeAt(i);o<n;)if(e.charCodeAt(o++)===u)continue t;return!1}return!0},e=new function t(){this.matches=function(t,e){return n(e.toLowerCase(),t.toLowerCase())}};var r=new function O(){this.matches=function(e,t){return!!e&&(e=e.trim().toLowerCase(),(t=t.trim().toLowerCase()).split(" ").filter(function(t){return 0<=e.indexOf(t)}).length===t.split(" ").length)}};var l={put:function z(t){if(c(t))return s(t);if(function e(t){return Boolean(t)&&"[object Array]"===Object.prototype.toString.call(t)}(t))return function i(t){var e=[];a();for(var n=0,r=t.length;n<r;n++)c(t[n])&&e.push(s(t[n]));return e}(t);return undefined},clear:a,search:function S(t){return t?function a(t,e,n,r){for(var i=[],o=0;o<t.length&&i.length<r.limit;o++){var u=d(t[o],e,n,r);u&&i.push(u)}return i}(o,t,u.searchStrategy,u).sort(u.sort):[]},setOptions:function q(t){(u=t||{}).fuzzy=t.fuzzy||!1,u.limit=t.limit||10,u.searchStrategy=t.fuzzy?e:r,u.sort=t.sort||i}};function i(){return 0}var o=[],u={};function a(){return o.length=0,o}function c(t){return Boolean(t)&&"[object Object]"===Object.prototype.toString.call(t)}function s(t){return o.push(t),o}function d(t,e,n,r){for(var i in t)if(!p(t[i],r.exclude)&&n.matches(t[i],e))return t}function p(t,e){for(var n=!1,r=0,i=(e=e||[]).length;r<i;r++){var o=e[r];!n&&new RegExp(t).test(o)&&(n=!0)}return n}u.fuzzy=!1,u.limit=10,u.searchStrategy=u.fuzzy?e:r,u.sort=i;var h={compile:function j(r){return m.template.replace(m.pattern,function(t,e){var n=m.middleware(e,r[e],m.template);return void 0!==n?n:r[e]||t})},setOptions:function C(t){m.pattern=t.pattern||m.pattern,m.template=t.template||m.template,"function"==typeof t.middleware&&(m.middleware=t.middleware)}},m={};m.pattern=/\{(.*?)\}/g,m.template="",m.middleware=function(){};var v={merge:function L(t,e){var n={};for(var r in t)n[r]=t[r],"undefined"!=typeof e[r]&&(n[r]=e[r]);return n},isJSON:function M(t){try{return!!(t instanceof Object&&JSON.parse(JSON.stringify(t)))}catch(e){return!1}}};!function(t){var o={searchInput:null,resultsContainer:null,json:[],success:Function.prototype,searchResultTemplate:'<li><a href="{url}" title="{desc}">{title}</a></li>',templateMiddleware:Function.prototype,sortMiddleware:function(){return 0},noResultsText:"No results found",limit:10,fuzzy:!1,exclude:[]},n=["searchInput","resultsContainer","json"],r=function y(e){if(!function n(t){return!!t&&"undefined"!=typeof t.required&&t.required instanceof Array}(e))throw new Error("-- OptionsValidator: required options missing");if(!(this instanceof y))return new y(e);var r=e.required;this.getRequiredOptions=function(){return r},this.validate=function(e){var n=[];return r.forEach(function(t){"undefined"==typeof e[t]&&n.push(t)}),n}}({required:n});function i(t){o.success(t),l.put(t),function e(){o.searchInput.addEventListener("keyup",function(t){(function e(t){return-1===[13,16,20,37,38,39,40,91].indexOf(t)})(t.which)&&(u(),c(t.target.value))})}()}function u(){o.resultsContainer.innerHTML=""}function a(t){o.resultsContainer.innerHTML+=t}function c(t){(function e(t){return t&&0<t.length})(t)&&(u(),function i(t,e){var n=t.length;if(0===n)return a(o.noResultsText);for(var r=0;r<n;r++)t[r].query=e,a(h.compile(t[r]))}(l.search(t),t))}function s(t){throw new Error("SimpleJekyllSearch --- "+t)}t.SimpleJekyllSearch=function(t){return 0<r.validate(t).length&&s("You must specify the following required options: "+n),o=v.merge(o,t),h.setOptions({template:o.searchResultTemplate,middleware:o.templateMiddleware}),l.setOptions({fuzzy:o.fuzzy,limit:o.limit,sort:o.sortMiddleware}),v.isJSON(o.json)?i(o.json):function e(n){f.load(n,function(t,e){t&&s("failed to get JSON ("+n+")"),i(e)})}(o.json),{search:c}}}(window)}();

File diff suppressed because it is too large Load Diff

View File

@ -1,2 +0,0 @@
bundle exec jekyll build
rsync -Pr _site/ potato@neophyte.me:~/site/blog

Binary file not shown.

BIN
fonts/aramisi.ttf Normal file

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 411 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 KiB

View File

@ -3,13 +3,48 @@ layout: default
---
<div class="posts">
<ul>
{%for post in site.posts %}
<li class="archive-list">
{{ post.date | date: "%e %B %Y" }} <br/> <a href="{{ site.baseurl }}{{ post.url }}">{{post.title}}</a>
</li>
{% for post in paginator.posts %}
<article class="post">
<a href="{{ site.baseurl }}{{ post.url }}">
<h1>{{ post.title }}</h1>
<div>
<p class="post_date">{{ post.date | date: "%B %e, %Y" }}</p>
</div>
</a>
<div class="entry">
{{ post.excerpt }}
</div>
<a href="{{ site.baseurl }}{{ post.url }}" class="read-more">Read More</a>
</article>
{% endfor %}
<!-- pagination -->
{% if paginator.total_pages > 1 %}
<div class="pagination">
{% if paginator.previous_page %}
<a href="{{ paginator.previous_page_path | prepend: site.baseurl | replace: '//', '/' }}">&laquo; Prev</a>
{% else %}
<span>&laquo; Prev</span>
{% endif %}
{% for page in (1..paginator.total_pages) %}
{% if page == paginator.page %}
<span class="webjeda">{{ page }}</span>
{% elsif page == 1 %}
<a href="{{ '/' | prepend: site.baseurl | replace: '//', '/' }}">{{ page }}</a>
{% else %}
<a href="{{ site.paginate_path | prepend: site.baseurl | replace: '//', '/' | replace: ':num', page }}">{{ page }}</a>
{% endif %}
{% endfor %}
</ul>
{% if paginator.next_page %}
<a href="{{ paginator.next_page_path | prepend: site.baseurl | replace: '//', '/' }}">Next &raquo;</a>
{% else %}
<span>Next &raquo;</span>
{% endif %}
</div>
{% endif %}
</div>

27149
package-lock.json generated

File diff suppressed because it is too large Load Diff

13
search.json Normal file
View File

@ -0,0 +1,13 @@
---
---
[
{% for post in site.posts %}
{
"title" : "{% if post.title != "" %}{{ post.title | escape }}{% else %}{{ post.excerpt | strip_html | escape | strip }}{%endif%}",
"url" : "{{ site.baseurl }}{{ post.url }}",
"category" : "{{ post.categories | join: ', '}}",
"date" : "{{ post.date | date: "%B %e, %Y" }}"
} {% unless forloop.last %},{% endunless %}
{% endfor %}
]