I am happy to announce that this January I’ve co-founded OptimalQ with my two amazing co-founders, Yechiel Levi and Yadin Haut.
What do we do in OptimalQ? As our website says:
OptimalQ’s proprietary technology harnesses a combination of big data statistical models and real time network information to intelligently look ahead at a set of mobile numbers and, without making a call, assess the physical and mental availability of each lead.
Our availability insights result in more people answering calls when they actually have the time to talk – meaning calls will be longer and likely more productive.
It has been an amazing ride so far, especially from a technical standpoint – I’ve had the time to finally design my “dream stack” (at least for an agile, time-to-market based business) and implement most of it.
We’re using Python as our technology of choice, with DynamoDB, Redis, MySQL as our main data stores. Sensu and Prometheus help us with monitoring and alerting. Logentries is our current logging solution, but ELK is in our future. All of our stack is based on microservices, using DNS-based service-discovery and SDN. We aren’t using containers and automatic orchestration as of yet, but that is coming very soon. We’re currently AWS based, but are most of our system is completely open-source and vendor agnostic which is great, as we’ve not bound to any one cloud (and might move in the near future).
It sure has been fun, let’s hope it stay this way. :)
As part of a hackathon we had in EverythingMe, I developed an am now releasing the initial version of raml, a RAML 0.8 parser implemented in Go.
RAML is a YAML-based language that describes RESTful APIs. Together with the YAML specification, this specification provides all the information necessary to describe RESTful APIs; to create API client-code and API server-code generators; and to create API user documentation from RAML API definitions.
The raml package enables Go programs to parse RAML files and valid RAML API definitions.
You can find the project here: github.com/go-raml/raml
Update, 2016-05-06: since I am currently quite busy with running OptimalQ, and as this project is in use by several other projects and has several active forks, I’m looking for someone to take over it and make it useful once again. Message me if you’re interested.
Dozens of developers from all over the country attended the first Hubanana hackathon, which was held last weekend in Raanana, Israel for around 24 hours. The focus this time was iBeacon, a technology which uses Bluetooth Low Energy proximity sensing to transmit a universally unique identifier that can be picked up by any compatible device, and which can then be used to determine a device’s physical location or to trigger a location-based action, among other possibilities.
It was a fun hackathon, and my team won first prize, which was an added bonus.
My team’s product for this hackathon was called BeaconTask. The idea was simple: leave beacons around the house, in specific “task stations”. When a family member arrives at this station (kitchen, backyard, etc) he can then receive a task, which is worth points. Example tasks can be: take out the trash, wash the dishes, etc. He can then accomplish this task and take a photograph of it, and the “Manager” (Mom/Dad/roommate/boss/etc) can verify the task has been completed. A verified task awards the person who performed it with points, which can then be used to receive various prizes or rewards. (e.g. allowance for kids, days off for an office)
During the hackathon, I improved python-firebase, a
I mostly worked on synchronizing the various team members, and also developed the back-end and data-model. All of the source code for our team’s project can be found here:
Articles (in Hebrew) regarding this hackathon can be found here and here.
I have recently discovered a bug in Python (both in the 2.x and 3.x families) and offered
a patch to solve the issue.
When imap() or imap_unordered() are called with the iterable parameter set as a generator function, and when that generator function raises an exception, then the _task_handler thread (running the method _handle_tasks) dies immediately, without causing the other threads to stop and without reporting the exception to the main thread (that one that called imap()).
I saw this issue in Python 2.7.8, 2.7.9 and 3.4.2. Didn’t check other versions, but I assume this is a bug in all Python versions since 2.6.
I reported this bug here and attached examples that reproduce this issue, as well as patches for both Python 2.7 and Python 3.4.
The patches I attached do 2 things:
- A deadlock is prevented, wherein the main thread waits forever for the Pool thread/s to finish their execution, while they wait for instructions to terminate from the _task_handler thread which has died. Instead, the exception are caught and handled and termination of the pool execution is performed.
- The exception that was raised is caught and passed to the main thread, and is re-thrown in the context of the main thread – hence the user catch it and handle it, or – at the very least – be aware of the issue.
Now I’m waiting for a review.
Update, 2015-03-06: patch was reviewed, tests were added, and it was merged into all
As part of my work on go-raml, I needed some additional capabilities from go-yaml, so I forked it and released my own version of it (until it’s merged in, if at all, since me and the main developer of go-yaml see things a bit differently). Here’s the details
* Added new regexp flag: Unmarshal all encountered YAML values with keys
that match the regular expression into the tagged field of a struct,
which must be a map or a slice of a type that the YAML value should
be unmarshaled into. [Unmarshaling only]
* Now dies in case of a badly formatted YAML tag in a struct field
* When a type implementing UnmarshalYAML calls the the unmarshaler func()
to unmarshal to a specific type, which fails, followed by it calling
the func() again with a different output value which suceeds, the YAML
unmarshaling process still failed. Issue was d.terrs == nil check, but
not len(d.terrs) == 0
* Lots of new tests for the regexp flag - regexp unmarshaling into maps,
slices, regexp priority etc.
Here’s the fork: github.com/advance512/yaml
As per antirez‘s feature request here, I implemented the following feature:
Added parameter to SPOP:
- spopCommand() now runs spopWithCountCommand() in case the param is found.
- Added intsetRandomMembers() to Intset: Copies N random members from the set into inputted ‘values’ array. Uses either the Knuth or Floyd sample algos depending on ratio count/size.
- Added setTypeRandomElements() to SET type: Returns a number of random elements from a non empty set. This is a version of setTypeRandomElement() that is modified in order to return multiple entries, using dictGetRandomKeys() and intsetRandomMembers().
- Added tests for SPOP with : unit/type/set, unit/scripting, integration/aof
More details can be found here.
Update, 2014-12-18: merged into all Redis branches.
Updated, 2016-05-06: officially a part of Redis 3.0.2, with various parts rewritten by antirez for better performance. More info here: Redis 3.2.0 is out!
Just encountered a frustrating problem trying to use yEd and Visual Paradigm for UML over Ubuntu. I am using a dual screen configuration. When either of these applications (and I am sure many other Java apps) are fullscreen, clicking the menu does not seem to work. Drag’n’drop of shapes seems to be imprecise, in fact it seems like the mouse has a sort of “offset” between the cursor and the actual mouse position.
This is solved by not having the window in fullscreen.
Here is another description of said problem: http://yed.yworks.com/support/qa/438/java-7-on-ubuntu-menu-mouse-error
I’m sure you’ve had the occasion on which you developed an interesting application, and now required the ability to control it from the command line. The standard C/C++ functions for implementing various switches and input is nothing fun to work with, and the various template and composition based solutions are too complex most of the time.
Check out this interesting project:
You define the options you want in a very, very simple definition language, compile it into a C++ class file and voila: you can use it in your main() function.