New refreshed blog for 2024 using Zola

This commit is contained in:
Salar Rahmanian 2024-02-10 18:04:44 -08:00
parent a23dd16b89
commit 46c2405d9e
125 changed files with 1356 additions and 1337 deletions

View file

@ -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" }
+++

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

View file

@ -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") }}

4
content/blog/_index.md Normal file
View file

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

View file

@ -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*

View file

@ -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 >}}
<link rel="stylesheet" href="/css/googleform.css">
<script type="text/javascript">var submitted=false;</script>
<iframe name="hidden_iframe" id="hidden_iframe" style="display:none;"
onload="if(submitted) {window.location='/consulting-thankyou';}"></iframe>
<form action="https://docs.google.com/forms/d/e/1FAIpQLSdCGmLDOLCM8ujwkAsKOks0v9xXRJ5R3_Gd-jPLigEHTth1BA/formResponse"
method="post" target="hidden_iframe" onsubmit="submitted=true;">
</form>
<form action="https://docs.google.com/forms/d/e/1FAIpQLSdCGmLDOLCM8ujwkAsKOks0v9xXRJ5R3_Gd-jPLigEHTth1BA/formResponse" method="post" target="hidden_iframe" onsubmit="submitted=true">
<label>Email*</label>
<input type="email" placeholder="Email address*" class="form-input" name="entry.315851213" required>
<label>First Name*</label>
<input type="text" placeholder="First Name*" class="form-input" name="entry.2101427994" required>
<label>Last Name*</label>
<input type="text" placeholder="Last Name*" class="form-input" name="entry.1349260782" required>
<label>Company Name</label>
<input type="text" placeholder="Company Name" class="form-input" name="entry.626621467">
<label>Phone Number</label>
<input type="text" placeholder="Phone Number" class="form-input" name="entry.1754566849">
<label>How Can I Help you?*</label>
<textarea rows="5" placeholder="Enter your message here" class="form-input" name="entry.737320458" required></textarea>
<label>What is your preferred dates and times for me to send you a Google Meet / Zoom Calendar invite for us to have a chat about how I can help?</label>
<textarea rows="5" placeholder="Enter your message here" class="form-input" name="entry.118380213"></textarea>
<button type="submit">Send</button>
</form>
{{< /rawhtml >}}

View file

@ -1,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
+++

View file

@ -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)

View file

@ -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?

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

View file

@ -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 <https://www.sfbayareatechies.com> ####
@ -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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 658 270" enable-background="new 0 0 658 270"><g><g fill="#0B5567"><path d="M349.6 105.5v-12.2h19.9v58.4c0 7.1 1.7 9.8 6.1 9.8 1.2 0 2.7-.2 4.1-.3v16.1c-2.2.8-5.5 1.3-9.8 1.3-4.8 0-8.6-.8-11.6-2.7-3.7-2.5-6-5.8-6.8-10.1-5.8 8.8-15.4 13.1-28.7 13.1-11.8 0-21.7-4.1-29.9-12.6-8-8.5-12-18.8-12-31.2s4-22.7 12-31c8.1-8.5 18.1-12.6 29.9-12.6 13.6 0 23.7 6 26.8 14zm-5.9 47.9c5-4.8 7.5-11 7.5-18.3s-2.5-13.4-7.5-18.3c-4.8-4.8-11-7.3-18.1-7.3-7.1 0-12.9 2.5-17.8 7.3-4.6 4.8-7 11-7 18.3s2.3 13.4 7 18.3c4.8 4.8 10.6 7.3 17.8 7.3 7.1 0 13.3-2.5 18.1-7.3zM388.5 177v-115.7h19.8v67.6l30.9-35.5h22.8l-32.7 37.4 36.2 46.3h-22.6l-26.4-33.7-8.3 9.3v24.3h-19.7zM470.8 177v-115.7h19.8v67.6l30.9-35.5h22.9l-32.7 37.4 36.2 46.3h-22.6l-26.4-33.7-8.3 9.3v24.3h-19.8zM607.9 105.5v-12.2h19.9v58.4c0 7.1 1.7 9.8 6.1 9.8 1.2 0 2.7-.2 4.1-.3v16.1c-2.2.8-5.5 1.3-9.8 1.3-4.8 0-8.6-.8-11.6-2.7-3.7-2.5-6-5.8-6.8-10.1-5.8 8.8-15.4 13.1-28.7 13.1-11.8 0-21.7-4.1-29.9-12.6-8-8.5-12-18.8-12-31.2s4-22.7 12-31c8.1-8.5 18.1-12.6 29.9-12.6 13.5 0 23.6 6 26.8 14zm-6 47.9c5-4.8 7.5-11 7.5-18.3s-2.5-13.4-7.5-18.3c-4.8-4.8-11-7.3-18.1-7.3-7.1 0-12.9 2.5-17.8 7.3-4.6 4.8-7 11-7 18.3s2.3 13.4 7 18.3c4.8 4.8 10.6 7.3 17.8 7.3 7.1 0 13.3-2.5 18.1-7.3z"/></g><path fill="#0B5567" d="M230.3 212.8c35.9 28.7 58.9-57 1.7-72.8-48-13.3-96.3 9.5-144.7 62.7 0 0 89.4-32.7 143 10.1z"/><path fill="#15A9CE" d="M88.1 202c34.4-35.7 91.6-75.5 144.9-60.8 12.4 3.5 21.2 10.7 26.9 19.3l-50.4-101.7c-7.2-11.5-25.6-9.1-36-.3l-133.2 111.6c-12.1 10.4-12.8 28.9-1.6 40.1 9.9 9.9 25.6 10.8 36.5 2l12.9-10.2z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

View file

@ -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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

View file

@ -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 <https://zio.dev>. This is hosted by a combination of using GitHub pages and [Netlify](https://www.netlify.com/).
All other projects use GitHub pages and have a GitHub pages project URL as opposed to a custom domain.
## Contribution Etiquette and Collaboration ##
The environment to contribute to an open source project is very different than how you collaborate with colleagues at work. The biggest points to realize is everyone is in effect a volunteer giving up their time to help. They maybe in a different timezone and only have certain pockets of time around their busy lives to take part.
As such working in harmony, being patient and greatful for all the help is very important. What I would like to summaries a few do's and don't that we should follow as an etiquette in order to maintain a happy and welcoming environment for all.
### Working on an issue ###
If you are interested in working on an issue, check the issue comments to make sure no one else is working on it already. If no one else is make a comment on the issue that you are working on it.
If someone has already commented on it that they are working on it and a considerable time has passed (about a month I would say is reasonable) with no visible work on the issue being done and no PR then add a comment asking if that contributor is still working on it and wait a few days for response and if they no longer are you are welcome to comment on the issue that you will be working on it. If in doubt as in the projects discord channel.
Unfortunately, due to the general nature of open source, you may see situations that multiple contributors work on the same issue and multiple PRs get submitted. This is why it is important to try your best to communicate your intentions as well as possible to minimize this happening.
### Pull request reviewers ###
Maintainers do regularly review new Pull Request to review but if you want to bring it their attention or tag someone for review you can either look at the pull request history to see who to tag for review or discuss PR in the projects discord channel.
Each project does have a group of maintainers who care about its progress who are the ones review your work.
In a work environment you would refer to them as project leads but its not really the same in open source. Its more the case that the maintainer has devoted a lot of their time to the project already that differentiates them from a new or an occasional contributor.
## Learning and Getting Help ##
Being a ZIO contributor is an opportunity to learn and practice. When trying to contribute don't hesitate to ask for help. All of us who have been contributing to ZIO for a while strive because we are happy to help each other and learn from each other.
When picking up an issue to work on and have any questions, ask by commenting on it or go to the projects discord channel and have a discussion about any topic that you need help with.
We try to be a very welcoming and helpful community so we look forward to helping you succeed at contributing.
Don't forget about the tools you have available to help you succeed:
- GitHub issues
- [ZIO Discord](https://sca.la/ziodiscord)
### Additional Resources for Contributing ###
- [ZIO Contributor Guidelines](https://zio.dev/docs/about/about_contributing)
- [ZIO Coding Guidelines](https://zio.dev/docs/about/about_coding_guidelines)
- [ZIO Code of Conduct](https://zio.dev/docs/about/about_coc)
ZIO Code of conduct linked above does include details of the current steering committee that you can contact in case of any issues especially conduct related.
## Lessons Learnt Contributing to ZIO ##
- Anyone can be a contributor. I used to think open source was done by a small group of elite people and not for *regular* developers. Contributing to ZIO showed me I was wrong and really anyone can and should participate.
- Focus your library on satisfying user experience and their needs and the rest will take care of itself
{{< youtube NZN0A0U6ysg >}}
- The power of the group. Do your best to figure out the answer yourself but be open when you haven't figured something out. It is amazing what we can figure out together.
- ZIO community is very welcoming to everyone especially if you are junior in Scala. A lot of passionnate people who have a common goal to push Scala to the top.
- Everyone in the ZIO community makes you feel supported
- You will learn a lot by just trying to answer other peoples question on discord
- Contributing to open source is the best way to learn and gain experience. Better than any course.
- Quality of feedback and help is very high enabling you to learn a lot
- Improved my collaboration skills by a large margin
- Learn a ton about concurrency, performance tuning and functional design
- Make a lot of new friends from all around the world that you would never have otherwise met
- Microsite CI build will always randomly fail when you haven't changed anything, just to make you laugh 🤣

View file

@ -1,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/).

View file

@ -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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

View file

@ -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)

View file

@ -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") }}
## Heros welcome
Over the years in my career I have followed many of the people I met at this years conference. Their work and teachings have helped me progress my knowledge and ability and have motivated me and others to be part of a great community.
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") }}

Binary file not shown.

After

Width:  |  Height:  |  Size: 968 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 792 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 731 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 989 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,003 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 664 KiB

View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 530 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 517 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 KiB

View file

@ -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 <version>
$ pyenv rehash
```bash
pyenv install <version>
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.

View file

@ -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
+++

View file

@ -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: <https://github.com/softinio/scaladex.nvim>
- README: <https://github.com/softinio/scaladex.nvim/blob/main/README.md>

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -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: <https://www.scalanews.net/>
- About Page: <https://www.scalanews.net/Resources/About.html>
- Repository: <https://github.com/softinio/scalanews>
- README: <https://github.com/softinio/scalanews/blob/main/README.md>

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

View file

@ -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: <https://github.com/zio/zio-actors>
- README: <https://github.com/zio/zio-actors/blob/master/README.md>
- Documentation: <https://zio.dev/zio-actors/>

View file

@ -1,11 +1,11 @@
+++
title = "Resume"
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*: <https://www.meetup.com/silicon-valley-nix-nixos-user-group/>
##### Swift Language User Group (San Francisco) #####
Organizer since *2022*: <https://www.sfswift.com>
Organizer from *2022* to *2023*: <https://www.meetup.com/swift-language/>
##### Bay Area Haskell & Functional Programming User Group #####
Organizer since *2021*: <https://www.sfhaskell.com>
#### Past Meetups ####
Organizer from *2021* to *2023*: <https://www.meetup.com/bay-area-haskell-user-group/>
##### San Francisco Java User Group Meetup #####

View file

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

11
content/talks/_index.md Normal file
View file

@ -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
+++

View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

View file

@ -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).

View file

@ -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).

Binary file not shown.

After

Width:  |  Height:  |  Size: 769 KiB

View file

@ -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).

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 KiB

12
content/til/_index.md Normal file
View file

@ -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
+++

View file

@ -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/)

View file

@ -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.