If it won't be simple, it simply won't be. [Hire me, source code] by Miki Tebeka, CEO, 353Solutions

Tuesday, February 27, 2018

Python's iter & functools.partial

Python's built-in iter function is mostly used to extract an iterator from an iterable (if you're confused by this, see Raymond's excellent answer on StackOverflow).

iter has a second form where it takes a function with not arguments and a sentinel value. This doesn't see that useful but check out the readline example in the documentation. iter will call the function repeatably until it the function return the sentinel value and then will stop.

What happens when the function  producing the values require some arguments? I this case we can use functools.partial to create a zero arguments function.

Here's an example of a simple HTTP client using raw sockets, we can directly use join on the iterator.

Sunday, February 11, 2018

353Solutions - 2017 in Review

A little late, but here's a summary of 2017.


  • Total of 255 calendar days where worked for a customer (including partial days)
    • Up 62 days from 2016
    • Out of 260 work days in 2016
  • Median work day is 6:53h
  • Normalized work days (total divided by 8) is 171.6
    • Up from 158.1 normalized days in 2016
  • Of these 30 days were in workshops and the rest in consulting
  • 10 workshops
    • Down from 18 last year
    • First video course on Lynda (over 100K viewers already)
    • Teaching in Israel, UK, US and Poland
  • Several new client including PayPal, CommonSense Robotics, Iguazio and others
  • Revenue down by 5%
    • But earnings are up :)
  • First newsletter went out


  • Personal social network keep bringing all the work
  • Very big workshops customer cut down a lot - picked up the difference with more consulting with is less lucrative
  • Python & Data Science in demand for workshops
  • Much more Go in consulting
  • Free 1/2 day open class did not bring any work
    • However will do some more - it was fun
  • We need to get better on marketing open classes

Last Year's Goals

  • Work less while keeping same revenue
    • Failed here. Worked more to keep about the same revenue
  • Work more from home
    • Success here
  • Publish my book
    • I can't believe this is not done yet.
  • Publish a video course
    • Done (with two more to come)
  • More open enrollment classes
    • Tried that but not enough enrollment, need to get better at marketing

Goals for 2018

  • Work less while increasing revenue
  • Publish my book
    • Learned from last year and reserved serveral days this quarter to finish it
  • More workshops and less consulting
    • Two open enrollment workshops
    • Two free 1/2 workshops
  • Keep working from home
    • Attend at least 3 conferences
  • Give at least 4 talks in meetups or conferences
    • First talk was Jan 1 on PyWeb-IL, have another one slated for March
  • Get better at marketing

Friday, December 08, 2017

Advent of Code 2017 #8 and Python's eval

I'm having fun solving Advent of Code 2017. Problem 8 reminded the power of Python's eval (and before you start commenting the "eval is evil" may I remind you of this :)

You can check The Go implementation that don't have eval and need to work harder.

Friday, November 24, 2017

Python → Go Cheat Sheet

I'm teaching and consulting in Go a lot lately, and I work a lot with Python as well. There's a big trend of rewriting backend services in Go and to help people coming from the Python world I've created a Go →Python cheatsheet.

The code in here, I'd love to hear if you have suggestion (via a PR ;)

Thursday, September 14, 2017

Checking for Zero Values in Go

In Go, every type has a zero value. Which is the value a variable of this type get if it's not initialized. I had a configuration object of type map[string]interface{} and I needed to check if value exists and is not a zero value.

Here's a small piece of code that checks for zero values:

Saturday, July 15, 2017

Generating Power Set using Bitmap

I was asked to write a function that generate a power set of items. At first I wrote a recursive algorithms but then another approach came to mind. When you calculate how many subsets there are, you can say that each item in the original set can either be or not be in a subset, which means 2^n subsets. This yes/no for including can be seen as a bitmask, and since we know that there are 2^n subsets we can use the number from 0 to 2^n-1 as bitmasks.

Blog Archive