[SK] Nájdi cestu k pokladu.
[EN] Find a path to the treasure.
[SK] Odkaz na aplikáciu.
[EN] Link to application.
Note: Map is based on one geocache puzzle.
[SK] Nájdi cestu k pokladu.
[EN] Find a path to the treasure.
[SK] Odkaz na aplikáciu.
[EN] Link to application.
Note: Map is based on one geocache puzzle.
Author: Lordrat
By now you know, that when you need simple server to serve static pages just for you to play, you use Python’s SimpleHTTPServer.
But this time I wanted more: I wanted to to able to use serve images caught by my webcam. CGI server would be quick answer. While there is class in python doing that, I did not wanted to play with it. I needed something quick to do and maybe I was just little lazy to do so this day.
First thought: one window while cycle with cam-grabber, in the other window SimpleHTTPServer. Well, the solution lacked elegance, as it was not one-liner-styled enough. And then it occurred to me: why not use Netcat?
At first, I needed to get data from camera. I had figured how to do that some time ago.
vgrabbj -i vga -d /dev/video0 -a -z 10 -q 100
Let’s just elaborate on that a little bit. vgrabbj takes `640×480` image from video4linux device `/dev/video0`, with enabled brightness adjustment, taking 10 images just to adjust, and using 100% quality of JPEG, and sending it to stdout.
Another building block is “server” to serve something that returned command. NetCat is our fiend. Little-bit of HTTP-fu is needed, but not much.
{ echo -ne 'HTTP/1.0 200 OK\r\nConnection: Close\r\n\r\n'; cat file; } | nc -l 1234
We will be serving JPEG, so we add appropriate HTTP header (unless you can see things in binary garbage).
Content-Type: image/jpeg
It may happen that file-size of image will cripple user’s comfort over slower network. What about speeding it up by sending response gzipped? We will need header
Content-Encoding: gzip
and we will have to use… you guessed it: gzip.
gzip -f
However, gzip will not reduce the size of JPEG much, as it already has entropy quite high. We can decrease quality of image i.g. by switch -q of vgrabbj, but in this case I would prefer ImageMagick for reasons that will become clear in a moment. Another possibility how to deal with this issue is scaling image down, which can be done here as well.
convert - -quality 75 -
It will also be nice to have a non-crippled copy of served file. Can do that: tee.
Serving repeatedly can be done by i.e. by while loop. Small functional enhancement: it will be nice to have so called “auto-refresh”. Adding one HTTP header will do that for us. Say every 5 seconds.
Refresh: 5
Some cooling enhancements? Server header:
Server: CoolServer!
And now just put it all together.
while :; do { echo -ne 'HTTP/1.0 200 OK\r\nServer: Kwak!\r\nConnection: Close'\
'\r\nRefresh: 5\r\nContent-Type: image/jpeg\r\nContent-Encoding: gzip\r\n\r\n'\
; vgrabbj -i vga -d /dev/video0 -a -z 10 -q 100 | tee omg-`date +'%Y-%m-%d-%H'\
'%M%S'`.jpg | convert - -quality 75 - | gzip -f; } | nc -l 1234; done
Feel free to unwrap it
.
And a non-one-liner (little bit more readable) version:
#!/bin/bash
PORT=1234
QUALITY=75
REFRESH=5
HEADER='HTTP/1.0 200 OK\r\n'
HEADER=$HEADER'Server: CoolServer!\r\n'
HEADER=$HEADER"Refresh: $REFRESH\r\n"
HEADER=$HEADER'Connection: Close\r\n'
HEADER=$HEADER'Content-Type: image/jpeg\r\n'
HEADER=$HEADER'Content-Encoding: gzip\r\n'
HEADER=$HEADER'\r\n'
while :; do
{
echo -ne "$HEADER"
vgrabbj -i vga -d /dev/video0 -a -z 10 -q 100 \
| tee omg-`date +'%Y-%m-%d-%H%M%S'`.jpg \
| convert - -quality "$QUALITY" - \
| gzip -f
} \
| nc -l "$PORT"
done
Enjoy
There is one very annoying issue in Eclipse: stealing of focus by Console window.
Console window is displayed when you run application.
When you set focus to some other window like Search results and application prints something on output then Eclipse will automatically switch to Console window. Your search results are gone.
There is simple way how to get rid of such a behavior.
Go to Window -> Preferences -> Run/Debug -> Console. Uncheck options:

Good news for WordPress fans! WordPress has its own TV.
Check out WordPress.TV.
Do you want to join some WordPress events around the world? Then check out WordCamp.org Central.
Imagine that we have C++ project e.g. for Visual Studio 2008. It is possible to build this project just by msbuild command:
msbuild MyProject.vcproj /p:Configuration="Release"
Let say that we want to use #define in the source code. It is necessary to define it in Configuration Properties > C++ > Command Line:
/DSIMPLE_DEFINE
This just pass SIMPLE_DEFINE as flag.
How to deal with string define which should behave like string? E.g.:
#define URL "http://georgik.sinusgear.com"
The trick is in escaping quotes. We can add following define to Command Line:
/DURL=\"http://georgik.sinusgear.com\"
It will transform into .vcproj file:
AdditionalOptions="/DURL=\"http://georgik.sinusgear.com\""
Let’s make one more step.
How to acquire such a define from environment variable? E.g. with following build.bat file:
set URL="http://georgik.sinusgear.com" msbuild MyProject.vcproj /p:Configuration="Release"
It requires only small modification of .vcproj file:
AdditionalOptions="/DURL=\"$(URL)\""
Small recap of flow: set env variable – pass it to XML – pass it compiler – pass it to code
There are many conferences around the world and it is hard to monitor them all.
I found useful site ConfRadar.com.
You just need to specify your favorite tags and you’ll get e-mail notification about conferences.
Three.js exporter for new version of Blender 2.60 supports many features. The problem is that default exporter settings generates quite big JSON file even for small models.
Here is list of defaut options for save model function from export_threejs.js:
filepath = "",
option_flip_yz = True,
option_vertices = True,
option_vertices_truncate = False,
option_faces = True,
option_normals = True,
option_uv_coords = True,
option_materials = True,
option_colors = True,
align_model = 0,
option_export_scene = False,
option_lights = False,
option_cameras = False,
option_scale = 1.0,
option_embed_meshes = True,
option_url_base_html = False,
option_copy_textures = False,
option_animation = False,
option_frame_step = 1,
option_all_meshes = True
These are good settings when you want to save all objects from scene. It is quite overkill when you need to save just one dynamically generated object. I recommend to turn off following options:
option_all_meshes, option_materials
Here is sample code in Python which will select object by name and save it to file with defined options:
import bpy bpy.ops.object.select_name(name="ObjectName") bpy.ops.export.threejs(filepath="ObjectName.js", option_all_meshes=False, option_materials=False)
Further articles about Blender and Python are located under the tag Blender on my blog.
Enjoy