Compare commits

..

No commits in common. "0d734e70f29d7c2fe8e68e3ec8052d5d3a79a2f0" and "de3e23c28221636c67e46bf6ecf0a68492d0caf2" have entirely different histories.

124 changed files with 1325 additions and 1400 deletions

20
.github/workflows/build.yml vendored Normal file
View file

@ -0,0 +1,20 @@
name: Build
on:
pull_request:
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: '0.104.3'
extended: true
- name: Hugo Build
run: hugo --minify

32
.github/workflows/deploy.yml vendored Normal file
View file

@ -0,0 +1,32 @@
name: Deploy
on:
push:
branches:
- main
jobs:
deploy:
name: Build and Deploy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: '0.104.3'
extended: true
- name: Hugo Build
run: hugo --minify
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1-node16
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Deploy to S3
run: hugo deploy --maxDeletes -1 --invalidateCDN

7
.gitignore vendored
View file

@ -1,3 +1,6 @@
public /public
themes .DS_Store
/resources/_gen/
/result
.hugo_build.lock

View file

@ -1,11 +0,0 @@
steps:
- name: build
image: nixos/nix
commands:
- echo 'experimental-features = flakes nix-command' >> /etc/nix/nix.conf
- nix build
volumes:
- /nix/store
when:
event: [push, pull_request]

9
archetypes/default.md Normal file
View file

@ -0,0 +1,9 @@
+++
title = "{{ replace .Name "-" " " | title }}"
date = {{ .Date }}
draft = true
showReadTime = false
showDate = false
comments = false
+++

21
archetypes/post.md Normal file
View file

@ -0,0 +1,21 @@
+++
title = "{{ replace .Name "-" " " | title }}"
date = {{ .Date }}
description = ""
featured = false
draft = false
toc = false
featureImage = ""
thumbnail = ""
shareImage = ""
codeMaxLines = 30
codeLineNumbers = false
figurePositionShow = false
keywords = []
tags = []
categories = []
showReadTime = true
showShare = true
showRelatedInArticle = false
+++

View file

@ -1,297 +0,0 @@
base_url = "https://www.softinio.com"
theme = "tabi"
title = "Salar Rahmanian"
description = "Software Engineer based in San Francisco Bay Area"
author = "Salar Rahmanian"
generate_feed = true
compile_sass = true
minify_html = true
# To translate the entire theme, there must be a file with the same ISO 639-1
# (or IETF BCP 47) Code in the `i18n` folder of your site or the tabi theme
# For example, "i18n/fr.toml" for French or "i18n/zh-Hans.toml" for Simplified Chinese.
# Otherwise the theme will be in English.
# See https://welpo.github.io/tabi/blog/faq-languages/ for more details.
default_language = "en"
taxonomies = [
{name = "categories", feed = true},
{name = "tags", feed = true},
]
[markdown]
highlight_code = true
highlight_theme = "css"
smart_punctuation = true
[link_checker]
internal_level = "warn"
[extra]
peertube = "https://watch.softinio.com/c/softinio/videos"
twitter_meta = "SalarRahmanian" # for SEO: twitter:site and twitter:creator
# google = "Your Google Site verification code."
# bing = "Your Bing Site verification code."
# Check out the documentation (or the comments below) to learn how to customise tabi:
# https://welpo.github.io/tabi/blog/mastering-tabi-settings/
# Enable JavaScript theme toggler to allow users to switch between dark/light mode.
# If disabled, your site will only use the theme specified in the `default_theme` variable.
theme_switcher = true
# This setting determines the default theme on load ("light" or "dark").
# To default to the user's OS-level theme, leave it empty or unset.
default_theme = ""
# Choose the colourscheme (skin) for the theme. Default is "teal".
# Skin available: blue, lavender, mint, red, sakura, teal, monochrome, lowcontrast_orange, lowcontrast_peach, lowcontrast_pink, indigo_ingot, evangelion
# See them live and learn how to create your own: https://welpo.github.io/tabi/blog/customise-tabi/#skins
# WARNING! "lowcontrast" skins, while aesthetically pleasing, may not provide optimal
# contrast (in light theme) for readability and might not be suitable for all users.
# Furthermore, low contrasting elements will affect your Google Lighthouse rating.
# All other skins have optimal contrast.
skin = "lowcontrast_orange"
# Set browser theme colour. Can be a single colour or [light, dark].
# Note: Bright colors may be ignored in dark mode.
# More details: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name/theme-color
browser_theme_color = "#f56a00"
# browser_theme_color = ["#ffffff", "#000000"] # Example of light/dark colours.
# List additional stylesheets to load site-wide.
# These stylesheets should be located in your site's `static` directory.
# Example: stylesheets = ["extra1.css", "path/extra2.css"]
# You can load a stylesheet for a single post by adding it to the [extra] section of the post's front matter, following this same format.
stylesheets = []
# Sets the default canonical URL for all pages.
# Individual pages can override this in the [extra] section using canonical_url.
# Example: "$base_url/blog/post1" will get the canonical URL "https://example.com/blog/post1".
# Note: To ensure accuracy in terms of matching content, consider setting 'canonical_url' individually per page.
# base_canonical_url = "https://example.com"
# Add a "copy" button to codeblocks (loads ~700 bytes of JavaScript).
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
copy_button = true
# Show the reading time of a page.
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
show_reading_time = true
# Adds backlinks to footnotes (loads ~500 bytes of JavaScripts).
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
footnote_backlinks = false
# Enable KaTeX for all posts.
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
katex = false
# Show links to previous and next articles at the bottom of posts.
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
show_previous_next_article_links = false
# Whether the navigation for previous/next article should match the full width of the site (same as the navigation bar at the top) or the article width.
# To match the navigation bar at the top, set it to true.
previous_next_article_links_full_width = true
# Quick navigation buttons.
# Adds "go up" and "go to comments" buttons on the bottom right (hidden for mobile).
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
quick_navigation_buttons = true
# Add a Table of Contents to posts, right below the title and metadata.
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
toc = false
# Date format used when listing posts (main page, /blog section, tag posts list…)
# Default is "6th July 2049" in English and "%d %B %Y" in other languages.
long_date_format = "%d %B %Y"
# Date format used for blog posts.
# Default is "6th July 2049" in English and "%-d %B %Y" in other languages.
short_date_format = ""
# Custom separator used in title tag and posts metadata (between date, time to read, and tags).
separator = "•"
# Use a shorter layout for All tags listing.
# Default: tag_name n post[s]
# Compact: tag_name^n (superscript number)
compact_tags = false
# Invert the order of the site title and page title in the browser tab.
# Example: true => "Blog • ~/tabi", false => "~/tabi • Blog"
invert_title_order = false
# Full path after the base URL required. So if you were to place it in "static" it would be "/favicon.png"
favicon = "favicon.png"
favicon16 = "favicon-16_16.png"
favicon32 = "favicon-32_32.png"
favicon180 = "softinio-apple-touch-icon.png" # apple-touch-icon.png
# Add an emoji here to use it as favicon.
# Compatibility: https://caniuse.com/link-icon-svg
favicon_emoji = "favicon.svg"
# Path to the fallback image for social media cards (the preview image shown when sharing a link on WhatsApp, LinkedIn…).
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
# Learn how to create these images in batch and automatically:
# https://osc.garden/blog/automating-social-media-cards-zola/
# social_media_card = "social_cards/index.jpg"
menu = [
{ name = "articles", url = "post", trailing_slash = true },
{ name = "til", url = "til", trailing_slash = true },
{ name = "projects", url = "projects", trailing_slash = true },
{ name = "talks", url = "talks", trailing_slash = true },
{ name = "subscribe", url = "subscribe", trailing_slash = true },
]
# The RSS icon will be shown if (1) it's enabled and (2) the following variable is set to true.
feed_icon = true
# Show the full post content in the Atom feed.
# If it's set to false, only the description or summary will be shown.
full_content_in_feed = false
# Email address for footer's social section.
# Protect against spambots:
# 1. Use base64 for email (convert at https://www.base64encode.org/ or `printf 'your@email.com' | base64`).
# 2. Or, set 'encode_plaintext_email' to true for auto-encoding (only protects on site, not in public repos).
email = "c2FsYXJAc29mdGluaW8ubmV0"
# Decoding requires ~400 bytes of JavaScript. If JS is disabled, the email won't be displayed.
encode_plaintext_email = false # Setting is ignored if email is already encoded.
# The icons available can be found in "social_icons" in the "static" folder.
socials = [
{ name = "xmpp", url = "https://join.jabber.network/#salar@softinio.dev", icon = "xmpp" },
{ name = "matrix", url = "matrix.to/#/@softinio:matrix.org", icon = "matrix" },
{ name = "discord", url = "https://discord.com/users/softinio", icon = "discord" },
{ name = "mastodon", url = "https://social.softinio.com/@softinio", icon = "mastodon" },
{ name = "x", url = "https://x.com/SalarRahmanian", icon = "x" },
{ name = "linkedin", url = "https://www.linkedin.com/in/salarrahmanian/", icon = "linkedin" },
{ name = "git", url = "https://code.softinio.com/softinio", icon = "git" },
{ name = "github", url = "https://github.com/softinio/", icon = "github" },
{ name = "codeberg", url = "https://codeberg.org/softinio", icon = "codeberg" },
{ name = "twitch", url = "https://www.twitch.tv/softinio", icon = "twitch" },
{ name = "peertube", url = "https://watch.softinio.com/c/softinio/videos", icon = "peertube" },
{ name = "youtube", url = "https://www.youtube.com/@Salar_Rahmanian", icon = "youtube" },
]
# Extra menu to show on the footer, below socials section.
footer_menu = [
{url = "about", name = "about", trailing_slash = true},
{url = "resume", name = "resume", trailing_slash = true},
{url = "categories", name = "categories", trailing_slash = true},
{url = "tags", name = "tags", trailing_slash = true},
{url = "sitemap.xml", name = "sitemap", trailing_slash = false},
]
# Enable a copyright notice for the footer, shown between socials and the "Powered by" text.
# $TITLE will be replaced by the website's title.
# $CURRENT_YEAR will be replaced by the current year.
# $AUTHOR will be replaced by the `author` variable.
# $SEPARATOR will be replaced by the `separator` variable.
# Markdown is supported (links, emphasis, etc).
copyright = "© $CURRENT_YEAR $AUTHOR $SEPARATOR Unless otherwise noted, the content in this website is available under the [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) license. Please attribute properly and link back."
# For multi-language sites, you can set a different copyright for each language.
# The old way of setting `translated_copyright = true` and using i18n files is deprecated.
# If a translation is missing for language, the `copyright` value will be used.
# copyright_translations.es = "$TITLE © $CURRENT_YEAR $AUTHOR $SEPARATOR A menos que se indique lo contrario, el contenido de esta web está disponible bajo la licencia [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)."
# Custom security headers. What urls should your website be able to connect to?
# You need to specify the CSP and the URLs associated with the directive.
# Useful if you want to load remote content safely (embed YouTube videos, which needs frame-src, for example).
# Default directive is self.
# Default config, allows for https remote images and embedding YouTube and Vimeo content.
# This configuration (along with the right webserver settings) gets an A+ in Mozilla's Observatory: https://observatory.mozilla.org
allowed_domains = [
{ directive = "font-src", domains = ["'self'", "data:"] },
{ directive = "img-src", domains = ["'self'", "https://*", "data:"] },
{ directive = "script-src", domains = ["'self'", "https://comments.softinio.com/js/embed.min.js"] },
{ directive = "style-src", domains = ["'self'"] },
{ directive = "frame-src", domains = ["player.vimeo.com", "https://www.youtube-nocookie.com", "https://watch.softinio.com", "https://notes.softinio.com/embed"] },
]
# Custom subset of characters for the header.
# If set to true, the `static/custom_subset.css` file will be loaded first.
# This avoids a flashing text issue in Firefox.
# Please see https://welpo.github.io/tabi/blog/custom-font-subset/ to learn how to create this file.
custom_subset = true
[extra.analytics]
# Specify which analytics service you want to use.
# Supported options: ["goatcounter", "umami", "plausible"]
# service = "goatcounter"
# Unique identifier for tracking.
# For GoatCounter, this is the code you choose during signup.
# For Umami, this is the website ID.
# For Plausible, this is the domain name (e.g. "example.com").
# Note: Leave this field empty if you're self-hosting.
# id = "yourID"
# Optional: Specify the URL for self-hosted analytics instances.
# For GoatCounter: Base URL like "https://stats.example.com"
# For Umami: Base URL like "https://umami.example.com"
# For Plausible: Base URL like "https://plausible.example.com"
# Leave this field empty if you're using the service's default hosting.
# self_hosted_url = "https://tabi-stats.osc.garden"
# giscus support for comments. https://giscus.app
# Setup instructions: https://welpo.github.io/tabi/blog/comments/#setup
[extra.giscus]
enabled_for_all_posts = false # Enables giscus on all posts. It can be enabled on individual posts by setting `giscus = true` in the [extra] section of a post's front matter.
automatic_loading = true # If set to false, a "Load comments" button will be shown.
repo = "welpo/tabi-comments"
repo_id = "R_kgDOJ59Urw" # Find this value in https://giscus.app/
category = "Announcements"
category_id = "DIC_kwDOJ59Ur84CX0QG" # Find this value in https://giscus.app/
mapping = "slug" # Available: pathname; url; title; slug. "slug" will use the post's filename (slug); this is the only way to share comments between languages.
strict_title_matching = 1 # 1 to enable, 0 to disable. https://github.com/giscus/giscus/blob/main/ADVANCED-USAGE.md#data-strict
enable_reactions = 1 # 1 to enable, 0 to disable.
comment_box_above_comments = false
light_theme = "noborder_light"
dark_theme = "noborder_dark"
lang = "" # Leave blank to match the page's language.
lazy_loading = true
# utterances support for comments. https://utteranc.es
# Setup instructions: https://welpo.github.io/tabi/blog/comments/#setup
[extra.utterances]
enabled_for_all_posts = false # Enables utterances on all posts. It can be enabled on individual posts by setting `utterances = true` in the [extra] section of a post's front matter.
automatic_loading = true # If set to false, a "Load comments" button will be shown.
repo = "yourGithubUsername/yourRepo" # https://utteranc.es/#heading-repository
issue_term = "slug" # Available: pathname; url; title; slug. "slug" will use the post's filename (slug); this is the only way to share comments between languages. https://utteranc.es/#heading-mapping
label = "💬" # https://utteranc.es/#heading-issue-label
light_theme = "github-light" # https://utteranc.es/#heading-theme
dark_theme = "photon-dark" # https://utteranc.es/#heading-theme
lazy_loading = true
# Hyvor Talk support for comments. https://talk.hyvor.com
[extra.hyvortalk]
enabled_for_all_posts = false # Enables hyvortalk on all posts. It can be enabled on individual posts by setting `hyvortalk = true` in the [extra] section of a post's front matter.
automatic_loading = true # If set to false, a "Load comments" button will be shown.
website_id = "1234"
page_id_is_slug = true # If true, it will use the post's filename (slug) as id; this is the only way to share comments between languages. If false, it will use the entire url as id.
lang = "" # Leave blank to match the page's language.
page_author = "" # Email (or base64 encoded email) of the author.
lazy_loading = true
# Isso support for comments. https://isso-comments.de/
# You need to self-host the backend first: https://blog.phusion.nl/2018/08/16/isso-simple-self-hosted-commenting-system/
# More info on some settings: https://isso-comments.de/docs/reference/client-config/
[extra.isso]
enabled_for_all_posts = true # Enables Isso on all posts. It can be enabled on individual posts by setting `isso = true` in the [extra] section of a post's front matter.
automatic_loading = true # If set to false, a "Load comments" button will be shown.
endpoint_url = "https://comments.softinio.com/" # Accepts relative paths like "/comments/" or "/isso/", as well as full urls like "https://example.com/comments/". Include the trailing slash.
page_id_is_slug = true # If true, it will use the relative path for the default language as id; this is the only way to share comments between languages. If false, it will use the entire url as id.
lang = "" # Leave blank to match the page's language.
max_comments_top = "inf" # Number of top level comments to show by default. If some comments are not shown, an “X Hidden” link is shown.
max_comments_nested = "5" # Number of nested comments to show by default. If some comments are not shown, an “X Hidden” link is shown.
avatar = true
voting = true
page_author_hashes = "" # hash (or list of hashes) of the author.
lazy_loading = true # Loads when the comments are in the viewport (using the Intersection Observer API).

View file

@ -0,0 +1,58 @@
baseurl = "https://www.softinio.com/"
title = "Salar Rahmanian"
author = "Salar Rahmanian"
enableRobotsTXT = true
enableEmoji = true
paginate = 10
# title = "Clarity" # Edit directly from config/_default/languages.toml # alternatively, uncomment this and remove `title` entry from the aforemention file.
# copyright = "Copyright © 20082018, Steve Francia and the Hugo Authors; all rights reserved."
# canonifyurls = true
theme = ["github.com/softinio/hugo-clarity"]
# disqusShortname = ""
DefaultContentLanguage = "en"
# [languages]
# config/_default/languages.toml
# [menus]
# config/_default/menus/menu.xx.toml
[taxonomies]
category = "categories"
tag = "tags"
series = "series"
[outputs]
home = ["HTML", "RSS", "JSON"]
page = ["html"]
[sitemap]
changefreq = "weekly"
priority = 0.5
filename = "sitemap.xml"
[deployment]
order = [".png$", ".jpg$", ".gif$", ".svg$"]
[[deployment.targets]]
name = "softinio-deploy"
URL = "s3://www.softinio.com?region=us-east-1"
cloudFrontDistributionID = "E1CMSLHG2WR51C"
[[deployment.matchers]]
# Cache static assets for 1 year.
pattern = "^.+\\.(js|css|svg|ttf)$"
cacheControl = "max-age=31536000, no-transform, public"
gzip = true
[[deployment.matchers]]
pattern = "^.+\\.(png|jpg)$"
cacheControl = "max-age=31536000, no-transform, public"
gzip = false
[[deployment.matchers]]
pattern = "^.+\\.(html|xml|json)$"
gzip = true

View file

@ -0,0 +1,24 @@
timeout = 30000
enableInlineShortcodes = true
footnoteReturnLinkContents = "^"
[privacy]
[privacy.vimeo]
disabled = false
simple = true
[privacy.twitter]
disabled = false
enableDNT = true
simple = true
disableInlineCSS = true
[privacy.instagram]
disabled = false
simple = true
[privacy.youtube]
disabled = false
privacyEnhanced = true

View file

@ -0,0 +1,6 @@
[en]
title = "Salar Rahmanian"
LanguageName = "English"
weight = 1

View file

@ -0,0 +1,17 @@
[goldmark]
[goldmark.renderer]
hardWraps = false
unsafe = false # change to false to disable inclusion of rawHTML and math functions
xhtml = false
[goldmark.extensions]
typographer = false
[highlight]
codeFences = true
guessSyntax = true
hl_Lines = "--"
lineNoStart = 1
lineNos = true # always set to true # else line numbers won't show at all! even when you toggle them on in the UI
lineNumbersInTable = false # toggling this on (i.e to true) or deleting this line will break the code blocks functionality. Will
noClasses = false
# style = "monokai"
tabWidth = 2

View file

@ -0,0 +1,103 @@
# [[main]]
# name = "Home"
# url = ""
# weight = -110
[[main]]
name = "About"
url = "about/"
weight = -110
[[main]]
name = "Resume"
url = "resume/"
weight = -109
[[main]]
name = "Consulting"
url = "consulting/"
weight = -108
[[main]]
name = "Newsletter"
url = "https://notes.softinio.com"
weight = -107
[[main]]
name = "Watch"
url = "https://watch.softinio.com/c/softinio/videos"
weight = -106
[[main]]
name = "TIL"
url = "https://til.softinio.com"
weight = -105
# Submenus are done this way: parent -> identifier
# [[main]]
# name = "Links"
# identifier = "Links"
# weight = -108
# [[main]]
# parent = "Links"
# name = "LinkedIn"
# url = "https://www.linkedin.com/"
# [[main]]
# parent = "Links"
# name = "Twitter"
# url = "https://twitter.com/"
# [[main]]
# name = "About"
# url = "about/"
# weight = -107
# social menu links
[[social]]
name = "cgit"
weight = 1
url = "https://git.softinio.com"
[[social]]
name = "github"
type = "social"
weight = 2
url = "https://github.com/softinio"
[[social]]
name = "twitter"
weight = 3
url = "https://twitter.com/SalarRahmanian"
[[social]]
name = "linkedin"
weight = 4
url = "https://www.linkedin.com/in/salarrahmanian"
[[social]]
name = "youtube"
weight = 5
url = "https://www.youtube.com/@softinio"
[[social]]
name = "matrix"
weight = 6
url = "https://matrix.to/#/@softinio:matrix.org"
[[social]]
name = "mastedon"
weight = 7
url = "https://fosstodon.org/@softinio"
[[social]]
name = "rss"
weight = 8
url = "index.xml"
# other supported social links
# name = "youtube"
# url = "https://www.youtube.com/#"
# name = "facebook"
# url = "https://facebook.com/#"
# name = "instagram"
# url = "https://instagram.com/#"
# name = "stackoverflow"
# url = "https://stackoverflow.com/#"
# name = "gitlab"
# url = "https://gitlab.com/#"
# name = "discord"
# url = "https://discord.gg/#"

147
config/_default/params.toml Normal file
View file

@ -0,0 +1,147 @@
# enable search
enableSearch = true
# socials
twitter = "@SalarRahmanian"
largeTwitterCard = true
introDescription = "Software Engineer based in San Francisco Bay Area."
description = "Salar Rahmanian"
keywords = ["Salar", "Rahmanian", "Salar Rahmanian", "Blog", "python", "scala", "haskell", "nix", "NixOS"]
# showShare = false # Uncomment to not show share buttons on each post. Also available in each post's front matter.
# Google analytics Id
ga_analytics = "G-XZR9K3MDHX"
# limit the number of taxonomies links shown on the sidebar of each page by default.
numberOfTagsShown = 14 # Applies for all other default & custom taxonomies. e.g categories, brands see https://gohugo.io/content-management/taxonomies#what-is-a-taxonomy
# Whether to default to storing images and other assets in the `static` directory, or use Hugo page bundles.
# Switch to `true` if you'd like to group assets with the post itself (as a "leaf bundle").
# This can be overridden at the page level; what is set below acts as the default if no page variable is set.
# Details on page bundles: https://gohugo.io/content-management/page-bundles/#leaf-bundles
usePageBundles = false
# Path variables
#
# By default, each of these directories are children of the `static` directory.
#
# In some Apache server installs, these directory names could conflict and you
# may want to change them. See:
# https://github.com/chipzoller/hugo-clarity/issues/74
#
# If you change the names of these directories, be sure to copy the contents of
# the originals to get the files included with Hugo Clarity.
#
# Images:
imagesDir = "images/" # without a leading forward slash
# Icons:
iconsDir = "icons/" # without a leading forward slash
# Fonts:
fontsDir = "fonts/" # without a leading forward slash
# Social media sharing image: Will be used on Twitter, Facebook, LinkedIn, etc.
# when a given page has no other image present.
fallBackOgImage = "salar.jpg"
# Logo image
# logo = "salar.jpg"
# center logo on navbar
centerLogo = false # Set to "true" for centering or "false" for left aligned.
# sets the maximum number of lines per codeblock. The codeblock will however be scrollable and expandable.
codeMaxLines = 10
# disable showing line numbers by default. Switch to `true` if you'd rather have them on.
codeLineNumbers = false
# enable math notation. Switch to `true` to enable mathjax in your site.
enableMathNotation = false
# directory(s) where your articles are located
mainSections = ["post"] # see config details here https://gohugo.io/functions/where/#mainsections
# Label Non inline images on an article body
figurePositionShow = false # toggle on or off globally
# you can toggle this behaviour on or off on per page using the same variable inside your articles frontmatter
figurePositionLabel = "Figure" # the text before image number e.g Figure 1.0
# Set the collapsed mobile navigation to either appear from the left or the right
mobileNavigation = "left" # if you prefer right change to 'right'
# some site owners want to decide how they would like their sites to be introduced users. These settings give you as a site owner to decide how the user will view your site for the first time.
# please note that you cannot enforce both modes at the same time. i.e by enforcing one mode, you priotise it over the other (by setting it to true). enforceDarkMode will be commented out
# please also not that mode toggle UI will remain in place. That way, if a user prefers darkmode, they can have their way.
enforceLightMode = false
# enforceDarkMode = false
# customize footer icon. see issue https://github.com/chipzoller/hugo-clarity/issues/77
# footerLogo = "icons/copy.svg"
# Customize Sidebar Disclaimer Text
# sidebardisclaimer = true
# disclaimerText = "The opinions expressed on this site are my own personal opinions and do not represent my employers view in any way."
# Text for the languages menu.
languageMenuName = "🌐"
# Title separator, default to |.
# titleSeparator = "|"
# Enable or disable comments globally. Default to true.
# comments = false
# Enable or disable Utterances (https://github.com/utterance/utterances) Github Issue-Based Commenting
# utterances = true #Run the utterances script in the single.html layout to load https://utteranc.es comments
# utterancesRepo = "GHUsername/Repository.Name" # Utterances is enabled when this param is set
# utterancesTheme = "github-light" # Default: github-dark
# utterancesIssueTerm = "pathname" # Default: pathname
# Maximum number of recent posts. (default: 8)
# numberOfRecentPosts = 8
# Maximum number of featured posts. (default: 8)
# numberOfFeaturedPosts = 8
# Pin featured posts in list.
# pinFeatured = true
# Maximum number of pinned featured posts. (default: 8)
# numberOfPinnedPosts = 8
# Date format. Checkout https://gohugo.io/functions/format/#hugo-date-and-time-templating-reference for details.
# dateFormat = "2006-01-02" # Default to "Jan 2, 2006".
# customFonts = false # toggle to true if you want to use custom fonts only.
# The year when ths website was created, this value is used in the copyright
# notice of the footer.
# since = 2016
# Show related content at the end of an article based on the 'series' taxonomy. Can be set in post front matter.
# showRelatedInArticle = false
# showRelatedInSidebar = false
# website author
[author]
name = "Salar Rahmanian"
photo = "salar.jpg"
[plausible_analytics]
enable = true # to enable plausible analytics set to true.
websiteDomain = "www.softinio.com" # domain name of your website, most cases same as your base url
plausibleDomain = "analytics.softinio.net" # default is set to plausible.io, only required if plausible is selfhosted
# scritpName = "plausible" # default is set to plausible, only required if using a custome name for script
[matomo_analytics]
enable = false # To enable matomo analytics change to `true`.
# websiteDomain = "www.softinio.com" # Set the domain name of your website, in most cases same as your base URL this is required.
# matomoDomain = "softinio.dev/matomo/" # Set to Matomo domain
# matomoSiteID = "2" # Default is set to 1, change this to the siteid being tracked
[giscus]
enable = true

View file

@ -1,9 +1,3 @@
+++ +++
title = "Home" author = "Salar Rahmanian"
template = "section.html"
[extra]
section_path = "post/_index.md"
max_posts = 3
header = {title = "That's what I do. I drink 🍷and I know technical things.", img = "SalarRahmanian.png", img_alt = "Salar Rahmanian" }
+++ +++

View file

@ -1,24 +1,26 @@
+++ +++
title = "About" title = "Salar Rahmanian"
template = "info-page.html" date = "2015-11-26T09:16:07-05:00"
path = "about" description = "About Salar Rahmanian"
keywords = ["Salar", "Rahmanian", "Salar Rahmanian"]
[extra] showReadTime = false
isso = false showDate = false
quick_navigation_buttons = true comments = false
+++ +++
I, [Salar Rahmanian](https://www.softinio.com), am a software engineer based in San Francisco Bay Area, California. I, [Salar Rahmanian](https://www.softinio.com), am a software engineer based in San Francisco Bay Area, California.
I have been developing software since the age of eleven. My current passion is functional programming, big data and distributed systems. I have been developing software since the age of eleven. My current passion is functional programming, big data and distributed systems.
I am particularly enthusiastic about the Scala Programming language and NixOS and technologies such as Apache Nifi, Kafka, Spark and Akka / Pekko. I am particularly enthusiastic about the Scala Programming language and NixOS and technologies such as Apache Nifi, Kafka, Spark and Akka.
I contribute to open source projects when time allows. I contribute to open source projects when time allows.
At work, I am currently working as a Data Engineer using spark and Databricks alot. For full details of my experience have a look at my [Resume](/resume).
As a long term Vim user and Neovim fan I also have started contributing plugins written in Lua for Neovim. As a long term Vim user and Neovim fan I also have started contributing plugins written in Lua for Neovim.
{{ full_width_image(src="SalarRahmanianFamily.jpg" alt="Salar Rahmanian's family photo") }} [Subscribe to my newsletter](https://notes.softinio.com/)
[Watch my talks](https://watch.softinio.com)
![Salar Rahmanian Family](/img/SalarRahmanianFamily.jpg)

View file

@ -1,4 +0,0 @@
+++
redirect_to = "post"
+++

View file

@ -0,0 +1,20 @@
+++
title = "Thank You."
date = 2022-10-15T23:20:17-07:00
draft = false
showReadTime = false
showDate = false
showShare = false
comments = false
sitemap_exclude = true
+++
Thank you for contacting me. I have received your submitted form for booking a consultation. I will be in touch shortly.
Many thanks.
Regards,
*Salar Rahmanian*

116
content/consulting.md Normal file
View file

@ -0,0 +1,116 @@
+++
title = "Consulting"
date = 2022-10-15T18:43:23-07:00
draft = false
showReadTime = false
showDate = false
comments = false
+++
![Consulting Technical Stack and Speciality: Scala, Akka, Apache Spark, Kafka, Apache Nifi, and Nix / NixOS](/img/techstack.png)
# Services
I am a software engineer and leader with over 20 years experience, based in the San Francisco Bay Area, California (USA). You can read more about my experience by looking at my [Resume]({{< ref "/resume" >}} "Resume").
### Software Development
I am happy to help build software for you. This includes, but is not limited to:
- Building new software for your business from inception
- Enhancing and adding new features to your existing custom software
- Joining your existing engineering team for short term and long term projects, helping to increase your teams capacity and capability
### Open source maintenance and Support
Many companies leverage open source software to save costs. As an active contributor and user of open source software I can help with:
- Providing support and Training
- Adding enhancments and new features to open source projects that you need
- If you have open sourced some of your work, I can help with maintenance and supporting its community of users
### Training
I provide expert training and mentorship. Happy to provide this on a one to one basis or as a workshop to a group.
All training and workshops I do are custom to your needs, so that it can focus on the areas most guidance is needed.
### Technical Review
Do you need an external experienced engineer to review your architecture and code and provide impartial feedback, with advice on improvements and evolving your work? I can provide this.
Thinking of acquiring a software company? Do you need its assets audited and reviewed to know and understand what you are getting? I can help!
### Hiring Help
I am available to help you with hiring engineers. I can help with:
- Defining your interview process and how to measure a candidate for a role
- Interview candidates of all levels on your behalf
- Train technical interviewers at your company
### Consulting
Having worked in the software engineering industry for over 20 years across the USA and Europe, I am happy to share any knowledge I have gathered, providing any advice I can help with. Also, where possible I can help with making the business and technical connections to help you succeed.
### Business Insights and Analytics
Do you want better insights and reporting on your business and competitors?
I can help with your data, creating data pipelines to generate insights and reports that can help with your business strategy and give you a competitive edge leveraging all the modern tools in data engineering and data science.
### Monitoring and Fault Detection Audit and Improvements
Does your software platform have quality of service issues? Are you failing to meet your customers SLA and reliability expectations?
I can help by assessing how you monitor and detect problems on your platform, providing advice on what needs to be done to have the best and most reliable service. I am also available to implement the changes needed adding the monitoring you need.
This includes, but is not limited to setting up:
- Better error logging leveraging technologies such as Kibana
- Better system monitoring leveraging Grafana or Datadog
- Improvements to compliance and audit logging
- Engineering process improvements to react to and eliminate recurring problems on your platform
# Book a Consultation
Want to get together to discuss how I can help you and find out more about my services? Book a consultation with me by submitting the form below and I will be in touch to move forward.
{{< rawhtml >}}
<link rel="stylesheet" href="/css/googleform.css">
<script type="text/javascript">var submitted=false;</script>
<iframe name="hidden_iframe" id="hidden_iframe" style="display:none;"
onload="if(submitted) {window.location='/consulting-thankyou';}"></iframe>
<form action="https://docs.google.com/forms/d/e/1FAIpQLSdCGmLDOLCM8ujwkAsKOks0v9xXRJ5R3_Gd-jPLigEHTth1BA/formResponse"
method="post" target="hidden_iframe" onsubmit="submitted=true;">
</form>
<form action="https://docs.google.com/forms/d/e/1FAIpQLSdCGmLDOLCM8ujwkAsKOks0v9xXRJ5R3_Gd-jPLigEHTth1BA/formResponse" method="post" target="hidden_iframe" onsubmit="submitted=true">
<label>Email*</label>
<input type="email" placeholder="Email address*" class="form-input" name="entry.315851213" required>
<label>First Name*</label>
<input type="text" placeholder="First Name*" class="form-input" name="entry.2101427994" required>
<label>Last Name*</label>
<input type="text" placeholder="Last Name*" class="form-input" name="entry.1349260782" required>
<label>Company Name</label>
<input type="text" placeholder="Company Name" class="form-input" name="entry.626621467">
<label>Phone Number</label>
<input type="text" placeholder="Phone Number" class="form-input" name="entry.1754566849">
<label>How Can I Help you?*</label>
<textarea rows="5" placeholder="Enter your message here" class="form-input" name="entry.737320458" required></textarea>
<label>What is your preferred dates and times for me to send you a Google Meet / Zoom Calendar invite for us to have a chat about how I can help?</label>
<textarea rows="5" placeholder="Enter your message here" class="form-input" name="entry.118380213"></textarea>
<button type="submit">Send</button>
</form>
{{< /rawhtml >}}

View file

@ -1,11 +1,6 @@
+++ +++
paginate_by = 4 aliases = ["posts", "articles", "blog", "showcase", "docs"]
path = "/post" title = "Posts"
title = "Articles" author = "Salar Rahmanian"
sort_by = "date" tags = ["index"]
template = "section.html"
insert_anchor_links = "left"
[extra]
show_previous_next_article_links = true
+++ +++

View file

@ -1,31 +1,27 @@
+++ +++
title = "Acting Lessons for Scala Engineers With Akka and Zio" title = "Acting Lessons for Scala Engineers With Akka and Zio"
description = "Salar Rahmanian's talk at Scale By the Bay conference 2020 on Akka Actors and ZIO Actors"
date = 2021-04-10T10:20:09-07:00 date = 2021-04-10T10:20:09-07:00
weight = 3 description = "Salar Rahmanian's talk at Scale By the Bay conference 2020 on Akka Actors and ZIO Actors"
featured = true
[taxonomies] draft = false
tags = ["actor model", "concurrency", "distributed systems", "scala", "functional programming", "conference", "talks"] toc = false
categories = ["Talks"] featureImage = "/img/sbtb2020.jpg"
thumbnail = ""
[extra] shareImage = ""
local_image = "talks/acting-lessons-for-scala-engineers-with-akka-and-zio/sbtb2020.webp" codeMaxLines = 30
social_media_card = "sbtb2020.jpg" codeLineNumbers = false
toc = true figurePositionShow = false
keywords = ["concurrent", "concurrency", "actor model", "actor", "actors", "threads", "petri net", "coroutines", "distributed", "akka", "erlang", "elixir", "akka.net", "microsoft orleans", "orleans", "zio", "zio-actors", "zio actors","swift language actors", "functional programming", "fp", "tech talk", "talk", "conference", "scale by the bay", "scala by the bay", "by the bay", "functional.tv", "sf scala"] keywords = ["concurrent", "concurrency", "actor model", "actor", "actors", "threads", "petri net", "coroutines", "distributed", "akka", "erlang", "elixir", "akka.net", "microsoft orleans", "orleans", "zio", "zio-actors", "zio actors","swift language actors", "functional programming", "fp", "tech talk", "talk", "conference", "scale by the bay", "scala by the bay", "by the bay", "functional.tv", "sf scala"]
tags = ["actor model", "concurrency", "distributed systems", "scala", "zio", "zio-actors", "functional programming", "conference", "talk"]
categories = ["concurrency", "distributed systems", "scala", "functional programming", "conference", "talk"]
+++ +++
![](sbtb2020.jpg)
In November 2020 I had the great privilege to do a [Talk at Scale By The Bay Conference](https://scalebythebay2020.sched.com/event/e54O/acting-lessons-for-scala-engineers-with-akka-and-zio). In November 2020 I had the great privilege to do a [Talk at Scale By The Bay Conference](https://scalebythebay2020.sched.com/event/e54O/acting-lessons-for-scala-engineers-with-akka-and-zio).
### Recording of my talk ### Here is the recording of my talk
{{ youtube(id="AQXBlbkf9wc") }} {{< youtube AQXBlbkf9wc >}}
### Slides
Slides for my talk can be found [here](https://github.com/softinio/talks/blob/master/SBTB2020/acting-lessons-for-scala-engineers-with-akka-and-zio.pdf).
### I also wrote three blogs posts as a companion to my talk ### I also wrote three blogs posts as a companion to my talk

View file

@ -1,18 +1,24 @@
+++ +++
title = "All Good Things Come to an End" title = "All Good Things Come to an End"
description = "After having spent the last seven years organizing technical talks at several meetups I have decided to step down and move on."
date = 2021-04-14T12:03:44-07:00 date = 2021-04-14T12:03:44-07:00
description = "After having spent the last seven years organizing technical talks at several meetups I have decided to step down and move on."
[taxonomies] featured = false
tags = ["meetup", "conference", "talks"] draft = false
categories = ["Announcements"] toc = false
featureImage = ""
[extra] thumbnail = ""
toc = true shareImage = ""
codeMaxLines = 30
codeLineNumbers = false
figurePositionShow = false
keywords = ["meetup", "conference", "technical talks", "events", "organizer"] keywords = ["meetup", "conference", "technical talks", "events", "organizer"]
tags = ["meetup", "conference", "technical talks"]
categories = ["meetup", "conference", "technical talks"]
+++ +++
{{ youtube(id="1CU5UPi7STk") }} **Update:** Since writing this blog I have re-started arranging some meetups again. **For details visit: [Current Meetups I am organizer for]({{< ref "resume.md#current-meetups" >}})**
{{< youtube 1CU5UPi7STk >}}
After having spent the last seven years organizing technical talks at several meetups I have decided to step down and move on. It is an end of an era for me, but I am excited about what's next. After having spent the last seven years organizing technical talks at several meetups I have decided to step down and move on. It is an end of an era for me, but I am excited about what's next.
@ -51,3 +57,5 @@ Keep in touch all, lets get together sometime for a happy hour (be it virtual or
Thank you 🙏🍷 All ! Thank you 🙏🍷 All !
### [Subscribe to my newsletter](https://notes.softinio.com)

View file

@ -1,15 +1,19 @@
+++ +++
title = "Announcing My New Site for Great Technical Video Content" title = "Announcing My New Site for Great Technical Video Content"
description = "I am thrilled to announce my new video website watch.softinio.com, a place for great technical talk content ad free and free from commnercial sponsorship."
date = 2021-11-22T18:07:52-08:00 date = 2021-11-22T18:07:52-08:00
description = "I am thrilled to announce my new video website watch.softinio.com, a place for great technical talk content ad free and free from commnercial sponsorship."
[taxonomies] featured = true
tags = ["video", "meetup", "conference", "talks"] draft = false
categories = ["Talks", "Announcements"] toc = false
featureImage = "/img/SF1.jpg"
[extra] thumbnail = ""
toc = true shareImage = ""
codeMaxLines = 30
codeLineNumbers = false
figurePositionShow = false
keywords = ["youtube", "PeerTube", "technical talks", "events", "conference", "meetup", "video", "virtual talks", "scala", "neovim", "kafka", "nifi", "spark", "java", "python", "Swift"] keywords = ["youtube", "PeerTube", "technical talks", "events", "conference", "meetup", "video", "virtual talks", "scala", "neovim", "kafka", "nifi", "spark", "java", "python", "Swift"]
tags = ["video", "meetup", "conference", "technical talks"]
categories = ["video", "meetup", "conference", "technical talks"]
+++ +++
#### Announcing [watch.softinio.com](https://watch.softinio.com) #### Announcing [watch.softinio.com](https://watch.softinio.com)
@ -26,7 +30,7 @@ This site is powered by [PeerTube](https://joinpeertube.org/) a decentralized al
I will be producing a lot of new content of my own here, including doing some live streams. Some of this of course, will also be made available on my [YouTube channel](https://softin.io/youtube). I will be producing a lot of new content of my own here, including doing some live streams. Some of this of course, will also be made available on my [YouTube channel](https://softin.io/youtube).
{{ peertube(id="e7548279-6a4c-46ae-80ed-5d434bb86f53") }} {{< peertube id="e7548279-6a4c-46ae-80ed-5d434bb86f53" title="0" >}}
#### Can I post my content on your site? #### Can I post my content on your site?

View file

@ -1,15 +1,11 @@
+++ +++
title = "Life changes and announcing SFBayAreaTech" title = "Life changes and announcing SFBayAreaTech"
description = "Me and family moved, I changed jobs and announcing SFBayAreaTech a slack community for anyone working in tech who are based in the San Francisco Bay Area California"
date = 2018-08-10T07:29:10-07:00 date = 2018-08-10T07:29:10-07:00
description = "Me and family moved, I changed jobs and announcing SFBayAreaTech a slack community for anyone working in tech who are based in the San Francisco Bay Area California"
[taxonomies] draft = false
keywords = ["sfbayareatech", "slack", "community", "san francisco", "bay area", "california"]
tags = ["sfbayareatechies"] tags = ["sfbayareatechies"]
categories = ["announcements"] categories = ["general"]
[extra]
toc = true
keywords = ["sfbayareatech", "san francisco", "bay area", "california"]
+++ +++
#### Update: Since writing this blog, I have changed jobs and SFBayAreaTech has changed to <https://www.sfbayareatechies.com> #### #### Update: Since writing this blog, I have changed jobs and SFBayAreaTech has changed to <https://www.sfbayareatechies.com> ####
@ -24,7 +20,7 @@ At Mya we are building an A.I. recruiting assistant. I am pretty excited about t
On to my goal of meeting everyone in tech and making some friends I have been going to a lot of tech meetups and conferences since arriving in San Francisco and I'm loving the learnings and networking. I even am co-organizer for two meetups already in the bay area [SF Scala](https://www.meetup.com/SF-Scala/) and [Elasticsearch San Francisco](https://www.meetup.com/Elasticsearch-San-Francisco/). I have met some great people including key contributors to many open source projects and tech celebrities that I have followed for years that I finally got the chance to meet in person (see if you recognize any of them in the pictures below): On to my goal of meeting everyone in tech and making some friends I have been going to a lot of tech meetups and conferences since arriving in San Francisco and I'm loving the learnings and networking. I even am co-organizer for two meetups already in the bay area [SF Scala](https://www.meetup.com/SF-Scala/) and [Elasticsearch San Francisco](https://www.meetup.com/Elasticsearch-San-Francisco/). I have met some great people including key contributors to many open source projects and tech celebrities that I have followed for years that I finally got the chance to meet in person (see if you recognize any of them in the pictures below):
![Tech celebrities](announcing_sfbayareatech.png) ![Tech celebrities](/img/via/Screen-Shot-2018-08-10-08-56-19.png)
One thing I noticed though, was that it was difficult to stay in touch with everyone. I mean we are all busy aren't we after all. I thought how can I improve this. I realized I keep in touch with people at work really well by using Slack. So I thought, wouldn't be nice to have a slack for everyone else in Tech who have any kind of affiliation to San Franscisco Bay Area? Thinking more about this I thought this would make things easier as we already have slack on our laptops and phones for work so adding another slack workspace is easy. One thing I noticed though, was that it was difficult to stay in touch with everyone. I mean we are all busy aren't we after all. I thought how can I improve this. I realized I keep in touch with people at work really well by using Slack. So I thought, wouldn't be nice to have a slack for everyone else in Tech who have any kind of affiliation to San Franscisco Bay Area? Thinking more about this I thought this would make things easier as we already have slack on our laptops and phones for work so adding another slack workspace is easy.

View file

@ -1,20 +1,21 @@
+++ +++
title = "Introduction to Akka Typed Using Scala" title = "Introduction to Akka Typed Using Scala"
description = "An Introduction to AKKA Typed using Scala with an example"
date = 2020-10-24T20:32:41-07:00 date = 2020-10-24T20:32:41-07:00
description = "An Introduction to AKKA Typed using Scala with an example"
[taxonomies] featured = false
tags = ["actor model", "concurrency", "distributed systems", "scala", "akka"] draft = false
categories = ["Software Engineering"]
[extra]
social_media_card = "akka_logo.svg"
toc = true toc = true
featureImage = "/img/akka_logo.svg"
thumbnail = ""
shareImage = ""
codeMaxLines = 30
codeLineNumbers = false
figurePositionShow = false
keywords = ["concurrent", "concurrency", "actor model", "actor", "actors", "threads", "petri net", "coroutines", "distributed", "akka", "erlang", "elixir", "akka.net", "microsoft orleans", "orleans", "zio", "zio-actors", "ZIO Actors","swift language actors"] keywords = ["concurrent", "concurrency", "actor model", "actor", "actors", "threads", "petri net", "coroutines", "distributed", "akka", "erlang", "elixir", "akka.net", "microsoft orleans", "orleans", "zio", "zio-actors", "ZIO Actors","swift language actors"]
tags = ["actor model", "concurrency", "distributed systems", "scala", "akka"]
categories = ["concurrency", "distributed systems", "scala"]
+++ +++
![akka](akka_logo.svg)
In this post I am going to do a quick introduction to using the Akka Typed toolkit that implements the Actor model using Scala. As part of this post I will be developing a simple application using Akka. My goal is to highlight what its like to develop applications using Akka and how to get started with it. I will be following up this post with more posts diving into Akka in more details and exploring more of its features and patterns you can use to solve concurrent and distributed applications. In this post I am going to do a quick introduction to using the Akka Typed toolkit that implements the Actor model using Scala. As part of this post I will be developing a simple application using Akka. My goal is to highlight what its like to develop applications using Akka and how to get started with it. I will be following up this post with more posts diving into Akka in more details and exploring more of its features and patterns you can use to solve concurrent and distributed applications.
Before reading this post it is recommended that you read my earlier post [Introduction to the Actor Model](/post/introduction-to-the-actor-model/) as I have assumed the reader will be familiar with the concepts discussed in that post. Before reading this post it is recommended that you read my earlier post [Introduction to the Actor Model](/post/introduction-to-the-actor-model/) as I have assumed the reader will be familiar with the concepts discussed in that post.
@ -25,7 +26,7 @@ To get start we are going to build a simple mailing list application where a per
The diagram below illustrates the actors that we will need and the message flow between each actor. The diagram below illustrates the actors that we will need and the message flow between each actor.
![Akka Actor System Design Example](akka_actor_system_design.png) ![Akka Actor System Design Example](/img/akka_actor_system_design.png)
- `Root Actor`: Creates the actor system and spawns all the actors. - `Root Actor`: Creates the actor system and spawns all the actors.
- `Validate Email Address Actor`: Validates if the new message received has a valid email address - `Validate Email Address Actor`: Validates if the new message received has a valid email address

View file

@ -1,20 +1,21 @@
+++ +++
title = "Introduction to the Actor Model" title = "Introduction to the Actor Model"
description = "In this post I am going do a quick introduction to the actor model and the problems it is trying to solve."
date = 2020-10-04T11:23:12-07:00 date = 2020-10-04T11:23:12-07:00
description = "In this post I am going do a quick introduction to the actor model and the problems it is trying to solve."
[taxonomies]
tags = ["actor model", "concurrency", "distributed systems"]
categories = ["Software Engineering"]
[extra]
social_media_card = "introduction_to_the_actor_model.png"
toc = true toc = true
featured = false
draft = false
featureImage = "/img/via/Screen-Shot-2020-10-17-15-56-15.66.png"
thumbnail = ""
shareImage = ""
codeMaxLines = 10
codeLineNumbers = false
figurePositionShow = false
keywords = ["concurrent", "concurrency", "actor model", "actor", "actors", "threads", "petri net", "coroutines", "distributed", "akka", "erlang", "elixir", "akka.net", "microsoft orleans", "orleans", "zio", "zio-actors", "swift language actors"] keywords = ["concurrent", "concurrency", "actor model", "actor", "actors", "threads", "petri net", "coroutines", "distributed", "akka", "erlang", "elixir", "akka.net", "microsoft orleans", "orleans", "zio", "zio-actors", "swift language actors"]
tags = ["actor model", "concurrency", "distributed systems"]
categories = ["concurrency", "distributed systems"]
+++ +++
![Actors](introduction_to_the_actor_model.png)
My first proper computer was an IBM PC clone with an Intel 486 processor. It had a button on it called `turbo` that when you pushed it would run the processor at double the speed. I say proper as before that I had started my computer journey with a Sinclair ZX Spectrum (48k Ram) and a Commodore 64 (64k Ram) hence didn't consider them as serious contenders for this post. It has been a really exciting ride watching hardware and software evolve together. The interesting observation has been that as faster more powerful hardware has come out, software has been quick to grab all the extra speed and resources the new hardware provides. My first proper computer was an IBM PC clone with an Intel 486 processor. It had a button on it called `turbo` that when you pushed it would run the processor at double the speed. I say proper as before that I had started my computer journey with a Sinclair ZX Spectrum (48k Ram) and a Commodore 64 (64k Ram) hence didn't consider them as serious contenders for this post. It has been a really exciting ride watching hardware and software evolve together. The interesting observation has been that as faster more powerful hardware has come out, software has been quick to grab all the extra speed and resources the new hardware provides.
Watching how CPU's have evolved, in the early days it was all about clock speed and cache as the main optimizations to improve performance. However in the later years multicore and hyperthreading has been the driving factor to improve performance. This means that in current times to reap the maximum performance benefits that are offered by todays processors we need to write our software leveraging concurrency. Watching how CPU's have evolved, in the early days it was all about clock speed and cache as the main optimizations to improve performance. However in the later years multicore and hyperthreading has been the driving factor to improve performance. This means that in current times to reap the maximum performance benefits that are offered by todays processors we need to write our software leveraging concurrency.
@ -25,7 +26,7 @@ There are many methods and patterns of concurrency. In this post I am going to f
An actor is an entity that receives a message and does some processing on the received message as a self contained concurrent operation. An actor is an entity that receives a message and does some processing on the received message as a self contained concurrent operation.
![Actor](actor.png) ![Actor](/img/actor.png)
An Actor consists of an isolated internal state, an address, a mailbox and a behavior. An Actor consists of an isolated internal state, an address, a mailbox and a behavior.
@ -58,7 +59,7 @@ In an actor system every actor has a supervisor who is responsible for handling
Lets go through a contrived simple example, lets say you are a store that sells oranges. You have 10 oranges in stock. You have two customers who try to buy 7 oranges each. As you don't have enough oranges you cannot serve both customers requests for oranges. Lets go through a contrived simple example, lets say you are a store that sells oranges. You have 10 oranges in stock. You have two customers who try to buy 7 oranges each. As you don't have enough oranges you cannot serve both customers requests for oranges.
![Object Oriented Programming Flow Example](oop_oranges_example.png) ![Object Oriented Programming Flow Example](/img/oop_oranges_example.png)
In a normal object oriented (multi-threadeed) program a customer would send a request to a service requesting the oranges they want. They expect a reply right away and wait for the response. When the request is received a check is made against the database to make sure there are enough oranges to fulfill the request (i.e. number of oranges >= 7) and if so, a success will be returned to the customer and 7 oranges will be deducted from the total orange count, python like pseudo code: In a normal object oriented (multi-threadeed) program a customer would send a request to a service requesting the oranges they want. They expect a reply right away and wait for the response. When the request is received a check is made against the database to make sure there are enough oranges to fulfill the request (i.e. number of oranges >= 7) and if so, a success will be returned to the customer and 7 oranges will be deducted from the total orange count, python like pseudo code:
@ -76,7 +77,7 @@ If the second customer places their order at the same time, as our application i
Using the Actor model this kind of race condition is avoided. Using the Actor model this kind of race condition is avoided.
![Actor Programming Flow Example](actor_oranges_example.png) ![Actor Programming Flow Example](/img/actor_oranges_example.png)
When each of the two requests are received, they will placed in the actor's inbox. The actor processes one request at a time from the inbox. The actors state are the oranges and updates to it are done whilst processing a single request which completes before the next request is fetched and processed from the inbox, thereby avoiding any potention race condition. When each of the two requests are received, they will placed in the actor's inbox. The actor processes one request at a time from the inbox. The actors state are the oranges and updates to it are done whilst processing a single request which completes before the next request is fetched and processed from the inbox, thereby avoiding any potention race condition.

View file

@ -1,20 +1,21 @@
+++ +++
title = "Introduction to Zio Actors" title = "Introduction to Zio Actors"
description = "Introduction to ZIO Actors"
date = 2020-11-01T14:14:21-08:00 date = 2020-11-01T14:14:21-08:00
description = "Introduction to ZIO Actors"
[taxonomies] featured = false
tags = ["actor model", "concurrency", "distributed systems", "scala", "functional programming", "zio"] draft = false
categories = ["Software Engineering"]
[extra]
toc = true toc = true
social_media_card = "ZIO.png" featureImage = "/img/ZIO.png"
thumbnail = ""
shareImage = ""
codeMaxLines = 30
codeLineNumbers = false
figurePositionShow = false
keywords = ["concurrent", "concurrency", "actor model", "actor", "actors", "threads", "petri net", "coroutines", "distributed", "akka", "erlang", "elixir", "akka.net", "microsoft orleans", "orleans", "zio", "zio-actors", "zio actors","swift language actors", "functional programming", "fp"] keywords = ["concurrent", "concurrency", "actor model", "actor", "actors", "threads", "petri net", "coroutines", "distributed", "akka", "erlang", "elixir", "akka.net", "microsoft orleans", "orleans", "zio", "zio-actors", "zio actors","swift language actors", "functional programming", "fp"]
tags = ["actor model", "concurrency", "distributed systems", "scala", "zio", "zio-actors", "functional programming"]
categories = ["concurrency", "distributed systems", "scala", "functional programming"]
+++ +++
![ZIO](ZIO.png)
In this post I am going to do a quick introduction to using the [ZIO Actors](https://zio.github.io/zio-actors/), a library that implements the Actor model using Scala and ZIO a library for asynchroneous and concurrent programming. In this post I am going to do a quick introduction to using the [ZIO Actors](https://zio.github.io/zio-actors/), a library that implements the Actor model using Scala and ZIO a library for asynchroneous and concurrent programming.
Before reading this post it is recommended that you read my two earlier posts [Introduction to the Actor Model](/post/introduction-to-the-actor-model/) and [Introduction to Akka Typed Using Scala](/post/introduction-to-akka-typed-using-scala/) as I have assumed the reader will be familiar with the concepts discussed in those posts. Some basic knowledge of [ZIO](https://zio.dev) is assumed. Before reading this post it is recommended that you read my two earlier posts [Introduction to the Actor Model](/post/introduction-to-the-actor-model/) and [Introduction to Akka Typed Using Scala](/post/introduction-to-akka-typed-using-scala/) as I have assumed the reader will be familiar with the concepts discussed in those posts. Some basic knowledge of [ZIO](https://zio.dev) is assumed.
@ -27,7 +28,7 @@ To get start we are going to build a simple mailing list application where a per
The diagram below illustrates the actors that we will need and the message flow between each actor. The diagram below illustrates the actors that we will need and the message flow between each actor.
![ZIO Actor System Design Example](zio_actor_system_design.png) ![ZIO Actor System Design Example](/img/zio_actor_system_design.png)
- `ZIO Actor System`: Creates the actor system and spawns all the actors. - `ZIO Actor System`: Creates the actor system and spawns all the actors.
- `Validate Email Address Actor`: Validates if the new message received has a valid email address - `Validate Email Address Actor`: Validates if the new message received has a valid email address

View file

@ -0,0 +1,167 @@
+++
title = "Lessons Learned From Being a ZIO Contributor"
date = 2020-09-15T12:43:34-07:00
description = "Contributing to your first open source project can be daunting but is a rewarding experience. In this post I will discuss what it is like to contribute to the ZIO Scala library, what lessons were learned from this experience, and discuss how you can get started contributing to your first open source project."
draft = false
toc = true
featured = false
featuredImage = "https://github.com/zio/zio/blob/master/ZIO.png?raw=true"
keywords = ["functional programming", "scala", "zio", "open source", "lambdaconf", "contributor"]
tags = ["functional programming", "scala", "zio", "open source"]
categories = ["functional programming", "scala", "zio", "open source", "conference", "talks"]
+++
# Talk at LambdaConf 2020 #
This blog post is a companion to the [Lambdaconf 2020 Talk](https://lambdaconf.zohobackstage.com/LambdaConf2020#/tickets) I did on this topic. Video of my talk will be added to this post once it is available.
[Slides of my talk at LambdaConf 2020](https://github.com/softinio/talks/blob/master/lambdaconf2020/lessons_learnt_from_being_a_zio_contributor.pdf)
## My Journey to being an Open source contributor ##
I started my programming life at the age of eleven which lead to me learning Pascal, Fortran and C Programming by the time I graduated from University.
First half of my career was spend writing software for enterprise level companies using C, Java, Oracle DB on Unix whilst watching open source software being talked about and used. At that point in my career I had zero contact with open source with the exception of being an early Linux enthusist and desktop user. As open source grew it did start trickling into my work with time, so the next phase of my career as a software engineer was filled with using open source projects on my stack on all the projects I was working on multiple levels.
Open source was a culture shock to me, the whole concept of the someone giving up their personal time to write software that they share with the rest of the world without any direct renumeration was something I spent time trying to understand. I felt guilty that at work we use so many but don't seem to be thanking the authors in any way for using what they created.
Wanting to understand open source more, and wanting to give back I started looking for an open source project to contribute to. I started by choosing projects I had an interest in or had used before and tried to interact with the current contributors and maintainers. As new comer to the projects I found this process difficult through no fault of each projects maintainers. As everyone are in effect volunteers, they only have a certain amount of bandwidth to contribute to their project so did not have any time or process to help new contributors on board. I then saw on reddit a project maintainer wanting a new maintainer for their open source project so I expressed an interest. To my surprise others who had nothing to do with the project started reacting in a negative way to my interest which included an arrogant rude interaction with a well known figure of that community. This friction to contribute lead me to take a step back and reconsider how I want to contribute to an open source project planning to revisit it later on.
I was learning and using [Scala](https://www.scala-lang.org/) at work for the first time and as it was a technology I had introduced I had no mentors at work to work with and hence started following key people in the Scala community and try to learn from them. One of the people I was following (whom at this point I had never met) was [John A De Goes](https://degoes.net/). Following John on twitter one day he mentioned on twitter that he is looking to start a new open source project and he is looking for contributors and he will be providing mentorship to get the project off the ground. If I remember right around 300 people replied expressing an interest when he was hoping to find 5 people 😀. This is where my journey into being a ZIO contributor began.
# Contributing to ZIO #
[ZIO](https://zio.dev) is a library for asynchronous and concurrent programming that is based on pure functional programming for the Scala programming language.
ZIO comprises of the core library itself and multipe smaller projects which either use ZIO or complement ZIO to solve different technical problems. Goal being that no matter what problems you are trying to solve, you can build a complete solution using ZIO.
The core library itself is by far the area that attracts most contributors. The velocity of new changes being merged is very high. There was a time where I was to review every single PR that would come in, not anymore.
## Decide on a project to contribute to ##
First thing to do is to decide on a project you want to contribute too.
To get started visit [ZIO list of repositories on GitHub](https://github.com/zio) anhave a browse of the different projects.
![ZIO Projects](/img/via/Screen-Recording-2020-09-05-20-02-47.gif)
Every project will have something different to offer you that will help you decide on what project is a good fit for you. Some projects have only recently started so if you are looking for something with less code to get familiar at the expense of fast changing. There are also projects that are short of contributors to consider.
A good practice is to look at the issue tracker of the projects on GitHub and start contributing with some low hanging fruit. We do try to label `good first issues`. There are also some issues labeled `documention` which are good to start with.
Each project has an associated channel on the [ZIO Discord](https://sca.la/ziodiscord) feel free to stop by, chat with the existing contributors who will be delighted to help you get started. Open invitation get in touch with me and I will help also.
## Starting a new ZIO Project ##
The other option is to contribute a new project to the ZIO eco-system. Think of new library that can use ZIO to solve a problem that doesn't exist or a library that extends ZIO capability.
The best way to get started with this is to use our [ZIO giter8 seed project](https://github.com/zio/zio-project-seed.g8). To get started with your project simpy run:
```shell-script
sbt new zio/zio-project-seed.g8
```
We have tried to standardize across all projects as much as possible on project structure, how we build our projects, what plugins and dependencies we use as base and how CI is run. By using this seed to create your project your project is conforming to this standard.
The project generated by the seed even includes a sample project website all ready with the appropriate CI configuration to deploy to GitHub pages with minimal change.
There are two options available to you when starting a new ZIO based project:
1. `ZIO Project`: Your project is added to the offical ZIO organization on GitHub and Maven. Your project will also have its own channel on the [ZIO Discord](http://sca.la/ziodiscord) as a ZIO Project.
2. `Community Project`: Your project is part of your own GitHub account/organization and maven account. You can still use [ZIO Discord](https://sca.la/ziodiscord) `#zio-users` channel for any kind of conversation you need help with your project. We want your project to succeed and make a point of being approachable. Once your project is mature we would consider creating a channel for you on our discord under the community projects section. We evaluate this on a case by case basis.
We have had multiple cases of projects starting as a community project and then being moved to the ZIO organization. There are a lot of advantages for doing this such as increased publicity leading increased adoption of your library as well as attracting more contributors to help with your project. This is one of the reasons its best to start your project with the ZIO seed as if you decide you want to do this later it will be a lot easier to move.
## Devops, infrastructure & Builds Lair ##
All our projects support both JDK Versions `8` and `11`. All projects support Scala versions `2.12.*`, `2.13.*` & `Dotty`.
Scala `2.11.*` as needed so you will see some projects have it added some don't. If your project is new and need it added take a look at [ZIO Actors](https://github.com/zio/zio-actors) and add it to the CircleCI and SBT settings.
If you need help with anything devops, build, infrastructure like CI related issues ask in the `#devops-lair` channel on [ZIO Discord](http://sca.la/ziodiscord) for help. If necessary create an issue on the relevant repositories issue tracker on GitHub and share link in this channel on discord for feedback and help.
We use CircleCI for all our builds but we are looking at moving to GitHub Actions which is an exciting effort coming up as it will help improve our build and release process better.
All our active projects on merge to the `master` branch do an automated `snapshot` release to maven so you don't have to wait for an official release to try the latest changes. We do periodic when necessary do official releases of the projects. Releases are done by doing a GitHub release and using [semantic versioning](https://semver.org/). For details of each release see the releases tab on GitHub for the project (example: [ZIO Releases](https://github.com/zio/zio/releases)). They do include some release notes that are helpful.
## Projects Documentation sites ##
We use [mdoc](https://scalameta.org/mdoc/) to generate our documentation inconjunction with [Docusaurus](https://docusaurus.io/) (version 1.x at the time of writing though we plan to upgrade to version 2.x) for every projects documentation microsite.
All projects have this already setup as part of the CI build. New Microsite is published when we do an official release of a project.
We do plan on making improvements in the future where in addition to documentation being updated at the point of release for us to be able to do adhoc releases of the documentation on its own.
The core ZIO project's documentation is the only one with its own domain and is what you see when visiting <https://zio.dev>. This is hosted by a combination of using GitHub pages and [Netlify](https://www.netlify.com/).
All other projects use GitHub pages and have a GitHub pages project URL as opposed to a custom domain.
## Contribution Etiquette and Collaboration ##
The environment to contribute to an open source project is very different than how you collaborate with colleagues at work. The biggest points to realize is everyone is in effect a volunteer giving up their time to help. They maybe in a different timezone and only have certain pockets of time around their busy lives to take part.
As such working in harmony, being patient and greatful for all the help is very important. What I would like to summaries a few do's and don't that we should follow as an etiquette in order to maintain a happy and welcoming environment for all.
### Working on an issue ###
If you are interested in working on an issue, check the issue comments to make sure no one else is working on it already. If no one else is make a comment on the issue that you are working on it.
If someone has already commented on it that they are working on it and a considerable time has passed (about a month I would say is reasonable) with no visible work on the issue being done and no PR then add a comment asking if that contributor is still working on it and wait a few days for response and if they no longer are you are welcome to comment on the issue that you will be working on it. If in doubt as in the projects discord channel.
Unfortunately, due to the general nature of open source, you may see situations that multiple contributors work on the same issue and multiple PRs get submitted. This is why it is important to try your best to communicate your intentions as well as possible to minimize this happening.
### Pull request reviewers ###
Maintainers do regularly review new Pull Request to review but if you want to bring it their attention or tag someone for review you can either look at the pull request history to see who to tag for review or discuss PR in the projects discord channel.
Each project does have a group of maintainers who care about its progress who are the ones review your work.
In a work environment you would refer to them as project leads but its not really the same in open source. Its more the case that the maintainer has devoted a lot of their time to the project already that differentiates them from a new or an occasional contributor.
## Learning and Getting Help ##
Being a ZIO contributor is an opportunity to learn and practice. When trying to contribute don't hesitate to ask for help. All of us who have been contributing to ZIO for a while strive because we are happy to help each other and learn from each other.
When picking up an issue to work on and have any questions, ask by commenting on it or go to the projects discord channel and have a discussion about any topic that you need help with.
We try to be a very welcoming and helpful community so we look forward to helping you succeed at contributing.
Don't forget about the tools you have available to help you succeed:
- GitHub issues
- [ZIO Discord](https://sca.la/ziodiscord)
### Additional Resources for Contributing ###
- [ZIO Contributor Guidelines](https://zio.dev/docs/about/about_contributing)
- [ZIO Coding Guidelines](https://zio.dev/docs/about/about_coding_guidelines)
- [ZIO Code of Conduct](https://zio.dev/docs/about/about_coc)
ZIO Code of conduct linked above does include details of the current steering committee that you can contact in case of any issues especially conduct related.
## Lessons Learnt Contributing to ZIO ##
- Anyone can be a contributor. I used to think open source was done by a small group of elite people and not for *regular* developers. Contributing to ZIO showed me I was wrong and really anyone can and should participate.
- Focus your library on satisfying user experience and their needs and the rest will take care of itself
{{< youtube NZN0A0U6ysg >}}
- The power of the group. Do your best to figure out the answer yourself but be open when you haven't figured something out. It is amazing what we can figure out together.
- ZIO community is very welcoming to everyone especially if you are junior in Scala. A lot of passionnate people who have a common goal to push Scala to the top.
- Everyone in the ZIO community makes you feel supported
- You will learn a lot by just trying to answer other peoples question on discord
- Contributing to open source is the best way to learn and gain experience. Better than any course.
- Quality of feedback and help is very high enabling you to learn a lot
- Improved my collaboration skills by a large margin
- Learn a ton about concurrency, performance tuning and functional design
- Make a lot of new friends from all around the world that you would never have otherwise met
- Microsite CI build will always randomly fail when you haven't changed anything, just to make you laugh 🤣

View file

@ -1,15 +1,11 @@
+++ +++
title = "Migrating from Pelican to Hugo" title = "Migrating from Pelican to Hugo"
description = "In this post I will discuss the steps I took to migrate my blog from Pelican to Hugo."
date = "2015-11-29T07:16:53-05:00" date = "2015-11-29T07:16:53-05:00"
description = "In this post I will discuss the steps I took to migrate my blog from Pelican to Hugo."
[taxonomies]
tags = ["blog"]
categories = ["Blogging"]
[extra]
toc = true toc = true
keywords = ["pelican", "hugo", "golang", "go", "python", "blog"] keywords = ["pelican", "hugo", "golang", "go", "python", "blog"]
tags = ["hugo", "golang", "blog"]
categories = ["development"]
+++ +++
In this post I will discuss the steps I took to migrate my blog from [Pelican](http://blog.getpelican.com/) to [Hugo](http://gohugo.io/). In this post I will discuss the steps I took to migrate my blog from [Pelican](http://blog.getpelican.com/) to [Hugo](http://gohugo.io/).

View file

@ -1,15 +1,14 @@
+++ +++
title = "Moving from Homebrew to Nix Package Manager" title = "Moving from Homebrew to Nix Package Manager"
description = "Moving from Homebrew to Nix Package manager on my macbook pro"
date = 2019-02-16T18:30:40-07:00 date = 2019-02-16T18:30:40-07:00
description = "Moving from Homebrew to Nix Package manager on my macbook pro"
[taxonomies] featured = true
tags = ["nix", "nixos", "macos", "functional programming"] draft = false
categories = ["Developer Tools"]
[extra]
toc = true toc = true
featureImage = "/img/via/Screen-Shot-2019-02-17-13-04-16.png"
keywords = ["nix", "nixos", "macos", "macbook", "package manager", "functional programming"] keywords = ["nix", "nixos", "macos", "macbook", "package manager", "functional programming"]
tags = ["nix", "nixos", "macos", "functional programming"]
categories = ["nix", "nixos", "macos"]
+++ +++
As all my friends, colleagues and followers know I am very big on functional programming, so when I heard about nixOS and the nix package manager (A Purely Functional package manager) I really wanted to find out more about it. As all my friends, colleagues and followers know I am very big on functional programming, so when I heard about nixOS and the nix package manager (A Purely Functional package manager) I really wanted to find out more about it.

View file

@ -1,19 +1,13 @@
+++ +++
title = "PyBay 2018 San Francisco" title = "PyBay 2018 San Francisco"
description = "Highlights of PyBay 2018 conference a Python event based in the San Francisco Bay Area California"
date = 2018-10-25T18:30:40-07:00 date = 2018-10-25T18:30:40-07:00
description = "Highlights of PyBay 2018 conference a Python event based in the San Francisco Bay Area California"
[taxonomies] draft = false
tags = ["python", "conference"] featureImage = "/img/via/PyBay_2018_Start.png"
[extra]
social_media_card = "PyBay_2018_Start.png"
toc = true
keywords = ["python", "pybay", "sfpython", "pycon", "san francisco", "bay area", "california", "conference"] keywords = ["python", "pybay", "sfpython", "pycon", "san francisco", "bay area", "california", "conference"]
tags = ["python", "conference"]
categories = ["python", "conference"]
+++ +++
![PyBay 2018](PyBay_2018_Start.png)
As you read in my [last blog](https://www.softinio.com/post/life-changes-and-announcing-sfbayareatech/) As you read in my [last blog](https://www.softinio.com/post/life-changes-and-announcing-sfbayareatech/)
I was lucky enough to finally move to the bay area. If you know me you will I was lucky enough to finally move to the bay area. If you know me you will
know that I am passionate about Scala and Python. To me being a master of these know that I am passionate about Scala and Python. To me being a master of these
@ -44,6 +38,8 @@ build. My biggest take aways from her talk were:
matter so designing algorithms powering your AI you need to always remember matter so designing algorithms powering your AI you need to always remember
that and take into account. that and take into account.
{{< youtube D4A18tUUb2Y >}}
- Machines can be used to predict the future and can be biased - Machines can be used to predict the future and can be biased
- Software is used to make *Life changing* decisions - Software is used to make *Life changing* decisions
- We have a responsability to think about our whole system and how it impacts peoples lives - We have a responsability to think about our whole system and how it impacts peoples lives
@ -66,7 +62,7 @@ build. My biggest take aways from her talk were:
- [Weapons of Math Destruction](https://www.amazon.com/Weapons-Math-Destruction-Increases-Inequality/dp/0553418831) - [Weapons of Math Destruction](https://www.amazon.com/Weapons-Math-Destruction-Increases-Inequality/dp/0553418831)
- [Datasheets for datasets](https://arxiv.org/abs/1803.09010) - [Datasheets for datasets](https://arxiv.org/abs/1803.09010)
![Salar Rahmanian meets Rachel Thomas after keynote at PyBay 2018](Rachel_Thomas_PyBay_2018.png) ![Salar Rahmanian meets Rachel Thomas after keynote at PyBay 2018](/img/via/Rachel_Thomas_PyBay_2018.png)
# Day two of PyBay 2018 # Day two of PyBay 2018
Day got on the way with a keynote by [Raymond Hettinger](https://twitter.com/raymondh) a Python Core developer based here in the bay area. Day got on the way with a keynote by [Raymond Hettinger](https://twitter.com/raymondh) a Python Core developer based here in the bay area.
@ -75,13 +71,13 @@ Day got on the way with a keynote by [Raymond Hettinger](https://twitter.com/ray
In his keynote we were given an overview of all the different testing tools available to us as Python developers that we can use to produce quality code and debug our work. He talked positively about my two favorite testing tools in the Python world which are [Pytest](https://docs.pytest.org/en/latest/) and [Hypothesis](https://hypothesis.readthedocs.io/en/latest/) In his keynote we were given an overview of all the different testing tools available to us as Python developers that we can use to produce quality code and debug our work. He talked positively about my two favorite testing tools in the Python world which are [Pytest](https://docs.pytest.org/en/latest/) and [Hypothesis](https://hypothesis.readthedocs.io/en/latest/)
![Raymond Hettinger at PyBay 2018](Raymond_Hettinger_PyBay_2018.jpg) ![Raymond Hettinger at PyBay 2018](/img/via/Raymond_Hettinger_PyBay_2018.jpg)
## Asyncio: What's next (Yuri Selivanov) ## Asyncio: What's next (Yuri Selivanov)
The next talk on day 2 that stood out for me was [Yuri Selivanov](https://www.linkedin.com/in/yselivanov/) the Python core developer behind asyncio and the uvloop library which enables us to develop high performance Python applications. I enjoyed listening to his update on where we are with asyncio and whats coming next. Yuri also drew comparisons to the new [Trio Async Libray](https://github.com/python-trio/trio) by our very own [Nathaniel J Smith](https://vorpus.org/). I am super excited about the direction and options we have here and look forward to using them in my projects. The next talk on day 2 that stood out for me was [Yuri Selivanov](https://www.linkedin.com/in/yselivanov/) the Python core developer behind asyncio and the uvloop library which enables us to develop high performance Python applications. I enjoyed listening to his update on where we are with asyncio and whats coming next. Yuri also drew comparisons to the new [Trio Async Libray](https://github.com/python-trio/trio) by our very own [Nathaniel J Smith](https://vorpus.org/). I am super excited about the direction and options we have here and look forward to using them in my projects.
![Yuri Selivanov at PyBay 2018](Yuri_Selivanov_PyBay_2018.jpg) ![Yuri Selivanov at PyBay 2018](/img/via/Yuri_Selivanov_PyBay_2018.jpg)
# Day three of PyBay 2018 # Day three of PyBay 2018
The final day of PyBay 2018 kicked off with a Keynote by the one and only [Travis Olaphant](https://www.linkedin.com/in/teoliphant/) the founder/creator of [Anaconda](https://www.anaconda.com/) The final day of PyBay 2018 kicked off with a Keynote by the one and only [Travis Olaphant](https://www.linkedin.com/in/teoliphant/) the founder/creator of [Anaconda](https://www.anaconda.com/)
@ -90,19 +86,19 @@ The final day of PyBay 2018 kicked off with a Keynote by the one and only [Travi
In this keynote we were taken through the journey of what has made Python such a great eco system for Data Science. Funny enough most of the tools that we use Travis Oliphant has had a hand in making it available to us all such as NumPy and SciPy. It was a real pleasure meeting him in person. In this keynote we were taken through the journey of what has made Python such a great eco system for Data Science. Funny enough most of the tools that we use Travis Oliphant has had a hand in making it available to us all such as NumPy and SciPy. It was a real pleasure meeting him in person.
![Salar Rahmanian meeting Travis Olaphant at PyBay 2018](Travis_Olaphant_PyBay_2018.jpg) ![Salar Rahmanian meeting Travis Olaphant at PyBay 2018](/img/via/Travis_Olaphant_PyBay_2018.jpg)
![Final Day Keynote by Travis Olaphant at PyBay 2018](Travis_Olaphant_Keynote_PyBay2018.JPG) ![Final Day Keynote by Travis Olaphant at PyBay 2018](/img/via/Travis_Olaphant_Keynote_PyBay2018.JPG)
# Lightening talks at PyBay 2018 # Lightening talks at PyBay 2018
One of the more fun aspects of PyBay was the lightening talks. Everyday of the conference there was a slot for doing a 5 minute lightening talk. One of the speakers that was planned for the third day of the conference dropped out so the organizers turned that hour into an extra lightening talk hour. They were looking for volunteers to do a lightening talk unplanned on short notice and for better or worse I volunteered and did a super fast lightening talk on using [pyenv](https://www.softinio.com/post/using-pyenv-for-python-projects/) fast forward to 5:22 to see my lightening talk: One of the more fun aspects of PyBay was the lightening talks. Everyday of the conference there was a slot for doing a 5 minute lightening talk. One of the speakers that was planned for the third day of the conference dropped out so the organizers turned that hour into an extra lightening talk hour. They were looking for volunteers to do a lightening talk unplanned on short notice and for better or worse I volunteered and did a super fast lightening talk on using [pyenv](https://www.softinio.com/post/using-pyenv-for-python-projects/) fast forward to 5:22 to see my lightening talk:
{{ youtube(id="KqqMSB0eyhk") }} {{< youtube KqqMSB0eyhk >}}
# Thank you PyBay 2018 # Thank you PyBay 2018
What made the event even more fun for me was that [Mya](https://hiremya.com/) was one of the sponsors so got the chance to enjoy the conference with my esteemed colleagues and found it incredibly fun to talk to everyone at the conference on the problems we are solving at Mya using Python. What made the event even more fun for me was that [Mya](https://hiremya.com/) was one of the sponsors so got the chance to enjoy the conference with my esteemed colleagues and found it incredibly fun to talk to everyone at the conference on the problems we are solving at Mya using Python.
![Mya team at PyBay 2018](Mya_team_PyBay_2018.jpg) ![Mya team at PyBay 2018](/img/via/Mya_team_PyBay_2018.jpg)
A Huge thank you to the organizers of PyBay 2018 for putting such a great event together. Lets not forget that PyBay is organized by a group of volunteers so their effort to put such a great event together was outstanding. Especially I would like to thank [Grace Law](https://www.linkedin.com/in/gracelaw1972/), [Simeon Franklin](https://www.linkedin.com/in/simeonfranklin/), [Daniel Pyrathon](https://www.linkedin.com/in/danielpyrathon/), [Paul Starrett](https://www.linkedin.com/in/paul-starrett-esq-ll-m-cfe-ence-251325/), and [Nick DiRienzo](https://www.linkedin.com/in/nickdirienzo/) A Huge thank you to the organizers of PyBay 2018 for putting such a great event together. Lets not forget that PyBay is organized by a group of volunteers so their effort to put such a great event together was outstanding. Especially I would like to thank [Grace Law](https://www.linkedin.com/in/gracelaw1972/), [Simeon Franklin](https://www.linkedin.com/in/simeonfranklin/), [Daniel Pyrathon](https://www.linkedin.com/in/danielpyrathon/), [Paul Starrett](https://www.linkedin.com/in/paul-starrett-esq-ll-m-cfe-ence-251325/), and [Nick DiRienzo](https://www.linkedin.com/in/nickdirienzo/)
![PyBay 2018 Crew](PyBay2018Crew.jpeg) ![PyBay 2018 Crew](/img/via/PyBay2018Crew.jpeg)

View file

@ -1,26 +1,23 @@
+++ +++
title = "Scale By The Bay 2018 San Francisco" title = "Scale By The Bay 2018 San Francisco"
description = "Highlights of Scale By The Bay 2018 San Francisco conference an event based in the San Francisco Bay Area California with major focus on Functional Programming, Reactive programming and Data Science"
date = 2019-05-02T18:30:40-07:00 date = 2019-05-02T18:30:40-07:00
description = "Highlights of Scale By The Bay 2018 San Francisco conference an event based in the San Francisco Bay Area California with major focus on Functional Programming, Reactive programming and Data Science"
[taxonomies] draft = false
tags = ["scala", "conference", "functional programming"]
[extra]
toc = true
keywords = ["scala", "bythebay", "sfscala", "functional programming", "san francisco", "bay area", "california", "conference"] keywords = ["scala", "bythebay", "sfscala", "functional programming", "san francisco", "bay area", "california", "conference"]
tags = ["scala", "conference", "functional programming"]
categories = ["scala", "conference", "functional programming"]
+++ +++
One of the highlights of 2018 was attending and being part of the Scale By the bay 2018 conference in San Francisco. This by far was the best conference I have ever attended. One of the highlights of 2018 was attending and being part of the Scale By the bay 2018 conference in San Francisco. This by far was the best conference I have ever attended.
![Scale By the Bay 2018](scalebythebay_2018_header.jpg) ![Scale By the Bay 2018](/img/via/scalebythebay_2018_header.jpg)
from left: [Dick Wall](https://twitter.com/dickwall), [Salar Rahmanian](https://twitter.com/SalarRahmanian), [Martin Odersky (Creator of Scala)](https://twitter.com/odersky), [Alexy Khrabrov](https://twitter.com/ChiefScientist), [Jakob Odersky ](https://twitter.com/jodersky) from left: [Dick Wall](https://twitter.com/dickwall), [Salar Rahmanian](https://twitter.com/SalarRahmanian), [Martin Odersky (Creator of Scala)](https://twitter.com/odersky), [Alexy Khrabrov](https://twitter.com/ChiefScientist), [Jakob Odersky ](https://twitter.com/jodersky)
The conference had 3 tracks covering the functional programming, reactive programming and data science topics. All the talks were of high quality made even better by highly intelligent audience made up of the most talented stars of our industry. The conference had 3 tracks covering the functional programming, reactive programming and data science topics. All the talks were of high quality made even better by highly intelligent audience made up of the most talented stars of our industry.
## Keynotes ## Keynotes
![Scale By the Bay 2018 Keynotes](scalebythebay_2018_keynotes.jpg) ![Scale By the Bay 2018 Keynotes](/img/via/scalebythebay_2018_keynotes.jpg)
### New Functional Constructs in Scala 3 by Martin Odersky (Creator of Scala) ### New Functional Constructs in Scala 3 by Martin Odersky (Creator of Scala)
@ -28,7 +25,7 @@ The first keynote was by the creator of Scala Programming language. He took us t
I personally am excited about the new features coming out and am optimistic about the success of the new version. In addition there will be new tooling the scala center is working on that will help with migrating to the new version. Let's not forget Scala is strongly typed which will help a lot with the migration unlike languages like Python. I personally am excited about the new features coming out and am optimistic about the success of the new version. In addition there will be new tooling the scala center is working on that will help with migrating to the new version. Let's not forget Scala is strongly typed which will help a lot with the migration unlike languages like Python.
{{ youtube(id="6P06YHc8faw") }} {{< youtube 6P06YHc8faw >}}
### Kafka and the Rise of the event driven Microservices by Neha Narkhede (Co-creator of Apache Kafka) ### Kafka and the Rise of the event driven Microservices by Neha Narkhede (Co-creator of Apache Kafka)
This keynote started off by asking the audience who uses Kafka in Production today. It was fascinating to see that 95% of the audience were which is a huge endorsement of Kafka. This keynote started off by asking the audience who uses Kafka in Production today. It was fascinating to see that 95% of the audience were which is a huge endorsement of Kafka.
@ -37,40 +34,40 @@ One of the initial and primary use cases for using Kafka has been to build data
This new paradigm will allow us to take data from your applications and data from your data systems like databases and do stream processing on them to produce. This new paradigm will allow us to take data from your applications and data from your data systems like databases and do stream processing on them to produce.
{{ youtube(id="DOoJzaXOGxs") }} {{< youtube DOoJzaXOGxs >}}
## Concurrency and more concurrency ## Concurrency and more concurrency
There was a common theme at this years conference, multiple talks about libraries and patterns to make concurrency and parallel processing easier and over coming the pain points associated with it. There was a common theme at this years conference, multiple talks about libraries and patterns to make concurrency and parallel processing easier and over coming the pain points associated with it.
Jakob Odesky talk summarized the concurrency options available to you within Scala Language and the JVM such as threads, Futures and Promises. He then went on to talk about Scala Center 's [scala-async](https://github.com/scala/scala-async) library which has lead him to his new open source project [escale](https://github.com/jodersky/escale) which is built on top of scala-async. This new library, escale, introduces the same concept as channels and green threads that was introduced by the go programming language for scala. I look forward to seeing how this evolves. Jakob Odesky talk summarized the concurrency options available to you within Scala Language and the JVM such as threads, Futures and Promises. He then went on to talk about Scala Center 's [scala-async](https://github.com/scala/scala-async) library which has lead him to his new open source project [escale](https://github.com/jodersky/escale) which is built on top of scala-async. This new library, escale, introduces the same concept as channels and green threads that was introduced by the go programming language for scala. I look forward to seeing how this evolves.
{{ youtube(id="EuNEZW8ljeY") }} {{< youtube EuNEZW8ljeY >}}
Michael Pilquist gave us a nice update on `cats-effect` took us through an overview of some of the features it has to solve concurrency problems. There was lot of content in his talk for me to summarize in this post so I urge you to watch the video of his talk. Michael Pilquist gave us a nice update on `cats-effect` took us through an overview of some of the features it has to solve concurrency problems. There was lot of content in his talk for me to summarize in this post so I urge you to watch the video of his talk.
{{ youtube(id="Gig-f_HXvLI") }} {{< youtube Gig-f_HXvLI >}}
My favorite talk of the conference was a talk by Sergei Winitzki on Declarative distributed concurrency in Scala where he talk about his open source project [Chymyst](https://github.com/Chymyst/chymyst-core) which implements the chemical machine (based on joint calculus). The philosophy and end goal of the chemical machine is to be able to process what ever problem you are trying to solve in 15 lines or less of code. Containers holding values are known as `molecules`. Molecules float around the site until they combine to form a chemical reaction the output of which can be used again. In his implementation partial functions where used to implement the reactions. I loved the analogy to chemistry and Sergei's presentation really explained the concept well to spark my interest in this. Since his talk I have researched the topic of chemical machines and I could only find research papers on the topic and none of them do as good a job in explaining what it is as the talk did so I urge you to watch the video. My favorite talk of the conference was a talk by Sergei Winitzki on Declarative distributed concurrency in Scala where he talk about his open source project [Chymyst](https://github.com/Chymyst/chymyst-core) which implements the chemical machine (based on joint calculus). The philosophy and end goal of the chemical machine is to be able to process what ever problem you are trying to solve in 15 lines or less of code. Containers holding values are known as `molecules`. Molecules float around the site until they combine to form a chemical reaction the output of which can be used again. In his implementation partial functions where used to implement the reactions. I loved the analogy to chemistry and Sergei's presentation really explained the concept well to spark my interest in this. Since his talk I have researched the topic of chemical machines and I could only find research papers on the topic and none of them do as good a job in explaining what it is as the talk did so I urge you to watch the video.
{{ youtube(id="23O32DMm69E") }} {{< youtube 23O32DMm69E >}}
## Heros welcome ## Heros welcome
Over the years in my career I have followed many of the people I met at this years conference. Their work and teachings have helped me progress my knowledge and ability and have motivated me and others to be part of a great community. Over the years in my career I have followed many of the people I met at this years conference. Their work and teachings have helped me progress my knowledge and ability and have motivated me and others to be part of a great community.
Here are some pictures of the tech heroes I got to meet at this conference: Here are some pictures of the tech heroes I got to meet at this conference:
![Scale By the Bay 2018 ](scale_by_the_bay_2018_1.JPG) ![Scale By the Bay 2018 ](/img/via/scale_by_the_bay_2018_1.JPG)
Top left: [Rob Norris (creator of Doobie)](https://twitter.com/tpolecat), Top right: [Ross Baker (creator of http4s)](https://twitter.com/rossabaker), Top left: [Rob Norris (creator of Doobie)](https://twitter.com/tpolecat), Top right: [Ross Baker (creator of http4s)](https://twitter.com/rossabaker),
Bottom left: [Michael Pilquist (Creator of FS2)](https://twitter.com/mpilquist), Bottom right: [Jon Pretty (Scala Center Advisory board chair)](https://twitter.com/propensive/) Bottom left: [Michael Pilquist (Creator of FS2)](https://twitter.com/mpilquist), Bottom right: [Jon Pretty (Scala Center Advisory board chair)](https://twitter.com/propensive/)
![Scale By the Bay 2018](scale_by_the_bay_2018_2.JPG) ![Scale By the Bay 2018](/img/via/scale_by_the_bay_2018_2.JPG)
[Runar Bjarnason ](https://twitter.com/runarorama) & [Paul Chiusano](https://twitter.com/pchiusano) authors of the book [Functional Programming in Scala](https://www.manning.com/books/functional-programming-in-scala) [Runar Bjarnason ](https://twitter.com/runarorama) & [Paul Chiusano](https://twitter.com/pchiusano) authors of the book [Functional Programming in Scala](https://www.manning.com/books/functional-programming-in-scala)
![Scale By the Bay 2018](scale_by_the_bay_2018_4.JPG) ![Scale By the Bay 2018](/img/via/scale_by_the_bay_2018_4.JPG)
Top left: [Eugene Yokota (Scala/SBT Team)](https://twitter.com/eed3si9n) , Top right: [Justin Kaeser (Jetbrains)](https://twitter.com/ebenwert), Top left: [Eugene Yokota (Scala/SBT Team)](https://twitter.com/eed3si9n) , Top right: [Justin Kaeser (Jetbrains)](https://twitter.com/ebenwert),
Bottom left: [Cliff Click](https://twitter.com/cliff_click), Bottom right: [Julien Le Dem (Apache Parquet & Arrow)](https://twitter.com/J_) Bottom left: [Cliff Click](https://twitter.com/cliff_click), Bottom right: [Julien Le Dem (Apache Parquet & Arrow)](https://twitter.com/J_)
![Scale By the Bay 2018](scale_by_the_bay_2018_3.JPG) ![Scale By the Bay 2018](/img/via/scale_by_the_bay_2018_3.JPG)
Top: [John De Goes (Creator of ZIO) ](https://twitter.com/jdegoes) & [Itamar Ravid (Core contributor to ZIO)](https://twitter.com/itrvd), Top: [John De Goes (Creator of ZIO) ](https://twitter.com/jdegoes) & [Itamar Ravid (Core contributor to ZIO)](https://twitter.com/itrvd),
Bottom: [Jon Pretty (Scala Center Advisory board chair)](https://twitter.com/propensive/) Bottom: [Jon Pretty (Scala Center Advisory board chair)](https://twitter.com/propensive/)
@ -79,5 +76,5 @@ I am humbled that I got a chance to meet so many great people at this conference
I want to thank all speakers and attendees at this event, especially I want to thank [Alexy Khrabrov](https://twitter.com/ChiefScientist) for putting together such a great event, welcoming me to the bay area and helping me be part of the great community we have in the bay area and this conference. I want to thank all speakers and attendees at this event, especially I want to thank [Alexy Khrabrov](https://twitter.com/ChiefScientist) for putting together such a great event, welcoming me to the bay area and helping me be part of the great community we have in the bay area and this conference.
{{ youtube(id="iTeh-wnvweQ") }} {{< youtube iTeh-wnvweQ >}}

View file

@ -1,20 +1,21 @@
+++ +++
title = "Unicomp New Model M Keyboard" title = "Unicomp New Model M Keyboard"
description = "Unicomp new Model M keyboard is the latest version of the classic and fabulous IBM Model M keyboard that came out earlier this year. This blog post is my unboxing and review of this timeless keyboard."
date = 2020-12-18T20:08:42-08:00 date = 2020-12-18T20:08:42-08:00
description = "Unicomp new Model M keyboard is the latest version of the classic and fabulous IBM Model M keyboard that came out earlier this year. This blog post is my unboxing and review of this timeless keyboard."
[taxonomies] featured = false
tags = ["keyboards"] draft = false
categories = ["Hardware"] toc = false
featureImage = "/img/unicomp_new_model_m.png"
[extra] thumbnail = ""
social_media_card = "unicomp_new_model_m.png" shareImage = ""
toc = true codeMaxLines = 30
codeLineNumbers = false
figurePositionShow = false
keywords = ["keyboard", "keyboards", "mechanical keyboards", "buckling spring", "buckling spring keyboard", "ibm model m", "ibm keyboard", "unicomp", "unicomp model m", "unicomp new model m", "unicomp new model m keyboard", "model m"] keywords = ["keyboard", "keyboards", "mechanical keyboards", "buckling spring", "buckling spring keyboard", "ibm model m", "ibm keyboard", "unicomp", "unicomp model m", "unicomp new model m", "unicomp new model m keyboard", "model m"]
tags = ["keyboards"]
categories = ["hardware"]
+++ +++
![Unicomp Model M](unicomp_new_model_m.png)
Unicomp new Model M keyboard is the latest version of the classic and fabulous IBM Model M keyboard that came out earlier this year. This blog post is my unboxing and review of this timeless keyboard. Unicomp new Model M keyboard is the latest version of the classic and fabulous IBM Model M keyboard that came out earlier this year. This blog post is my unboxing and review of this timeless keyboard.
My favorite keyboard of all time was the [IBM Model M keyboard](https://en.wikipedia.org/wiki/Model_M_keyboard). Through out the 1980s and the 1990s I would exclusively use this keyboard. In fact as I type this blog post I can confirm I still have 3 of them in my garage back in London, England. My favorite keyboard of all time was the [IBM Model M keyboard](https://en.wikipedia.org/wiki/Model_M_keyboard). Through out the 1980s and the 1990s I would exclusively use this keyboard. In fact as I type this blog post I can confirm I still have 3 of them in my garage back in London, England.
@ -29,15 +30,15 @@ When IBM decided to stop manufacturing keyboards, a company called Lexmark bough
This is how it was delivered: This is how it was delivered:
![Unicomp New Model M box](unicomp_model_m_box.png) ![Unicomp New Model M box](/img/unicomp_model_m_box.png)
When the package arrived I could feel the keyboard moving inside the box, but when I opened the box I saw how well it was packed: When the package arrived I could feel the keyboard moving inside the box, but when I opened the box I saw how well it was packed:
![Unicomp New Model M opened box](unicomp_model_m_open_box.png) ![Unicomp New Model M opened box](/img/unicomp_model_m_open_box.png)
I took it out of its box and removed all packaging material it was wrapped in: I took it out of its box and removed all packaging material it was wrapped in:
![Unicomp New Model M Keyboard](unicomp_model_m_out_of_box.png) ![Unicomp New Model M Keyboard](/img/unicomp_model_m_out_of_box.png)
## Review ## Review
@ -51,7 +52,7 @@ I am thoroughly enjoying using this keyboard. Its typing feel and size are on pa
When I went to place my order on Unicomp website they only had a windows version of the new Model M listed. Whilst that will work fine with macOS, it does have some features missing compared to a keyboard that has dedicated support for macOS, such as volume control, music play/stop/previous track /next track keys. Good news is I called Unicomp and spoke to Troy about this and he was kind enought to tell me I can place an order and request a custom configuration at a small fee to have the extra macOS features added. I did that and my keyboard has all the extra macOS keys functioning as expected. It even has the window key replaced with the macOS command key. When I went to place my order on Unicomp website they only had a windows version of the new Model M listed. Whilst that will work fine with macOS, it does have some features missing compared to a keyboard that has dedicated support for macOS, such as volume control, music play/stop/previous track /next track keys. Good news is I called Unicomp and spoke to Troy about this and he was kind enought to tell me I can place an order and request a custom configuration at a small fee to have the extra macOS features added. I did that and my keyboard has all the extra macOS keys functioning as expected. It even has the window key replaced with the macOS command key.
![Unicomp New Model M with macOS layout](unicomp_model_m_mac_keys.png) ![Unicomp New Model M with macOS layout](/img/unicomp_model_m_mac_keys.png)
### Unicomp quality of service ### Unicomp quality of service

View file

@ -1,15 +1,12 @@
+++ +++
title = "Using pyenv for Python projects" title = "Using pyenv for Python projects"
description = "Using pyenv to manage your virtual environments makes working on multiple projects, each using a different version of python a breeze."
date = "2015-04-13T09:06:03-05:00" date = "2015-04-13T09:06:03-05:00"
draft = false
[taxonomies]
tags = ["python"]
categories = ["Developer Tools"]
[extra]
toc = true toc = true
keywords = ["python", "pyenv"] description = "Using pyenv to manage your virtual environments makes working on multiple projects, each using a different version of python a breeze."
keywords = ["python", "pyenv", "centos", "macos"]
tags = ["python", "pyenv", "centos", "macos"]
categories = ["development"]
+++ +++
Using [pyenv][3] to manage your virtual environments makes working on multiple projects, each using a different version of python a breeze. Using [pyenv][3] to manage your virtual environments makes working on multiple projects, each using a different version of python a breeze.
@ -22,13 +19,13 @@ Here some simple notes on how I setup and use [pyenv][3] :
**Install using [homebrew][5]** **Install using [homebrew][5]**
```bash ```
brew install pyenv pyenv-virtualenv $ brew install pyenv pyenv-virtualenv
``` ```
**Update your shell profile (.bashrc or .zshrc) adding the following to it (and restart your terminal)** **Update your shell profile (.bashrc or .zshrc) adding the following to it (and restart your terminal)**
```bash ```
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
if which pyenv-virtualenv-init > /dev/null; then eval "$(pyenv virtualenv-init -)"; fi if which pyenv-virtualenv-init > /dev/null; then eval "$(pyenv virtualenv-init -)"; fi
``` ```
@ -38,47 +35,47 @@ if which pyenv-virtualenv-init > /dev/null; then eval "$(pyenv virtualenv-init -
**Checkout from github** **Checkout from github**
```bash ```
git clone https://github.com/yyuu/pyenv.git ~/.pyenv $ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv $ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
``` ```
**Update your shell profile (.bashrc or .zshrc) adding the following to it (and restart your terminal)** **Update your shell profile (.bashrc or .zshrc) adding the following to it (and restart your terminal)**
```bash ```
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile $ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile $ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
``` ```
## Using pyenv ## ## Using pyenv ##
**To install a new version of [Python][6]** **To install a new version of [Python][6]**
```bash ```
pyenv install <version> $ pyenv install <version>
pyenv rehash $ pyenv rehash
``` ```
**To get a list of [Python][6] versions available** **To get a list of [Python][6] versions available**
```bash ```
pyenv install -l $ pyenv install -l
``` ```
**To create a new virtual environment** **To create a new virtual environment**
```bash ```
pyenv virtualenv [pyenv-version] [virtualenv-name] $ pyenv virtualenv [pyenv-version] [virtualenv-name]
``` ```
**To use your new virtual environment within your project** **To use your new virtual environment within your project**
1. Change to your projects root directory 1. Change to your projects root directory
1. Run: 1. Run:
```bash ```
pyenv local [virtualenv-name] $ pyenv local [virtualenv-name]
``` ```
Note that this is done only the first time you go to your project directory. The wonderful thing about [pyenv][3] is in future when you change directory to your project directory, it will be automatically activated your virtualenv for you. Note that this is done only the first time you go to your project directory. The wonderful thing about [pyenv][3] is in future when you change directory to your project directory, it will be automatically activated your virtualenv for you.

View file

@ -1,10 +0,0 @@
+++
title = "Projects"
sort_by = "weight"
template = "cards.html"
insert_anchor_links = "left"
[extra]
show_reading_time = false
quick_navigation_buttons = true
+++

View file

@ -1,33 +0,0 @@
+++
title = "scaladex.nvim"
description = "Lua Library and Neovim Plugin to search scaladex for scala packages."
weight = 2
[taxonomies]
tags = ["Scala", "lua", "neovim"]
categories = ["Project"]
[extra]
local_image = "projects/scaladex-nvim/scala-logo.png"
social_media_card = "scala-logo.png"
toc = true
keywords = ["Scala", "neovim", "lua", "telescope", "scaladex"]
+++
![scaladex.nvim](scala-logo.png)
# Overview
I created a lua library that is able to search for scala pages on [Scaladex](https://index.scala-lang.org).
I then used it to create a [Neovim](https://neovim.io) plugin and [telescope.nvim](https://github.com/nvim-telescope/telescope.nvim) plugin so that when I am coding using Neovim I can search for and add packages as dependencies.
## Demo and Video Tutorial on using scaladex.nvim
{{ peertube(id="44bD8ASpSkzmKifDBNMBkr") }}
## Links
- Repository: <https://github.com/softinio/scaladex.nvim>
- README: <https://github.com/softinio/scaladex.nvim/blob/main/README.md>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View file

@ -1,30 +0,0 @@
+++
title = "Scala News"
description = "Scala bloggers directory and news feed using RSS"
weight = 1
[taxonomies]
tags = ["Scala", "Typelevel"]
categories = ["Project"]
[extra]
local_image = "projects/scalanews/scalanews.png"
social_media_card = "scalanews.png"
toc = true
keywords = ["Scala", "Typelevel", "Bloggers", "RSS", "News"]
+++
![Scala News](scalanews.png)
# Overview
I wanted to create a directory of all bloggers who write about Scala Programming language with links to their RSS Feeds.
Using this directory I have created a CLI tool using Scala, Typelevel stack (cats-effect, fs2, http4s, decline, Laika) to use the rss feed links to generate the latest news in the scala community that I publish periodically on [www.scalanews.net](https://www.scalanews.net/).
## Links
- Website: <https://www.scalanews.net/>
- About Page: <https://www.scalanews.net/Resources/About.html>
- Repository: <https://github.com/softinio/scalanews>
- README: <https://github.com/softinio/scalanews/blob/main/README.md>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 277 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 KiB

View file

@ -1,35 +0,0 @@
+++
title = "ZIO Actors"
description = "A High performance, purely functional library for building, composing, and supervising typed actors based on ZIO using Scala."
weight = 3
[taxonomies]
tags = ["actor model", "concurrency", "distributed systems", "scala", "functional programming", "zio"]
categories = ["Project"]
[extra]
local_image = "projects/zio-actors/ZIO.png"
social_media_card = "ZIO.png"
toc = true
keywords = ["concurrent", "concurrency", "actor model", "actor", "actors", "threads", "petri net", "coroutines", "distributed", "akka", "erlang", "elixir", "akka.net", "microsoft orleans", "orleans", "zio", "zio-actors", "zio actors","swift language actors", "functional programming", "fp"]
+++
![Scala News](ZIO.png)
# Overview
ZIO Actors is a high-performance, purely functional library for building, composing, and supervising typed actors based on ZIO using Scala.
Original creator of this project, though I do not maintain it anymore.
## My blog post and Talk about ZIO Actors
[see here](/talks/acting-lessons-for-scala-engineers-with-akka-and-zio/)
## Links
- Repository: <https://github.com/zio/zio-actors>
- README: <https://github.com/zio/zio-actors/blob/master/README.md>
- Documentation: <https://zio.dev/zio-actors/>

View file

@ -1,11 +1,11 @@
+++ +++
title = "Resume" title = "Resume"
description = "Salar Rahmanian Resume"
date = "2018-04-16T09:16:07-05:00" date = "2018-04-16T09:16:07-05:00"
description = "Salar Rahmanian Resume"
[extra]
isso = false
keywords = ["Salar", "Rahmanian", "Salar Rahmanian", "Resume", "CV"] keywords = ["Salar", "Rahmanian", "Salar Rahmanian", "Resume", "CV"]
showReadTime = false
showDate = false
comments = false
+++ +++
# Salar Rahmanian # # Salar Rahmanian #
## My Location ## ## My Location ##
@ -93,19 +93,17 @@ You can find more of my projects on my [GitHub](https://github.com/softinio?tab=
I have a passion to learn and network with like minded people with similar interests in technology. Hence I am very active in the conference, meetup and open source communities: I have a passion to learn and network with like minded people with similar interests in technology. Hence I am very active in the conference, meetup and open source communities:
#### Past Meetups #### #### Current Meetups ####
##### Silicon Valley Nix / NixOS User Group #####
Organizer from *2022* to *2023*: <https://www.meetup.com/silicon-valley-nix-nixos-user-group/>
##### Swift Language User Group (San Francisco) ##### ##### Swift Language User Group (San Francisco) #####
Organizer from *2022* to *2023*: <https://www.meetup.com/swift-language/> Organizer since *2022*: <https://www.sfswift.com>
##### Bay Area Haskell & Functional Programming User Group ##### ##### Bay Area Haskell & Functional Programming User Group #####
Organizer from *2021* to *2023*: <https://www.meetup.com/bay-area-haskell-user-group/> Organizer since *2021*: <https://www.sfhaskell.com>
#### Past Meetups ####
##### San Francisco Java User Group Meetup ##### ##### San Francisco Java User Group Meetup #####

View file

@ -1,10 +0,0 @@
+++
title = "Subscribe"
template = "subscribe.html"
path = "subscribe"
[extra]
isso = false
quick_navigation_buttons = true
+++

View file

@ -1,11 +0,0 @@
+++
title = "Talks"
sort_by = "weight"
template = "cards.html"
insert_anchor_links = "left"
[extra]
show_reading_time = false
quick_navigation_buttons = true
+++

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

View file

@ -1,29 +0,0 @@
+++
title = "Elevating Python Development with Nix Package Manager"
description = "Salar Rahmanian's talk at PyBay 2023"
date = 2023-10-14
weight = 2
[taxonomies]
tags = ["Nix", "NixOS", "Python", "functional programming", "conference", "talks"]
categories = ["Talks"]
[extra]
local_image = "talks/elevating-python-development-with-nix/Elevating_Python_Development_with_Nix_Package_Manager.png"
social_media_card = "Elevating_Python_Development_with_Nix_Package_Manager.png"
toc = true
keywords = ["Nix", "NixOS", "Python", "devenv", "flakes", "functional programming", "fp", "tech talk", "talk", "conference", "PyBay", "SF Python", "sfpython"]
+++
![](Elevating_Python_Development_with_Nix_Package_Manager.png)
In October 2023 I had the great privilege to do a talk at PyBay 2023 in San Francisco, California.
### Recording of my talk
{{ youtube(id="AJs_izrEBOA") }}
### Slides
Slides for my talk can be found [here](https://github.com/softinio/talks/blob/master/PyBay2023/pybay2023_slides.pdf).

View file

@ -1,29 +0,0 @@
+++
title = "Next-Level Diagnostics for Async & Concurrent Errors with ZIO"
description = "Salar Rahmanian's talk with John A De Goes at Scale By The Bay 2019"
date = 2019-11-13
weight = 4
[taxonomies]
tags = ["concurrency", "distributed systems", "scala", "functional programming", "conference", "talks", "ZIO"]
categories = ["Talks"]
[extra]
local_image = "talks/next-level-diagnostics-for-async-and-concurrent-errors-with-zio/sbtb2019.png"
social_media_card = "sbtb2019.png"
toc = true
keywords = ["concurrent", "concurrency", "coroutines", "distributed", "zio", "functional programming", "fp", "tech talk", "talk", "conference", "scale by the bay", "scala by the bay", "by the bay", "functional.tv", "sf scala"]
+++
![](sbtb2019.png)
In November 2019 I had the great privilege to do a [Talk at Scale By The Bay Conference](https://scalebythebay2019.sched.com/event/RoSt/next-level-diagnostics-for-async-concurrent-errors-with-zio) with John A De Goes.
### Recording of my talk
{{ youtube(id="MdYKEwuWR4U") }}
### Slides
Slides for my talk can be found [here](slides.pdf).

Binary file not shown.

Before

Width:  |  Height:  |  Size: 769 KiB

View file

@ -1,37 +0,0 @@
+++
title = "Streamline Your Development Workflow: Harnessing the Power of NixOS and Nix Package"
description = "Salar Rahmanian's talk at Scale By The Bay 2023"
date = 2023-10-14
weight = 1
[taxonomies]
tags = ["Nix", "NixOS", "Python", "functional programming", "conference", "talks"]
categories = ["Talks"]
[extra]
local_image = "talks/streamline-your-development-workflow/sbtb2023.png"
social_media_card = "sbtb2023.png"
toc = true
keywords = ["Nix", "NixOS", "Python", "devenv", "flakes", "functional programming", "fp", "tech talk", "talk", "conference", "scale by the bay", "scala by the bay", "by the bay", "functional.tv", "sf scala"]
+++
![](sbtb2023.png)
In November 2023 I had the great privilege to do a talk at [Scale By The Bay 2023](https://www.scale.bythebay.io/post/salar-rahmanian-streamline-your-development-workflow-harnessing-the-power-of-nixos-and-nix-package) in San Francisco, California.
### Recording of my talk
{{ youtube(id="Qv3Y23RjJa0") }}
### Pre-Conference Introduction to talk
{{ youtube(id="LVadoYGDvI8") }}
### Post Conference Interview
{{ youtube(id="B9wpkWdE368") }}
### Slides
Slides for my talk can be found [here](https://github.com/softinio/talks/blob/master/SBTB2023/sbtb2023_slides.pdf).

Binary file not shown.

Before

Width:  |  Height:  |  Size: 839 KiB

View file

@ -1,12 +0,0 @@
+++
paginate_by = 5
path = "/til"
title = "Things I've Learned"
sort_by = "date"
template = "section.html"
insert_anchor_links = "left"
[extra]
show_previous_next_article_links = true
+++

View file

@ -1,31 +0,0 @@
+++
title = "Configuring Github Pages With a Custom Domain"
date = 2023-01-14T16:45:33-08:00
[taxonomies]
tags = ["github"]
categories = [ "TIL" ]
[extra]
toc = true
keywords = ["github pages"]
+++
To setup my custom domain I went through the following steps:
1. *Verify Domain:* I followed [these steps](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/verifying-your-custom-domain-for-github-pages) to verify. Note that this was done using my GitHub accounts settings and not the repositories settings.
2. *Configuring my subdomain:* Next I configured my subdomain to be used as my custom domain with GitHub pages by following [these steps](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site#configuring-a-subdomain) which involved adding a CNAME record to my DNS settings with my domain registrar. Note that as I was using a subdomain adding a CNAME record was all that was needed (however if I was to use an apex domain, I would have needed to add A and AAAA records too pointing to GitHub's ip addresses).
3. *Add CNAME file:* You need to add a file called `CNAME` to the root of your generated static site that contains your host name only (i.e. for this site `til.softinio`). As I use Hugo, I put this in the `static` directory as when the site is created it will be put in the root. Here is an [example](https://github.com/softinio/til/blob/main/static/CNAME).
4. *Configuring GitHub Pages:* Go to your repositories settings and select pages. Enter your domain name, save it and click check. Tick the box to enforce `https`.
## Notes
- This TIL does not cover setting up GitHub actions to build and deploy your code. Here is a [sample](https://github.com/softinio/til/tree/main/.github/workflows).
- You need to have your site deployed at least once so that the `gh-pages` branch is created so that you can set the site source branch in your repositories pages settings.
- To make sure your GitHub actions is able to create the `gh-pages` branch, go to your repositories settings, then click `Actions` then `General` and under the `workflow permissions` section make sure the `read and write permissions` is selected and saved.
## References
- [Hugo Documentation for hosting on GitHub](https://gohugo.io/hosting-and-deployment/hosting-on-github/)

View file

@ -1,31 +0,0 @@
+++
title = "Converting HTML to Markdown using Markdownify"
date = 2023-12-26
[taxonomies]
tags = ["markdown"]
categories = [ "TIL" ]
[extra]
toc = true
keywords = ["markdown", "html", "convert", "python", "nix"]
+++
I had some HTML content that I wanted to convert to markdown.
The simplest tool I found to do this effectively was a python utility called [Markdownify](https://pypi.org/project/markdownify/).
I used Nix Shell to install it:
```bash
nix-shell -p python311Packages.markdownify
```
And to do the conversion I just did:
```bash
markdownify myfile.html > myfile.md
```
where `myfile.html` is the name of the file I wanted to convert and `myfile.md` in the name of the markdown file it got converted to.

View file

@ -1,14 +0,0 @@
+++
title = "Creating a native image for a scala and typelevel project using graalvm"
date = 2024-01-20
[taxonomies]
tags = ["scala", "typelevel"]
categories = [ "TIL" ]
[extra]
toc = true
keywords = ["scala", "typelevel", "graalvm", "nix", "binary", "native image"]
+++

0
data/.keep Normal file
View file

View file

@ -1,45 +0,0 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1704194953,
"narHash": "sha256-RtDKd8Mynhe5CFnVT8s0/0yqtWFMM9LmCzXv/YKxnq4=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "bd645e8668ec6612439a9ee7e71f7eac4099d4f6",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs",
"theme": "theme"
}
},
"theme": {
"flake": false,
"locked": {
"lastModified": 1704495088,
"narHash": "sha256-ZfN0qTw2yO+/zU5hkWlB/lOXSJPdcFfVduYUOoSor3A=",
"owner": "welpo",
"repo": "tabi",
"rev": "7fa208a2a5dffbc83dd2b71de1e804c2f2eaad01",
"type": "github"
},
"original": {
"owner": "welpo",
"repo": "tabi",
"rev": "7fa208a2a5dffbc83dd2b71de1e804c2f2eaad01",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

View file

@ -1,56 +0,0 @@
{
description = "Softinio's Zola website";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs?ref=nixos-unstable";
theme = {
url = "github:welpo/tabi/7fa208a2a5dffbc83dd2b71de1e804c2f2eaad01";
flake = false;
};
};
outputs = { self, nixpkgs, theme }:
let
themeName = ((builtins.fromTOML (builtins.readFile "${theme}/theme.toml")).name);
allSystems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
forAllSystems = nixpkgs.lib.genAttrs allSystems;
nixpkgsFor = forAllSystems (system: import nixpkgs { inherit system; });
in
{
packages = forAllSystems (system:
let
pkgs = nixpkgsFor.${system};
in {
default = pkgs.stdenv.mkDerivation rec {
name = "softinio-${system}";
version = "0.1";
src = ./.;
nativeBuildInputs = with pkgs; [ zola ];
configurePhase = ''
mkdir -p themes
ln -snf "${theme}" "themes/${themeName}"
'';
buildPhase = ''
zola build
'';
installPhase = ''
mkdir -p $out
cp -r public/* $out
'';
};
});
devShells = forAllSystems (system:
let
pkgs = nixpkgsFor.${system};
in {
default = pkgs.mkShell {
buildInputs = with pkgs; [ zola ];
shellHook = ''
mkdir -p themes
ln -snf "${theme}" "themes/${themeName}"
'';
};
});
};
}

5
go.mod Normal file
View file

@ -0,0 +1,5 @@
module softinio.com
go 1.18
require github.com/softinio/hugo-clarity v0.0.0-20220804231030-5179510a03ea // indirect

2
go.sum Normal file
View file

@ -0,0 +1,2 @@
github.com/softinio/hugo-clarity v0.0.0-20220804231030-5179510a03ea h1:fJw3f89X83BAkTnwM8rP5lihcw3Z8gSOc3pNso3IRa4=
github.com/softinio/hugo-clarity v0.0.0-20220804231030-5179510a03ea/go.mod h1:FhIE2pdxA/KkNA0FW425TKxr/DWrtS6hNiVZEHIg5oY=

42
layouts/_default/rss.xml Normal file
View file

@ -0,0 +1,42 @@
{{- $pctx := . -}}
{{- if .IsHome -}}{{ $pctx = .Site }}{{- end -}}
{{- $pages := slice -}}
{{- if or $.IsHome $.IsSection -}}
{{- $pages = $pctx.RegularPages -}}
{{- else -}}
{{- $pages = $pctx.Pages -}}
{{- end -}}
{{- $limit := .Site.Config.Services.RSS.Limit -}}
{{- if ge $limit 1 -}}
{{- $pages = $pages | first $limit -}}
{{- end -}}
{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<author>{{.Site.Author.name}}</author>
<title>{{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}{{ end }}</title>
<link>{{ .Permalink }}</link>
<description>Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{.}} {{ end }}{{ end }}on {{ .Site.Title }}</description>
<generator>Hugo -- gohugo.io</generator>{{ with .Site.LanguageCode }}
<language>{{.}}</language>{{end}}{{ with .Site.Author.email }}
<managingEditor>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</managingEditor>{{end}}{{ with .Site.Author.email }}
<webMaster>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</webMaster>{{end}}{{ with .Site.Copyright }}
<copyright>{{.}}</copyright>{{end}}{{ if not .Date.IsZero }}
<lastBuildDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
{{- with .OutputFormats.Get "RSS" -}}
{{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
{{- end -}}
{{ range where (where .Site.Pages ".Section" "post") "Kind" "page" }}
<item>
<author>{{.Site.Author.name}}</author>
<title>{{ .Title }}</title>
<link>{{ .Permalink }}</link>
<pubDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
{{ with .Site.Author.email }}<author>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</author>{{end}}
<guid>{{ .Permalink }}</guid>
<description>{{ .Content | html }}</description>
</item>
{{ end }}
</channel>
</rss>

View file

@ -0,0 +1,25 @@
{{ printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
{{ range where .Data.Pages "Params.sitemap_exclude" "ne" true }}
{{- if .Permalink -}}
<url>
<loc>{{ .Permalink }}</loc>{{ if not .Lastmod.IsZero }}
<lastmod>{{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}</lastmod>{{ end }}{{ with .Sitemap.ChangeFreq }}
<changefreq>{{ . }}</changefreq>{{ end }}{{ if ge .Sitemap.Priority 0.0 }}
<priority>{{ .Sitemap.Priority }}</priority>{{ end }}{{ if .IsTranslated }}{{ range .Translations }}
<xhtml:link
rel="alternate"
hreflang="{{ .Language.Lang }}"
href="{{ .Permalink }}"
/>{{ end }}
<xhtml:link
rel="alternate"
hreflang="{{ .Language.Lang }}"
href="{{ .Permalink }}"
/>{{ end }}
</url>
{{- end -}}
{{ end }}
</urlset>

View file

@ -0,0 +1,21 @@
<!-- giscus -->
{{ if .Site.Params.giscus.enable }}
<div class="post bg-white">
<script src="https://giscus.app/client.js"
data-repo="softinio/softinio.com"
data-repo-id="MDEwOlJlcG9zaXRvcnkxNDQyMjczODU="
data-category="Blog Comments"
data-category-id="DIC_kwDOCJi8Oc4CR7nj"
data-mapping="url"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="bottom"
data-theme="preferred_color_scheme"
data-lang="en"
crossorigin="anonymous"
async>
</script>
</div>
{{ end }}

View file

@ -0,0 +1,7 @@
<link rel='apple-touch-icon' sizes='180x180' href='{{ absURL "icons/apple-touch-icon.png" }}'>
<link rel='icon' type='image/png' sizes='32x32' href='{{ absURL "favicon.png" }}'>
<link rel='icon' type='image/png' sizes='16x16' href='{{ absURL "favicon.png" }}'>
<link rel='manifest' href='{{ absURL "icons/site.webmanifest" }}'>
<link rel="mask-icon" href= '{{ absURL "safari-pinned-tab.svg" }}' color="#002538">
<meta name="msapplication-TileColor" content="#002538">
<meta name="theme-color" content="#002538">

View file

@ -0,0 +1,18 @@
{{- partial "substack" .}}
{{- $s := .Site.Params }}
{{ $t := .Site.Title }}
{{- if or .Params.enableMathNotation $s.enableMathNotation }}
{{ partialCached "math" . }}
{{- end }}
{{- $iconsDir := default "icons/" .Site.Params.iconsDir }}
{{- $defaultFooterLogo := printf "%s%s" $iconsDir "apple-touch-icon.png"}}
<footer class = 'footer'>
<div class = 'footer_inner wrap pale'>
<img src = '{{ absURL "softinio.jpg" }}' class = 'icon icon_2 transparent'>
<p>Copyright &copy;&nbsp;<span class = 'year'></span>&nbsp;{{ .Site.Title | upper }}. <span>
<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/80x15.png" /></a><br />This work by <span xmlns:cc="http://creativecommons.org/ns#" property="cc:attributionName">Salar Rahmanian</span> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</a>.
Please attribute properly and link back. <br/>
</span></p>
{{- partial "top" .}}
</div>
</footer>

View file

@ -0,0 +1,63 @@
<svg width="0" height="0" class="hidden">
<symbol viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" id="facebook">
<path d="M437 0H75C33.648 0 0 33.648 0 75v362c0 41.352 33.648 75 75 75h151V331h-60v-90h60v-61c0-49.629 40.371-90 90-90h91v90h-91v61h91l-15 90h-76v181h121c41.352 0 75-33.648 75-75V75c0-41.352-33.648-75-75-75zm0 0"></path>
</symbol>
<symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18.001 18.001" id="twitter">
<path d="M15.891 4.013c.808-.496 1.343-1.173 1.605-2.034a8.68 8.68 0 0 1-2.351.861c-.703-.756-1.593-1.14-2.66-1.14-1.043 0-1.924.366-2.643 1.078a3.56 3.56 0 0 0-1.076 2.605c0 .309.039.585.117.819-3.076-.105-5.622-1.381-7.628-3.837-.34.601-.51 1.213-.51 1.846 0 1.301.549 2.332 1.645 3.089-.625-.053-1.176-.211-1.645-.47 0 .929.273 1.705.82 2.388a3.623 3.623 0 0 0 2.115 1.291c-.312.08-.641.118-.979.118-.312 0-.533-.026-.664-.083.23.757.664 1.371 1.291 1.841a3.652 3.652 0 0 0 2.152.743C4.148 14.173 2.625 14.69.902 14.69c-.422 0-.721-.006-.902-.038 1.697 1.102 3.586 1.649 5.676 1.649 2.139 0 4.029-.542 5.674-1.626 1.645-1.078 2.859-2.408 3.639-3.974a10.77 10.77 0 0 0 1.172-4.892v-.468a7.788 7.788 0 0 0 1.84-1.921 8.142 8.142 0 0 1-2.11.593z"
></path>
</symbol>
<symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" id="mastedon">
<path d="M433 179.11c0-97.2-63.71-125.7-63.71-125.7-62.52-28.7-228.56-28.4-290.48 0 0 0-63.72 28.5-63.72 125.7 0 115.7-6.6 259.4 105.63 289.1 40.51 10.7 75.32 13 103.33 11.4 50.81-2.8 79.32-18.1 79.32-18.1l-1.7-36.9s-36.31 11.4-77.12 10.1c-40.41-1.4-83-4.4-89.63-54a102.54 102.54 0 0 1-.9-13.9c85.63 20.9 158.65 9.1 178.75 6.7 56.12-6.7 105-41.3 111.23-72.9 9.8-49.8 9-121.5 9-121.5zm-75.12 125.2h-46.63v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.33V197c0-58.5-64-56.6-64-6.9v114.2H90.19c0-122.1-5.2-147.9 18.41-175 25.9-28.9 79.82-30.8 103.83 6.1l11.6 19.5 11.6-19.5c24.11-37.1 78.12-34.8 103.83-6.1 23.71 27.3 18.4 53 18.4 175z"></path></symbol>
<symbol aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" id="mail">
<path d="M502.3 190.8c3.9-3.1 9.7-.2 9.7 4.7V400c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V195.6c0-5 5.7-7.8 9.7-4.7 22.4 17.4 52.1 39.5 154.1 113.6 21.1 15.4 56.7 47.8 92.2 47.6 35.7.3 72-32.8 92.3-47.6 102-74.1 131.6-96.3 154-113.7zM256 320c23.2.4 56.6-29.2 73.4-41.4 132.7-96.3 142.8-104.7 173.4-128.7 5.8-4.5 9.2-11.5 9.2-18.9v-19c0-26.5-21.5-48-48-48H48C21.5 64 0 85.5 0 112v19c0 7.4 3.4 14.3 9.2 18.9 30.6 23.9 40.7 32.4 173.4 128.7 16.8 12.2 50.2 41.8 73.4 41.4z"></path>
</symbol>
<symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" id="calendar">
<path d="M452 40h-24V0h-40v40H124V0H84v40H60C26.916 40 0 66.916 0 100v352c0 33.084 26.916 60 60 60h392c33.084 0 60-26.916 60-60V100c0-33.084-26.916-60-60-60zm20 412c0 11.028-8.972 20-20 20H60c-11.028 0-20-8.972-20-20V188h432v264zm0-304H40v-48c0-11.028 8.972-20 20-20h24v40h40V80h264v40h40V80h24c11.028 0 20 8.972 20 20v48z"></path>
<path d="M76 230h40v40H76zm80 0h40v40h-40zm80 0h40v40h-40zm80 0h40v40h-40zm80 0h40v40h-40zM76 310h40v40H76zm80 0h40v40h-40zm80 0h40v40h-40zm80 0h40v40h-40zM76 390h40v40H76zm80 0h40v40h-40zm80 0h40v40h-40zm80 0h40v40h-40zm80-80h40v40h-40z"></path>
</symbol>
<symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" id="github">
<path d="M255.968 5.329C114.624 5.329 0 120.401 0 262.353c0 113.536 73.344 209.856 175.104 243.872 12.8 2.368 17.472-5.568 17.472-12.384 0-6.112-.224-22.272-.352-43.712-71.2 15.52-86.24-34.464-86.24-34.464-11.616-29.696-28.416-37.6-28.416-37.6-23.264-15.936 1.728-15.616 1.728-15.616 25.696 1.824 39.2 26.496 39.2 26.496 22.848 39.264 59.936 27.936 74.528 21.344 2.304-16.608 8.928-27.936 16.256-34.368-56.832-6.496-116.608-28.544-116.608-127.008 0-28.064 9.984-51.008 26.368-68.992-2.656-6.496-11.424-32.64 2.496-68 0 0 21.504-6.912 70.4 26.336 20.416-5.696 42.304-8.544 64.096-8.64 21.728.128 43.648 2.944 64.096 8.672 48.864-33.248 70.336-26.336 70.336-26.336 13.952 35.392 5.184 61.504 2.56 68 16.416 17.984 26.304 40.928 26.304 68.992 0 98.72-59.84 120.448-116.864 126.816 9.184 7.936 17.376 23.616 17.376 47.584 0 34.368-.32 62.08-.32 70.496 0 6.88 4.608 14.88 17.6 12.352C438.72 472.145 512 375.857 512 262.353 512 120.401 397.376 5.329 255.968 5.329z"></path>
</symbol>
<symbol viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" id="rss">
<circle cx="3.429" cy="20.571" r="3.429"></circle>
<path d="M11.429 24h4.57C15.999 15.179 8.821 8.001 0 8v4.572c6.302.001 11.429 5.126 11.429 11.428z"></path>
<path d="M24 24C24 10.766 13.234 0 0 0v4.571c10.714 0 19.43 8.714 19.43 19.429z"></path>
</symbol>
<symbol viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" id="linkedin">
<path d="M437 0H75C33.648 0 0 33.648 0 75v362c0 41.352 33.648 75 75 75h362c41.352 0 75-33.648 75-75V75c0-41.352-33.648-75-75-75zM181 406h-60V196h60zm0-240h-60v-60h60zm210 240h-60V286c0-16.54-13.46-30-30-30s-30 13.46-30 30v120h-60V196h60v11.309C286.719 202.422 296.93 196 316 196c40.691.043 75 36.547 75 79.688zm0 0"></path>
</symbol>
<symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 612 612" id="arrow">
<path d="M604.501 440.509L325.398 134.956c-5.331-5.357-12.423-7.627-19.386-7.27-6.989-.357-14.056 1.913-19.387 7.27L7.499 440.509c-9.999 10.024-9.999 26.298 0 36.323s26.223 10.024 36.222 0l262.293-287.164L568.28 476.832c9.999 10.024 26.222 10.024 36.221 0 9.999-10.023 9.999-26.298 0-36.323z"></path>
</symbol>
<symbol viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" id="carly">
<path d="M504.971 239.029L448 182.059V84c0-46.317-37.682-84-84-84h-44c-13.255 0-24 10.745-24 24s10.745 24 24 24h44c19.851 0 36 16.149 36 36v108c0 6.365 2.529 12.47 7.029 16.971L454.059 256l-47.029 47.029A24.002 24.002 0 0 0 400 320v108c0 19.851-16.149 36-36 36h-44c-13.255 0-24 10.745-24 24s10.745 24 24 24h44c46.318 0 84-37.683 84-84v-98.059l56.971-56.971c9.372-9.372 9.372-24.568 0-33.941zM112 192V84c0-19.851 16.149-36 36-36h44c13.255 0 24-10.745 24-24S205.255 0 192 0h-44c-46.318 0-84 37.683-84 84v98.059l-56.971 56.97c-9.373 9.373-9.373 24.568 0 33.941L64 329.941V428c0 46.317 37.682 84 84 84h44c13.255 0 24-10.745 24-24s-10.745-24-24-24h-44c-19.851 0-36-16.149-36-36V320c0-6.365-2.529-12.47-7.029-16.971L57.941 256l47.029-47.029A24.002 24.002 0 0 0 112 192z"></path>
</symbol>
<symbol viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" id="copy">
<path d="M23 2.75A2.75 2.75 0 0 0 20.25 0H8.75A2.75 2.75 0 0 0 6 2.75v13.5A2.75 2.75 0 0 0 8.75 19h11.5A2.75 2.75 0 0 0 23 16.25zM18.25 14.5h-7.5a.75.75 0 0 1 0-1.5h7.5a.75.75 0 0 1 0 1.5zm0-3h-7.5a.75.75 0 0 1 0-1.5h7.5a.75.75 0 0 1 0 1.5zm0-3h-7.5a.75.75 0 0 1 0-1.5h7.5a.75.75 0 0 1 0 1.5z"></path>
<path d="M8.75 20.5a4.255 4.255 0 0 1-4.25-4.25V2.75c0-.086.02-.166.025-.25H3.75A2.752 2.752 0 0 0 1 5.25v16A2.752 2.752 0 0 0 3.75 24h12a2.752 2.752 0 0 0 2.75-2.75v-.75z"></path>
</symbol>
<symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512.001 512.001" id="closeme">
<path d="M284.286 256.002L506.143 34.144c7.811-7.811 7.811-20.475 0-28.285-7.811-7.81-20.475-7.811-28.285 0L256 227.717 34.143 5.859c-7.811-7.811-20.475-7.811-28.285 0-7.81 7.811-7.811 20.475 0 28.285l221.857 221.857L5.858 477.859c-7.811 7.811-7.811 20.475 0 28.285a19.938 19.938 0 0 0 14.143 5.857 19.94 19.94 0 0 0 14.143-5.857L256 284.287l221.857 221.857c3.905 3.905 9.024 5.857 14.143 5.857s10.237-1.952 14.143-5.857c7.811-7.811 7.811-20.475 0-28.285L284.286 256.002z"></path>
</symbol>
<symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" id="open-menu">
<path d="M492 236H20c-11.046 0-20 8.954-20 20s8.954 20 20 20h472c11.046 0 20-8.954 20-20s-8.954-20-20-20zm0-160H20C8.954 76 0 84.954 0 96s8.954 20 20 20h472c11.046 0 20-8.954 20-20s-8.954-20-20-20zm0 320H20c-11.046 0-20 8.954-20 20s8.954 20 20 20h472c11.046 0 20-8.954 20-20s-8.954-20-20-20z"></path>
</symbol>
<symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="instagram">
<path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z"/>
</symbol>
<symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id=youtube>
<path d="M19.615 3.184c-3.604-.246-11.631-.245-15.23 0-3.897.266-4.356 2.62-4.385 8.816.029 6.185.484 8.549 4.385 8.816 3.6.245 11.626.246 15.23 0 3.897-.266 4.356-2.62 4.385-8.816-.029-6.185-.484-8.549-4.385-8.816zm-10.615 12.816v-8l8 3.993-8 4.007z"/>
</symbol>
<symbol style="color:red" fill="currentColor" class="abi abi-git" viewBox="0 0 16 16" id="cgit" xmlns="http://www.w3.org/2000/svg">
<path d="M15.698 7.287 8.712.302a1.03 1.03 0 0 0-1.457 0l-1.45 1.45 1.84 1.84a1.223 1.223 0 0 1 1.55 1.56l1.773 1.774a1.224 1.224 0 0 1 1.267 2.025 1.226 1.226 0 0 1-2.002-1.334L8.58 5.963v4.353a1.226 1.226 0 1 1-1.008-.036V5.887a1.226 1.226 0 0 1-.666-1.608L5.093 2.465l-4.79 4.79a1.03 1.03 0 0 0 0 1.457l6.986 6.986a1.03 1.03 0 0 0 1.457 0l6.953-6.953a1.031 1.031 0 0 0 0-1.457" fill="red"/>
</symbol>
<symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 612 612" id="to-top">
<path d="M604.501 440.509L325.398 134.956c-5.331-5.357-12.423-7.627-19.386-7.27-6.989-.357-14.056 1.913-19.387 7.27L7.499 440.509c-9.999 10.024-9.999 26.298 0 36.323s26.223 10.024 36.222 0l262.293-287.164L568.28 476.832c9.999 10.024 26.222 10.024 36.221 0 9.999-10.023 9.999-26.298 0-36.323z"></path>
</symbol>
<symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 71 55" id="discord">
<path d="M60.1045 4.8978C55.5792 2.8214 50.7265 1.2916 45.6527 0.41542C45.5603 0.39851 45.468 0.440769 45.4204 0.525289C44.7963 1.6353 44.105 3.0834 43.6209 4.2216C38.1637 3.4046 32.7345 3.4046 27.3892 4.2216C26.905 3.0581 26.1886 1.6353 25.5617 0.525289C25.5141 0.443589 25.4218 0.40133 25.3294 0.41542C20.2584 1.2888 15.4057 2.8186 10.8776 4.8978C10.8384 4.9147 10.8048 4.9429 10.7825 4.9795C1.57795 18.7309 -0.943561 32.1443 0.293408 45.3914C0.299005 45.4562 0.335386 45.5182 0.385761 45.5576C6.45866 50.0174 12.3413 52.7249 18.1147 54.5195C18.2071 54.5477 18.305 54.5139 18.3638 54.4378C19.7295 52.5728 20.9469 50.6063 21.9907 48.5383C22.0523 48.4172 21.9935 48.2735 21.8676 48.2256C19.9366 47.4931 18.0979 46.6 16.3292 45.5858C16.1893 45.5041 16.1781 45.304 16.3068 45.2082C16.679 44.9293 17.0513 44.6391 17.4067 44.3461C17.471 44.2926 17.5606 44.2813 17.6362 44.3151C29.2558 49.6202 41.8354 49.6202 53.3179 44.3151C53.3935 44.2785 53.4831 44.2898 53.5502 44.3433C53.9057 44.6363 54.2779 44.9293 54.6529 45.2082C54.7816 45.304 54.7732 45.5041 54.6333 45.5858C52.8646 46.6197 51.0259 47.4931 49.0921 48.2228C48.9662 48.2707 48.9102 48.4172 48.9718 48.5383C50.038 50.6034 51.2554 52.5699 52.5959 54.435C52.6519 54.5139 52.7526 54.5477 52.845 54.5195C58.6464 52.7249 64.529 50.0174 70.6019 45.5576C70.6551 45.5182 70.6887 45.459 70.6943 45.3942C72.1747 30.0791 68.2147 16.7757 60.1968 4.9823C60.1772 4.9429 60.1437 4.9147 60.1045 4.8978ZM23.7259 37.3253C20.2276 37.3253 17.3451 34.1136 17.3451 30.1693C17.3451 26.225 20.1717 23.0133 23.7259 23.0133C27.308 23.0133 30.1626 26.2532 30.1066 30.1693C30.1066 34.1136 27.28 37.3253 23.7259 37.3253ZM47.3178 37.3253C43.8196 37.3253 40.9371 34.1136 40.9371 30.1693C40.9371 26.225 43.7636 23.0133 47.3178 23.0133C50.9 23.0133 53.7545 26.2532 53.6986 30.1693C53.6986 34.1136 50.9 37.3253 47.3178 37.3253Z"/>
</symbol>
<symbol id="matrix" viewBox="0 0 24 24" id=".05226047285077895" xmlns="http://www.w3.org/2000/svg">
<path d="M.632.55v22.9H2.28V24H0V0h2.28v.55zm7.043 7.26v1.157h.033a3.312 3.312 0 0 1 1.117-1.024c.433-.245.936-.365 1.5-.365.54 0 1.033.107 1.481.314.448.208.785.582 1.02 1.108.254-.374.6-.706 1.034-.992.434-.287.95-.43 1.546-.43.453 0 .872.056 1.26.167.388.11.716.286.993.53.276.245.489.559.646.951.152.392.23.863.23 1.417v5.728h-2.349V11.52c0-.286-.01-.559-.032-.812a1.755 1.755 0 0 0-.18-.66 1.106 1.106 0 0 0-.438-.448c-.194-.11-.457-.166-.785-.166-.332 0-.6.064-.803.189a1.38 1.38 0 0 0-.48.499 1.946 1.946 0 0 0-.231.696 5.56 5.56 0 0 0-.06.785v4.768h-2.35v-4.8c0-.254-.004-.503-.018-.752a2.074 2.074 0 0 0-.143-.688 1.052 1.052 0 0 0-.415-.503c-.194-.125-.476-.19-.854-.19-.111 0-.259.024-.439.074-.18.051-.36.143-.53.282a1.637 1.637 0 0 0-.439.595c-.12.259-.18.6-.18 1.02v4.966H5.46V7.81zm15.693 15.64V.55H21.72V0H24v24h-2.28v-.55z"/>
</symbol>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

View file

@ -0,0 +1,6 @@
<h2>Subscribe</h2>
<div>
Subscribe to my newsletter
</div>
<a href="https://notes.softinio.com" class="button mt-1" role="button">subscribe</a>

View file

@ -0,0 +1,125 @@
{{ $s := site.Params }}
<aside class="sidebar">
<section class="sidebar_inner">
<br>
{{ partial "search/widget" . }}
{{- $introDescription := $s.introDescription }}
{{- with .Params.introDescription }}
{{- $introDescription = . }}
{{- end }}
{{- if $introDescription }}
{{- $author := $s.Author }}
{{- $showAuthorPhoto := false }}
{{- $fullAuthor := reflect.IsMap $author }}
{{- if $fullAuthor }}
{{- if $author.photo }}
{{- $showAuthorPhoto = true }}
{{- end }}
{{- end }}
{{- if $showAuthorPhoto }}
<div class="author_header">
<img src="{{ absURL $author.photo }}" alt="{{ $author.name }} photo">
<h2>{{ $author.name }}</h2>
</div>
{{- else }}
<h2>{{ if $fullAuthor }}{{ $author.name }}{{ else }}{{ $author }}{{ end }}</h2>
{{- end }}
<div class="author_bio">
{{ markdownify $introDescription }}
</div>
{{- if ( ne $s.introURL false ) }}
{{- $r := T "read_more" }}
<a href='{{ absLangURL (default "about/" $s.introURL) }}' class="button mt-1" role="button" title='{{ $r }}'>{{ $r }}</a>
<!-- salar_custom: Only change from themes sidebar was to add this partial -->
{{ partial "newsletter" . }}
<!-- end_salar_custom -->
{{- end }}
{{- end }}
{{ if .Site.Params.sidebardisclaimer }}
<div class="sidebardisclaimer">
<h2 class="mt-4">Disclaimer</h2>
{{ .Site.Params.disclaimerText }}
</div>
{{ end }}
{{- $relatedInSidebar := true }}
{{- if eq $s.showRelatedInSidebar false }}
{{ $relatedInSidebar = false }}
{{- end }}
{{ if (and ($relatedInSidebar) (isset .Params "series") ) }}
{{$related := where .Site.RegularPages ".Params.series" "eq" .Params.series }}
<h2 class="mt-4">{{ T "series_posts" }}</h2>
<ul>
{{ range $related }}
<li>
<a href="{{ .Permalink }}" class="nav-link" title="{{ .Title }}">{{ .Title | markdownify }}</a>
</li>
{{ end }}
</ul>
{{ end }}
{{- $posts := where .Site.RegularPages "Type" "in" $s.mainSections }}
{{- $featured := default 8 $s.numberOfFeaturedPosts }}
{{- $featuredPosts := first $featured (where $posts "Params.featured" true)}}
{{- with $featuredPosts }}
<h2 class="mt-4">{{ T "featured_posts" }}</h2>
<ul>
{{- range . }}
<li>
<a href="{{ .Permalink }}" class="nav-link" title="{{ .Title }}">{{ .Title | markdownify }}</a>
</li>
{{- end }}
</ul>
{{- end }}
<h2 class="mt-4">{{ T "recent_posts" }}</h2>
<ul class="flex-column">
{{- $recent := default 8 $s.numberOfRecentPosts }}
{{- range first $recent $posts | symdiff $featuredPosts }}
<li>
<a href="{{ .Permalink }}" class="nav-link" title="{{ .Title }}">{{ .Title | markdownify }}</a>
</li>
{{- end }}
</ul>
{{- $tagsLimit := (default 100 $s.numberOfTagsShown) }}
{{- range $key, $value := .Site.Taxonomies }}
{{- if gt $value 0 }}
<div>
<h2 class="mt-4 taxonomy" id="{{ $key }}-section">{{ T $key }}</h2>
<nav class="tags_nav">
{{- $onPageTags := $.Page.Params.tags }}
{{- $slicedTags := ($value.ByCount | first $tagsLimit) }}
{{- range $slicedTags }}
<a href='{{ absLangURL $key }}/{{ (replace .Name "#" "%23") | urlize }}/' class="post_tag button button_translucent" title="{{ .Name }}">
{{ upper .Name }}
<span class="button_tally">{{ .Count }}</span>
</a>
{{ end }}
{{ if gt (len $value.ByCount) $tagsLimit }}
<br>
<div class="post_tags_toggle button">{{ T (printf "all_%s" (lower $key)) }}</div>
{{- $tagsInfo := newScratch }}
<div class="post_tags">
<div class="tags_list">
{{- range $value.Alphabetical }}
{{ $tagsInfo.Add "tagsInfo" (slice .Name .Count)}}
<a href='{{ absLangURL $key }}/{{ (replace .Name "#" "%23") | urlize }}/' class=" post_tag button button_translucent" data-position={{ .Count }} title="{{ .Name }}">
{{- upper .Name -}}
<span class="button_tally">{{ .Count }}</span>
</a>
{{ end }}
<div class="tags_sort"><span title="sort alphabetically">[A~Z]</span><span title="sort by count">[0~9]</span>
</div>
<span class="tags_hide"><svg class="icon">
<use xlink:href="#closeme"></use>
</svg></span>
</div>
</div>
{{- end }}
</nav>
</div>
{{- end }}
{{- end }}
</section>
</aside>

View file

@ -0,0 +1,6 @@
<div>
<p align="center">
<iframe src="https://notes.softinio.com/embed" width="480" height="320" style="border:1px solid #EEE; background:white;" frameborder="0" scrolling="no"></iframe>
</p>
</div>

2
layouts/robots.txt Normal file
View file

@ -0,0 +1,2 @@
User-agent: *
Disallow: /consulting-thankyou

View file

@ -0,0 +1,14 @@
{{ if .IsNamedParams -}}
<div style="position: relative; padding-bottom: 56.25%; margin-bottom: 1rem; height: 0; overflow: hidden;">
<iframe sandbox="allow-same-origin allow-scripts allow-popups" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;"
src="https://watch.softinio.com/videos/embed/{{ .Get "id" }}?{{ with .Get "title" }}title={{ . }}{{ else }}title=0{{ end }}&{{ with .Get "warning" }}warningTitle={{ . }}{{ else }}warningTitle=0{{ end }}{{ with .Get "subtitle" }}&subtitle={{ . }}{{ end }}&peertubeLink=0" allowfullscreen>
</iframe>
</div>
{{- else -}}
<div style="position: relative; padding-bottom: 56.25%; margin-bottom: 1rem; height: 0; overflow: hidden;">
<iframe sandbox="allow-same-origin allow-scripts allow-popups" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;"
src="https://watch.softinio.com/videos/embed/{{ .Get 1 }}?title=0&warningTitle=0&peertubeLink=0" title="Peertube Video" allowfullscreen>
</iframe>
</div>
{{- end }}

View file

@ -0,0 +1,3 @@
<!-- raw html -->
{{.Inner}}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 756 KiB

46
static/css/googleform.css Normal file
View file

@ -0,0 +1,46 @@
@import url(https://fonts.googleapis.com/css?family=Montserrat:400,700);
form { max-width:420px; margin:50px auto; }
.form-input {
color:#777;
font-family: Helvetica, Arial, sans-serif;
font-weight:500;
font-size: 18px;
border-radius: 5px;
line-height: 22px;
background-color: transparent;
border:2px solid #F6B26B;
transition: all 0.3s;
padding: 13px;
margin-bottom: 15px;
width:100%;
box-sizing: border-box;
outline:0;
}
.form-input:focus { border:2px solid #CC4949; }
textarea {
height: 150px;
line-height: 150%;
resize:vertical;
}
[type="submit"] {
font-family: 'Montserrat', Arial, Helvetica, sans-serif;
width: 100%;
background:#F6B26B;
border-radius:5px;
border:0;
cursor:pointer;
color:#777;
font-size:24px;
padding-top:10px;
padding-bottom:10px;
transition: all 0.3s;
margin-top:-4px;
font-weight:700;
}
[type="submit"]:hover { background:#CC4949; }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 742 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

View file

@ -1,110 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="180" height="180">
<path d="M0 0 C59.4 0 118.8 0 180 0 C180 59.4 180 118.8 180 180 C120.6 180 61.2 180 0 180 C0 120.6 0 61.2 0 0 Z " fill="#F68B22" transform="translate(0,0)"/>
<path d="M0 0 C0.99 0.99 1.98 1.98 3 3 C2.01 3.495 2.01 3.495 1 4 C-1.39373959 5.99494452 -1.39373959 5.99494452 -1.5625 9.875 C-1.36092962 12.92655159 -0.94227222 14.09621297 0.6875 16.8125 C5.7000578 20.12267968 11.14678327 20.9459068 17 22 C17 23.32 17 24.64 17 26 C14.47524538 27.26237731 12.68799534 27.09856404 9.875 27.0625 C8.96492187 27.05347656 8.05484375 27.04445312 7.1171875 27.03515625 C6.06917969 27.01775391 6.06917969 27.01775391 5 27 C4.67 25.68 4.34 24.36 4 23 C1.69 23 -0.62 23 -3 23 C-1.25465958 28.22357167 -1.25465958 28.22357167 2.625 31.9375 C8.25066424 33.70854245 12.90659225 33.79930114 18.4375 31.6875 C21.21821686 30.09498436 21.21821686 30.09498436 23 27 C23.57075609 23.2493171 23.34180314 21.54435315 21.3125 18.3125 C17.02633045 14.42737555 10.49072467 13.98881279 5 13 C5.33 11.35 5.66 9.7 6 8 C8.97 8 11.94 8 15 8 C15.33 8.99 15.66 9.98 16 11 C18.31 11 20.62 11 23 11 C21.22380973 5.53510379 21.22380973 5.53510379 16.8125 2.0625 C15.884375 1.711875 14.95625 1.36125 14 1 C14 0.67 14 0.34 14 0 C21.92 0 29.84 0 38 0 C36.68 0.99 35.36 1.98 34 3 C28.02730162 7.55740944 28.02730162 7.55740944 25.69921875 14.3671875 C25.67085775 20.4364414 26.01422817 24.87323339 30.40625 29.47265625 C34.58572385 33.01140887 38.23461325 33.66281772 43.640625 33.3515625 C48.82232987 32.57945416 52.75720389 30.19575132 56.04296875 26.0859375 C57.81701854 22.21923306 57.61617529 18.02304419 57.6640625 13.828125 C57.77492187 12.89484375 57.88578125 11.9615625 58 11 C58.99 10.34 59.98 9.68 61 9 C61 20.22 61 31.44 61 43 C64.465 42.505 64.465 42.505 68 42 C68.33 31.11 68.66 20.22 69 9 C72.63 9 76.26 9 80 9 C80 20.22 80 31.44 80 43 C82.31 43 84.62 43 87 43 C87 31.78 87 20.56 87 9 C87.99 9.495 87.99 9.495 89 10 C89 12.97 89 15.94 89 19 C90.9451 16.08235 91.45276317 14.37462715 92 11 C92.33 11 92.66 11 93 11 C93.33 18.26 93.66 25.52 94 33 C95.65 33.33 97.3 33.66 99 34 C99.495 36.475 99.495 36.475 100 39 C101.32 39 102.64 39 104 39 C104 38.01 104 37.02 104 36 C105.98 36.33 107.96 36.66 110 37 C108.18585949 35.18585949 105.45040946 35.3649546 103 35 C103 34.67 103 34.34 103 34 C105.31 34 107.62 34 110 34 C109.98428955 33.31897217 109.9685791 32.63794434 109.95239258 31.9362793 C109.89006778 28.85343719 109.85101742 25.77072756 109.8125 22.6875 C109.78736328 21.61564453 109.76222656 20.54378906 109.73632812 19.43945312 C109.72666016 18.41142578 109.71699219 17.38339844 109.70703125 16.32421875 C109.6913208 15.37635498 109.67561035 14.42849121 109.65942383 13.4519043 C110 11 110 11 111.3972168 9.19213867 C113.39120028 7.70902803 114.53326631 7.59696894 117 7.625 C118.0209375 7.61339844 118.0209375 7.61339844 119.0625 7.6015625 C121.62354793 8.12822961 122.39957365 8.94486577 124 11 C124.34057617 13.36010742 124.34057617 13.36010742 124.29296875 16.10546875 C124.28330078 17.08837891 124.27363281 18.07128906 124.26367188 19.08398438 C124.23853516 20.10814453 124.21339844 21.13230469 124.1875 22.1875 C124.17396484 23.22326172 124.16042969 24.25902344 124.14648438 25.32617188 C124.11111389 27.88463699 124.06175544 30.4420578 124 33 C126.31 33 128.62 33 131 33 C130.67 24.42 130.34 15.84 130 7 C130.33 7 130.66 7 131 7 C131.33 5.02 131.66 3.04 132 1 C132.33 1 132.66 1 133 1 C133 11.56 133 22.12 133 33 C135.31 33 137.62 33 140 33 C140 29.37 140 25.74 140 22 C140.99 22 141.98 22 143 22 C143.5878125 23.36125 143.5878125 23.36125 144.1875 24.75 C146.40798082 28.73155182 148.93860016 30.96930008 153 33 C158.30846237 33.61623941 163.39020514 33.94817972 168 30.9375 C173.34534269 26.37221928 174.3181401 20.40066818 174.88671875 13.72265625 C174.92410156 13.15417969 174.96148437 12.58570313 175 12 C175.33 12 175.66 12 176 12 C176 25.2 176 38.4 176 52 C116.6 52 57.2 52 -4 52 C-4 35.17 -4 18.34 -4 1 C-2.68 1.33 -1.36 1.66 0 2 C0 1.34 0 0.68 0 0 Z M95 36 C95 36.66 95 37.32 95 38 C95.66 38 96.32 38 97 38 C97 37.34 97 36.68 97 36 C96.34 36 95.68 36 95 36 Z " fill="#F16B20" transform="translate(4,128)"/>
<path d="M0 0 C0.82638376 2.89234315 1 4.88742431 1 8 C2.90735262 9.22483938 2.90735262 9.22483938 4.75 8.5625 C7.65617598 7.835956 10.01582866 7.68253496 13 8 C15.04040776 10.04040776 16 11.08325244 16 14 C16.66 14 17.32 14 18 14 C17.95875 13.21625 17.9175 12.4325 17.875 11.625 C18 9 18 9 20 7 C22.625 6.875 22.625 6.875 25 7 C26.1875 9.25 26.1875 9.25 27 12 C25.625 14.3125 25.625 14.3125 24 16 C24.33 16.33 24.66 16.66 25 17 C25.0883967 19.3756852 25.11530305 21.72208674 25.09765625 24.09765625 C25.0962413 24.80651474 25.09482635 25.51537323 25.09336853 26.24571228 C25.08775443 28.51801712 25.07519963 30.79022475 25.0625 33.0625 C25.05748681 34.59960796 25.05292359 36.13671745 25.04882812 37.67382812 C25.03778042 41.44925642 25.02050641 45.22461171 25 49 C21.625 49.1875 21.625 49.1875 18 49 C15.81005752 45.71508627 15.64722661 44.16904361 15.375 40.3125 C15.30023438 39.31863281 15.22546875 38.32476562 15.1484375 37.30078125 C15.07496094 36.16189453 15.07496094 36.16189453 15 35 C14.67 38.3 14.34 41.6 14 45 C13.67 45 13.34 45 13 45 C13.00523682 44.42967041 13.01047363 43.85934082 13.01586914 43.27172852 C13.03658221 40.70199677 13.0496419 38.13228253 13.0625 35.5625 C13.07087891 34.66466797 13.07925781 33.76683594 13.08789062 32.84179688 C13.09111328 31.98779297 13.09433594 31.13378906 13.09765625 30.25390625 C13.10289307 29.46314697 13.10812988 28.6723877 13.11352539 27.85766602 C13.20495909 25.98407311 13.20495909 25.98407311 12 25 C12 36.22 12 47.44 12 59 C9.69 59 7.38 59 5 59 C5 47.78 5 36.56 5 25 C1.37 25 -2.26 25 -6 25 C-5.99476318 25.99443115 -5.98952637 26.9888623 -5.98413086 28.01342773 C-5.96607959 31.69033921 -5.95456754 35.36724675 -5.94506836 39.04418945 C-5.94002843 40.63794614 -5.9331965 42.23169819 -5.92456055 43.82543945 C-5.91248001 46.11150253 -5.90676845 48.39750467 -5.90234375 50.68359375 C-5.89718246 51.40026718 -5.89202118 52.11694061 -5.88670349 52.85533142 C-5.88650737 54.57063672 -5.93807993 56.28581266 -6 58 C-6.495 58.495 -6.495 58.495 -7 59 C-8.98 59 -10.96 59 -13 59 C-13 47.45 -13 35.9 -13 24 C-13.99 24 -14.98 24 -16 24 C-16 22.02 -16 20.04 -16 18 C-15.01 18 -14.02 18 -13 18 C-13.01160156 17.31292969 -13.02320312 16.62585938 -13.03515625 15.91796875 C-13.04417969 15.01691406 -13.05320312 14.11585937 -13.0625 13.1875 C-13.07410156 12.29417969 -13.08570312 11.40085937 -13.09765625 10.48046875 C-13 8 -13 8 -12 5 C-12.66 4.67 -13.32 4.34 -14 4 C-9.33286748 0.166284 -5.97171665 -0.13572083 0 0 Z " fill="#F07C26" transform="translate(79,112)"/>
<path d="M0 0 C1.2684375 0.12375 1.2684375 0.12375 2.5625 0.25 C4.94475541 3.82338312 4.80283109 5.45621014 4.75 9.6875 C4.74355469 10.82058594 4.73710938 11.95367187 4.73046875 13.12109375 C4.59279419 15.68568261 4.31172106 17.81053624 3.5625 20.25 C4.5525 19.92 5.5425 19.59 6.5625 19.25 C6.8925 17.6 7.2225 15.95 7.5625 14.25 C6.9025 13.92 6.2425 13.59 5.5625 13.25 C5.8125 10.375 5.8125 10.375 6.5625 7.25 C8.375 5.8125 8.375 5.8125 10.5625 5.25 C14.0625 5.75 14.0625 5.75 15.5625 7.25 C15.79537008 8.93183948 15.97514166 10.6212416 16.125 12.3125 C16.20878906 13.23160156 16.29257813 14.15070312 16.37890625 15.09765625 C16.43949219 15.80792969 16.50007813 16.51820312 16.5625 17.25 C17.8825 17.25 19.2025 17.25 20.5625 17.25 C20.5625 19.56 20.5625 21.87 20.5625 24.25 C19.5725 24.58 18.5825 24.91 17.5625 25.25 C17.376875 26.85875 17.376875 26.85875 17.1875 28.5 C16.66606064 31.62863615 16.16161746 33.58480424 14.5625 36.25 C12.9228125 36.1571875 12.9228125 36.1571875 11.25 36.0625 C7.67172093 35.90576732 7.67172093 35.90576732 5.6875 37.625 C4.49768188 39.26178511 4.49768188 39.26178511 3.5625 41.25 C1.5825 41.25 -0.3975 41.25 -2.4375 41.25 C-2.7675 39.93 -3.0975 38.61 -3.4375 37.25 C-4.13617188 37.27320313 -4.83484375 37.29640625 -5.5546875 37.3203125 C-6.46476562 37.33835938 -7.37484375 37.35640625 -8.3125 37.375 C-9.66988281 37.40980469 -9.66988281 37.40980469 -11.0546875 37.4453125 C-13.4375 37.25 -13.4375 37.25 -15.4375 35.25 C-15.47991723 32.91705225 -15.47842937 30.58297433 -15.4375 28.25 C-15.7675 27.26 -16.0975 26.27 -16.4375 25.25 C-18.45258358 24.51676204 -18.45258358 24.51676204 -20.4375 24.25 C-20.4375 22.27 -20.4375 20.29 -20.4375 18.25 C-19.4784375 18.0025 -19.4784375 18.0025 -18.5 17.75 C-17.819375 17.255 -17.13875 16.76 -16.4375 16.25 C-16.14848067 14.2268647 -15.86564337 12.20062726 -15.6953125 10.1640625 C-15.4375 8.25 -15.4375 8.25 -14.25 6.1875 C-11.48453299 4.75708603 -9.37039209 5.53307082 -6.4375 6.25 C-6.4375 7.24 -6.4375 8.23 -6.4375 9.25 C-5.7775 9.25 -5.1175 9.25 -4.4375 9.25 C-4.293125 7.950625 -4.14875 6.65125 -4 5.3125 C-3.44902738 0.3537464 -3.44902738 0.3537464 0 0 Z " fill="#F58E29" transform="translate(90.4375,35.75)"/>
<path d="M0 0 C5.01791684 2.41935276 8.49958655 5.9991731 11 11 C11.68448516 16.05585632 12.14684613 20.93244641 9.61328125 25.5 C5.80322815 29.99602795 2.63432362 32.49523283 -3.25 33.3125 C-8.14235035 33.67047685 -11.38130133 33.23379685 -15.4375 30.375 C-19.38375253 26.94694225 -21.62306107 23.92008386 -22.30859375 18.609375 C-22.59200559 12.87243224 -21.92067505 9.43655335 -18 5 C-17.175 4.05125 -16.35 3.1025 -15.5 2.125 C-11.03694954 -1.39306784 -5.34974796 -0.79364393 0 0 Z " fill="#FBF6F2" transform="translate(51,129)"/>
<path d="M0 0 C4.56897752 2.61391347 8.04174199 6.07124433 10 11 C10.83868746 16.89259633 9.96210779 21.79077595 7 27 C1.62253334 31.97415666 -2.05845409 33.45918297 -9.2734375 33.31640625 C-14.36935568 32.72504612 -16.99483874 30.11382734 -20.3125 26.4375 C-23.7614759 21.45564593 -23.98979107 15.85892454 -23 10 C-17.68420976 0.91642438 -10.20043455 -1.73485652 0 0 Z " fill="#FBF6F1" transform="translate(169,129)"/>
<path d="M0 0 C3.47405263 1.69996316 4.82700343 2.74050515 7 6 C7 7.32 7 8.64 7 10 C4.69 10 2.38 10 0 10 C-0.33 9.34 -0.66 8.68 -1 8 C-3.97 8 -6.94 8 -10 8 C-10.33 9.32 -10.66 10.64 -11 12 C-9.67935547 12.14695313 -9.67935547 12.14695313 -8.33203125 12.296875 C-7.17058594 12.44640625 -6.00914063 12.5959375 -4.8125 12.75 C-3.08966797 12.95882812 -3.08966797 12.95882812 -1.33203125 13.171875 C2.38782817 14.09638871 4.25313166 15.36863069 7 18 C8.42662219 20.85324437 8.31033868 22.83454549 8 26 C5.59494159 29.91935444 3.4752557 31.90604861 -1 33 C-6.73484159 33.59472431 -11.0692062 33.28719587 -16 30 C-18.88092425 27.02304494 -19 26.33178252 -19 22 C-16.69 22 -14.38 22 -12 22 C-11.67 22.99 -11.34 23.98 -11 25 C-7.04 25 -3.08 25 1 25 C1 23.68 1 22.36 1 21 C0.11957031 20.90203125 -0.76085937 20.8040625 -1.66796875 20.703125 C-2.82941406 20.55359375 -3.99085937 20.4040625 -5.1875 20.25 C-6.33605469 20.11078125 -7.48460937 19.9715625 -8.66796875 19.828125 C-12.38782817 18.90361129 -14.25313166 17.63136931 -17 15 C-18.62911419 11.74177162 -18.66435104 8.50965244 -18 5 C-13.4041513 -1.12779826 -7.26301626 -1.17303089 0 0 Z " fill="#FAF4EE" transform="translate(20,129)"/>
<path d="M0 0 C4.10063529 0.0649863 6.54768527 0.50515881 9.75 3.25 C14.68764513 8.77870763 14.22940198 13.9605996 14 21.125 C13.98195312 22.19492188 13.96390625 23.26484375 13.9453125 24.3671875 C13.89837439 26.99572178 13.83272933 29.62238913 13.75 32.25 C11.44 32.25 9.13 32.25 6.75 32.25 C6.73018066 31.59402832 6.71036133 30.93805664 6.68994141 30.26220703 C6.59487493 27.29938931 6.48512248 24.33729468 6.375 21.375 C6.3440625 20.34246094 6.313125 19.30992187 6.28125 18.24609375 C6.24257812 17.25996094 6.20390625 16.27382812 6.1640625 15.2578125 C6.11693115 13.89100342 6.11693115 13.89100342 6.06884766 12.49658203 C5.95117489 10.05068814 5.95117489 10.05068814 3.75 8.25 C1.83993694 7.9323754 1.83993694 7.9323754 -0.25 8 C-0.95125 7.99484375 -1.6525 7.9896875 -2.375 7.984375 C-4.4935669 8.09294485 -4.4935669 8.09294485 -6.25 10.25 C-6.62051993 12.5745339 -6.62051993 12.5745339 -6.6640625 15.2578125 C-6.70273438 16.24394531 -6.74140625 17.23007813 -6.78125 18.24609375 C-6.8121875 19.27863281 -6.843125 20.31117188 -6.875 21.375 C-6.91367188 22.41527344 -6.95234375 23.45554688 -6.9921875 24.52734375 C-7.08664766 27.10138311 -7.17221214 29.67541155 -7.25 32.25 C-9.56 32.25 -11.87 32.25 -14.25 32.25 C-14.25 22.02 -14.25 11.79 -14.25 1.25 C-11.28 1.25 -8.31 1.25 -5.25 1.25 C-3.68966377 -0.31033623 -2.16052864 0.04292441 0 0 Z " fill="#FCEEE7" transform="translate(121.25,128.75)"/>
<path d="M0 0 C1.98 0 3.96 0 6 0 C6.2475 1.27875 6.495 2.5575 6.75 3.875 C7.51990586 7.26747318 7.51990586 7.26747318 10.125 9.5 C10.74375 9.665 11.3625 9.83 12 10 C11.0925 10.556875 10.185 11.11375 9.25 11.6875 C5.9322643 14.04819656 4.02325619 15.47803553 2 19 C1.38462842 22.66120232 1.12986992 26.29221384 1 30 C0.34 30 -0.32 30 -1 30 C-1 33.63 -1 37.26 -1 41 C-3.31 41 -5.62 41 -8 41 C-8.33 33.08 -8.66 25.16 -9 17 C-9.99 16.67 -10.98 16.34 -12 16 C-13.33333333 14.33333333 -14.66666667 12.66666667 -16 11 C-16.99 10.67 -17.98 10.34 -19 10 C-18.67 8.68 -18.34 7.36 -18 6 C-17.67 6.66 -17.34 7.32 -17 8 C-15.02 8 -13.04 8 -11 8 C-10.67 5.69 -10.34 3.38 -10 1 C-9.690625 1.639375 -9.38125 2.27875 -9.0625 2.9375 C-8.1654837 4.93610821 -8.1654837 4.93610821 -7 6 C-5.33382885 6.04063832 -3.66611905 6.042721 -2 6 C-1.34 4.02 -0.68 2.04 0 0 Z " fill="#F37822" transform="translate(145,120)"/>
<path d="M0 0 C-0.51152368 3.78527521 -1.20845842 5.44108688 -4 8 C-5.44440034 12.33320102 -5.54168843 16.4714847 -5 21 C-3.20353146 23.93423195 -2.0558929 25.47205355 1 27 C6.03760382 27.57619651 11.3168415 28.12024176 15.625 25.0625 C18.7420429 21.04315521 19.23947541 18.0118782 19 13 C18.62602046 10.35261852 18.04596456 8.51031495 17 6 C16.01 5.67 15.02 5.34 14 5 C13.3125 2.9375 13.3125 2.9375 13 1 C15.29778673 -0.3950848 16.4792967 -1.07438619 19.1875 -0.6875 C21 0 21 0 22 1 C22.23287008 2.68183948 22.41264166 4.3712416 22.5625 6.0625 C22.64628906 6.98160156 22.73007813 7.90070312 22.81640625 8.84765625 C22.87699219 9.55792969 22.93757813 10.26820312 23 11 C24.32 11 25.64 11 27 11 C27 13.31 27 15.62 27 18 C26.01 18.33 25.02 18.66 24 19 C23.814375 20.60875 23.814375 20.60875 23.625 22.25 C23.10356064 25.37863615 22.59911746 27.33480424 21 30 C19.3603125 29.9071875 19.3603125 29.9071875 17.6875 29.8125 C14.10922093 29.65576732 14.10922093 29.65576732 12.125 31.375 C10.93518188 33.01178511 10.93518188 33.01178511 10 35 C8.02 35 6.04 35 4 35 C3.67 33.68 3.34 32.36 3 31 C2.30132812 31.02320313 1.60265625 31.04640625 0.8828125 31.0703125 C-0.02726562 31.08835938 -0.93734375 31.10640625 -1.875 31.125 C-3.23238281 31.15980469 -3.23238281 31.15980469 -4.6171875 31.1953125 C-7 31 -7 31 -9 29 C-9.04241723 26.66705225 -9.04092937 24.33297433 -9 22 C-9.33 21.01 -9.66 20.02 -10 19 C-12.01508358 18.26676204 -12.01508358 18.26676204 -14 18 C-14 16.02 -14 14.04 -14 12 C-13.360625 11.835 -12.72125 11.67 -12.0625 11.5 C-11.381875 11.005 -10.70125 10.51 -10 10 C-9.71098067 7.9768647 -9.42814337 5.95062726 -9.2578125 3.9140625 C-9 2 -9 2 -7.8125 -0.0625 C-5.04703299 -1.49291397 -2.93289209 -0.71692918 0 0 Z " fill="#FAEFE4" transform="translate(84,42)"/>
<path d="M0 0 C2.31 0 4.62 0 7 0 C7 1.98 7 3.96 7 6 C8.65 6 10.3 6 12 6 C12 8.31 12 10.62 12 13 C10.35 13 8.7 13 7 13 C7 24.55 7 36.1 7 48 C4.69 48 2.38 48 0 48 C0 36.45 0 24.9 0 13 C-1.98 13 -3.96 13 -6 13 C-6 11.02 -6 9.04 -6 7 C-4.02 7 -2.04 7 0 7 C0 4.69 0 2.38 0 0 Z " fill="#FAF7F2" transform="translate(84,123)"/>
<path d="M0 0 C0.625 1.8125 0.625 1.8125 1 4 C0.01 5.485 0.01 5.485 -1 7 C-2.32 7 -3.64 7 -5 7 C-5 9.31 -5 11.62 -5 14 C-3.35 14 -1.7 14 0 14 C0 15.98 0 17.96 0 20 C-1.65 20 -3.3 20 -5 20 C-5 31.55 -5 43.1 -5 55 C-6.98 55 -8.96 55 -11 55 C-11 43.45 -11 31.9 -11 20 C-11.99 20 -12.98 20 -14 20 C-14 18.02 -14 16.04 -14 14 C-13.01 14 -12.02 14 -11 14 C-11.04640625 13.32453125 -11.0928125 12.6490625 -11.140625 11.953125 C-11.43299415 4.72743018 -11.43299415 4.72743018 -9.4375 1.375 C-6.17757904 -0.46392977 -3.67887806 -0.28299062 0 0 Z " fill="#FBF9F5" transform="translate(77,116)"/>
<path d="M0 0 C1.98 0 3.96 0 6 0 C6 0.66 6 1.32 6 2 C6.639375 2.12375 7.27875 2.2475 7.9375 2.375 C8.618125 2.58125 9.29875 2.7875 10 3 C11.38100634 5.76201268 10.93187719 8.08996496 10.7421875 11.125 C10.82726562 11.74375 10.91234375 12.3625 11 13 C11.99 13.66 12.98 14.32 14 15 C14.33 13.68 14.66 12.36 15 11 C16.25664978 13.90600261 17 15.79604584 17 19 C12.88514582 22.93197177 10.09721207 24.35287953 4.375 24.5 C0.18643212 24.31563388 -2.68017259 23.74744338 -6 21 C-5.38125 20.855625 -4.7625 20.71125 -4.125 20.5625 C-1.96741678 20.06847775 -1.96741678 20.06847775 0 19 C0 17.68 0 16.36 0 15 C-0.66 14.34 -1.32 13.68 -2 13 C-2.265625 10.9765625 -2.265625 10.9765625 -2.25 8.625 C-2.25515625 7.85414063 -2.2603125 7.08328125 -2.265625 6.2890625 C-1.97688045 3.8007639 -1.24139229 2.15765802 0 0 Z " fill="#FAEAE0" transform="translate(158,138)"/>
<path d="M0 0 C0 1.32 0 2.64 0 4 C0.66 4 1.32 4 2 4 C1.71517632 5.41805831 1.42181856 6.83440379 1.125 8.25 C0.96257813 9.03890625 0.80015625 9.8278125 0.6328125 10.640625 C0.00849925 12.96831144 -0.84838542 14.89031952 -2 17 C-0.02 17.66 1.96 18.32 4 19 C4 18.34 4 17.68 4 17 C4.99 17.33 5.98 17.66 7 18 C2.33942132 21.69632102 -1.50039839 22.47011654 -7.359375 22.41015625 C-11.9228661 21.70132997 -14.87555543 19.28928338 -18 16 C-20.47337017 12.21265192 -21.3981914 9.51283588 -21 5 C-19.5393715 7.64738916 -19 8.89448334 -19 12 C-18.34 12 -17.68 12 -17 12 C-15.375 13.5 -15.375 13.5 -14 15 C-14.33 14.01 -14.66 13.02 -15 12 C-13.68 12.33 -12.36 12.66 -11 13 C-10.67 12.34 -10.34 11.68 -10 11 C-9.01 11 -8.02 11 -7 11 C-7.66 10.67 -8.32 10.34 -9 10 C-9 8.68 -9 7.36 -9 6 C-9.66 6 -10.32 6 -11 6 C-9.55449331 0.45889101 -9.55449331 0.45889101 -7.1875 -1.5 C-4.24054351 -2.17359005 -2.65220688 -1.32610344 0 0 Z " fill="#FBEBE0" transform="translate(50,140)"/>
<path d="M0 0 C3.41529114 0.2846076 4.78498424 0.79660671 7.3125 3.1875 C9.32835318 6.5472553 9.64220846 8.14674921 9 12 C6.59494159 15.91935444 4.4752557 17.90604861 0 19 C-5.73484159 19.59472431 -10.0692062 19.28719587 -15 16 C-17.88092425 13.02304494 -18 12.33178252 -18 8 C-15.69 8 -13.38 8 -11 8 C-10.67 8.99 -10.34 9.98 -10 11 C-6.04 11 -2.08 11 2 11 C2 9.68 2 8.36 2 7 C1.34 7 0.68 7 0 7 C0 5 0 5 2 3 C2 2.34 2 1.68 2 1 C1.34 0.67 0.68 0.34 0 0 Z " fill="#F9E9DE" transform="translate(19,143)"/>
<path d="M0 0 C2.31 0 4.62 0 7 0 C7 10.23 7 20.46 7 31 C4.69 31 2.38 31 0 31 C0 20.77 0 10.54 0 0 Z " fill="#FBECE3" transform="translate(137,130)"/>
<path d="M0 0 C1.2684375 0.12375 1.2684375 0.12375 2.5625 0.25 C4.95231361 3.83472042 4.80260257 5.50353765 4.75 9.75 C4.74355469 10.8946875 4.73710938 12.039375 4.73046875 13.21875 C4.5625 16.25 4.5625 16.25 3.5625 19.25 C1.17685923 18.67415568 -1.10432784 18.02772405 -3.4375 17.25 C-3.4375 17.91 -3.4375 18.57 -3.4375 19.25 C-4.860625 19.683125 -4.860625 19.683125 -6.3125 20.125 C-9.48961578 21.01825109 -9.48961578 21.01825109 -11.4375 23.25 C-12.2208257 15.26007787 -12.2208257 15.26007787 -9.0625 11.1875 C-6.4375 9.25 -6.4375 9.25 -4.4375 9.25 C-4.293125 7.950625 -4.14875 6.65125 -4 5.3125 C-3.44902738 0.3537464 -3.44902738 0.3537464 0 0 Z " fill="#F48D37" transform="translate(90.4375,35.75)"/>
<path d="M0 0 C7.92 0 15.84 0 24 0 C22.68 0.99 21.36 1.98 20 3 C14.59745752 7.21398314 12.25976456 9.53758619 11.375 16.25 C11.25125 17.4875 11.1275 18.725 11 20 C10.360625 19.195625 9.72125 18.39125 9.0625 17.5625 C7.59396498 15.7249496 7.59396498 15.7249496 6 14 C4.80375 14.185625 3.6075 14.37125 2.375 14.5625 C-1.96004507 15.18849929 -4.89949575 14.45226192 -9 13 C-8.67 11.35 -8.34 9.7 -8 8 C-5.03 8 -2.06 8 1 8 C1.33 8.99 1.66 9.98 2 11 C4.31 11 6.62 11 9 11 C7.22380973 5.53510379 7.22380973 5.53510379 2.8125 2.0625 C1.884375 1.711875 0.95625 1.36125 0 1 C0 0.67 0 0.34 0 0 Z " fill="#F47A2C" transform="translate(18,128)"/>
<path d="M0 0 C1.98 0 3.96 0 6 0 C6 10.23 6 20.46 6 31 C4.02 31 2.04 31 0 31 C0 20.77 0 10.54 0 0 Z " fill="#FCF7F2" transform="translate(98,130)"/>
<path d="M0 0 C0.78375 0.04125 1.5675 0.0825 2.375 0.125 C3.5625 2.375 3.5625 2.375 4.375 5.125 C3 7.4375 3 7.4375 1.375 9.125 C1.705 9.785 2.035 10.445 2.375 11.125 C0.395 11.125 -1.585 11.125 -3.625 11.125 C-3.625 21.355 -3.625 31.585 -3.625 42.125 C-7.0116371 38.7383629 -7.04463254 37.9912468 -7.3125 33.4375 C-7.37824219 32.44363281 -7.44398437 31.44976562 -7.51171875 30.42578125 C-7.54910156 29.66652344 -7.58648437 28.90726563 -7.625 28.125 C-7.955 31.425 -8.285 34.725 -8.625 38.125 C-8.955 38.125 -9.285 38.125 -9.625 38.125 C-9.61976318 37.55990723 -9.61452637 36.99481445 -9.60913086 36.41259766 C-9.58837578 33.8584097 -9.5753446 31.30423947 -9.5625 28.75 C-9.55412109 27.86054688 -9.54574219 26.97109375 -9.53710938 26.0546875 C-9.53388672 25.20390625 -9.53066406 24.353125 -9.52734375 23.4765625 C-9.52210693 22.69104004 -9.51687012 21.90551758 -9.51147461 21.09619141 C-9.49926047 19.04727332 -9.49926047 19.04727332 -10.625 17.125 C-8.975 17.125 -7.325 17.125 -5.625 17.125 C-5.57601562 16.06539062 -5.52703125 15.00578125 -5.4765625 13.9140625 C-5.40153291 12.52601503 -5.32598515 11.13799549 -5.25 9.75 C-5.2190625 9.05132812 -5.188125 8.35265625 -5.15625 7.6328125 C-4.72888688 0.22518509 -4.72888688 0.22518509 0 0 Z " fill="#F1742A" transform="translate(101.625,118.875)"/>
<path d="M0 0 C-2.40921705 2.40921705 -4.94334509 3.53812156 -8 5 C-7.67 5.66 -7.34 6.32 -7 7 C-15.12041791 9.16544478 -24.66627769 8.91131856 -32 5 C-31.34 3.35 -30.68 1.7 -30 0 C-28.22992286 -0.08114106 -26.45877902 -0.13925505 -24.6875 -0.1875 C-23.70136719 -0.22230469 -22.71523437 -0.25710937 -21.69921875 -0.29296875 C-19 0 -19 0 -17.14453125 1.38671875 C-16 3 -16 3 -16 5 C-14.02 5 -12.04 5 -10 5 C-9.71125 4.195625 -9.4225 3.39125 -9.125 2.5625 C-7.05707701 -2.14776903 -4.49406067 -0.87927274 0 0 Z " fill="#F69624" transform="translate(104,72)"/>
<path d="M0 0 C1.98 0 3.96 0 6 0 C6 0.66 6 1.32 6 2 C7.32 2.33 8.64 2.66 10 3 C10.1953125 9.0546875 10.1953125 9.0546875 10 11 C8 13 8 13 4.5625 13.3125 C1 13 1 13 -0.9375 11.875 C-2.49328953 9.12948906 -2.3168479 7.10510946 -2 4 C-1 1.625 -1 1.625 0 0 Z " fill="#F9F1EA" transform="translate(158,138)"/>
<path d="M0 0 C0.33 0 0.66 0 1 0 C1.33 6.27 1.66 12.54 2 19 C5.20275807 14.7296559 5.52022697 12.3064246 5.6875 7.25 C5.72166016 6.55261719 5.75582031 5.85523438 5.79101562 5.13671875 C5.87308295 3.42502892 5.93822919 1.7125424 6 0 C6.33 0 6.66 0 7 0 C7 11.22 7 22.44 7 34 C4.69 34 2.38 34 0 34 C0 22.78 0 11.56 0 0 Z " fill="#FBE1D6" transform="translate(84,137)"/>
<path d="M0 0 C0.66 0 1.32 0 2 0 C5.39900287 5.89160498 5.13515674 12.28000316 5.0625 18.875 C5.05798828 19.65875 5.05347656 20.4425 5.04882812 21.25 C5.03714093 23.16670014 5.01920908 25.08336048 5 27 C3.02 27 1.04 27 -1 27 C-1.1723784 17.95971078 -0.6331684 9.01134307 0 0 Z " fill="#FCF2EC" transform="translate(67,144)"/>
<path d="M0 0 C0.33 0 0.66 0 1 0 C1 2.31 1 4.62 1 7 C0.34 7 -0.32 7 -1 7 C-1 9.31 -1 11.62 -1 14 C-0.01 14 0.98 14 2 14 C2 25.55 2 37.1 2 49 C1.67 49 1.34 49 1 49 C0.9906543 48.14245117 0.98130859 47.28490234 0.97167969 46.40136719 C0.92758709 43.21027321 0.86593944 40.02013244 0.79248047 36.82958984 C0.76430901 35.45048349 0.74307528 34.07121682 0.72900391 32.69189453 C0.70752455 30.70577051 0.65876868 28.72000091 0.609375 26.734375 C0.58842773 25.54038086 0.56748047 24.34638672 0.54589844 23.11621094 C-0.10486722 19.40137515 -1.15922872 18.37889992 -4 16 C-4.804375 14.989375 -5.60875 13.97875 -6.4375 12.9375 C-8.84133341 10.18188609 -10.82747609 8.72222727 -14 7 C-14 6.67 -14 6.34 -14 6 C-9.38 6 -4.76 6 0 6 C0 4.02 0 2.04 0 0 Z " fill="#F29059" transform="translate(64,122)"/>
<path d="M0 0 C0.77988281 -0.01417969 1.55976562 -0.02835938 2.36328125 -0.04296875 C4.8907668 0.20765587 6.50468031 0.92376228 8.6875 2.1875 C8.3125 4.125 8.3125 4.125 7.6875 6.1875 C5.23778376 7.41235812 3.54515539 7.35472808 0.8125 7.375 C-0.48300781 7.39626953 -0.48300781 7.39626953 -1.8046875 7.41796875 C-4.4366288 7.17609252 -6.05230544 6.51733541 -8.3125 5.1875 C-8.6425 6.1775 -8.9725 7.1675 -9.3125 8.1875 C-9.3125 7.5275 -9.3125 6.8675 -9.3125 6.1875 C-10.6325 6.1875 -11.9525 6.1875 -13.3125 6.1875 C-13.3125 4.5375 -13.3125 2.8875 -13.3125 1.1875 C-12.013125 1.208125 -10.71375 1.22875 -9.375 1.25 C-8.02084367 1.27149454 -6.66493917 1.25898199 -5.3125 1.1875 C-3.74222683 -0.38277317 -2.16980053 0.01775614 0 0 Z " fill="#F9FAF7" transform="translate(121.3125,128.8125)"/>
<path d="M0 0 C-0.51340384 3.79918838 -1.2079868 5.43134786 -4 8 C-5.98579337 11.19933376 -6.49470643 14.29451382 -7 18 C-8.98 17.67 -10.96 17.34 -13 17 C-13 15.02 -13 13.04 -13 11 C-12.01 10.67 -11.02 10.34 -10 10 C-9.896875 8.741875 -9.79375 7.48375 -9.6875 6.1875 C-9.35723612 3.6703537 -9.08928064 2.15506637 -7.8125 -0.0625 C-5.04703299 -1.49291397 -2.93289209 -0.71692918 0 0 Z " fill="#F9F0E7" transform="translate(84,42)"/>
<path d="M0 0 C0 11.22 0 22.44 0 34 C-0.33 34 -0.66 34 -1 34 C-1.33 27.4 -1.66 20.8 -2 14 C-2.33 14 -2.66 14 -3 14 C-3.33 11.69 -3.66 9.38 -4 7 C-5.32 6.67 -6.64 6.34 -8 6 C-8.33 6.66 -8.66 7.32 -9 8 C-10 7 -10 7 -10.0625 3.9375 C-10.041875 2.968125 -10.02125 1.99875 -10 1 C-8 0 -8 0 0 0 Z " fill="#F37425" transform="translate(84,137)"/>
<path d="M0 0 C0.33 1.32 0.66 2.64 1 4 C1.66 4 2.32 4 3 4 C3.33 6.64 3.66 9.28 4 12 C4.33 11.34 4.66 10.68 5 10 C6.65 10.33 8.3 10.66 10 11 C10 11.66 10 12.32 10 13 C10.99 13.33 11.98 13.66 13 14 C12.25 18.75 12.25 18.75 10 21 C5.97412118 19.21072052 3.27783669 17.83635653 1 14 C-0.04976964 10.85069107 -0.10131595 8.61185544 -0.0625 5.3125 C-0.05347656 4.31863281 -0.04445312 3.32476562 -0.03515625 2.30078125 C-0.02355469 1.54152344 -0.01195312 0.78226563 0 0 Z " fill="#FBF2EB" transform="translate(146,139)"/>
<path d="M0 0 C0 1.32 0 2.64 0 4 C0.66 4 1.32 4 2 4 C2 4.66 2 5.32 2 6 C1.34 6 0.68 6 0 6 C0 6.99 0 7.98 0 9 C-4.43076923 11.09230769 -4.43076923 11.09230769 -7.3125 10.625 C-7.869375 10.41875 -8.42625 10.2125 -9 10 C-9 8.68 -9 7.36 -9 6 C-9.66 6 -10.32 6 -11 6 C-9.55449331 0.45889101 -9.55449331 0.45889101 -7.1875 -1.5 C-4.24054351 -2.17359005 -2.65220688 -1.32610344 0 0 Z " fill="#F17321" transform="translate(50,140)"/>
<path d="M0 0 C2.5 0.125 2.5 0.125 3.5 1.125 C3.57244053 3.14464199 3.58377188 5.16667124 3.5625 7.1875 C3.55347656 8.29222656 3.54445313 9.39695312 3.53515625 10.53515625 C3.52355469 11.38980469 3.51195313 12.24445312 3.5 13.125 C1.19 13.455 -1.12 13.785 -3.5 14.125 C-3.52685938 11.97923363 -3.54633088 9.83337355 -3.5625 7.6875 C-3.57410156 6.49253906 -3.58570312 5.29757813 -3.59765625 4.06640625 C-3.46840705 0.17342035 -3.46840705 0.17342035 0 0 Z " fill="#FBF7F3" transform="translate(90.5,35.875)"/>
<path d="M0 0 C0.33 0 0.66 0 1 0 C1 9.9 1 19.8 1 30 C3.97 30.33 6.94 30.66 10 31 C9.67 31.66 9.34 32.32 9 33 C9.66 33.33 10.32 33.66 11 34 C10.67 34.66 10.34 35.32 10 36 C8.02 35.34 6.04 34.68 4 34 C4 34.99 4 35.98 4 37 C2.68 37 1.36 37 0 37 C0 36.01 0 35.02 0 34 C-0.99 33.67 -1.98 33.34 -3 33 C-3.99 32.34 -4.98 31.68 -6 31 C-4.02 31 -2.04 31 0 31 C0 20.77 0 10.54 0 0 Z M-5 34 C-4.34 34 -3.68 34 -3 34 C-3 34.66 -3 35.32 -3 36 C-3.66 36 -4.32 36 -5 36 C-5 35.34 -5 34.68 -5 34 Z " fill="#F0854D" transform="translate(104,130)"/>
<path d="M0 0 C0.33 0 0.66 0 1 0 C1 1.98 1 3.96 1 6 C1.99 6 2.98 6 4 6 C4 5.34 4 4.68 4 4 C4.66 4 5.32 4 6 4 C6 4.66 6 5.32 6 6 C7.98 6 9.96 6 12 6 C12 6.33 12 6.66 12 7 C10.02 7 8.04 7 6 7 C6 8.98 6 10.96 6 13 C7.98 13 9.96 13 12 13 C12 13.33 12 13.66 12 14 C8.37 14 4.74 14 1 14 C1 24.89 1 35.78 1 47 C0.67 47 0.34 47 0 47 C0 35.78 0 24.56 0 13 C1.65 13 3.3 13 5 13 C5 11.02 5 9.04 5 7 C3.35 7 1.7 7 0 7 C0 4.69 0 2.38 0 0 Z " fill="#F69B73" transform="translate(72,123)"/>
<path d="M0 0 C4.94084137 4.78145939 4.94084137 4.78145939 5.11352539 8.33837891 C5.10828857 9.29147949 5.10305176 10.24458008 5.09765625 11.2265625 C5.09443359 12.2578125 5.09121094 13.2890625 5.08789062 14.3515625 C5.07951172 15.43179688 5.07113281 16.51203125 5.0625 17.625 C5.05798828 18.71296875 5.05347656 19.8009375 5.04882812 20.921875 C5.03701776 23.61463789 5.02054778 26.30729188 5 29 C4.67 29 4.34 29 4 29 C3.98018066 28.44014404 3.96036133 27.88028809 3.93994141 27.3034668 C3.84462217 24.76434146 3.73497247 22.22603112 3.625 19.6875 C3.5940625 18.80642578 3.563125 17.92535156 3.53125 17.01757812 C3.49257812 16.17001953 3.45390625 15.32246094 3.4140625 14.44921875 C3.3826416 13.66893311 3.3512207 12.88864746 3.31884766 12.0847168 C3.10412111 9.69844232 3.10412111 9.69844232 1 7 C1 6.01 1 5.02 1 4 C0.34 4 -0.32 4 -1 4 C-1 4.99 -1 5.98 -1 7 C-1.53625 6.690625 -2.0725 6.38125 -2.625 6.0625 C-5.3984957 4.82172561 -8.00042837 4.4090325 -11 4 C-11 3.67 -11 3.34 -11 3 C-10.06027344 3.05220703 -10.06027344 3.05220703 -9.1015625 3.10546875 C-8.28429687 3.13253906 -7.46703125 3.15960938 -6.625 3.1875 C-5.40683594 3.23970703 -5.40683594 3.23970703 -4.1640625 3.29296875 C-3.44992188 3.19628906 -2.73578125 3.09960938 -2 3 C-1.34 2.01 -0.68 1.02 0 0 Z " fill="#FBE5D6" transform="translate(130,132)"/>
<path d="M0 0 C3.65316671 1.24976756 4.78065836 1.67098753 7 5 C7 6.32 7 7.64 7 9 C4.69 9 2.38 9 0 9 C-0.33 8.34 -0.66 7.68 -1 7 C-2.45742463 6.91903197 -3.91612807 6.86082226 -5.375 6.8125 C-6.59316406 6.76029297 -6.59316406 6.76029297 -7.8359375 6.70703125 C-8.55007813 6.80371094 -9.26421875 6.90039062 -10 7 C-10.66 7.99 -11.32 8.98 -12 10 C-12 8.35 -12 6.7 -12 5 C-7.38 5 -2.76 5 2 5 C1.34 3.35 0.68 1.7 0 0 Z " fill="#F9E6DB" transform="translate(20,130)"/>
<path d="M0 0 C2.5625 0.1875 2.5625 0.1875 4.5625 2.1875 C4.00694444 6.74305556 4.00694444 6.74305556 2.5625 8.1875 C0.125 8.375 0.125 8.375 -2.4375 8.1875 C-3.0975 7.5275 -3.7575 6.8675 -4.4375 6.1875 C-3.71780303 0.28598485 -3.71780303 0.28598485 0 0 Z " fill="#F9F2EA" transform="translate(140.4375,118.8125)"/>
<path d="M0 0 C0.78375 0.04125 1.5675 0.0825 2.375 0.125 C3.5 2.4375 3.5 2.4375 4.375 5.125 C3.385 6.61 3.385 6.61 2.375 8.125 C-0.6875 8.375 -0.6875 8.375 -3.625 8.125 C-4.625 7.125 -4.625 7.125 -4.8125 4.6875 C-4.54653904 1.05270021 -3.63803315 0.17323967 0 0 Z " fill="#F9F1EA" transform="translate(101.625,118.875)"/>
<path d="M0 0 C0.82638376 2.89234315 1 4.88742431 1 8 C1.66 8.33 2.32 8.66 3 9 C1.68 9 0.36 9 -1 9 C-1.33 7.68 -1.66 6.36 -2 5 C-7.32170494 4.70437633 -7.32170494 4.70437633 -12 7 C-12 6.34 -12 5.68 -12 5 C-12.66 4.67 -13.32 4.34 -14 4 C-9.33286748 0.166284 -5.97171665 -0.13572083 0 0 Z " fill="#F47F25" transform="translate(79,112)"/>
<path d="M0 0 C-0.0721875 0.81082031 -0.144375 1.62164062 -0.21875 2.45703125 C-0.82252141 9.66035957 -1.13035532 16.77252181 -1 24 C-1.66 24 -2.32 24 -3 24 C-3 17.4 -3 10.8 -3 4 C-5.31 4 -7.62 4 -10 4 C-7.26634436 -0.10048346 -4.7993062 -1.59976873 0 0 Z " fill="#F1771E" transform="translate(147,126)"/>
<path d="M0 0 C0.76173392 4.3164922 1.16063604 7.74433453 0 12 C-0.66 12 -1.32 12 -2 12 C-2 11.01 -2 10.02 -2 9 C-3.32 9 -4.64 9 -6 9 C-5.4140625 2.84765625 -5.4140625 2.84765625 -5 1 C-3 0 -3 0 0 0 Z " fill="#F37B21" transform="translate(86,33)"/>
<path d="M0 0 C2.97 0 5.94 0 9 0 C10 4 10 4 9 6 C1.25 6.125 1.25 6.125 -1 5 C-0.67 3.35 -0.34 1.7 0 0 Z " fill="#F0731F" transform="translate(10,136)"/>
<path d="M0 0 C2.31 0 4.62 0 7 0 C7.73080266 1.97746603 8.39421747 3.98072489 9 6 C8.67 6.66 8.34 7.32 8 8 C5.9375 8.625 5.9375 8.625 4 9 C0 4.5 0 4.5 0 0 Z " fill="#FBDCCA" transform="translate(1,151)"/>
<path d="M0 0 C2.97 0.495 2.97 0.495 6 1 C6.33 1.99 6.66 2.98 7 4 C5.02 4 3.04 4 1 4 C1 14.23 1 24.46 1 35 C0.67 35 0.34 35 0 35 C-0.16800236 30.65860566 -0.32851981 26.31701785 -0.48217773 21.97509766 C-0.53547011 20.49878539 -0.59078903 19.02254481 -0.64819336 17.54638672 C-0.73046212 15.42170666 -0.80538335 13.29687349 -0.87890625 11.171875 C-0.9260376 9.8940918 -0.97316895 8.61630859 -1.02172852 7.29980469 C-1.00390727 4.59337842 -0.83306311 2.54687307 0 0 Z " fill="#F2956B" transform="translate(97,126)"/>
<path d="M0 0 C0.66 0 1.32 0 2 0 C1.67 2.97 1.34 5.94 1 9 C3.31 8.34 5.62 7.68 8 7 C7.67 4.69 7.34 2.38 7 0 C7.99 0.33 8.98 0.66 10 1 C10.1953125 7.0546875 10.1953125 7.0546875 10 9 C8 11 8 11 4.5625 11.3125 C1 11 1 11 -0.9375 9.875 C-2.48138276 7.15050101 -2.3267107 5.07108055 -2 2 C-1.34 1.34 -0.68 0.68 0 0 Z " fill="#F27127" transform="translate(158,140)"/>
<path d="M0 0 C0.33 0 0.66 0 1 0 C1 1.65 1 3.3 1 5 C1.9590625 4.7215625 1.9590625 4.7215625 2.9375 4.4375 C3.618125 4.293125 4.29875 4.14875 5 4 C5.33 4.33 5.66 4.66 6 5 C6.33 3.35 6.66 1.7 7 0 C7.33 0 7.66 0 8 0 C8.07347656 0.90492187 8.07347656 0.90492187 8.1484375 1.828125 C8.22320312 2.62734375 8.29796875 3.4265625 8.375 4.25 C8.44460937 5.03890625 8.51421875 5.8278125 8.5859375 6.640625 C9.01507113 9.085877 9.78600638 10.84836903 11 13 C10.01 13 9.02 13 8 13 C7.67 14.65 7.34 16.3 7 18 C6.34 17.67 5.68 17.34 5 17 C5.020625 15.906875 5.04125 14.81375 5.0625 13.6875 C5.18544452 10.05615809 5.18544452 10.05615809 4 7 C1.98491642 6.26676204 1.98491642 6.26676204 0 6 C0 4.02 0 2.04 0 0 Z " fill="#F8EDDF" transform="translate(70,54)"/>
<path d="M0 0 C0.99 0.99 1.98 1.98 3 3 C2.01 3.495 2.01 3.495 1 4 C-1.42144512 5.99685749 -1.42144512 5.99685749 -1.375 9.9375 C-1.22585596 13.05231594 -0.76283869 15.35574196 1 18 C-0.9375 17.6875 -0.9375 17.6875 -3 17 C-4.14077657 13.57767028 -4.09815117 10.91326783 -4.0625 7.3125 C-4.05347656 6.13300781 -4.04445313 4.95351562 -4.03515625 3.73828125 C-4.02355469 2.83464844 -4.01195312 1.93101562 -4 1 C-2.68 1.33 -1.36 1.66 0 2 C0 1.34 0 0.68 0 0 Z " fill="#F07A2E" transform="translate(4,128)"/>
<path d="M0 0 C0.4125 0.495 0.825 0.99 1.25 1.5 C3.12202338 3.43386092 3.12202338 3.43386092 7 3 C6.67 4.65 6.34 6.3 6 8 C5.01 8 4.02 8 3 8 C3 8.66 3 9.32 3 10 C2.01 10 1.02 10 0 10 C0 8.68 0 7.36 0 6 C-0.66 6 -1.32 6 -2 6 C-1.34 4.02 -0.68 2.04 0 0 Z " fill="#F1772E" transform="translate(41,140)"/>
<path d="M0 0 C1.65 0 3.3 0 5 0 C5.33 2.97 5.66 5.94 6 9 C4.35 9 2.7 9 1 9 C-1.09230769 4.56923077 -1.09230769 4.56923077 -0.625 1.6875 C-0.41875 1.130625 -0.2125 0.57375 0 0 Z " fill="#F5781C" transform="translate(107,120)"/>
<path d="M0 0 C0.66 0.33 1.32 0.66 2 1 C2.4140625 3.50390625 2.4140625 3.50390625 2.625 6.5625 C2.69976562 7.57441406 2.77453125 8.58632813 2.8515625 9.62890625 C2.90054688 10.41136719 2.94953125 11.19382812 3 12 C3.66 12 4.32 12 5 12 C4.67 13.98 4.34 15.96 4 18 C2.68 18.33 1.36 18.66 0 19 C0 18.01 0 17.02 0 16 C-0.66 15.67 -1.32 15.34 -2 15 C-1.01 15 -0.02 15 1 15 C0.67 10.05 0.34 5.1 0 0 Z " fill="#F38017" transform="translate(94,37)"/>
<path d="M0 0 C0 0.66 0 1.32 0 2 C-1.70940029 3.60228383 -3.53301528 5.01294742 -5.37109375 6.46484375 C-7.26558258 8.00756886 -7.26558258 8.00756886 -8 11 C-8.99 11.33 -9.98 11.66 -11 12 C-12.69321939 13.29944744 -14.36395804 14.62926214 -16 16 C-14.03466064 9.9253147 -7.26769621 0 0 0 Z " fill="#F07220" transform="translate(64,14)"/>
<path d="M0 0 C1.65 0 3.3 0 5 0 C5 7.26 5 14.52 5 22 C4.67 22 4.34 22 4 22 C4 16.72 4 11.44 4 6 C2.68 5.67 1.36 5.34 0 5 C0 3.35 0 1.7 0 0 Z " fill="#FAFCFB" transform="translate(138,130)"/>
<path d="M0 0 C2.20914 3.31371 2.22481553 4.3446021 2.125 8.1875 C2.10695313 9.08855469 2.08890625 9.98960937 2.0703125 10.91796875 C2.03550781 11.94857422 2.03550781 11.94857422 2 13 C0.02 13 -1.96 13 -4 13 C-3.34 12.67 -2.68 12.34 -2 12 C-2.33 10.02 -2.66 8.04 -3 6 C-2.34 5.67 -1.68 5.34 -1 5 C-0.34444881 2.47266765 -0.34444881 2.47266765 0 0 Z " fill="#FBEBE0" transform="translate(70,158)"/>
<path d="M0 0 C0.33 0 0.66 0 1 0 C1.33 7.59 1.66 15.18 2 23 C0.68 22.34 -0.64 21.68 -2 21 C-2 15.72 -2 10.44 -2 5 C-1.67 5 -1.34 5 -1 5 C-0.67 3.35 -0.34 1.7 0 0 Z " fill="#F36B0F" transform="translate(96,139)"/>
<path d="M0 0 C0.99 0.33 1.98 0.66 3 1 C2.25 5.75 2.25 5.75 0 8 C-2.625 7.625 -2.625 7.625 -5 7 C-5.680625 7.99 -5.680625 7.99 -6.375 9 C-6.91125 9.66 -7.4475 10.32 -8 11 C-8.66 11 -9.32 11 -10 11 C-10 9.68 -10 8.36 -10 7 C-9.01 7 -8.02 7 -7 7 C-6.67 6.01 -6.34 5.02 -6 4 C-4.68 4 -3.36 4 -2 4 C-1.34 2.68 -0.68 1.36 0 0 Z " fill="#F9FDFC" transform="translate(157,132)"/>
<path d="M0 0 C5.75 -0.125 5.75 -0.125 8 1 C8 1.66 8 2.32 8 3 C8.66 3 9.32 3 10 3 C10.33 2.01 10.66 1.02 11 0 C11.33 2.31 11.66 4.62 12 7 C10.68 6.34 9.36 5.68 8 5 C7.67 5.66 7.34 6.32 7 7 C7.66 7 8.32 7 9 7 C8.67 7.99 8.34 8.98 8 10 C8 9.34 8 8.68 8 8 C7.34 8 6.68 8 6 8 C6 6.68 6 5.36 6 4 C3.03 3.505 3.03 3.505 0 3 C0 2.01 0 1.02 0 0 Z " fill="#F9EFE6" transform="translate(44,136)"/>
<path d="M0 0 C2.64 0 5.28 0 8 0 C7.01 1.98 6.02 3.96 5 6 C3.02 6 1.04 6 -1 6 C-0.67 4.02 -0.34 2.04 0 0 Z " fill="#FAF5EC" transform="translate(89,71)"/>
<path d="M0 0 C-2.40921705 2.40921705 -4.94334509 3.53812156 -8 5 C-7.67 5.66 -7.34 6.32 -7 7 C-8.75 7.6875 -8.75 7.6875 -11 8 C-13.25 6.5625 -13.25 6.5625 -15 5 C-13.35 5 -11.7 5 -10 5 C-9.566875 3.7934375 -9.566875 3.7934375 -9.125 2.5625 C-7.05707701 -2.14776903 -4.49406067 -0.87927274 0 0 Z " fill="#F49C36" transform="translate(104,72)"/>
<path d="M0 0 C3.41529114 0.2846076 4.78498424 0.79660671 7.3125 3.1875 C9.25629673 6.42716122 9.34530062 8.28801837 9 12 C8.896875 11.360625 8.79375 10.72125 8.6875 10.0625 C8.460625 9.381875 8.23375 8.70125 8 8 C7.01 7.67 6.02 7.34 5 7 C5 6.34 5 5.68 5 5 C3.35 5.66 1.7 6.32 0 7 C0 5 0 5 2 3 C2 2.34 2 1.68 2 1 C1.34 0.67 0.68 0.34 0 0 Z " fill="#F7E1D3" transform="translate(19,143)"/>
<path d="M0 0 C0.33 0.99 0.66 1.98 1 3 C2.29355827 4.37195574 3.62298702 5.71182656 5 7 C3.35 7 1.7 7 0 7 C0 6.34 0 5.68 0 5 C-0.66 5 -1.32 5 -2 5 C-2 5.66 -2 6.32 -2 7 C-2.99 7 -3.98 7 -5 7 C-5 5.02 -5 3.04 -5 1 C-2 0 -2 0 0 0 Z " fill="#F57417" transform="translate(78,122)"/>
<path d="M0 0 C0.99 0 1.98 0 3 0 C5.49977543 3.33303391 6 4.73303602 6 9 C4.02 8.34 2.04 7.68 0 7 C0 4.69 0 2.38 0 0 Z " fill="#F5B799" transform="translate(161,138)"/>
<path d="M0 0 C0.33 0 0.66 0 1 0 C1 1.98 1 3.96 1 6 C1.99 6 2.98 6 4 6 C4 5.34 4 4.68 4 4 C4.66 4 5.32 4 6 4 C6 4.66 6 5.32 6 6 C7.98 6 9.96 6 12 6 C12 6.33 12 6.66 12 7 C10.02 7 8.04 7 6 7 C6 8.98 6 10.96 6 13 C7.98 13 9.96 13 12 13 C12 13.33 12 13.66 12 14 C9.36 14 6.72 14 4 14 C4.33 11.69 4.66 9.38 5 7 C3.35 7 1.7 7 0 7 C0 4.69 0 2.38 0 0 Z " fill="#EF9968" transform="translate(72,123)"/>
<path d="M0 0 C2.875 -0.125 2.875 -0.125 6 0 C6.66 0.66 7.32 1.32 8 2 C3.5 5 3.5 5 -1 8 C-1.66 7.67 -2.32 7.34 -3 7 C-2.6875 5.0625 -2.6875 5.0625 -2 3 C-1.01 2.67 -0.02 2.34 1 2 C0.67 1.34 0.34 0.68 0 0 Z " fill="#F07D2C" transform="translate(149,128)"/>
<path d="M0 0 C-0.33 2.64 -0.66 5.28 -1 8 C-3.97 7.505 -3.97 7.505 -7 7 C-7 5.35 -7 3.7 -7 2 C-2.25 0 -2.25 0 0 0 Z " fill="#F9FAF9" transform="translate(78,52)"/>
<path d="M0 0 C1.65 0 3.3 0 5 0 C5.33 0.99 5.66 1.98 6 3 C6.33 3 6.66 3 7 3 C8.10228696 7.40914783 8.07654536 11.48382401 8 16 C7.67 16 7.34 16 7 16 C6.92523437 15.39671875 6.85046875 14.7934375 6.7734375 14.171875 C6.0944149 9.4116009 6.0944149 9.4116009 3.53125 5.51171875 C1.71981764 4.29312506 1.71981764 4.29312506 -1 3 C-0.67 2.01 -0.34 1.02 0 0 Z " fill="#EF6812" transform="translate(21,140)"/>
<path d="M0 0 C0.66 0.33 1.32 0.66 2 1 C2 1.66 2 2.32 2 3 C1.01 3.33 0.02 3.66 -1 4 C-1.33 4.66 -1.66 5.32 -2 6 C-1.34 6 -0.68 6 0 6 C-0.33 6.66 -0.66 7.32 -1 8 C-7.93 7.505 -7.93 7.505 -15 7 C-15 6.67 -15 6.34 -15 6 C-14.41992188 5.98582031 -13.83984375 5.97164063 -13.2421875 5.95703125 C-7.14244918 5.58460498 -4.32010398 4.32010398 0 0 Z " fill="#F9E0C6" transform="translate(102,64)"/>
<path d="M0 0 C2.31 0.33 4.62 0.66 7 1 C7.33 1.99 7.66 2.98 8 4 C3.375 6.125 3.375 6.125 0 5 C0 4.34 0 3.68 0 3 C0.66 3 1.32 3 2 3 C2 2.34 2 1.68 2 1 C1.34 0.67 0.68 0.34 0 0 Z " fill="#FAF8F5" transform="translate(14,143)"/>
<path d="M0 0 C1.98 0 3.96 0 6 0 C5.01 0.495 5.01 0.495 4 1 C4 1.66 4 2.32 4 3 C4.66 3 5.32 3 6 3 C6.33 4.32 6.66 5.64 7 7 C5.68 6.34 4.36 5.68 3 5 C2.67 5.66 2.34 6.32 2 7 C1.01 7 0.02 7 -1 7 C-0.649375 6.21625 -0.29875 5.4325 0.0625 4.625 C0.371875 3.75875 0.68125 2.8925 1 2 C0.67 1.34 0.34 0.68 0 0 Z " fill="#F67018" transform="translate(118,136)"/>
<path d="M0 0 C0.66 0 1.32 0 2 0 C2.33 1.98 2.66 3.96 3 6 C2.34 6 1.68 6 1 6 C1 10.95 1 15.9 1 21 C0.67 21 0.34 21 0 21 C-0.19461488 18.06281233 -0.38097593 15.12550068 -0.5625 12.1875 C-0.61857422 11.35412109 -0.67464844 10.52074219 -0.73242188 9.66210938 C-0.78076172 8.85966797 -0.82910156 8.05722656 -0.87890625 7.23046875 C-0.9260376 6.49207764 -0.97316895 5.75368652 -1.02172852 4.99291992 C-1 3 -1 3 0 0 Z " fill="#FBFAFB" transform="translate(129,136)"/>
<path d="M0 0 C0.66 0.33 1.32 0.66 2 1 C-0.1385485 3.1385485 -1.13275314 3.42655063 -4 4 C-3.01 5.485 -3.01 5.485 -2 7 C-3.65 7.33 -5.3 7.66 -7 8 C-7 7.01 -7 6.02 -7 5 C-7.66 4.67 -8.32 4.34 -9 4 C-7.54618103 3.30300448 -6.08677047 2.61766134 -4.625 1.9375 C-3.40683594 1.36322266 -3.40683594 1.36322266 -2.1640625 0.77734375 C-1.44992188 0.52082031 -0.73578125 0.26429687 0 0 Z " fill="#EF6D21" transform="translate(75,8)"/>
<path d="M0 0 C1.625 1.1875 1.625 1.1875 3 3 C3.1875 5.6875 3.1875 5.6875 3 8 C2.01 8 1.02 8 0 8 C0 7.34 0 6.68 0 6 C-0.66 6 -1.32 6 -2 6 C-2.66 4.35 -3.32 2.7 -4 1 C-2 0 -2 0 0 0 Z " fill="#FBF5F1" transform="translate(24,148)"/>
<path d="M0 0 C2 3 4 6 6 9 C3.66666667 9 1.33333333 9 -1 9 C-0.67 6.03 -0.34 3.06 0 0 Z " fill="#EF752A" transform="translate(146,150)"/>
<path d="M0 0 C2.25998595 3.59462331 2.20868087 6.56595675 2.125 10.75 C2.10695313 11.92046875 2.08890625 13.0909375 2.0703125 14.296875 C2.03550781 15.63492188 2.03550781 15.63492188 2 17 C1.34 16.34 0.68 15.68 0 15 C0 13.68 0 12.36 0 11 C-0.66 10.67 -1.32 10.34 -2 10 C-1.67 9.67 -1.34 9.34 -1 9 C-0.76807135 7.48530552 -0.58784762 5.96245438 -0.4375 4.4375 C-0.35371094 3.61121094 -0.26992188 2.78492188 -0.18359375 1.93359375 C-0.12300781 1.29550781 -0.06242187 0.65742188 0 0 Z " fill="#F2742F" transform="translate(62,143)"/>
<path d="M0 0 C2.97 0 5.94 0 9 0 C9.33 2.31 9.66 4.62 10 7 C9.52949219 6.66226563 9.05898437 6.32453125 8.57421875 5.9765625 C7.95160156 5.53054687 7.32898438 5.08453125 6.6875 4.625 C6.07261719 4.18414062 5.45773438 3.74328125 4.82421875 3.2890625 C3.2347608 2.16589093 1.61937829 1.07958553 0 0 Z " fill="#F37620" transform="translate(166,128)"/>
<path d="M0 0 C0.33 0 0.66 0 1 0 C1 2.31 1 4.62 1 7 C0.34 7 -0.32 7 -1 7 C-1.33 9.31 -1.66 11.62 -2 14 C-2.33 13.01 -2.66 12.02 -3 11 C-3.99 10.67 -4.98 10.34 -6 10 C-5.34 8.68 -4.68 7.36 -4 6 C-2.68 6 -1.36 6 0 6 C0 4.02 0 2.04 0 0 Z " fill="#F27315" transform="translate(64,122)"/>
<path d="M0 0 C0.28875 0.61875 0.5775 1.2375 0.875 1.875 C2.63411124 5.19776568 4.68335854 6.45223399 8 8 C5.69 8 3.38 8 1 8 C1 9.65 1 11.3 1 13 C0.67 13 0.34 13 0 13 C-0.19551338 11.39679026 -0.38111983 9.79237014 -0.5625 8.1875 C-0.71912109 6.84751953 -0.71912109 6.84751953 -0.87890625 5.48046875 C-1 3 -1 3 0 0 Z " fill="#F4741D" transform="translate(135,121)"/>
<path d="M0 0 C0.66 0 1.32 0 2 0 C2.66 1.98 3.32 3.96 4 6 C3.34 6.66 2.68 7.32 2 8 C1.01 8 0.02 8 -1 8 C-1 7.34 -1 6.68 -1 6 C-1.66 6 -2.32 6 -3 6 C-2.67 5.01 -2.34 4.02 -2 3 C-1.01 3 -0.02 3 1 3 C0.67 2.01 0.34 1.02 0 0 Z " fill="#F9F9F7" transform="translate(103,64)"/>
<path d="M0 0 C0.94875 0.350625 1.8975 0.70125 2.875 1.0625 C2.875 2.3825 2.875 3.7025 2.875 5.0625 C1.225 4.7325 -0.425 4.4025 -2.125 4.0625 C-2.125 3.4025 -2.125 2.7425 -2.125 2.0625 C-3.115 2.0625 -4.105 2.0625 -5.125 2.0625 C-5.125 1.4025 -5.125 0.7425 -5.125 0.0625 C-3.125 -0.9375 -3.125 -0.9375 0 0 Z " fill="#F47C1B" transform="translate(141.125,113.9375)"/>
<path d="M0 0 C1.95418308 2.93127462 2.64700993 4.55834679 3 8 C2.34 8.66 1.68 9.32 1 10 C0.01 10 -0.98 10 -2 10 C-2.33 8.68 -2.66 7.36 -3 6 C-2.34 5.67 -1.68 5.34 -1 5 C-0.34444881 2.47266765 -0.34444881 2.47266765 0 0 Z " fill="#F3712B" transform="translate(29,150)"/>
<path d="M0 0 C-0.99 0.495 -0.99 0.495 -2 1 C-1.67 1.66 -1.34 2.32 -1 3 C-1.94875 3.309375 -2.8975 3.61875 -3.875 3.9375 C-6.86080408 4.87394742 -6.86080408 4.87394742 -9 6 C-9 5.34 -9 4.68 -9 4 C-9.66 3.67 -10.32 3.34 -11 3 C-7.17860188 -0.1390056 -4.83859894 -1.61286631 0 0 Z " fill="#F18231" transform="translate(76,113)"/>
<path d="M0 0 C0 0.99 0 1.98 0 3 C-0.99 3.33 -1.98 3.66 -3 4 C-3.28875 4.598125 -3.5775 5.19625 -3.875 5.8125 C-5.35537318 8.69100341 -7.42278571 10.10099999 -10 12 C-10 9 -10 9 -7.8125 6.5625 C-5.28225355 4.25716434 -2.70944196 2.09014094 0 0 Z " fill="#FB9725" transform="translate(58,15)"/>
<path d="M0 0 C1.65 0 3.3 0 5 0 C5 1.65 5 3.3 5 5 C4.01 5.495 4.01 5.495 3 6 C2.01 5.67 1.02 5.34 0 5 C0 3.35 0 1.7 0 0 Z " fill="#F8F3ED" transform="translate(2,152)"/>
<path d="M0 0 C1.8125 0.75 1.8125 0.75 2.8125 2.75 C2.19375 2.894375 1.575 3.03875 0.9375 3.1875 C-1.22008322 3.68152225 -1.22008322 3.68152225 -3.1875 4.75 C-3.5175 5.41 -3.8475 6.07 -4.1875 6.75 C-4.8475 5.1 -5.5075 3.45 -6.1875 1.75 C-3.9127187 0.36888278 -2.68578639 -0.30694702 0 0 Z " fill="#F6EBE4" transform="translate(103.1875,41.25)"/>
<path d="M0 0 C1.4370809 -0.05422947 2.87475462 -0.09289723 4.3125 -0.125 C5.11300781 -0.14820313 5.91351563 -0.17140625 6.73828125 -0.1953125 C9 0 9 0 12 2 C7.375 4.125 7.375 4.125 4 3 C2.64377755 2.03126968 1.30582947 1.03565785 0 0 Z " fill="#FCF2ED" transform="translate(117,129)"/>
<path d="M0 0 C-0.33 1.65 -0.66 3.3 -1 5 C-1.66 4.67 -2.32 4.34 -3 4 C-5.3329866 3.95977609 -7.66706666 3.95679753 -10 4 C-7.26634436 -0.10048346 -4.7993062 -1.59976873 0 0 Z " fill="#EF8D4A" transform="translate(147,126)"/>
<path d="M0 0 C0.33 0 0.66 0 1 0 C1 1.65 1 3.3 1 5 C1.9590625 4.7215625 1.9590625 4.7215625 2.9375 4.4375 C3.618125 4.293125 4.29875 4.14875 5 4 C5.33 4.33 5.66 4.66 6 5 C6.33 3.35 6.66 1.7 7 0 C7.33 0 7.66 0 8 0 C8 2.31 8 4.62 8 7 C7.34 7 6.68 7 6 7 C5.67 7.99 5.34 8.98 5 10 C4.67 9.01 4.34 8.02 4 7 C1.98491642 6.26676204 1.98491642 6.26676204 0 6 C0 4.02 0 2.04 0 0 Z " fill="#FAD8B9" transform="translate(70,54)"/>
<path d="M0 0 C0.99 0.33 1.98 0.66 3 1 C2.67 1.99 2.34 2.98 2 4 C0.68 3.67 -0.64 3.34 -2 3 C-2 3.99 -2 4.98 -2 6 C-3.98 6.33 -5.96 6.66 -8 7 C-6 4 -6 4 -4 3 C-3.360625 2.46375 -2.72125 1.9275 -2.0625 1.375 C-1.381875 0.92125 -0.70125 0.4675 0 0 Z " fill="#FAEBDD" transform="translate(59,149)"/>
<path d="M0 0 C0.33 0 0.66 0 1 0 C1 1.65 1 3.3 1 5 C1.66 5.33 2.32 5.66 3 6 C2.67 7.65 2.34 9.3 2 11 C-1.89847716 7.7106599 -1.89847716 7.7106599 -2.375 4.375 C-2 2 -2 2 0 0 Z " fill="#F68143" transform="translate(62,131)"/>
<path d="M0 0 C1.65 0 3.3 0 5 0 C5 1.98 5 3.96 5 6 C3.68 6.33 2.36 6.66 1 7 C0.67 4.69 0.34 2.38 0 0 Z " fill="#F67C22" transform="translate(92,120)"/>
<path d="M0 0 C0.66 0 1.32 0 2 0 C2.36541918 4.26322371 1.49759276 6.54179464 -1 10 C-1.99 10.495 -1.99 10.495 -3 11 C-3.39253254 6.55129785 -2.15305957 3.85756507 0 0 Z " fill="#F07C1E" transform="translate(45,32)"/>
<path d="M0 0 C1.423125 0.2165625 1.423125 0.2165625 2.875 0.4375 C7.56740347 1.11197278 12.28134412 1.55376896 17 2 C17 2.33 17 2.66 17 3 C11.06 3 5.12 3 -1 3 C-0.67 2.01 -0.34 1.02 0 0 Z " fill="#F79C22" transform="translate(81,3)"/>
<path d="M0 0 C3.3 0.33 6.6 0.66 10 1 C9.67 1.99 9.34 2.98 9 4 C9.99 4.33 10.98 4.66 12 5 C11.01 5.33 10.02 5.66 9 6 C8.01 5.34 7.02 4.68 6 4 C6 3.34 6 2.68 6 2 C3.03 1.505 3.03 1.505 0 1 C0 0.67 0 0.34 0 0 Z " fill="#F7F5EF" transform="translate(8,155)"/>
<path d="M0 0 C1.98 0 3.96 0 6 0 C5.67 1.65 5.34 3.3 5 5 C3.68 5 2.36 5 1 5 C0.67 3.35 0.34 1.7 0 0 Z " fill="#F67C32" transform="translate(91,136)"/>
<path d="M0 0 C2.97 0.495 2.97 0.495 6 1 C6.33 1.99 6.66 2.98 7 4 C5.02 4 3.04 4 1 4 C1 5.65 1 7.3 1 9 C0.67 9 0.34 9 0 9 C0 6.03 0 3.06 0 0 Z " fill="#F38A49" transform="translate(97,126)"/>
<path d="M0 0 C0.86625 0.3403125 0.86625 0.3403125 1.75 0.6875 C0.76 1.1825 0.76 1.1825 -0.25 1.6875 C0.74 2.3475 1.73 3.0075 2.75 3.6875 C-0.03823655 4.7201802 -1.1177274 4.73259293 -4 3.75 C-4.7425 3.399375 -5.485 3.04875 -6.25 2.6875 C-2.80384615 -0.38942308 -2.80384615 -0.38942308 0 0 Z " fill="#F79928" transform="translate(101.25,74.3125)"/>
<path d="M0 0 C-0.928125 0.86625 -0.928125 0.86625 -1.875 1.75 C-3.81347053 3.80249821 -4.90014249 5.43366582 -6 8 C-6 7.01 -6 6.02 -6 5 C-6.66 5 -7.32 5 -8 5 C-8 4.01 -8 3.02 -8 2 C-4.77208445 -0.1519437 -3.71599191 -0.20086443 0 0 Z " fill="#FAE6D6" transform="translate(111,59)"/>
<path d="M0 0 C1.65 0 3.3 0 5 0 C5.33 0.99 5.66 1.98 6 3 C2.01803543 4.05404945 -0.98195309 3.84098656 -5 3 C-5 2.67 -5 2.34 -5 2 C-3.35 2 -1.7 2 0 2 C0 1.34 0 0.68 0 0 Z " fill="#F0712F" transform="translate(138,161)"/>
<path d="M0 0 C0.66 0 1.32 0 2 0 C2.33 1.65 2.66 3.3 3 5 C4.98 5 6.96 5 9 5 C9 5.33 9 5.66 9 6 C2.47692308 6.36923077 2.47692308 6.36923077 0.0625 4.5 C-0.4634375 3.7575 -0.4634375 3.7575 -1 3 C-0.67 2.01 -0.34 1.02 0 0 Z " fill="#ED8740" transform="translate(105,124)"/>
<path d="M0 0 C0.99 0.33 1.98 0.66 3 1 C1.29171079 3.10633718 0.47851584 3.93801608 -2.26171875 4.29296875 C-3.06222656 4.25816406 -3.86273438 4.22335938 -4.6875 4.1875 C-5.49574219 4.16042969 -6.30398437 4.13335937 -7.13671875 4.10546875 C-7.75160156 4.07066406 -8.36648437 4.03585938 -9 4 C-9 3.67 -9 3.34 -9 3 C-8.071875 2.87625 -7.14375 2.7525 -6.1875 2.625 C-2.86074765 2.18466918 -2.86074765 2.18466918 0 0 Z " fill="#F2981B" transform="translate(96,66)"/>
<path d="M0 0 C0.99 0 1.98 0 3 0 C2.01 3.3 1.02 6.6 0 10 C-1.66666667 3.33333333 -1.66666667 3.33333333 0 0 Z " fill="#F59132" transform="translate(109,61)"/>
<path d="M0 0 C1.98 0.495 1.98 0.495 4 1 C4 2.32 4 3.64 4 5 C2.35 4.67 0.7 4.34 -1 4 C-0.67 2.68 -0.34 1.36 0 0 Z " fill="#F7FCF7" transform="translate(107,54)"/>
<path d="M0 0 C1.65 0 3.3 0 5 0 C5.33 1.32 5.66 2.64 6 4 C3.36 3.67 0.72 3.34 -2 3 C-1.34 2.67 -0.68 2.34 0 2 C0 1.34 0 0.68 0 0 Z " fill="#F27519" transform="translate(90,32)"/>
<path d="M0 0 C0.99 0.33 1.98 0.66 3 1 C2.67 2.32 2.34 3.64 2 5 C0.68 4.67 -0.64 4.34 -2 4 C-1.34 2.68 -0.68 1.36 0 0 Z " fill="#F7EBE0" transform="translate(45,142)"/>
<path d="M0 0 C2.97 0.495 2.97 0.495 6 1 C4.68 2.32 3.36 3.64 2 5 C1.34 4.67 0.68 4.34 0 4 C0 2.68 0 1.36 0 0 Z " fill="#F17B2A" transform="translate(30,130)"/>
<path d="M0 0 C3.3 0 6.6 0 10 0 C10 1.32 10 2.64 10 4 C9.46375 3.690625 8.9275 3.38125 8.375 3.0625 C5.6015043 1.82172561 2.99957163 1.4090325 0 1 C0 0.67 0 0.34 0 0 Z " fill="#F9E2D5" transform="translate(119,135)"/>
<path d="M0 0 C0.99 0 1.98 0 3 0 C3.33 1.32 3.66 2.64 4 4 C3.34 4 2.68 4 2 4 C1.67 4.99 1.34 5.98 1 7 C0.67 7 0.34 7 0 7 C0 4.69 0 2.38 0 0 Z " fill="#F37D24" transform="translate(72,40)"/>
<path d="M0 0 C2.475 0.99 2.475 0.99 5 2 C5 2.66 5 3.32 5 4 C3.02 4.33 1.04 4.66 -1 5 C-0.67 3.35 -0.34 1.7 0 0 Z " fill="#F26D22" transform="translate(110,11)"/>
<path d="M0 0 C2.475 0.495 2.475 0.495 5 1 C5 2.32 5 3.64 5 5 C2 4 2 4 0 3 C0 2.01 0 1.02 0 0 Z " fill="#F07B39" transform="translate(16,149)"/>
</svg>

Before

Width:  |  Height:  |  Size: 49 KiB

BIN
static/img/SF1.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 KiB

View file

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

View file

Before

Width:  |  Height:  |  Size: 200 KiB

After

Width:  |  Height:  |  Size: 200 KiB

View file

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

View file

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

View file

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

View file

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 70 KiB

View file

Before

Width:  |  Height:  |  Size: 105 KiB

After

Width:  |  Height:  |  Size: 105 KiB

BIN
static/img/techstack.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

View file

Before

Width:  |  Height:  |  Size: 530 KiB

After

Width:  |  Height:  |  Size: 530 KiB

View file

Before

Width:  |  Height:  |  Size: 13 MiB

After

Width:  |  Height:  |  Size: 13 MiB

View file

Before

Width:  |  Height:  |  Size: 547 KiB

After

Width:  |  Height:  |  Size: 547 KiB

View file

Before

Width:  |  Height:  |  Size: 517 KiB

After

Width:  |  Height:  |  Size: 517 KiB

View file

Before

Width:  |  Height:  |  Size: 462 KiB

After

Width:  |  Height:  |  Size: 462 KiB

View file

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 94 KiB

View file

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 52 KiB

View file

Before

Width:  |  Height:  |  Size: 205 KiB

After

Width:  |  Height:  |  Size: 205 KiB

View file

Before

Width:  |  Height:  |  Size: 326 KiB

After

Width:  |  Height:  |  Size: 326 KiB

View file

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 MiB

View file

Before

Width:  |  Height:  |  Size: 3.1 MiB

After

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Some files were not shown because too many files have changed in this diff Show more