I just saw PhotoTime on the App Store, and gave it a go – this is a quick review.
Beautiful app with great workflow and features. The core concept is that they send a small version of your photo to their servers to analyse and insert tags, then delete their copy of the photo. You get a local album with tags for names, places, objects, etc auto-inserted, so that you can just type what you want to find, and it’ll show you the photos.
The object recognition is quite impressive, but I’m not convinced it’s practical. You might search for “Safari park visit” rather than “bird, car, elephant”, which is what it recognises. Nonetheless, still impressive in what it did recognise, and this can only be a good start. It’s the only one I know that does object/scene recognition to any extend
However, it’s a lovely app, and if you trust their privacy assertions, well worth trying out. At the end of the day, if you want to search for photos locally by keywords – there is none – so having this can only be an improvement.
Does it beat Picturelife? Well.. No. I still think taking search clues from tags, places, dates/times as common relative terms (eg. “Last Tuesday”), and album names, will let you find the photo you’re looking for easier than object recognition. Picturelife’s autocomplete of search terms is a great way of gently finding your way through what’s available to get a result.
Remember PhotoTime is just an iOS app and only local too – no cloud service. Ideally Picturelife would licence their technology and add it to the service (although PhotoTime are probably hoping to be bought by Google).
Some examples of the tag terms for given scenes below:
I had one of these for my HTC ONE, and immediately got one for my iPhone 6. They don’t detract too much from the feel of the phone, like a fully enclosed case might, but protect it from falls, including face first, and give excellent grip so you don’t have to give a thought about holding it with any risk of dropping it.
I used to throw my HTC ONE around all the time – literally toss it on the gym floor – in this case. The iPhone one feels a little less cushioned when it hits the floor, enough that I don’t throw it down, denying a little convenience (hey, I said “No worries”!), hence only 4/5 points. But still good enough that I didn’t even consider getting another case (I will probably get a Lifeproof for the beach).
I’ve been playing with rsyslog, which I want to use as a cheap (free!), self-contained means of load balancing logs across multiple log receivers, from multiple log sources.
RSyslog is very powerful (some would call it complex 🙂 ), but I got there. As always, my use case was not a typical one for the protocol, so few examples of what I wanted to do, but I found a way using timestamps.
Rather than using uptime, which has 1-second resolution, I’m used timegenerated, which has microsecond resolution. I was concerned that running at high rates and large numbers (eg. 100keps across 100 devices) would result in each device being blasted by 100keps for 1 second.
This way, I flip every microsecond to a new destination. I chose not to use the event time, since it may not have subsecond resolution. I also chose not to use the event index number that I get inside every event (I have one), since it would require regex of the form .*?EventId=(\d+).*?, which could be expensive in large (6-8KB) log lines, and slow down processing.
Next step is to go from UDP to Encrypted TCP, which should hopefully be easy.
Code snippet for the load balancing (across 3 in test);
# Load balance output based on system time
# Define a template that contains just the subsecond value of the event receipt time (not event timestamp!).
# For timegenerated, this is in microseconds
template(name="subseconds" type="string" string="%timegenerated:::date-subseconds%")
# Set a variable to that value
set $!subsecs = exec_template("subseconds");
# Perform a modulo of the subsecond value of the receipt time to decide which way to send it
if ($!subsecs % 3 == 0) then call output_0
if ($!subsecs % 3 == 1) then call output_1
if ($!subsecs % 3 == 2) then call output_2