Taichi Logo in CSS

A Taichi logo made with pure CSS, codepen link:

System App Peer

John Hu had became a peer of system app. I am responsible for TV system app since I had worked on the first version of TV gaia. It’s my honor to be part of system app.

It’s so nice to see android has keyboard shortcuts feature with keyboard attached. But it may be a little annoying that we want to use those keys to do what we want. John Hu had created another open source project called shun-feng-er which is a tool for eye impaired person. During this project, we need to override the behavior of those shortcuts.

As per discussions and here, it is not possible to disable it or overide it at app level. The solution I found is to use Xposed Framework to inject code at WindowManagerPolicy. This needs a rooted device. But it doesn’t make sense to ask an user with hardware keyboard to have a rooted device.

After some investigations, I found that there is a keyboard layout config called “apple wireless keyboard”. It had change the meta key to home key. The most magic part is all shortcuts related to meta key are disabled, like META + C, META + TAB, etc That’s amazing. So, I try to find how it does.

The main part is to remap the key, it only remaps META key to HOME key. This is its configuration:

# remap meta key
map key 125 F12
map key 126 F12
 
# remap alt key
map key 56  F11
map key 100 F11

We need to change the keyboard layout once connected. It can be made at Settings app -> Language and input -> Physical keyboard -> (tap it and choose new mapping config)

Please find the whole patch at https://github.com/john-hu/shun-feng-er/commit/a2baf65e0407f294534560278b72474cb9f9dc13.

While writing programs in pyopencl, we should face the indentation of python and CL. According to the coding convention, python uses 4 spaces as the indentation and C uses 2 spaces as the indentation. So, we may want to configure our IDE to have different indentation on different programming languages.

As a user of Sublime Text, I found that the Syntax Specific is the correct place to configure it. If we want to configure C to use 2 spaces as its default indentation, we can do the followings:

  1. Open/create a C file
  2. Open Syntax Specific at Preferences -> Settings-More -> Syntax Specific
  3. use the following content as the opened file which should be C++.sublime-settings:
{
  "tab_size": 2,
  "translate_tabs_to_spaces": true
}

It’s so cool to have that.

One of my workmate had experiences on Open CL. We had a discussion on the improvement of histogram. And I learned that we should calculate the cost of Open CL before applying Open CL to a topic. The cost of Open CL is the time that we prepared everything for running Open CL. If the cost is larger than sequence code, we would never get any improvement with Open CL. But in most of cases, we will introduce a lot of calculation to Open CL. So, I wrote a program to measure the cost.

The program is pretty simple. We only measure the followings:

  1. creating context and queue
  2. reading file from disk
  3. building the kernel program
  4. creating buffer
  5. running the kerner program

The python looks like:

  def run(self):
    # measure elapsed time for creating context and queue
    tQueue = time()
    clContext = cl.create_some_context()
    clQueue = cl.CommandQueue(clContext)
    self.result.append({'type': 'create queue', 'time': (time() - tQueue)})
    # measure elapsed time for reading kernel program from file system
    tReadFile = time()
    f = open('baseline.c', 'r')
    fstr = ''.join(f.readlines())
    self.result.append({'type': 'read file', 'time': (time() - tReadFile)})
    # measure elapsed time for building the kernel program.
    tProgram = time()
    clProgram = cl.Program(clContext, fstr).build()
    self.result.append({'type': 'build program', 'time': (time() - tProgram)})
    # measure elapsed time for creating buffer.
    mf = cl.mem_flags
    pyBuffer = array('i', [0] * self.options.buffer_size)
    tBuffer = time()
    clBuffer = cl.Buffer(clContext, mf.READ_WRITE | mf.USE_HOST_PTR, hostbuf=pyBuffer)
    cl.enqueue_write_buffer(clQueue, clBuffer, pyBuffer).wait()
    self.result.append({'type': 'create buffer', 'time': (time() - tBuffer)})
    # measure elapsed time for running the program
    tRun = time()
    clProgram.baseline(clQueue, (self.options.buffer_size, ), None, clBuffer)
    self.result.append({'type': 'run program', 'time': (time() - tRun)})
    # we don't need to measure the time for reading data back because we use
    # `USE_HOST_PTR` which creates the buffer in main memory instead of GPU's.
    return self.result

The kernel program only does a atom_inc function call:

__kernel void baseline(__global unsigned int* data)
{
  atom_inc(&data[get_global_id(0)]);
}

The cost of Open CL in my Makbook Pro are:

Intel(R) Core(TM) i7-3540M CPU @ 3.00GHz
========================================
buffer size (in int): 1048576
create queue: 0.006128s
read file: 0.000031s
build program: 0.006540s
create buffer: 0.000191s
run program: 0.000128s
----------------------------------------
total: 0.013018s
========================================

HD Graphics 4000 GPU
========================================
buffer size (in int): 1048576
create queue: 0.010630s
read file: 0.000050s
build program: 0.006650s
create buffer: 0.001557s
run program: 0.000194s
----------------------------------------
total: 0.019081s
========================================

It looks not bad.

The URL of this program is: https://github.com/john-hu/pyopencl-example/tree/master/baseline