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

Wednesday, April 18, 2018

Creating a Book with pandoc

One of my clients asked me for a printable book to accompany one of my workshops. My teaching style is more fluid and we write a lot of code in class. I wanted a quick way to take all the source code files and some images and make a book out of them.

Since I already work with markdown, I looked for a solution that can convert markdown to PDF. The winner was Pandoc (which can be installed with conda). Of course the out-of-the-box results weren't satisfactory and some tweaking was required. Mostly to make images appear where they are define in the markdown and not where pandoc/LaTex thinks is the optimal location.

The solution is composed of an awk script to add an include directive to markdown, a custom LaTex header to inline images and a Makefile to bind them all.

You can view the whole project here, including a example book. You can view the output here (decorators anyone?).

Tuesday, April 10, 2018

Installing Arch Linux on Laptop with UEFI

After some time with Xubuntu I decided to get back to Arch Linux.

Arch have a command line based installer, the installation instructions are pretty good but for a laptop with UEFI I had to do some extra steps. Here's what I came up with, hope you'll find it useful as well.

Most of my files are backed on "the cloud", my home directory with all the RC files is on a private git repository. Getting up and running after the initial install was pretty easy.

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

Blog Archive