Plenty of things happen that are almost blog worthy but just don't have the substance for a full post. For the most part, this is what microblogging is for. However, there are somethings that are too big for a posting on identi.ca. So what is a Jez to do?
Why, have a fun filled frolicking Friday feature fest, of course. The idea is simple: aggregate the little things into one post. Booyah!
Jezra.net
Recently, I've make two changes to my blog, only one of which you the viewer will actually experience.
the blog code has been updated to allow me to write using the Markdown format. I'm actually using PHP Markdown written by Michel Fortin. From a visitor's standpoint, this doesn't really do much, but it certainly makes it easier for me to compose a new posting.
images in blog postings will now be utilizing lightbox, a javascript library for presenting "click to view larger image" images in a pleasant way. There is actually a lightbox2 that I should be using, but I'm happy with the way things are working right now.
Code
heybuddy, the Python identi.ca client, has a new stable release: 0.0.7 "Glens Falls". The biggest feature of this release is probably the inclusion of avatars. Go get it!
In December of 2009, there was a thread in the Linux Outlaws forum about coding a "crap alert" in various programming languages. I wrote the alert in Python and then ported the code to Vala. Recently I cleaned up the Vala code, compiled the code to run on my N810 and made an application package for Maemo. Hopefully the compiled app will also run on an N900, but I don't have one to test on. hint hint
Here is the Vala code:
valac --pkg hildon-1 --pkg gstreamer-0.10 --pkg gtk+-2.0 crapalert.vala -o crapalert
*
* or
*
valac -D TESTBUILD --pkg hildon-1 --pkg gstreamer-0.10 --pkg gtk+-2.0 crapalert.vala -o crapalert
*
*/
using Gtk;
using Gdk;
using Gst;
using Hildon;
public class CrapAlert:Hildon.Program
{
bool is_playing;
Element playbin;
bool is_fullscreen;
Hildon.Window window;
construct{
}
public CrapAlert()
{
#if TESTBUILD
string resources = Path.build_filename(Environment.get_current_dir(),"Resources",null);
#else
string resources = Path.build_filename("/","usr","share","crapalert");
#endif
/* set some variables for later use */
is_playing = false;
is_fullscreen=false;
//where is the image for the app?
string image_src = Path.build_filename(resources,"crapalert.png",null);
string icon_src = Path.build_filename(resources,"icon.png",null);
stdout.printf("image_scr: %s\n",image_src);
//where is the audio file?
string audio_src = Path.build_filename(resources,"crapalert.wav",null);
stdout.printf("audio_scr: %s\n",audio_src);
/* create a gstreamer playbin */
playbin = Gst.ElementFactory.make("playbin", "player");
//set the uri of the playbin to the audio file source
playbin.set_property("uri", "file://" + audio_src);
//get the bus of the playbin
var bus = playbin.get_bus();
//tell the bus to watch for signals from the playbin
bus.add_signal_watch();
//connect "message" signals to a function
bus.message.connect( player_message );
/* build the interface */
// create a new window
window = new Hildon.Window();
// connect the delete_event so we can quit the app
window.destroy.connect( (w)=> {
quit();
} );
window.key_press_event.connect( (w,e)=> {
check_event(e);
} );
// we need a button box to hold the image
Gtk.Button button = new Gtk.Button();
//connect the button to the play_audio function
button.clicked.connect( (w)=>{
play_audio();
} );
//create an image from the image_src
Gtk.Image image = new Gtk.Image.from_file(image_src);
//add the image to the button
button.set_image(image);
//add the button to the window
window.add(button);
//set the window icon
window.set_icon_from_file( icon_src )
//show the app
window.show_all();
}
public void run()
{
//start gtk
Gtk.main();
}
private void quit()
{
playbin.set_state(Gst.State.NULL);
Gtk.main_quit();
}
public void play_audio()
{
//are we already playing?
if(!is_playing)
{
is_playing = true;
//make the playbin play
playbin.set_state(Gst.State.PLAYING);
}
}
private void player_message(Message message)
{
// check for the end of stream message from the playbin
var t = message.type;
if (t == Gst.MessageType.EOS )
{
playbin.set_state(Gst.State.NULL);
is_playing=false;
}
}
private void check_event(EventKey event) {
if (event.keyval==65475) {
toggle_fullscreen();
}
}
private void toggle_fullscreen() {
if (is_fullscreen) {
window.unfullscreen();
is_fullscreen=false;
}else{
window.fullscreen();
is_fullscreen=true;
}
}
}
public static void main(string[] args)
{
//init gtk and gstreamer
Gtk.init(ref args);
Gst.init(ref args);
//make a new instance of the crapalert
CrapAlert ca = new CrapAlert();
//run the crap alert
ca.run();
}
Here is the crapalert running on my N810. If anyone is interested in the installable binary, it is available at http://www.jezra.net/downloads/crapalert-0.2.deb.
Technology
About two weeks ago, my telephone answering machine died. To be honest, it had been one cassette in the grave for a very long time. Anyway, a short trip to a local thrift store and $6 later; I had taken the leap for the 80s right into the 90s with a digital answering machine/cordless phone combination. That's right, a push button phone. How tech is that?
A few days after connecting my new phone, I received an invitation to Google Voice and I thought I should try out the service. I will be doing a proper review in a month or two when I have had time to properly use Google Voice.
Speaking of speaking, I've been trying to set up a Mumble server and I could use some help testing the machine with someone far away. If you can install Mumble v1.2.2, have a microphone, and live more than 4000 miles from the San Francisco Bay Area, contact me. Actually, if you can install Mumble 1.2.2 then you should contact me.
Now quit reading, and go do something.