diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 27a3a2e..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,20 +0,0 @@ -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 - diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index 6ce1104..0000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,32 +0,0 @@ -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 - diff --git a/.gitignore b/.gitignore index bafe440..a48cf0d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1 @@ -/public -.DS_Store -/resources/_gen/ -/result -.hugo_build.lock - +public diff --git a/archetypes/default.md b/archetypes/default.md deleted file mode 100644 index 0fd0f07..0000000 --- a/archetypes/default.md +++ /dev/null @@ -1,9 +0,0 @@ -+++ -title = "{{ replace .Name "-" " " | title }}" -date = {{ .Date }} -draft = true -showReadTime = false -showDate = false -comments = false -+++ - diff --git a/archetypes/post.md b/archetypes/post.md deleted file mode 100644 index 21bf734..0000000 --- a/archetypes/post.md +++ /dev/null @@ -1,21 +0,0 @@ -+++ -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 -+++ - diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..a1fca6b --- /dev/null +++ b/config.toml @@ -0,0 +1,297 @@ +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). diff --git a/config/_default/config.toml b/config/_default/config.toml deleted file mode 100644 index 35b085e..0000000 --- a/config/_default/config.toml +++ /dev/null @@ -1,58 +0,0 @@ -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 © 2008–2018, 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 - - diff --git a/config/_default/configTaxo.toml b/config/_default/configTaxo.toml deleted file mode 100644 index beb5961..0000000 --- a/config/_default/configTaxo.toml +++ /dev/null @@ -1,24 +0,0 @@ -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 - diff --git a/config/_default/languages.toml b/config/_default/languages.toml deleted file mode 100644 index b3ff308..0000000 --- a/config/_default/languages.toml +++ /dev/null @@ -1,6 +0,0 @@ - -[en] - title = "Salar Rahmanian" - LanguageName = "English" - weight = 1 - diff --git a/config/_default/markup.toml b/config/_default/markup.toml deleted file mode 100644 index 6a3b397..0000000 --- a/config/_default/markup.toml +++ /dev/null @@ -1,17 +0,0 @@ -[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 diff --git a/config/_default/menus/menu.en.toml b/config/_default/menus/menu.en.toml deleted file mode 100644 index 65d9c3d..0000000 --- a/config/_default/menus/menu.en.toml +++ /dev/null @@ -1,103 +0,0 @@ -# [[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/#" diff --git a/config/_default/params.toml b/config/_default/params.toml deleted file mode 100644 index 68dbef5..0000000 --- a/config/_default/params.toml +++ /dev/null @@ -1,147 +0,0 @@ -# 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 employer’s 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 - diff --git a/content/_index.md b/content/_index.md index 525ec8c..1820048 100644 --- a/content/_index.md +++ b/content/_index.md @@ -1,3 +1,9 @@ +++ -author = "Salar Rahmanian" +title = "Home" +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" } +++ diff --git a/static/img/SalarRahmanianFamily.jpg b/content/about/SalarRahmanianFamily.jpg similarity index 100% rename from static/img/SalarRahmanianFamily.jpg rename to content/about/SalarRahmanianFamily.jpg diff --git a/content/about.md b/content/about/index.md similarity index 59% rename from content/about.md rename to content/about/index.md index a773a94..0978092 100644 --- a/content/about.md +++ b/content/about/index.md @@ -1,26 +1,24 @@ +++ -title = "Salar Rahmanian" -date = "2015-11-26T09:16:07-05:00" -description = "About Salar Rahmanian" -keywords = ["Salar", "Rahmanian", "Salar Rahmanian"] -showReadTime = false -showDate = false -comments = false +title = "About" +template = "info-page.html" +path = "about" + +[extra] +isso = false +quick_navigation_buttons = true +++ 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 am particularly enthusiastic about the Scala Programming language and NixOS and technologies such as Apache Nifi, Kafka, Spark and Akka. +I am particularly enthusiastic about the Scala Programming language and NixOS and technologies such as Apache Nifi, Kafka, Spark and Akka / Pekko. 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. -[Subscribe to my newsletter](https://notes.softinio.com/) - -[Watch my talks](https://watch.softinio.com) - -![Salar Rahmanian Family](/img/SalarRahmanianFamily.jpg) +{{ full_width_image(src="SalarRahmanianFamily.jpg" alt="Salar Rahmanian's family photo") }} diff --git a/content/blog/_index.md b/content/blog/_index.md new file mode 100644 index 0000000..6e7eb7f --- /dev/null +++ b/content/blog/_index.md @@ -0,0 +1,4 @@ ++++ +redirect_to = "post" ++++ + diff --git a/content/consulting-thankyou.md b/content/consulting-thankyou.md deleted file mode 100644 index ff2241c..0000000 --- a/content/consulting-thankyou.md +++ /dev/null @@ -1,20 +0,0 @@ -+++ -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* - - diff --git a/content/consulting.md b/content/consulting.md deleted file mode 100644 index 14e9469..0000000 --- a/content/consulting.md +++ /dev/null @@ -1,116 +0,0 @@ -+++ -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 >}} - - - - - -
-
- -
- - - - - - - - - - - - - - - - - - - - - - -
- -{{< /rawhtml >}} - diff --git a/content/post/_index.md b/content/post/_index.md index a3fe8c1..78ade06 100644 --- a/content/post/_index.md +++ b/content/post/_index.md @@ -1,6 +1,11 @@ +++ -aliases = ["posts", "articles", "blog", "showcase", "docs"] -title = "Posts" -author = "Salar Rahmanian" -tags = ["index"] +paginate_by = 4 +path = "/post" +title = "Articles" +sort_by = "date" +template = "section.html" +insert_anchor_links = "left" + +[extra] +show_previous_next_article_links = true +++ diff --git a/content/post/all-good-things-come-to-an-end.md b/content/post/all-good-things-come-to-an-end.md index c524efc..c5379c9 100644 --- a/content/post/all-good-things-come-to-an-end.md +++ b/content/post/all-good-things-come-to-an-end.md @@ -1,24 +1,18 @@ +++ title = "All Good Things Come to an End" -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." -featured = false -draft = false -toc = false -featureImage = "" -thumbnail = "" -shareImage = "" -codeMaxLines = 30 -codeLineNumbers = false -figurePositionShow = false +date = 2021-04-14T12:03:44-07:00 + +[taxonomies] +tags = ["meetup", "conference", "talks"] +categories = ["Announcements"] + +[extra] +toc = true keywords = ["meetup", "conference", "technical talks", "events", "organizer"] -tags = ["meetup", "conference", "technical talks"] -categories = ["meetup", "conference", "technical talks"] +++ -**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 >}} +{{ youtube(id="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. @@ -57,5 +51,3 @@ Keep in touch all, lets get together sometime for a happy hour (be it virtual or Thank you 🙏🍷 All ! -### [Subscribe to my newsletter](https://notes.softinio.com) - diff --git a/content/post/announcing-my-new-site-for-great-technical-video-content.md b/content/post/announcing-my-new-site-for-great-technical-video-content.md index 45f1267..ebb6267 100644 --- a/content/post/announcing-my-new-site-for-great-technical-video-content.md +++ b/content/post/announcing-my-new-site-for-great-technical-video-content.md @@ -1,19 +1,15 @@ +++ title = "Announcing My New Site for Great Technical Video Content" -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." -featured = true -draft = false -toc = false -featureImage = "/img/SF1.jpg" -thumbnail = "" -shareImage = "" -codeMaxLines = 30 -codeLineNumbers = false -figurePositionShow = false +date = 2021-11-22T18:07:52-08:00 + +[taxonomies] +tags = ["video", "meetup", "conference", "talks"] +categories = ["Talks", "Announcements"] + +[extra] +toc = true 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) @@ -30,7 +26,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). -{{< peertube id="e7548279-6a4c-46ae-80ed-5d434bb86f53" title="0" >}} +{{ peertube(id="e7548279-6a4c-46ae-80ed-5d434bb86f53") }} #### Can I post my content on your site? diff --git a/static/img/via/Screen-Shot-2018-08-10-08-56-19.png b/content/post/announcing-sfbayareatech/announcing_sfbayareatech.png similarity index 100% rename from static/img/via/Screen-Shot-2018-08-10-08-56-19.png rename to content/post/announcing-sfbayareatech/announcing_sfbayareatech.png diff --git a/content/post/announcing-sfbayareatech.md b/content/post/announcing-sfbayareatech/index.md similarity index 95% rename from content/post/announcing-sfbayareatech.md rename to content/post/announcing-sfbayareatech/index.md index f265fed..07853e6 100644 --- a/content/post/announcing-sfbayareatech.md +++ b/content/post/announcing-sfbayareatech/index.md @@ -1,11 +1,15 @@ +++ title = "Life changes and announcing SFBayAreaTech" -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" -draft = false -keywords = ["sfbayareatech", "slack", "community", "san francisco", "bay area", "california"] +date = 2018-08-10T07:29:10-07:00 + +[taxonomies] tags = ["sfbayareatechies"] -categories = ["general"] +categories = ["announcements"] + +[extra] +toc = true +keywords = ["sfbayareatech", "san francisco", "bay area", "california"] +++ #### Update: Since writing this blog, I have changed jobs and SFBayAreaTech has changed to #### @@ -20,7 +24,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): -![Tech celebrities](/img/via/Screen-Shot-2018-08-10-08-56-19.png) +![Tech celebrities](announcing_sfbayareatech.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. diff --git a/static/img/akka_actor_system_design.png b/content/post/introduction-to-akka-typed-using-scala/akka_actor_system_design.png similarity index 100% rename from static/img/akka_actor_system_design.png rename to content/post/introduction-to-akka-typed-using-scala/akka_actor_system_design.png diff --git a/static/img/akka_logo.svg b/content/post/introduction-to-akka-typed-using-scala/akka_logo.svg similarity index 100% rename from static/img/akka_logo.svg rename to content/post/introduction-to-akka-typed-using-scala/akka_logo.svg diff --git a/content/post/introduction-to-akka-typed-using-scala.md b/content/post/introduction-to-akka-typed-using-scala/index.md similarity index 96% rename from content/post/introduction-to-akka-typed-using-scala.md rename to content/post/introduction-to-akka-typed-using-scala/index.md index d0a5930..33be64e 100644 --- a/content/post/introduction-to-akka-typed-using-scala.md +++ b/content/post/introduction-to-akka-typed-using-scala/index.md @@ -1,21 +1,20 @@ +++ title = "Introduction to Akka Typed Using Scala" -date = 2020-10-24T20:32:41-07:00 description = "An Introduction to AKKA Typed using Scala with an example" -featured = false -draft = false -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"] +date = 2020-10-24T20:32:41-07:00 + +[taxonomies] tags = ["actor model", "concurrency", "distributed systems", "scala", "akka"] -categories = ["concurrency", "distributed systems", "scala"] +categories = ["Software Engineering"] + +[extra] +social_media_card = "akka_logo.svg" +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"] +++ +![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. 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. @@ -26,7 +25,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. -![Akka Actor System Design Example](/img/akka_actor_system_design.png) +![Akka Actor System Design Example](akka_actor_system_design.png) - `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 diff --git a/static/img/actor.png b/content/post/introduction-to-the-actor-model/actor.png similarity index 100% rename from static/img/actor.png rename to content/post/introduction-to-the-actor-model/actor.png diff --git a/static/img/actor_oranges_example.png b/content/post/introduction-to-the-actor-model/actor_oranges_example.png similarity index 100% rename from static/img/actor_oranges_example.png rename to content/post/introduction-to-the-actor-model/actor_oranges_example.png diff --git a/content/post/introduction-to-the-actor-model.md b/content/post/introduction-to-the-actor-model/index.md similarity index 95% rename from content/post/introduction-to-the-actor-model.md rename to content/post/introduction-to-the-actor-model/index.md index 8f2b538..1def843 100644 --- a/content/post/introduction-to-the-actor-model.md +++ b/content/post/introduction-to-the-actor-model/index.md @@ -1,21 +1,20 @@ +++ title = "Introduction to the Actor Model" -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." -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"] +date = 2020-10-04T11:23:12-07:00 + +[taxonomies] tags = ["actor model", "concurrency", "distributed systems"] -categories = ["concurrency", "distributed systems"] +categories = ["Software Engineering"] + +[extra] +social_media_card = "introduction_to_the_actor_model.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", "swift language actors"] +++ +![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. 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. @@ -26,7 +25,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. -![Actor](/img/actor.png) +![Actor](actor.png) An Actor consists of an isolated internal state, an address, a mailbox and a behavior. @@ -59,7 +58,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. -![Object Oriented Programming Flow Example](/img/oop_oranges_example.png) +![Object Oriented Programming Flow Example](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: @@ -77,7 +76,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. -![Actor Programming Flow Example](/img/actor_oranges_example.png) +![Actor Programming Flow Example](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. diff --git a/static/img/via/Screen-Shot-2020-10-17-15-56-15.66.png b/content/post/introduction-to-the-actor-model/introduction_to_the_actor_model.png similarity index 100% rename from static/img/via/Screen-Shot-2020-10-17-15-56-15.66.png rename to content/post/introduction-to-the-actor-model/introduction_to_the_actor_model.png diff --git a/static/img/oop_oranges_example.png b/content/post/introduction-to-the-actor-model/oop_oranges_example.png similarity index 100% rename from static/img/oop_oranges_example.png rename to content/post/introduction-to-the-actor-model/oop_oranges_example.png diff --git a/static/img/ZIO.png b/content/post/introduction-to-zio-actors/ZIO.png similarity index 100% rename from static/img/ZIO.png rename to content/post/introduction-to-zio-actors/ZIO.png diff --git a/content/post/introduction-to-zio-actors.md b/content/post/introduction-to-zio-actors/index.md similarity index 96% rename from content/post/introduction-to-zio-actors.md rename to content/post/introduction-to-zio-actors/index.md index e24c93a..c36d913 100644 --- a/content/post/introduction-to-zio-actors.md +++ b/content/post/introduction-to-zio-actors/index.md @@ -1,21 +1,20 @@ +++ title = "Introduction to Zio Actors" -date = 2020-11-01T14:14:21-08:00 description = "Introduction to ZIO Actors" -featured = false -draft = false +date = 2020-11-01T14:14:21-08:00 + +[taxonomies] +tags = ["actor model", "concurrency", "distributed systems", "scala", "functional programming", "zio"] +categories = ["Software Engineering"] + +[extra] toc = true -featureImage = "/img/ZIO.png" -thumbnail = "" -shareImage = "" -codeMaxLines = 30 -codeLineNumbers = false -figurePositionShow = false +social_media_card = "ZIO.png" 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. 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. @@ -28,7 +27,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. -![ZIO Actor System Design Example](/img/zio_actor_system_design.png) +![ZIO Actor System Design Example](zio_actor_system_design.png) - `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 diff --git a/static/img/zio_actor_system_design.png b/content/post/introduction-to-zio-actors/zio_actor_system_design.png similarity index 100% rename from static/img/zio_actor_system_design.png rename to content/post/introduction-to-zio-actors/zio_actor_system_design.png diff --git a/content/post/lessons-learned-from-being-a-zio-contributor.md b/content/post/lessons-learned-from-being-a-zio-contributor.md deleted file mode 100644 index 8d712e1..0000000 --- a/content/post/lessons-learned-from-being-a-zio-contributor.md +++ /dev/null @@ -1,167 +0,0 @@ -+++ -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 . 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 🤣 - - - - - - diff --git a/content/post/migrating-from-pelican-to-hugo.md b/content/post/migrating-from-pelican-to-hugo.md index a9d57f5..622d317 100644 --- a/content/post/migrating-from-pelican-to-hugo.md +++ b/content/post/migrating-from-pelican-to-hugo.md @@ -1,11 +1,15 @@ +++ title = "Migrating from Pelican to Hugo" -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." +date = "2015-11-29T07:16:53-05:00" + +[taxonomies] +tags = ["blog"] +categories = ["Blogging"] + +[extra] toc = true 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/). diff --git a/content/post/moving-from-homebrew-to-nix-package-manager.md b/content/post/moving-from-homebrew-to-nix-package-manager.md index 1a3d302..2b8feda 100644 --- a/content/post/moving-from-homebrew-to-nix-package-manager.md +++ b/content/post/moving-from-homebrew-to-nix-package-manager.md @@ -1,14 +1,15 @@ +++ title = "Moving from Homebrew to Nix Package Manager" -date = 2019-02-16T18:30:40-07:00 description = "Moving from Homebrew to Nix Package manager on my macbook pro" -featured = true -draft = false -toc = true -featureImage = "/img/via/Screen-Shot-2019-02-17-13-04-16.png" -keywords = ["nix", "nixos", "macos", "macbook", "package manager", "functional programming"] +date = 2019-02-16T18:30:40-07:00 + +[taxonomies] tags = ["nix", "nixos", "macos", "functional programming"] -categories = ["nix", "nixos", "macos"] +categories = ["Developer Tools"] + +[extra] +toc = true +keywords = ["nix", "nixos", "macos", "macbook", "package manager", "functional programming"] +++ 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. diff --git a/static/img/via/Mya_team_PyBay_2018.jpg b/content/post/pybay-2018-san-francisco/Mya_team_PyBay_2018.jpg similarity index 100% rename from static/img/via/Mya_team_PyBay_2018.jpg rename to content/post/pybay-2018-san-francisco/Mya_team_PyBay_2018.jpg diff --git a/static/img/via/PyBay2018Crew.jpeg b/content/post/pybay-2018-san-francisco/PyBay2018Crew.jpeg similarity index 100% rename from static/img/via/PyBay2018Crew.jpeg rename to content/post/pybay-2018-san-francisco/PyBay2018Crew.jpeg diff --git a/static/img/via/PyBay_2018_Start.png b/content/post/pybay-2018-san-francisco/PyBay_2018_Start.png similarity index 100% rename from static/img/via/PyBay_2018_Start.png rename to content/post/pybay-2018-san-francisco/PyBay_2018_Start.png diff --git a/static/img/via/Rachel_Thomas_PyBay_2018.png b/content/post/pybay-2018-san-francisco/Rachel_Thomas_PyBay_2018.png similarity index 100% rename from static/img/via/Rachel_Thomas_PyBay_2018.png rename to content/post/pybay-2018-san-francisco/Rachel_Thomas_PyBay_2018.png diff --git a/static/img/via/Raymond_Hettinger_PyBay_2018.jpg b/content/post/pybay-2018-san-francisco/Raymond_Hettinger_PyBay_2018.jpg similarity index 100% rename from static/img/via/Raymond_Hettinger_PyBay_2018.jpg rename to content/post/pybay-2018-san-francisco/Raymond_Hettinger_PyBay_2018.jpg diff --git a/static/img/via/Travis_Olaphant_Keynote_PyBay2018.JPG b/content/post/pybay-2018-san-francisco/Travis_Olaphant_Keynote_PyBay2018.JPG similarity index 100% rename from static/img/via/Travis_Olaphant_Keynote_PyBay2018.JPG rename to content/post/pybay-2018-san-francisco/Travis_Olaphant_Keynote_PyBay2018.JPG diff --git a/static/img/via/Travis_Olaphant_PyBay_2018.jpg b/content/post/pybay-2018-san-francisco/Travis_Olaphant_PyBay_2018.jpg similarity index 100% rename from static/img/via/Travis_Olaphant_PyBay_2018.jpg rename to content/post/pybay-2018-san-francisco/Travis_Olaphant_PyBay_2018.jpg diff --git a/static/img/via/Yuri_Selivanov_PyBay_2018.jpg b/content/post/pybay-2018-san-francisco/Yuri_Selivanov_PyBay_2018.jpg similarity index 100% rename from static/img/via/Yuri_Selivanov_PyBay_2018.jpg rename to content/post/pybay-2018-san-francisco/Yuri_Selivanov_PyBay_2018.jpg diff --git a/content/post/pybay-2018-san-francisco.md b/content/post/pybay-2018-san-francisco/index.md similarity index 90% rename from content/post/pybay-2018-san-francisco.md rename to content/post/pybay-2018-san-francisco/index.md index 7d2c7e8..e79af9b 100644 --- a/content/post/pybay-2018-san-francisco.md +++ b/content/post/pybay-2018-san-francisco/index.md @@ -1,13 +1,19 @@ +++ title = "PyBay 2018 San Francisco" -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" -draft = false -featureImage = "/img/via/PyBay_2018_Start.png" -keywords = ["python", "pybay", "sfpython", "pycon", "san francisco", "bay area", "california", "conference"] +date = 2018-10-25T18:30:40-07:00 + +[taxonomies] tags = ["python", "conference"] -categories = ["python", "conference"] + +[extra] +social_media_card = "PyBay_2018_Start.png" +toc = true +keywords = ["python", "pybay", "sfpython", "pycon", "san francisco", "bay area", "california", "conference"] +++ + +![PyBay 2018](PyBay_2018_Start.png) + 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 know that I am passionate about Scala and Python. To me being a master of these @@ -38,8 +44,6 @@ build. My biggest take aways from her talk were: matter so designing algorithms powering your AI you need to always remember that and take into account. - {{< youtube D4A18tUUb2Y >}} - - Machines can be used to predict the future and can be biased - Software is used to make *Life changing* decisions - We have a responsability to think about our whole system and how it impacts peoples lives @@ -62,7 +66,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) - [Datasheets for datasets](https://arxiv.org/abs/1803.09010) -![Salar Rahmanian meets Rachel Thomas after keynote at PyBay 2018](/img/via/Rachel_Thomas_PyBay_2018.png) +![Salar Rahmanian meets Rachel Thomas after keynote at PyBay 2018](Rachel_Thomas_PyBay_2018.png) # 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. @@ -71,13 +75,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/) -![Raymond Hettinger at PyBay 2018](/img/via/Raymond_Hettinger_PyBay_2018.jpg) +![Raymond Hettinger at PyBay 2018](Raymond_Hettinger_PyBay_2018.jpg) ## 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. -![Yuri Selivanov at PyBay 2018](/img/via/Yuri_Selivanov_PyBay_2018.jpg) +![Yuri Selivanov at PyBay 2018](Yuri_Selivanov_PyBay_2018.jpg) # 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/) @@ -86,19 +90,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. -![Salar Rahmanian meeting Travis Olaphant at PyBay 2018](/img/via/Travis_Olaphant_PyBay_2018.jpg) -![Final Day Keynote by Travis Olaphant at PyBay 2018](/img/via/Travis_Olaphant_Keynote_PyBay2018.JPG) +![Salar Rahmanian meeting Travis Olaphant at PyBay 2018](Travis_Olaphant_PyBay_2018.jpg) +![Final Day Keynote by Travis Olaphant at PyBay 2018](Travis_Olaphant_Keynote_PyBay2018.JPG) # 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: -{{< youtube KqqMSB0eyhk >}} +{{ youtube(id="KqqMSB0eyhk") }} # 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. -![Mya team at PyBay 2018](/img/via/Mya_team_PyBay_2018.jpg) +![Mya team at PyBay 2018](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/) -![PyBay 2018 Crew](/img/via/PyBay2018Crew.jpeg) +![PyBay 2018 Crew](PyBay2018Crew.jpeg) diff --git a/content/post/scale-by-the-bay-2018-san-francisco.md b/content/post/scale-by-the-bay-2018-san-francisco/index.md similarity index 91% rename from content/post/scale-by-the-bay-2018-san-francisco.md rename to content/post/scale-by-the-bay-2018-san-francisco/index.md index 8ca44da..a3c80e7 100644 --- a/content/post/scale-by-the-bay-2018-san-francisco.md +++ b/content/post/scale-by-the-bay-2018-san-francisco/index.md @@ -1,23 +1,26 @@ +++ title = "Scale By The Bay 2018 San Francisco" -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" -draft = false -keywords = ["scala", "bythebay", "sfscala", "functional programming", "san francisco", "bay area", "california", "conference"] +date = 2019-05-02T18:30:40-07:00 + +[taxonomies] tags = ["scala", "conference", "functional programming"] -categories = ["scala", "conference", "functional programming"] + +[extra] +toc = true +keywords = ["scala", "bythebay", "sfscala", "functional programming", "san francisco", "bay area", "california", "conference"] +++ 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](/img/via/scalebythebay_2018_header.jpg) +![Scale By the Bay 2018](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) 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 -![Scale By the Bay 2018 Keynotes](/img/via/scalebythebay_2018_keynotes.jpg) +![Scale By the Bay 2018 Keynotes](scalebythebay_2018_keynotes.jpg) ### New Functional Constructs in Scala 3 by Martin Odersky (Creator of Scala) @@ -25,7 +28,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. -{{< youtube 6P06YHc8faw >}} +{{ youtube(id="6P06YHc8faw") }} ### 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. @@ -34,40 +37,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. -{{< youtube DOoJzaXOGxs >}} +{{ youtube(id="DOoJzaXOGxs") }} ## 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. 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 EuNEZW8ljeY >}} +{{ youtube(id="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. -{{< youtube Gig-f_HXvLI >}} +{{ youtube(id="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. -{{< youtube 23O32DMm69E >}} +{{ youtube(id="23O32DMm69E") }} ## Hero’s 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. Here are some pictures of the tech heroes I got to meet at this conference: -![Scale By the Bay 2018 ](/img/via/scale_by_the_bay_2018_1.JPG) +![Scale By the Bay 2018 ](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), 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](/img/via/scale_by_the_bay_2018_2.JPG) +![Scale By the Bay 2018](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) -![Scale By the Bay 2018](/img/via/scale_by_the_bay_2018_4.JPG) +![Scale By the Bay 2018](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), 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](/img/via/scale_by_the_bay_2018_3.JPG) +![Scale By the Bay 2018](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), Bottom: [Jon Pretty (Scala Center Advisory board chair)](https://twitter.com/propensive/) @@ -76,5 +79,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. -{{< youtube iTeh-wnvweQ >}} +{{ youtube(id="iTeh-wnvweQ") }} diff --git a/static/img/via/scale_by_the_bay_2018_1.JPG b/content/post/scale-by-the-bay-2018-san-francisco/scale_by_the_bay_2018_1.JPG similarity index 100% rename from static/img/via/scale_by_the_bay_2018_1.JPG rename to content/post/scale-by-the-bay-2018-san-francisco/scale_by_the_bay_2018_1.JPG diff --git a/static/img/via/scale_by_the_bay_2018_2.JPG b/content/post/scale-by-the-bay-2018-san-francisco/scale_by_the_bay_2018_2.JPG similarity index 100% rename from static/img/via/scale_by_the_bay_2018_2.JPG rename to content/post/scale-by-the-bay-2018-san-francisco/scale_by_the_bay_2018_2.JPG diff --git a/static/img/via/scale_by_the_bay_2018_3.JPG b/content/post/scale-by-the-bay-2018-san-francisco/scale_by_the_bay_2018_3.JPG similarity index 100% rename from static/img/via/scale_by_the_bay_2018_3.JPG rename to content/post/scale-by-the-bay-2018-san-francisco/scale_by_the_bay_2018_3.JPG diff --git a/static/img/via/scale_by_the_bay_2018_4.JPG b/content/post/scale-by-the-bay-2018-san-francisco/scale_by_the_bay_2018_4.JPG similarity index 100% rename from static/img/via/scale_by_the_bay_2018_4.JPG rename to content/post/scale-by-the-bay-2018-san-francisco/scale_by_the_bay_2018_4.JPG diff --git a/static/img/via/scalebythebay_2018_header.jpg b/content/post/scale-by-the-bay-2018-san-francisco/scalebythebay_2018_header.jpg similarity index 100% rename from static/img/via/scalebythebay_2018_header.jpg rename to content/post/scale-by-the-bay-2018-san-francisco/scalebythebay_2018_header.jpg diff --git a/static/img/via/scalebythebay_2018_keynotes.jpg b/content/post/scale-by-the-bay-2018-san-francisco/scalebythebay_2018_keynotes.jpg similarity index 100% rename from static/img/via/scalebythebay_2018_keynotes.jpg rename to content/post/scale-by-the-bay-2018-san-francisco/scalebythebay_2018_keynotes.jpg diff --git a/content/post/unicomp-new-model-m-keyboard.md b/content/post/unicomp-new-model-m-keyboard/index.md similarity index 92% rename from content/post/unicomp-new-model-m-keyboard.md rename to content/post/unicomp-new-model-m-keyboard/index.md index e7b3c9a..f74ac25 100644 --- a/content/post/unicomp-new-model-m-keyboard.md +++ b/content/post/unicomp-new-model-m-keyboard/index.md @@ -1,21 +1,20 @@ +++ title = "Unicomp New Model M Keyboard" -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." -featured = false -draft = false -toc = false -featureImage = "/img/unicomp_new_model_m.png" -thumbnail = "" -shareImage = "" -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"] +date = 2020-12-18T20:08:42-08:00 + +[taxonomies] tags = ["keyboards"] -categories = ["hardware"] +categories = ["Hardware"] + +[extra] +social_media_card = "unicomp_new_model_m.png" +toc = true +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"] +++ +![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. 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. @@ -30,15 +29,15 @@ When IBM decided to stop manufacturing keyboards, a company called Lexmark bough This is how it was delivered: -![Unicomp New Model M box](/img/unicomp_model_m_box.png) +![Unicomp New Model M box](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: -![Unicomp New Model M opened box](/img/unicomp_model_m_open_box.png) +![Unicomp New Model M opened box](unicomp_model_m_open_box.png) I took it out of its box and removed all packaging material it was wrapped in: -![Unicomp New Model M Keyboard](/img/unicomp_model_m_out_of_box.png) +![Unicomp New Model M Keyboard](unicomp_model_m_out_of_box.png) ## Review @@ -52,7 +51,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. -![Unicomp New Model M with macOS layout](/img/unicomp_model_m_mac_keys.png) +![Unicomp New Model M with macOS layout](unicomp_model_m_mac_keys.png) ### Unicomp quality of service diff --git a/static/img/unicomp_model_m_box.png b/content/post/unicomp-new-model-m-keyboard/unicomp_model_m_box.png similarity index 100% rename from static/img/unicomp_model_m_box.png rename to content/post/unicomp-new-model-m-keyboard/unicomp_model_m_box.png diff --git a/static/img/unicomp_model_m_mac_keys.png b/content/post/unicomp-new-model-m-keyboard/unicomp_model_m_mac_keys.png similarity index 100% rename from static/img/unicomp_model_m_mac_keys.png rename to content/post/unicomp-new-model-m-keyboard/unicomp_model_m_mac_keys.png diff --git a/static/img/unicomp_model_m_open_box.png b/content/post/unicomp-new-model-m-keyboard/unicomp_model_m_open_box.png similarity index 100% rename from static/img/unicomp_model_m_open_box.png rename to content/post/unicomp-new-model-m-keyboard/unicomp_model_m_open_box.png diff --git a/static/img/unicomp_model_m_out_of_box.png b/content/post/unicomp-new-model-m-keyboard/unicomp_model_m_out_of_box.png similarity index 100% rename from static/img/unicomp_model_m_out_of_box.png rename to content/post/unicomp-new-model-m-keyboard/unicomp_model_m_out_of_box.png diff --git a/static/img/unicomp_new_model_m.png b/content/post/unicomp-new-model-m-keyboard/unicomp_new_model_m.png similarity index 100% rename from static/img/unicomp_new_model_m.png rename to content/post/unicomp-new-model-m-keyboard/unicomp_new_model_m.png diff --git a/content/post/using-pyenv-for-python-projects.md b/content/post/using-pyenv-for-python-projects.md index 65a3f22..6799b49 100644 --- a/content/post/using-pyenv-for-python-projects.md +++ b/content/post/using-pyenv-for-python-projects.md @@ -1,12 +1,15 @@ +++ title = "Using pyenv for Python projects" -date = "2015-04-13T09:06:03-05:00" -draft = false -toc = true 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"] +date = "2015-04-13T09:06:03-05:00" + +[taxonomies] +tags = ["python"] +categories = ["Developer Tools"] + +[extra] +toc = true +keywords = ["python", "pyenv"] +++ Using [pyenv][3] to manage your virtual environments makes working on multiple projects, each using a different version of python a breeze. @@ -19,13 +22,13 @@ Here some simple notes on how I setup and use [pyenv][3] : **Install using [homebrew][5]** -``` -$ brew install pyenv pyenv-virtualenv +```bash +brew install pyenv pyenv-virtualenv ``` **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-virtualenv-init > /dev/null; then eval "$(pyenv virtualenv-init -)"; fi ``` @@ -35,47 +38,47 @@ if which pyenv-virtualenv-init > /dev/null; then eval "$(pyenv virtualenv-init - **Checkout from github** -``` -$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv -$ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv +```bash +git clone https://github.com/yyuu/pyenv.git ~/.pyenv +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)** -``` -$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile -$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile -$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile -$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile +```bash +echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile +echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile +echo 'eval "$(pyenv init -)"' >> ~/.bash_profile +echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile ``` ## Using pyenv ## **To install a new version of [Python][6]** -``` -$ pyenv install -$ pyenv rehash +```bash +pyenv install +pyenv rehash ``` **To get a list of [Python][6] versions available** -``` -$ pyenv install -l +```bash +pyenv install -l ``` **To create a new virtual environment** -``` -$ pyenv virtualenv [pyenv-version] [virtualenv-name] +```bash +pyenv virtualenv [pyenv-version] [virtualenv-name] ``` **To use your new virtual environment within your project** 1. Change to your projects root directory 1. Run: -``` -$ pyenv local [virtualenv-name] +```bash +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. diff --git a/content/projects/_index.md b/content/projects/_index.md new file mode 100644 index 0000000..4ee8429 --- /dev/null +++ b/content/projects/_index.md @@ -0,0 +1,10 @@ ++++ +title = "Projects" +sort_by = "weight" +template = "cards.html" +insert_anchor_links = "left" + +[extra] +show_reading_time = false +quick_navigation_buttons = true ++++ diff --git a/content/projects/scaladex-nvim/index.md b/content/projects/scaladex-nvim/index.md new file mode 100644 index 0000000..b0548c7 --- /dev/null +++ b/content/projects/scaladex-nvim/index.md @@ -0,0 +1,33 @@ ++++ +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: + - README: + diff --git a/content/projects/scaladex-nvim/scala-logo.png b/content/projects/scaladex-nvim/scala-logo.png new file mode 100644 index 0000000..47558b5 Binary files /dev/null and b/content/projects/scaladex-nvim/scala-logo.png differ diff --git a/content/projects/scalanews/index.md b/content/projects/scalanews/index.md new file mode 100644 index 0000000..176844d --- /dev/null +++ b/content/projects/scalanews/index.md @@ -0,0 +1,30 @@ ++++ +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: + - About Page: +- Repository: + - README: diff --git a/content/projects/scalanews/scalanews.png b/content/projects/scalanews/scalanews.png new file mode 100644 index 0000000..88ae5db Binary files /dev/null and b/content/projects/scalanews/scalanews.png differ diff --git a/content/projects/zio-actors/ZIO.png b/content/projects/zio-actors/ZIO.png new file mode 100644 index 0000000..5c03841 Binary files /dev/null and b/content/projects/zio-actors/ZIO.png differ diff --git a/content/projects/zio-actors/index.md b/content/projects/zio-actors/index.md new file mode 100644 index 0000000..af47503 --- /dev/null +++ b/content/projects/zio-actors/index.md @@ -0,0 +1,35 @@ ++++ +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: + - README: +- Documentation: + + diff --git a/content/resume.md b/content/resume.md index 599ca54..a39d67f 100644 --- a/content/resume.md +++ b/content/resume.md @@ -1,11 +1,11 @@ +++ title = "Resume" -date = "2018-04-16T09:16:07-05:00" description = "Salar Rahmanian Resume" +date = "2018-04-16T09:16:07-05:00" + +[extra] +isso = false keywords = ["Salar", "Rahmanian", "Salar Rahmanian", "Resume", "CV"] -showReadTime = false -showDate = false -comments = false +++ # Salar Rahmanian # ## My Location ## @@ -93,17 +93,19 @@ 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: -#### Current Meetups #### +#### Past Meetups #### + +##### Silicon Valley Nix / NixOS User Group ##### + +Organizer from *2022* to *2023*: ##### Swift Language User Group (San Francisco) ##### -Organizer since *2022*: +Organizer from *2022* to *2023*: ##### Bay Area Haskell & Functional Programming User Group ##### -Organizer since *2021*: - -#### Past Meetups #### +Organizer from *2021* to *2023*: ##### San Francisco Java User Group Meetup ##### diff --git a/content/subscribe/index.md b/content/subscribe/index.md new file mode 100644 index 0000000..934e29b --- /dev/null +++ b/content/subscribe/index.md @@ -0,0 +1,10 @@ ++++ +title = "Subscribe" +template = "subscribe.html" +path = "subscribe" + +[extra] +isso = false +quick_navigation_buttons = true ++++ + diff --git a/content/talks/_index.md b/content/talks/_index.md new file mode 100644 index 0000000..4a8eef4 --- /dev/null +++ b/content/talks/_index.md @@ -0,0 +1,11 @@ ++++ +title = "Talks" +sort_by = "weight" +template = "cards.html" +insert_anchor_links = "left" + +[extra] +show_reading_time = false +quick_navigation_buttons = true ++++ + diff --git a/content/post/acting-lessons-for-scala-engineers-with-akka-and-zio.md b/content/talks/acting-lessons-for-scala-engineers-with-akka-and-zio/index.md similarity index 71% rename from content/post/acting-lessons-for-scala-engineers-with-akka-and-zio.md rename to content/talks/acting-lessons-for-scala-engineers-with-akka-and-zio/index.md index 7862d23..568ebe9 100644 --- a/content/post/acting-lessons-for-scala-engineers-with-akka-and-zio.md +++ b/content/talks/acting-lessons-for-scala-engineers-with-akka-and-zio/index.md @@ -1,27 +1,31 @@ +++ title = "Acting Lessons for Scala Engineers With Akka and Zio" -date = 2021-04-10T10:20:09-07:00 description = "Salar Rahmanian's talk at Scale By the Bay conference 2020 on Akka Actors and ZIO Actors" -featured = true -draft = false -toc = false -featureImage = "/img/sbtb2020.jpg" -thumbnail = "" -shareImage = "" -codeMaxLines = 30 -codeLineNumbers = false -figurePositionShow = false +date = 2021-04-10T10:20:09-07:00 +weight = 3 + +[taxonomies] +tags = ["actor model", "concurrency", "distributed systems", "scala", "functional programming", "conference", "talks"] +categories = ["Talks"] + +[extra] +local_image = "talks/acting-lessons-for-scala-engineers-with-akka-and-zio/sbtb2020.webp" +social_media_card = "sbtb2020.jpg" +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", "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). -### Here is the recording of my talk +### Recording of my talk -{{< youtube AQXBlbkf9wc >}} +{{ youtube(id="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 diff --git a/static/img/sbtb2020.jpg b/content/talks/acting-lessons-for-scala-engineers-with-akka-and-zio/sbtb2020.jpg similarity index 100% rename from static/img/sbtb2020.jpg rename to content/talks/acting-lessons-for-scala-engineers-with-akka-and-zio/sbtb2020.jpg diff --git a/content/talks/acting-lessons-for-scala-engineers-with-akka-and-zio/sbtb2020.webp b/content/talks/acting-lessons-for-scala-engineers-with-akka-and-zio/sbtb2020.webp new file mode 100644 index 0000000..8a9e646 Binary files /dev/null and b/content/talks/acting-lessons-for-scala-engineers-with-akka-and-zio/sbtb2020.webp differ diff --git a/content/talks/elevating-python-development-with-nix/Elevating_Python_Development_with_Nix_Package_Manager.png b/content/talks/elevating-python-development-with-nix/Elevating_Python_Development_with_Nix_Package_Manager.png new file mode 100644 index 0000000..e4ecac0 Binary files /dev/null and b/content/talks/elevating-python-development-with-nix/Elevating_Python_Development_with_Nix_Package_Manager.png differ diff --git a/content/talks/elevating-python-development-with-nix/index.md b/content/talks/elevating-python-development-with-nix/index.md new file mode 100644 index 0000000..1c24744 --- /dev/null +++ b/content/talks/elevating-python-development-with-nix/index.md @@ -0,0 +1,29 @@ ++++ +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). + diff --git a/content/talks/next-level-diagnostics-for-async-and-concurrent-errors-with-zio/index.md b/content/talks/next-level-diagnostics-for-async-and-concurrent-errors-with-zio/index.md new file mode 100644 index 0000000..e933efe --- /dev/null +++ b/content/talks/next-level-diagnostics-for-async-and-concurrent-errors-with-zio/index.md @@ -0,0 +1,29 @@ ++++ +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). + diff --git a/content/talks/next-level-diagnostics-for-async-and-concurrent-errors-with-zio/sbtb2019.png b/content/talks/next-level-diagnostics-for-async-and-concurrent-errors-with-zio/sbtb2019.png new file mode 100644 index 0000000..dc72d45 Binary files /dev/null and b/content/talks/next-level-diagnostics-for-async-and-concurrent-errors-with-zio/sbtb2019.png differ diff --git a/content/talks/next-level-diagnostics-for-async-and-concurrent-errors-with-zio/slides.pdf b/content/talks/next-level-diagnostics-for-async-and-concurrent-errors-with-zio/slides.pdf new file mode 100644 index 0000000..bfa4c15 Binary files /dev/null and b/content/talks/next-level-diagnostics-for-async-and-concurrent-errors-with-zio/slides.pdf differ diff --git a/content/talks/streamline-your-development-workflow/index.md b/content/talks/streamline-your-development-workflow/index.md new file mode 100644 index 0000000..ea938f5 --- /dev/null +++ b/content/talks/streamline-your-development-workflow/index.md @@ -0,0 +1,37 @@ ++++ +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). + diff --git a/content/talks/streamline-your-development-workflow/sbtb2023.png b/content/talks/streamline-your-development-workflow/sbtb2023.png new file mode 100644 index 0000000..9b1127e Binary files /dev/null and b/content/talks/streamline-your-development-workflow/sbtb2023.png differ diff --git a/content/til/_index.md b/content/til/_index.md new file mode 100644 index 0000000..de3da8a --- /dev/null +++ b/content/til/_index.md @@ -0,0 +1,12 @@ ++++ +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 ++++ + diff --git a/content/til/configuring-github-pages-with-a-custom-domain.md b/content/til/configuring-github-pages-with-a-custom-domain.md new file mode 100644 index 0000000..b413ab1 --- /dev/null +++ b/content/til/configuring-github-pages-with-a-custom-domain.md @@ -0,0 +1,31 @@ ++++ +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/) + + diff --git a/content/til/converting-html-to-markdown-using-markdownify.md b/content/til/converting-html-to-markdown-using-markdownify.md new file mode 100644 index 0000000..f1d4de4 --- /dev/null +++ b/content/til/converting-html-to-markdown-using-markdownify.md @@ -0,0 +1,31 @@ ++++ +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. + diff --git a/content/til/creating-a-native-image-for-a-scala-and-typelevel-project-using-graalvm.md b/content/til/creating-a-native-image-for-a-scala-and-typelevel-project-using-graalvm.md new file mode 100644 index 0000000..ba7fbfa --- /dev/null +++ b/content/til/creating-a-native-image-for-a-scala-and-typelevel-project-using-graalvm.md @@ -0,0 +1,14 @@ ++++ +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"] ++++ + + diff --git a/data/.keep b/data/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..45061fd --- /dev/null +++ b/flake.lock @@ -0,0 +1,45 @@ +{ + "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 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..1f3a341 --- /dev/null +++ b/flake.nix @@ -0,0 +1,36 @@ +{ + 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 + allSystems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ]; + + forAllSystems = nixpkgs.lib.genAttrs allSystems; + + nixpkgsFor = forAllSystems (system: import nixpkgs { inherit system; }); + + in + { + devShells = forAllSystems (system: + let + pkgs = nixpkgsFor.${system}; + themeName = ((builtins.fromTOML (builtins.readFile "${theme}/theme.toml")).name); + in { + default = pkgs.mkShell { + buildInputs = with pkgs; [ zola ]; + shellHook = '' + mkdir -p themes + ln -snf "${theme}" "themes/${themeName}" + ''; + }; + }); + }; +} diff --git a/go.mod b/go.mod deleted file mode 100644 index b9612ec..0000000 --- a/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module softinio.com - -go 1.18 - -require github.com/softinio/hugo-clarity v0.0.0-20220804231030-5179510a03ea // indirect diff --git a/go.sum b/go.sum deleted file mode 100644 index 2ec3931..0000000 --- a/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -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= diff --git a/layouts/_default/rss.xml b/layouts/_default/rss.xml deleted file mode 100644 index baad8fe..0000000 --- a/layouts/_default/rss.xml +++ /dev/null @@ -1,42 +0,0 @@ -{{- $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 "" | safeHTML }} - - - {{.Site.Author.name}} - {{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}{{ end }} - {{ .Permalink }} - Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{.}} {{ end }}{{ end }}on {{ .Site.Title }} - Hugo -- gohugo.io{{ with .Site.LanguageCode }} - {{.}}{{end}}{{ with .Site.Author.email }} - {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}}{{ with .Site.Author.email }} - {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}}{{ with .Site.Copyright }} - {{.}}{{end}}{{ if not .Date.IsZero }} - {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}{{ end }} - {{- with .OutputFormats.Get "RSS" -}} - {{ printf "" .Permalink .MediaType | safeHTML }} - {{- end -}} - {{ range where (where .Site.Pages ".Section" "post") "Kind" "page" }} - - {{.Site.Author.name}} - {{ .Title }} - {{ .Permalink }} - {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} - {{ with .Site.Author.email }}{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}} - {{ .Permalink }} - {{ .Content | html }} - - {{ end }} - - - diff --git a/layouts/_default/sitemap.xml b/layouts/_default/sitemap.xml deleted file mode 100644 index d368c04..0000000 --- a/layouts/_default/sitemap.xml +++ /dev/null @@ -1,25 +0,0 @@ -{{ printf "" | safeHTML }} - - {{ range where .Data.Pages "Params.sitemap_exclude" "ne" true }} - {{- if .Permalink -}} - - {{ .Permalink }}{{ if not .Lastmod.IsZero }} - {{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}{{ end }}{{ with .Sitemap.ChangeFreq }} - {{ . }}{{ end }}{{ if ge .Sitemap.Priority 0.0 }} - {{ .Sitemap.Priority }}{{ end }}{{ if .IsTranslated }}{{ range .Translations }} - {{ end }} - {{ end }} - - {{- end -}} - {{ end }} - - diff --git a/layouts/partials/comments.html b/layouts/partials/comments.html deleted file mode 100644 index 78f6753..0000000 --- a/layouts/partials/comments.html +++ /dev/null @@ -1,21 +0,0 @@ - -{{ if .Site.Params.giscus.enable }} -
- -
-{{ end }} - diff --git a/layouts/partials/favicon.html b/layouts/partials/favicon.html deleted file mode 100644 index fe5c9ee..0000000 --- a/layouts/partials/favicon.html +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html deleted file mode 100644 index 7e86506..0000000 --- a/layouts/partials/footer.html +++ /dev/null @@ -1,18 +0,0 @@ - {{- 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"}} - diff --git a/layouts/partials/icons.html b/layouts/partials/icons.html deleted file mode 100644 index 555b40a..0000000 --- a/layouts/partials/icons.html +++ /dev/null @@ -1,63 +0,0 @@ - diff --git a/layouts/partials/newsletter.html b/layouts/partials/newsletter.html deleted file mode 100644 index bd3f656..0000000 --- a/layouts/partials/newsletter.html +++ /dev/null @@ -1,6 +0,0 @@ -

Subscribe

-
-Subscribe to my newsletter -
-subscribe - diff --git a/layouts/partials/sidebar.html b/layouts/partials/sidebar.html deleted file mode 100644 index ee89e91..0000000 --- a/layouts/partials/sidebar.html +++ /dev/null @@ -1,125 +0,0 @@ -{{ $s := site.Params }} - - diff --git a/layouts/partials/substack.html b/layouts/partials/substack.html deleted file mode 100644 index ea0c722..0000000 --- a/layouts/partials/substack.html +++ /dev/null @@ -1,6 +0,0 @@ -
-

- -

-
- diff --git a/layouts/robots.txt b/layouts/robots.txt deleted file mode 100644 index 3fe2f9d..0000000 --- a/layouts/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: /consulting-thankyou diff --git a/layouts/shortcodes/peertube.html b/layouts/shortcodes/peertube.html deleted file mode 100644 index 7d5be87..0000000 --- a/layouts/shortcodes/peertube.html +++ /dev/null @@ -1,14 +0,0 @@ -{{ if .IsNamedParams -}} -
- -
-{{- else -}} -
- -
-{{- end }} - diff --git a/layouts/shortcodes/rawhtml.html b/layouts/shortcodes/rawhtml.html deleted file mode 100644 index 72f8e3e..0000000 --- a/layouts/shortcodes/rawhtml.html +++ /dev/null @@ -1,3 +0,0 @@ - -{{.Inner}} - diff --git a/static/SalarRahmanian.png b/static/SalarRahmanian.png new file mode 100644 index 0000000..edb3f3c Binary files /dev/null and b/static/SalarRahmanian.png differ diff --git a/static/css/googleform.css b/static/css/googleform.css deleted file mode 100644 index 97fed94..0000000 --- a/static/css/googleform.css +++ /dev/null @@ -1,46 +0,0 @@ -@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; } - diff --git a/static/favicon-16_16.png b/static/favicon-16_16.png new file mode 100644 index 0000000..0a5bcf8 Binary files /dev/null and b/static/favicon-16_16.png differ diff --git a/static/favicon-32_32.png b/static/favicon-32_32.png new file mode 100644 index 0000000..06cba75 Binary files /dev/null and b/static/favicon-32_32.png differ diff --git a/static/favicon.svg b/static/favicon.svg new file mode 100644 index 0000000..9956183 --- /dev/null +++ b/static/favicon.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/SF1.jpg b/static/img/SF1.jpg deleted file mode 100755 index 294ba82..0000000 Binary files a/static/img/SF1.jpg and /dev/null differ diff --git a/static/img/techstack.png b/static/img/techstack.png deleted file mode 100644 index fb9efa4..0000000 Binary files a/static/img/techstack.png and /dev/null differ diff --git a/static/img/via/Screen-Recording-2020-09-05-20-02-47.gif b/static/img/via/Screen-Recording-2020-09-05-20-02-47.gif deleted file mode 100644 index 98dbd91..0000000 Binary files a/static/img/via/Screen-Recording-2020-09-05-20-02-47.gif and /dev/null differ diff --git a/static/img/via/Screen-Shot-2019-02-17-13-04-16.png b/static/img/via/Screen-Shot-2019-02-17-13-04-16.png deleted file mode 100644 index 1c152c3..0000000 Binary files a/static/img/via/Screen-Shot-2019-02-17-13-04-16.png and /dev/null differ diff --git a/static/salar.jpg b/static/salar.jpg deleted file mode 100644 index 9ef35ad..0000000 Binary files a/static/salar.jpg and /dev/null differ diff --git a/static/social_icons/codeberg.svg b/static/social_icons/codeberg.svg new file mode 100644 index 0000000..65b80f6 --- /dev/null +++ b/static/social_icons/codeberg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/social_icons/git.svg b/static/social_icons/git.svg new file mode 100644 index 0000000..6b6a26a --- /dev/null +++ b/static/social_icons/git.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/social_icons/peertube.svg b/static/social_icons/peertube.svg new file mode 100644 index 0000000..0e6e228 --- /dev/null +++ b/static/social_icons/peertube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/social_icons/twitch.svg b/static/social_icons/twitch.svg new file mode 100644 index 0000000..b2c8ff5 --- /dev/null +++ b/static/social_icons/twitch.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/static/social_icons/xmpp.svg b/static/social_icons/xmpp.svg new file mode 100644 index 0000000..06e4094 --- /dev/null +++ b/static/social_icons/xmpp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/softinio-apple-touch-icon.png b/static/softinio-apple-touch-icon.png new file mode 100644 index 0000000..52c758f Binary files /dev/null and b/static/softinio-apple-touch-icon.png differ diff --git a/templates/partials/custom_header.html b/templates/partials/custom_header.html new file mode 100644 index 0000000..31e31fc --- /dev/null +++ b/templates/partials/custom_header.html @@ -0,0 +1,34 @@ +{% if config.extra.favicon180 %} + +{% endif %} +{% if config.extra.favicon32 %} + +{% endif %} +{% if config.extra.favicon16 %} + +{% endif %} +{%- if config.author %} + +{%- endif %} + +{%- if page.extra.keywords and config.extra.keywords %} + +{%- elif page.extra.keywords %} + +{%- elif config.extra.keywords %} + +{%- endif %} +{%- if config.extra.google %} + +{%- endif %} + +{%- if config.extra.bing %} + +{%- endif %} + +{%- if config.extra.twitter_meta %} + + +{%- endif %} + + diff --git a/templates/partials/footer.html b/templates/partials/footer.html new file mode 100644 index 0000000..d058c40 --- /dev/null +++ b/templates/partials/footer.html @@ -0,0 +1,106 @@ +{%- set separator = config.extra.separator | default(value="•") -%} + +{%- set rel_attributes = macros_rel_attributes::rel_attributes() | trim -%} + +{%- if config.markdown.external_links_target_blank -%} + {%- set blank_target = "target=_blank" -%} +{%- else -%} + {%- set blank_target = "" -%} +{%- endif -%} + +
+
+ + + {# Footer menu #} + + +
+ + {% include "partials/copyright.html" %} + Subscribe to Salar Rahmanian's Newsletter to be informed of new posts. + +
+
+ + {# Load the decoding script if email is encoded #} + {%- if email_needs_decoding -%} + + {%- endif -%} +
+ diff --git a/templates/partials/header.html b/templates/partials/header.html new file mode 100644 index 0000000..0c50fa2 --- /dev/null +++ b/templates/partials/header.html @@ -0,0 +1,166 @@ + + + + + {# Site title #} + {%- include "partials/title.html" -%} + + {# Favicon #} + {% if config.extra.favicon %} + + {% endif %} + {% if config.extra.favicon_emoji %} + + {% endif %} + + {# Feed #} + + + {# CSS #} + {# Load subset of glyphs for header. Avoids flashing issue in Firefox #} + {% if config.extra.custom_subset and config.extra.custom_subset == true %} + + {% elif lang == 'en' %} + + {% elif lang == 'es' %} + + {% endif %} + + {# Define array of CSS files to load. main.css is always loaded. #} + {%- set stylesheets = [ "main.css" ] -%} + + {# Load extra CSS files from config.toml #} + {%- if config.extra.stylesheets -%} + {%- set stylesheets = stylesheets | concat(with=config.extra.stylesheets) -%} + {%- endif -%} + + {# Load extra CSS files from page metadata #} + {%- if page.extra.stylesheets -%} + {%- set stylesheets = stylesheets | concat(with=page.extra.stylesheets) -%} + {%- endif -%} + + {# Load extra CSS for custom skin #} + {%- if config.extra.skin -%} + {%- set stylesheets = stylesheets | concat(with='skins/' ~ config.extra.skin ~ '.css') -%} + {%- endif -%} + + {# Load all stylesheets #} + {%- for stylesheet in stylesheets %} + + {%- endfor %} + + + + {%- if config.extra.browser_theme_color and config.extra.browser_theme_color is iterable -%} + {# Handle array values: theme_color[0] for light mode, theme_color[1] for dark mode #} + + + {%- elif config.extra.browser_theme_color -%} + {# Handle single value #} + + {%- endif -%} + + {%- if page.description %} + + + + {%- elif section.description %} + + + {%- elif page.summary %} + + + {%- else %} + + + + {%- endif %} + + {% if is_404 %} + + {% else %} + + + + + {% endif %} + + + + + {# Image for social media sharing #} + {%- set social_media_card = macros_settings::evaluate_setting_priority(setting="social_media_card", page=page | default(value=""), section=section | default(value=""), default_global_value="") -%} + {% if social_media_card %} + {# Try to construct the image path relative to the current page #} + {% set colocated_path = page.colocated_path | default(value="") %} + {% set file_path = colocated_path ~ social_media_card %} + + {# Fetch metadata to verify image existence at the relative path #} + {%- set meta = get_image_metadata(path=file_path, allow_missing=true) -%} + + {# Check if relative path exists, else try absolute path #} + {% if meta %} + {% set final_path = file_path %} + {% else %} + {# If the relative path didn't work, try fetching metadata for the absolute path #} + {% set meta = get_image_metadata(path=social_media_card, allow_missing=true) %} + {% if meta %} + {% set final_path = social_media_card %} + {% else %} + {# Throw an error if the image doesn't exist at either path #} + {{ throw(message="Could not get metadata for the specified social media card image in page " ~ page.path ~ ". Attempted relative path: '" ~ file_path ~ "' and absolute path: '" ~ social_media_card ~ "'. Ensure the file exists at one of these locations.") }} + {% endif %} + {% endif %} + + {# Generate the social media meta tags #} + + + + + + {% endif %} + + {# Add og:locale and hreflang tags for multilingual sites #} + {%- if config.languages | length > 0 and current_url %} + {%- include "partials/multilingual_tags.html" -%} + {%- else -%} + + {%- endif %} + + {# Set canonical URL #} + {%- if current_url -%} + {%- if page.extra.canonical_url or section.extra.canonical_url -%} + {%- set canonical_url = page.extra.canonical_url | default(value=section.extra.canonical_url) -%} + {%- elif config.extra.base_canonical_url -%} + {%- set canonical_url = current_url | replace(from=config.base_url, to=config.extra.base_canonical_url) -%} + {%- endif -%} + {%- endif -%} + + {# Add canonical URL, if set #} + {%- if canonical_url -%} + + + {%- elif current_url -%} + + + {%- endif -%} + + + + {%- include "partials/content_security_policy.html" -%} + + {%- if config.extra.theme_switcher and config.extra.theme_switcher == true -%} + {# If JavaScript is disabled, hide the button. #} + + + + {%- endif -%} + + {%- if config.extra.analytics.service -%} + {%- include "partials/analytics.html" -%} + {%- endif -%} + {%- include "partials/custom_header.html" -%} + + + diff --git a/templates/shortcodes/peertube.html b/templates/shortcodes/peertube.html new file mode 100644 index 0000000..618a5fe --- /dev/null +++ b/templates/shortcodes/peertube.html @@ -0,0 +1,4 @@ +
+ +
+ diff --git a/templates/shortcodes/youtube.html b/templates/shortcodes/youtube.html new file mode 100644 index 0000000..d07b91b --- /dev/null +++ b/templates/shortcodes/youtube.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/templates/subscribe.html b/templates/subscribe.html new file mode 100644 index 0000000..23b4b54 --- /dev/null +++ b/templates/subscribe.html @@ -0,0 +1,29 @@ + +{% extends "base.html" %} + +{%- block main_content %} + +{{ macros_page_header::page_header(title=page.title) }} + +
+
+ {{ page.content | replace(from="", to=macros_toc::toc(page=page, header=false, language_strings=language_strings)) | safe }} +
+

You can subscribe to my blog via my email newsletter on Substack and receive notifications when I publish new blogs or have other announcements to make.

+

Your email will only be used for this purpose and nothing else, so no spam or advertising or anything just content.

+
+
+

+ +

+
+
+

You can also subscribe to my atom / rss feed or follow me on Mastodon or X (formerly known as Twitter) too.

+
+
+
+ +{%- include "partials/extra_features.html" -%} + +{%- endblock main_content %} +