Foldio2 Sample Picture

I received my Foldio2 "Pop-up studio" from Orange Monkie. Here is a sample photo taken using this "pop-up studio" a.k.a. small lightbox. The result is pretty good! The LED light strip is quite bright. No more setting up a bunch of lightbulb stands. The fact that it folds down to the size of a pizza box for storage is a big plus.


First Day with the Apple Watch

The future is here. That is how I felt a few hours into using the Apple Watch.

I have a Pebble that I wore on and off for a few months. It was a fun watch. It was nice to receive SMS directly on the watch, checking the weather. But it feel very much like an experiment. The Apple Watch is that smart watch vision executed correctly.

I bought the cheapest option, the Sports edition. It came in a rediculously shaped box. The plastic case is quite heavy. Together with the shape the whole package feels a bit strange. Contrasting to the packaging, the on boarding experience is wonderful. During pairing it shows a little particles animation. Then it offers the default option of installing all available matching Watch App onto the watch. It was a surprisingly long list. The App load/sync process did take quite a long time.

Some of the cool things to do with the Apple Watch on the first day:

Favorite Photos on the Watch: Setup a photo album on the iPhone. I created an iCloud album so that I can easily send the photos from iPhoto on my Mac to the album instead of using the clunky iOS photos app. These photos are synced to the watch. So you can carry your favorite family pictures and show them off.

Siri: The "hey siri" function never works well for me on the phone. By the time I take the phone out and press the home button, I might as well just start an app and type into it. However having the Apple Watch responding to voice command is much more natural. You just need to press and hold the digital crown to initiate Siri. For example, starting a timer for reminding to feed the parking meeting is totally natural now. "Start a timer for 30 minutes".

Remote Controlling Apple TV: You can pair the remote app on the Apple Watch with any Apple TV and iTunes server like pairing other iOS device. The Apple Watch will display a four digit code for you to enter into the corresponding Apple TV being controlled. It is fun to be able to select shows or pause and play Netflix and Hulu on my Apple TV on my wrist.

Paul Graham is Wrong

In Paul Graham's latest blog post, he voices his support "to make immigration easier" to allow easier hiring of foreign tech workers by using a overly simplistic argument:

The US has less than 5% of the world's population. Which means if the qualities that make someone a great programmer are evenly distributed, 95% of great programmers are born outside the US.

US does rougly has 5% of the world population: 320 million at end of 2014 out of the world's 7.3 billion. But is comparing strict population appropriate? Are rural farming families in China likely to apply for technical jobs in the Us? No.

A better comparison maybe to compare number of college graduates. The data is less accurate, but this gives you a good picture:

The ratio of these numbers are much closer, far less dramatic.

Constrained for Talent, or Cheap Talent?

Graham argues that there are just not enough great programmers to go around and the immigrate programmers are being paid the same:

But if you talk to startups, you find practically every one over a certain size has gone through legal contortions to get programmers into the US, where they then paid them the same as they'd have paid an American.

Personally, I cannot imagine a start up that can affort this type of legal fees are start ups anymore. I would love to see the actual figures that back this argument up.

Immigration is Good

Ironically, I believe immigration reform is good, and it is good not just for the tech world. I like free markets. I like competitions. Within the startup world, I have hired and worked with great programmers all around the world.

But Local is Important

There is a lot to be said for having software developers that understand the local culture and market. To use a reverse example, can a US designer successfully design a UI for the Chinese market without a lot of local help? No.

What to do?

To solve the root of the program, America needs to pay more attention to STEM in school. We need to eliminate the gender gap in engineering. We need to teach more and better maths in elementary schools. Otherwise we are loosing the race to build a great talent pool.

Flask, REST and PiGlow on a RaspberryPi

The RaspberryPi (RPi) is the little computer that could. $40, runs a version of linux. But can you use it for "serious programming", deploy "real" applications? Of course !

As an excercie, I decided to put together a RESTful API server, and a web interface to control the fun PiGlow LED display board on a RPi. This project uses:

  • virtualenv
  • flask
  • flask-restful
  • angularjs (ok this is really off the RPi)
  • thread locking to control hardware access
  • and most importantly, it let me use the RPi+PiGlow board as a remote display any where with network access.

You can see the code and documentation here on github.

Arhitecture


This diagram shows the overall architecture:

Hardware - PiGlow Board

Get the PiGlow board from the PiHut if you are in the UK or Adafruit if you are in the US. This board provides 18 LED's with controllable brightness in 6 colors, arranged in a spiral pattern. Think of all the fun patterns you can generate. What makes the PiGlow board particularly great is that it is cheap ($15) and it plugs into the GPIO socket directly. (See Picture)

Basic Software

The PiGlow board is connected to the RPi via the i2c interface on the RPi. To control the pins in python, you can use the python-smbus python package at the lowest level, or you can use one of the many wrapper python classes.

i2c bus support

You also need to install i2c support first if you have not done so already. The original piglow example code has great instructions.

PyGlow.py library

There are many different python libraries written to support the PiGlow board. I like this version by Ben Lebherz here

Single Threading

The first step is to create a RESTful API server running on the RPi to talk to the PiGlow board. This will allow other software to control the LEDs on and off the RPi. One subtle but important note is that, since there is *one* actual PiGlow board, requests to update the board need to be done in sequence. We cannot have everyone writing to the i2c bus at the same time. So one important feature of the API server is that it single threads all the control operations, without blocking the API requests. i.e. the controlling of the board is done asynchronously from the actual API request/response.

The locking is acheive using a Lock object from the threading library.

Once a global lock object is created by calling threading.Lock(), all operations are wrapped with calls to acquire and release methods. In my code I use the python with statement to do this nicely.

# wait for lock becoming available if necessary
with lock:
    # here the lock is locked
    led_list[num - 1]['brightness'] = brightness
    pyglow.led(num, brightness=brightness)

# and the lock is unlocked

The asynchronous operations is done by putting the actual work in a separate thread from the thread that is handling the inbound REST request. The queue_command method in the PiGlowResourceMixin starts a thread to perform the operation, leaving the main thread to continue to response to the caller:
 

def queue_command(self, func, *args):
        """
        Queue function func with optional args in a separate thread.
        """
        h = threading.Thread(target=func, args=args)
        h.setDaemon(True)
        h.start()
        return h

REST API

Flask has a nice plugin call Flask_RESTful that makes writing REST API servers very easy. In our server, we subclass Resource from restful, which provides routing of calls and argument parsing. Each type of "things", LEDs, LED arms,  and LED rings (colors) are all addressable objects via the REST API.
For example: (LedAPI)

class LedAPI(PiGlowResourceMixin, Resource):
    """
        REST interface to control individual LED.
    """
    def get(self, led_id):
        """
        Get the brightness of a LED.

        (These are cached values, not necessary correct!)
        """
        return led_list[led_id]

    def put(self, led_id):
        """
        Set the brightness of a LED

        PUT /leds/:id

        URL Parameters:
        id=[integer] in the range of 1-18

        Optional:
        brightness=[integer 0-255]

        Data Parameters (optional):
        {
            "brightness": [integer 0-255]
        }
        """
        self.validate_led_id(led_id)

        parser = reqparse.RequestParser()
        parser.add_argument('brightness', type=int, default=0,
                            help='Brightness for this arm of LED')
        args = parser.parse_args()

        b = args.get('brightness')
        self.validate_brightness(b)

        self.queue_command(set_led, led_id, b)
        return led_list[led_id - 1]

 

Mixin

We also use a python feature called mixin to add common functionality to all the API interfaces. The validation methods are shared this way. And most importantly the queue_command method which provide the threading support is added to all the endpoints using this mixin.

The RESTful API Server

You can start the API server by just passing the file to python. For example:

python /usr/local/lib/python2.7/site-packages/piglowserver/piglowserver/pg_rest_server.py


API

The API server responses to a set of PUT requests to control individual LEDs, list of LEDs, "arms", and "colors". See the readme on github () for full documentation. But a quick example will give you an idea:

    # set arm 3 to brightness 50
    curl -X PUT -d brightness=50 http://localhost:5000/arms/3

    # switch on and off LED 7
    curl -X PUT -d brightness=100 http://localhost:5000/leds/7
    curl -X PUT -d brightness=0 http://localhost:5000/leds/7

    # switch on led 3 and 5 with brightness 10 and 200
    curl -X PUT -H 'Content-Type: application/json' \
        -d '[{"led_id":3, "brightness": 10}, {"led_id":5, "brightness":200 }]' \
        http://localhost:5000/leds

    # excute a starburst pattern
    curl -X PUT -d brightness=100 http://localhost:5000/patterns/starburst

    # turn everything off
    curl -X PUT http://localhost:5000/patterns/clear

 

CORS / CSRF Issues

The REST server is designed to be access either directly from another application, or from a web based application. Using our angular one page application (localhost:8000/app) as an example, that web page contains client side javascript code that access the REST server via the API.

However, all modern browser consider this type of access, where a web page served from one server try to access resources on another server, it performs a cross site request forgery ( CSRF ) check. Therefore the REST server is setup to add a CORS header "Access-Control-Allow-Origin: *" to all responses, allowing this type of cross site access.

The Web Application Server

The REST API is designed for used by another software applications. You can call it from another computer system, using the PiGlow board as a display station remotely. To demonstrate this connection, this project also include a very simple web application server, pg_control.py. You can run this server, also a flask application, and control the REST server remotely. The pg_control server can be run on the same RPi, a different RPi, or on a completely different machine.

python /usr/local/lib/python2.7/site-packages/piglowserver/piglowserver/pg_control.py

The Javascript Client

You can also run the simple angularJS powered single page javascript client to control the PiGlow board. Just point your browser to the /app URL in the pg_control server above.

A Command Line Weather Display Client

Finally, we have a simple example to query Yahoo weather for the temperature in a simple Python script, and display the result with LEDs. Look in the examples/weather.py script. You will need to modify the script to access your particular REST server's IP address, as well as put in your own city name.

Because I am running it on a mac, I have included a plist file that you can use to schedule the weather client to run every hour on your mac.

For the Impatiences

If you just want to install all the software and try it, follow these steps:

  1. Enable the i2c support, following these instructions
  2. Add your user ID ("pi" normally) to the i2c user group with sudo adduser pi i2c
  3. Install Ben's library with:  pip install git+https://github.com/benleb/PyGlow.git
  4. Install my software pip install git+https://github.com/pkshiu/piglowserver.git
  5. Install additional python packages required for the piglowserver using my requirement files: pip install -r /usr/local/lib/python2.7/site-packages/piglowserver/requirement.txt
  6. This will install three common python development tools: flask, flask-restful and requests onto your system.
  7. Run the API server: python /usr/local/lib/python2.7/site-packages/piglowserver/piglowserver/pg_rest_server.py (it will start listening on port 5000)
  8. Run the web application: python /usr/local/lib/python2.7/site-packages/piglowserver/piglowserver/pg_control.py (it will start listening on port 8000)
  9. Point your browser, on the RPi or on a different machine, to the web application:  <RPi_IP_Address>:8000
  10. Try it out!
  11. Also try the client side application: <RPi_IP_Address>:8000/app

Conclusion

This project demostrates the power of the RaspberryPi. While I also like the Arduino, the RPi has a rich development environment that allows for some powerful computing projects.

How to print multiple address labels from address book on the Mac

It is holiday cards time and every year I go through trying to remember to print address labels from my Mac OSX Contact app. The short answer? It is really simple.

Create a CSV File for Export from Contacts?

Contacts Export Options

No. This is not the way. But the old school me always start thinking down this road. Then I realized there is no "export to CSV" feature in Contacts. You can however drag contacts into Numbers and the contacts will automatically converts to a table.

Mail Merge directly from MS Word?

No. Or rather, you could do this. If you create a new document from the "label wizzard" template in MS Word on the Mac, it will ask for permissions to access your address book. Allow it. (You could also enable the access via the Security & Privacy settings in System Preferences.) But frankly I cannot figure out how to use the mail merge feature in MS Word. Too complicated.

The Mac Way

Print Labels from Contacts

Even as a long time Apple convert, I still am amazed by these obvious answers when using Apple product. You want to print multiple addresses from your Contacts (address book) on your Mac onto Avery 5160 label sheets? You just do the obvious:

  1. Open your contacts application
  2. Select the contacts you want to print: I have all my holiday cards contact assigned to a group, so I select the group and do a select all to highlight all the contacts
  3. Select File / Print / Labels and pick the right Avery label type
  4. print

No need to do export, conversions, merges. Just print labels.

Ban All Screenshots in Presentation

Do you put screenshots in your powerpoints or keynote presentations? Please stop now. Unless your presentation is actually about screen design, there is no real reason to include a screenshot of a software product or a website.

Why do people put screenshots in presentation? It is either to show progress, or features:

  • "Look at these screens ! We finished the product ( actually it barely works, that's why we cannot give a real demo)"
  • "Look at the menus ! We created so many useful features (but how often are these actually used?)"

This is all wrong

This point was driven home for me today when I went to an otherwise great presentation made by a town's IT department to a citizen group. The presentation content was great, but the slides were all  "bullet lists" and "screenshots". Because the audience consists of many older citizens, at one point someone raised his hands and say "I cannot read a single thing on your slide!"


Point made clear (sic)

This entire incident broke two fundemental rules about making a presentation:

  1. Know your audience
  2. Tell a story

Know your audience

In this particular example, we know that the citizen group consists of a large number of seniors. Many of them are also non technical. Yet the slides were all unreadable, full of small text bullet lists and screenshots. The materials were full of technology acronyms that the presenters did not explain, again until someone asked "what is GIS"?

Tell a Story

Instead of presenting a list of facts and show the webpages that the user can use to execute particular sets of functions, the presenter should have framed the presentation as a set of stories. Put the audience at the center of the story. How would the audience use this feature to achieve a desire goal?

An Example

As an example, part of the presentation is to highly a new GIS (Geographic Information System) enabled feature on a town website. A staff or a resident can now easily lookup information related to a particular property at once: perperty tax, voting district assignment, school district, neighborhood, distance to wetlands and recreational facilities, etc. The original data are stored in separate databases. Some of the geographic information, like wetlands and school districts, are geographic boundaries drawn on maps. So a special type of database and data processing is required to relate a property address to, say a district boundary. The technology is cool and useful. But showing a screenshot of the website with all the overlays is (1) unreadable, and (2) only exciting for perhaps a techie.

Instead, what if the presentation centers around how a resident may do to collect such information? How many "stops" does the resident need to make around the town offices to look up different information from different sources? But now all she has to do, or the town's staff has to do, is to visit the website, and obtain all the information she needed. 30 seconds instead of spending the morning at town hall.

The slides can be a set of pictures showing the rooms or counters at the town hall, or the piles of paper records and maps that she would have to look through, and the success case can be a slide of a happy user at her computer.

So please, stop putting screenshots in your presentation.

Know your Audience, and Tell a Story instead.

tmux.conf file not working?

If you updated your .tmux.conf file and find that it is not working, perhaps you have existing tmux session running. You need to exit all tmux sessions so that a new tmux server will start and (re)read the updated .tmux.conf file.

If you do not want to stop all tmux sessions, you can also issue the source-file command either from within tmux or use tmux at the command line.

 

# see what other tmuxes are running
ps -ef | grep tmux

# if control-b is your tmux prefix key, type:
c-b : source-file ~/.tmux.conf

# or at the command line:
tmux source-file ~/.tmux.conf

 

 

Karas Kustoms INK First Impression

ink_1.jpg

This long weekend is off to a great start. My pair of Karas Kustoms INK pens arrived, fresh from their Kickstarter campaign. A few initial obervations:

  • the tips are interchangable !  I did not know that. So with two bodies, I can use either one with the fountain pen tip or the ballpoint/rollerball tip. This is a very nice surprise.
  • the click is highly polished -- looks nice but will probably get scratched over time. Compare with my Retrakt that clip is less polished.
  • A small disappointment -- neither the Pilot Acroball nor the Pilot Juice, nor the Muji gel refill will fit inside the INK. The tips in both of those refills are thicker than the Schmidt refills. I have not tried a Hi-Tec-C refill yet.
  • This is the first time I tried the Schimdt P8126 refill (came with the INK). It is very smooth. The line is slightly thicker than I want but I think I will like using it.

I think the INK is Karas Kustoms best pen yet. I have a prototype/raw Render K, an Aluminium Retrakt. I like them both, but I think I am going to like the INK most.

When is Free not Free? When it is Verizon

Yes this is a "first world problem". I came across this "Free On-Demand Marathon" on Verizon FIOS. As I do not have a subscription to HBO I was eager to check out some of the movies. Remote on - navigated to the confusing UI, click on the clearly labelled "free" movie, then it ask me to subscribe...

Every reading the "fine print" on their webpage, I realized that all the good stuff is only available until Sept 22nd (yesterday). Could they at least update their webpage and their banner?


How to add additional storage to a QNAP NAS in RAID 1 (mirrored) configuration

I have been storing my important digital files on a RAID box for many years. I have a QNAP TS459 Pro+ that has one pair of 2T seagate drive in them. The 2T storage is almost full. This is a screencast on how I replaced the pair with a pair of WD Red drives, rated for NAS use. (WD40EFRX)

Conceptually the process is simple

The current setup is RAID 1, mirrored. That means each hard drive (HDD) has a complete copy of all the files. Simple pull old drive 1 out and replace it with a new one. The RAID system will copy the files onto the new drive. Then do the same for the second drive. But the actual operations is a little more complicated.

Actual Process

  1. Tell QNAP that we are to replace the hard drives, one by one:
    1. Under "raid management" , click the "Action" button and start the "Expand Capacity" action
    2. QNAP will display "You can replace this drive" for all the HDDs in the array. This does *not* mean you should pull the drive just yet:
    3. Select HDD 1, click "Change" to tell QNAP to stop using this drive.
    4. When QNAP displays "Please remove this drive", pull the drive out of the system and wait for QNAP to beep twice. (While you are waiting you can unscrew and replace the actual hard drive in the drive holder, ready for re-insertion).
    5. When QNAP displays "Please insert the new drive", plug the new drive into the slot.
    6. Be patience and wait (over 1 minute sometimes) for QNAP to beep and start rebuilding. Rebuilding will take hours.
    7. When QNAP display "ready" under status, the drives are back in RAID mode.
  2. Now repeat the same process for hard drive 2.
    1. Under "raid management" , click the "Action" button and start the "Expand Capacity" action
    2. QNAP will display "You can replace this drive" for all the HDDs in the array. This does *not* mean you should pull the drive just yet:
    3. Select HDD 2, click "Change" to tell QNAP to stop using this drive.
    4. When QNAP displays "Please remove this drive", pull the drive out of the system and wait for QNAP to beep twice. (While you are waiting you can unscrew and replace the actual hard drive in the drive holder, ready for re-insertion).
    5. When QNAP displays "Please insert the new drive", plug the new drive into the slot.
    6. Be patience and wait (over 1 minute sometimes) for QNAP to beep and start rebuilding. Rebuilding will take hours.
    7. When QNAP display "ready" under status, the drives are back in RAID mode.
  3. At this point, we have two new drives in the QNAP. But only the original capacity is being used. You need to tell QNAP to start using all the capacity.
    1. Under "raid management" , click the "Action" button and start the "Expand Capacity" action
    2. There is another "Expand Capacity" button now shown on the bottom of the screen. Click that.
    3. The QNAP will start the expansion process, which again takes a long time.
    4. Once that is done, you now have a RAID setup that make full use of the larger pair of hard drive.

Screencast

This is a screencast showing the entire operations over two days, compressed:


Conclusion

I am happy that I did the drive replacement. I now have twice the storage, and also a pair of higher quality drives in my QNAP. The QNAP forum was a great source of information. I have received a lot of help when I ran into problems.

There are also two issues that makes this process more difficult than it should:

  • You need to wait a long time for the QNAP to recognize you have inserted a new drive. The first time I tried this I didn't wait long enough, thought something was wrong, and pulled the disk out again. I ended up having to rebuild the original drive (meaning wait another 12+ hours) and start over.
  • You cannot/should not pull the drive out until you click "change". When QNAP display the message "you can replace this drive" - it means you can replace this drive if you click "here/change". i.e. do not forget to click "change" before pulling the drive out.

Reference

Agile in China: Moving away from the factory worker mentality

The Agile software development mindset requires agile team members to be treated as knowledge workers. In the Chinese context, this may be harder than you think.

Rainy Day Solution, or the Low Cost of Labor

Umbrella Seller in Shanghai Subway Exit

Umbrella Seller in Shanghai Subway Exit

Chinese developers have realatively lower pay than the US. A good developer in Shanghai makes less than half, sometimes a third, of her Boston counterpart. General labor is even cheaper. Let me illustrate with an example:

What do you do when you are caught without an umbrella on your way to work? In Shanghai an Unbrella seller will pop up at each exit. We even joke that we can who is an organized person by looking at people's umbrella at the office. The subway exit umbrellas often have recognizable prints.

In Hong Kong you will not find such vendors. instead you will see umbrella vending machines that accept payment by the HK Octopus card, a stored value smartcard that can be used on public transits, convinent stores and more. The Octopus card is a internationally famous successful technology project.

Hong Kong Subway Unbrella Vending Machine

Hong Kong Subway Unbrella Vending Machine

 

Overtime Mentality

In many companies overtime ( 加班 ) is not only expected, but budgeted. Often developers are paid for their scheduled overtime. "Work more hours" is the standard answer to any problems. Reminding the reader of the classics, The Mythical Man-Month and Brooke's law: "Adding manpower to a late software project makes it later". Factory work with interchangable workers doing manual work may benefit from overtime. But software development does not.

What to do?

A good agile team needs each team member to take personal responsibility of the work. To prepare for that, management need to respect each team member. Acknowledge each member as a knowledge worker, who needs time to think, and time to recover. This may not be a welcomed idea to traditional bosses, but it must be done.

Are you Chinese?

It is always this crowded on weekends

It is always this crowded on weekends

Today after lunch at Luziazui (陆家嘴) financial district I helped a European tourist couple take a picture of them in front of the Oriental Pearl TV Tower (东方明珠). They then asked me how to get to the metro station, which is a common questions that I have answered many times even from Chinese tourists. After giving them a detail set of directions, one of them asked me: "Are you Chinese?" Instinctively I answered "Yes".

She commented "Your English is very good!" I smiled and wave goodbye to them, did my bit for Shanghai Tourist Relation today.

How to change ear tips on the Bose QuietComfort 20i headphones without breaking them

If you are looking for a noise cancelling headphone, the Bose QuietComfort 20i is your top choice. After you bought yours, I am sure you want to experiment with the different sized ear tips -- and that is when the trouble starts.

The Bose ear tips attach to the headphone in a very different way than all other earbuds style headphones that I used. Instead of just snapping onto the earbuds over some sort of ridge, there are two additional little plastic wings/tags that the ear tips must fit over. If you are not careful, you will break them when you try to remove the ear tips.

To help you not break them, here are some close up pictures of those wings/tabs. Study their locations. Also watch this video instruction by Bose. Then carefully remove and replace the ear tips as instructed.


Remote fish feeder using littleBits new Cloudbit

Can a just turned ten years old and his eight years old sister, never used littleBits before, create a project using littleBits and the Cloud module? Will our betta fish be fed in time?

We are a family of casual makers. My just turned 10 years old, Gab, and his sister Morgan both have a lot of Scratch experience but never used littleBits. We got onto the beta test list for the cloudbit module and was sent a cloudbit (Thanks littleBits!). I purchased the premium kit so that we have more parts to play with. With them in hand, Gabriel is tasked with first trying out the littleBits and then create a project with the betta cloudbit module.

littleBits

Gabriel and Morgan like the LittleBits system. "Robotics but simpler" is his immediate reaction. Morgan commented that the color coding of the module helps him locate and organize his work. He likes all of the sensors and output devices. He has used the pico board with Scratch before, but the pressure sensor and the pulse module is new to him. One of his favorite output is the vibration module, another new device.

The Bad

Two criticism from Gabriel is that

  1. the fan is not strong enough
  2. we wish the servo would "spin around all the way".

And most importantly the cloud module response time is very slow. In fact sometimes it seems to not work at all. We tried using twitter and SMS to trigger action on the littleBits and often it either is very slow or not worked at all.

Yum Yum Fish Feeder

After brain storming a bit we decided to build a fish feeder, as Gabriel's daily task is to feed our only family pet ORO (Octo Rainbow Odo) beta fish. With a cloud powered fish feeder, we can feed the fish when we are not home. Seems easy enough? But Gabriel insisted on feeding ORO's daily 3 fish pellets one at a time. If we throw all three pellets in, the fish gets confused and sometimes does not eat the pellets.

Which Output Module

Prototype Testing

Prototype Testing

We started brain storming and experimented with each of the outputs to get ideas. Because Gabriel and Morgan has started building another project using the servo module, they wanted to use the servo with some sort of cardboard attachment to push the pellets into the fish bowl. But the pellets are too small to make this work effectively.

We tried the fan, but it is too weak to blow the very small fish pellets down a chute. (Dad's mental note: perhaps concentrating the airflow would have helped). Then we settled on the vibration module.

First prototype

We build a little chute with a toilet paper roll (from the standard family maker material inventory?). Taped the vibration module to it and crumbled up there bits of paper as test pellets. It worked ! Gabriel built a stand to hold the chute and off we went testing the prototype. For testing we just used the roller switch as the controller to speed up our test time. It worked pretty well, but...

When we put the actual tiny fish pellets on the chute, they would not move. The fish pellets are too small and too light. The vibration module does not create enough 'shake' with the toilet paper roll.

Final Device

We had bits of paper laying around, so we build a very simple chute with a piece of paper. A lighter chute means stronger shake? Dad's extra input is to put a fold at the end of the chute to hold the pellets better. This works. We hooked everything up, tested with the roller switched and it worked. We tested the cloud module before to make sure the IFTTT recipes worked. We replaced the roller switch with the cloud module, setup the fish feeder over the fish bowl, and fed our fish via SMS remotely.

You can view the project on the littlebits website for more details.

Project Video

Our brainstorming notes for this article


Chinese Postman Canvas Bag

I have a thing for bags, from Jack Spade to my recent order of their Waxed Canvas bag from Wear Gustin. I walked out of my apartment building in Shanghai today and see this beauty - a real bicycle used by our local postman for delivering mail to my building. Take a look at that bike and the canvas bags on it. well worn but functional.

Enjoy the pictures.

EventDove is much more then a EventBrite Clone

I learnt of EventDove several years ago via my Boston connections. I even used it once at a small local event in the Boston area, but honestly did not find it particularly different from eventbrite. I was so wrong.

I attended a talk by Jun Chang, the CEO and founder of EventDove in Shanghai. She gave a very personal talk about the company and it's business model. My key takeaways make me believe that this company is going to be very successful:

EventDove focuses on B2B

While the EventDove platform clearly is useful for event registration services for events of any size, (there is a free plan), the company is focused on servicing large scale, repeated customers. EventDove often provide back end system integration with their larger customers to provide many features that may not be visible to the event attendees. This provide a high barrier of entry for competitors, and high exit costs for their integrated customers.

These integration reaches beyond event organizers. It can include event revenues operators as well, which are a source of new customers.

A customer is a customer when they are paying for the service

Jun stress that while she values all customers who uses her platform, paying customers are where she is concentrating her companies resources on. The initial paying customer based is most important. Having worked with many start ups, I completely agrees with her. A start up sometimes too eagerly chases after potential paying customers by listening to their non paying customers too much.

O2O - Online too Offline (and back)

This is a key feature of EventDove that I did not see before because I did not attend a large scale event serviced by EventDove. Their platform has significant feature set to support onsite registrations, badge handling and much more. It is geared towards a large scale event hosted at a convention type venue. These onsite, off line features, with venue system integration, create another high barrier of entry for competitors.

EDM and Data Mining

As EventDove is used by more and more conference venues, with it's integration with both the event organizers and venues, it has access to a large data set of attendees. While currently the platform can feed this data back to the conference organizer for used in the electronic direct mail (EDM) marketing, is it possible for EventDove to mine this dataset across events and organizers?

Jun also mentioned that events in China a slowly moving away from focusing on big name speakers as the key marketing source. As the event organizers focus more on the content of the events, and the quality of the attendees, (think barcamp) can EventDove leverage it's combined attendee dataset and provide social networking features like meetup.com?

Standards and Platform

If EventDove is the first platform to integrate event organizers and event venue operators, it has the potential to set the standard for data exchange in this space.  Will it become *the* platform for large scale event hosting?

Dove

I want to end this summary with a fun fact. The "Dove" in the name EventDove has a meaning that perhaps get lots in the English name. Doves can also be referring to carrier pigeons. They carry information back and forth. EventDove then is a platform for information exchange between event organizers, attendees and venue operators!

Localized Advertisement in China

Some brand, like Apple, is such a global brand that it can use mostly standardized advertising across the globe. However in general is it possible to have one standard universal story for the entire world? Or is a localized story more effective?

Example

Here is an example from a Chinese company point of view. I saw this ad on a Shanghai subway car. It is for a job board company called liepin.com.

Even if you do not read Chinese, can you guess what is the copy? If you guessed the left pane says something like "I lost my job", and the right pane says "you are hired" you will be very wrong.

The left pane says:

When I went home during Chinese New Year (a very common thing to do for Chinese, travelling to their family home to spend time with the extended family) I saw my parent's getting so old, I tell myself I want to give them a better life.

The right pane says "headhunters will recommend great jobs, changes start at liepin (the advertiser)"

Local Story

It is a very common story for adult children to return to their family home to visit their parents during the big Chinese New Year (Spring Festival 春节). There is also a (older) cultural expectation and responsibility to support your parents. Therefore this advertisement story is quite powerful. Would this work in the US? Absolutely not.