Posts Tagged ‘How to’

(on Technorati , Del.icio.us)

Script: Wireless Strength Polling/Logging/Graphing

Initially, I wrote this script to give me frequent feedback on the signal strength. This is useful when adjusting antennas to that sweet spot that give stronger signals; especially if you’re testing some homemade tinfoil parabolic reflectors! 😉 If you have a portable wireless device, like a netbook, you can ssh into your (wireless) desktop and run wireless-strength to get realtime feedback on adjustments to the access point’s antenna… assuming the connection doesn’t break. 😛 And, of course, you can just walk around running it on your mobile device to create a kind of wireless heatmap.

If you have gnuplot, you can also generate graphs from the data with ws-plot. This is me walking around my house with my notebook:

I started in my room (40% 🙁 ), which is where the first peak is – near the window. Left my room, back to 40%, peak near window again, then bathroom… 40%. The climb from 40-80% is me walking towards the TV room (PS3 lives in a solid 80% zone, at least!). Walked upstairs, got 100% in most areas (that’s where the Access Point is) – tried a bedroom, dropped to 40%.

Download the scripts and get more details here: https://github.com/izm/wireless-strength

Nerdy Ramblings

This script originated years back, but I recently tried using it on my laptop and it didn’t work! Unacceptable! The original parsed the output of iwconfig. But what showed up as “Quality=30/70” on my desktop, would show up as “Quality:4” on my laptop. COMPLETELY DIFFERENT. Even the character after “Quality” was different! o.O The output of iwconfig is driver dependent, which is why I looked to network-manager. I figured there’s probably a nice dbus command I can send to network-manager for that purpose – but I got tired of looking and decided to just parse output again. :/ Luckily, network-manager includes nm-tool. It’s certainly not a clean solution, but it works for now.

I also used updating rewriting the script as an excuse to get better acquainted with git – which I’m really liking.

Every time I do a bash script, I vow to do the next script in Python. I like Python and I don’t like Bash… but there’s a certain… nativeness or dependency-free elegance to bash scripts. Still, I hate writing them, and the next script’s in Python! 😛

DIY Wireless Booster

To access the Internet on my desktop computer, I must use wireless. Unfortunately, it’s about as far away from the access point as possible: opposite corners of the house and different floors. And the wireless card I’ve got in my desktop is a little old and pretty cheap. Basically, I’ve had to battle with a poor connection for years. Often, I would have to manually move the antenna an inch this way or that, try reconnecting, and repeat. I vented to my friend, Shirley, about my connection, and she said her friend was having similar issues, so Shirley recommended she make a signal booster. That’s something I’d been thinking about doing, and thought it was about time. I googled how to make a booster. Enter the Parabolic Reflector available here. I’m sure there are lots others, but this is the one I decided to try out.

Desktop antenna with booster

I made 3 of them. the first was made entirely with paper and tinfoil and it worked fine, but I figured I would try making a couple more with different materials: 2 different strengths of card. It’s good I did that too, as I ended up using 2 of them and giving the paper prototype to Shirley’s friend who most likely has better things to do than build paper parabolas. 🙂 (I, on the other hand, do not.)

Gluestick?  Check.  Scissors?  Check.

Access point hidden away, with booster pointed down slightly (towards my room)

What does it do? It turns your omni-directional antenna into a directional antenna with a stronger signal. The tinfoil does the radio wave reflecting and the shape (the parabola) just happens to be an efficient way to do that. Using this new direction, I’ve “pointed” the antenna on my wireless router towards my room – even on a bit of an angle through the floor. In my room, on my desktop PC, I’ve just pointed it horizontally in the direction of the access point.

Wireless signal strength over a few days

The results have been great. Without any home-made boosters, I received 25-35%, with one on the access point, i received 35-55%, and with one on both the access point and my desktop antennas, I’m receiving a pretty steady 62-68% (see the graph, above). I still receive disconnects, but it’s now much easier to reconnect… usually happens automatically on the first try – I don’t even have to do anything!

So if you’re having wireless issues, give it a shot! It certainly doesn’t cost much. 🙂

Ubuntu 8.10 (Intrepid Ibex) and Tablets

I just had to mention this: The latest version of Ubuntu finally supports input hotplugging. What this means is that you can plug in your tablet at any point and start taking advantage of its pressure sensitivity, etc. Previously, it would only work correctly if Ubuntu (the X server part of it) started with the tablet plugged in. Let me just say: OMG, I’ve been waiting for this for years! Seriously. I hadn’t been keeping up with every detail on the release (and I’m surprised I hadn’t seen mention of this yet), but I always plug in my USB tablet and run a quick test with new releases. This time, it actually worked! My test turned into a quick (and random) doodle:

How to Test

Plug in your tablet.

Run GIMP (included with Ubuntu by default).
Applications > Graphics > GIMP Image Editor

Enable Extended Input devices in GIMP.
Edit > Preferences > Input Devices > Configure Extended Input Devices

Find your tablet under the Device dropdown (mine is a Wacom Graphire) and select Screen or Window for the Mode. (It defaults to disabled.)

Create a new image, select the paintbrush tool and start drawing. To play with the features of your tablet, expand the Brush Dynamics section in the paintbrush options window (should be below the toolbox, where you selected the paintbrush). Here you can adjust things that pressure of your pen will control, like size and opacity. Fun stuff!

It’s not perfect (only works with the stylus – eraser doesn’t work without configuring), but it’s a HUGE step!! 😀 And the fact that this also includes the latest version of GIMP (2.6) makes this upgrade an absolute no-brainer for linux graphic-philes. 🙂

I found the new UI in GIMP a little strange at first, because I became so accustomed to the old one, but it is much better.

Upgrade Problems

Related to the upgrade, I lost wireless connectivity with my laptop upon doing it because the hostap_cs driver is used. I forgot about this issue that I had with previous releases and my super-cheap 1000yen wireless card. Blacklisting the hostap_cs driver and forcing the orinoco_cs driver fixed my problem again. The lesson: the upgrade wasn’t perfect and it should never be assumed that they will be – please backup your stuff! But do do the upgrade! 😉

open-with for the command-line

Update 2008/11/18: Use xargs 😛

Here’s a bash script that you can pipe output into and tell it to run a specific program with the output as arguments. I’ve named it open-with and placed it in my personal script directory: /home/steve/bin/. Look within the script at a couple of the examples for how to use it.

#!/bin/bash
 
PROG=`basename $0`
 
DESC="Read arguments from standard input and run a specified program
with them.  Meant to be used as output for a pipe."
 
 
USAGE="OUTPUT | $PROG \"PROGRAM-NAME [OPTIONS AND ARGUMENTS]\""
 
EXAMPLES="
# List (with details), all the files that include \"downloads\" in their name:
  find /home/ -iname \"*downloads*\" | $PROG \"ls -l\"
 
# Queue all AVI files in current directory in vlc:
  ls *.avi | $PROG vlc
 
# View all time-related icons with eye-of-gnome:
  find /usr/share/icons/gnome/ -iregex \".*[^mul]time.*\" | open-with eog
"
 
function Usage() {
  echo "DESCRIPTION: $DESC" ; echo
  echo "USAGE: $USAGE" ; echo
  echo -n "EXAMPLES: $EXAMPLES"
}
 
# Quick check to see it's being called correctly, if not, print Usage and exit
if [ ${#@} -ne 1 ]
then
	Usage
	exit
fi
 
files=()						# empty array
while read -r					# read from stdin
do
	files+=( "$REPLY" )			# add result of read to array
done
 
# assume $1 is a valid program
$1 "${files[@]}"				# pass arguments to specified program

Motivation

You’re sitting at the command line and have a list of images (in different locations) that you would like to browse. Most image viewers let you iterate over a set of images, but only within the same directory. What would be great is if they accepted input from stdin through a pipe!

$ cat my_list_of_images | my_image_viewer

I didn’t find anything that did that, but using the open-with script, you can do something similar:

$ cat my_list_of_images | open-with my_image_viewer


Browsing a select list of images is actually kind of nice. It’s like a playlist for your image viewer – a viewlist. 🙂 Anyway, I’m sure there’s some problems with this script. Feel free to provide suggestions in the comments. But I certainly don’t want to look at it for a while….

I hate shell scripting

With a passion. It’s not a great surprise… many programmers do. I’m willing to go on record and state that I hate it even more than PERL programming. I rarely do it, and when I decide to try something that seems like it would be simple, it turns out taking forever due mostly to quirks. The rest of this post is a bit about how I went about writing this script, which ended up being mostly given to me by some #bash gurus on IRC. And it’s a bit of a rant.

Although not many GUI programs seem to accept stdin as input, most accept filenames as arguments:

$ eog image1.jpg image2.jpg image3.jpg "/home/steve/image seven.jpg"

So I figured I would just have to convert the list of images into an acceptable format: quoted, absolute filenames, separated by space. Doing this depends entirely on the format the list is currently in, but it’s likely a list of unquoted filenames separated by newlines:

/home/steve/image1.jpg
/home/steve/my images/wow.jpg
/tmp/anotherimage.png

For me, my test list looked like this:

/usr/share/icons/gnome/48x48/stock/generic/stock_timezone.png
/usr/share/icons/gnome/16x16/stock/generic/stock_timezone.png
/usr/share/icons/gnome/16x16/stock/generic/stock_timer.png
/usr/share/icons/gnome/16x16/stock/generic/stock_timer_stopped.png
/usr/share/icons/gnome/16x16/stock/form/stock_form-time-field.png
/usr/share/icons/gnome/24x24/stock/generic/stock_timezone.png
/usr/share/icons/gnome/24x24/stock/generic/stock_timer.png
/usr/share/icons/gnome/24x24/stock/generic/stock_timer_stopped.png
/usr/share/icons/gnome/24x24/stock/form/stock_form-time-field.png

I was looking for icons of clocks or representations of time, and I obtained that list using find:

$ find /usr/share/icons/gnome/ -iregex ".*[^mul]time.*"

So I can’t pipe it into my image viewer, but I can use the output as the command-line arguments if I change the newlines to spaces. find has an option for formatting the output which is perfect:

$ find /usr/share/icons/gnome/ -iregex ".*[^mul]time.*" -printf "'%p' "
'/usr/share/icons/gnome/48x48/stock/generic/stock_timezone.png' '/usr/share/icons/gnome/16x16/stock/generic/stock_timezone.png' '/usr/share/icons/gnome/16x16/stock/generic/stock_timer.png' '/usr/share/icons/gnome/16x16/stock/generic/stock_timer_stopped.png' '/usr/share/icons/gnome/16x16/stock/form/stock_form-time-field.png' '/usr/share/icons/gnome/24x24/stock/generic/stock_timezone.png' '/usr/share/icons/gnome/24x24/stock/generic/stock_timer.png' '/usr/share/icons/gnome/24x24/stock/generic/stock_timer_stopped.png' '/usr/share/icons/gnome/24x24/stock/form/stock_form-time-field.png'

That’s great for me, because I’m using find. But not very useful if I’m not, so I wanted something more generic. Of course, there are many ways to do this, and again, I’m by no means a command-line guru. But here’s how I started:

$ find /usr/share/icons/gnome/ -iregex ".*[^mul]time.*" | sed -e 's/^/"/' | sed -e :a -e '$!N;s/\n/" /; ta' | tr '\n' '"'

This wrapped the lines in double-quotes and join them together with a space in between. The find command is the same as before, minus the formatting because that’s what I was trying to find an alternative to. The output of find is piped into sed, which adds a " at the beginning of each line. This output is then sent to another sed which replaces the newline character at the end of each line with a closing double-quote and a space, joining all lines into a single line. Finally, that output is piped into tr which replaces the one remaining newline with a final double-quote.

If the files don’t include spaces or other troublesome characters (mine didn’t), then you could get away with simply changing the newlines into spaces. But again, I wanted something generic.

$ find /usr/share/icons/gnome/ -iregex ".*[^mul]time.*" | tr '\n' ' '

Anyway, now that we have something that creates the desired input, we just have to wrap it in back-ticks and put the whole mess as the argument to the image viewer! In my case, I’m using eye-of-gnome (or eog).

$ eog `find /usr/share/icons/gnome/ -iregex ".*[^mul]time.*" | sed -e 's/^/"/' | sed -e :a -e '$!N;s/\n/" /; ta' | tr '\n' '"'`

Wait a second. That doesn’t actually work. Why not? Running the backtick contents by itself seemed to produce the correct output. Copying this output verbatim as arguments to eog worked as expected. The problem was that when the quoted arguments were manually entered on the command-line, bash (silently) escapes the filenames, removing the quotes, adding backslashes before space,s etc. But when the pipeline is wrapped in backticks, the result is not escaped, and eog complains about not being able to find files that begin with quotes. Fine. I was not about to write a bash “escape” script – something like that should already exist, right? And it should be built in to bash! Perhaps it’s even called “escape“. Well, if there exists such a built-in, I couldn’t find it. But I had to be going about this the wrong way. Heading over to IRC, it was kind of difficult to explain the problem, but ferret eventually gave me the meat of the script above:

files=(); while read -r; do files+=( "$REPLY" ); done < <(find /usr/share/icons/gnome/ -iregex ".*[^mul]time.*"); eog "${files[@]}"

It worked! I thanked him and began studying it. There were still a couple things I didn’t understand:

  • Why two angle brackets with a space between them? I understand the first one is probably redirecting input, but I don’t understand that one next to the opening parenthesis.
    Answer: The <(command) actually puts command‘s output in a temporary file and produces that filename. So <(command) becomes tempfile. (Thanks, kojiro.)
  • If I open some video or audio files in totem using open-with, there’s an odd delay. Using vlc doesn’t produce a delay, however.

And to think this was originally going to be a micro-blog post in Twitter and identi.ca. Wow. It’s safe to say I still hate shell scripting. 🙂

python treeview toggle

Had this post sitting around. Seems finished. May be helpful to someone. /me waves Wand of Publish +1

I was confused when I was playing around with this basic concept: adding a toggle widget to the treeview in pygtk. The reason for this is an inconsistency in the api model – or at least how I perceived it. With a regular toggle button, you create the widget and can manipulate it once it is drawn. The checkmark is toggled and the “toggled” signal is emitted. I only connect a signal handler to the toggled signal after. However, following this same logic, I created a list with a column of toggle widgets and tried clicking them… but nothing happened. The problem here was the toggled value was linked to the list’s data, and the data wasn’t actually changing. Even though the toggle signal was being emitted, the checkmark wasn’t being toggled because the data wasn’t changing, so I thought there was a problem with my code and the signal wasn’t being emitted. But actually, it would make more sense if it was a “clicked” signal that was being emitted, not the “toggled” signal.

Example source code:

#!/usr/bin/env python
 
# example basictreeviewtoggle.py
 
import pygtk
pygtk.require('2.0')
import gtk
import gobject
 
class BasicTreeViewToggleExample:
 
    # close the window and quit
    def delete_event(self, widget, event, data=None):
        gtk.main_quit()
        return False
 
    def column_toggled(self, cell, path, model):
        # get toggled iter, and value at column 0
        iter = model.get_iter((int(path),))
        val = model.get_value(iter, 0)
 
        # toggle the value
        val = not val
 
        # set new value
        model.set(iter, 0, val)
 
 
    def __init__(self):
        # create a new window
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_title("Basic TreeView Toggle Example")
        self.window.set_size_request(200, 200)
        self.window.connect("delete_event", self.delete_event)
 
        # create a ListStore with two columns to use as the model
        self.model = gtk.ListStore(gobject.TYPE_BOOLEAN, str)
 
        # create some list items
        for item in range(5):
            self.model.append([False, 'item %i' % item])
 
        # create the TreeView using the model
        self.view = gtk.TreeView(self.model)
 
        # create a CellRendererText to render the data
        self.cellrenderer_text = gtk.CellRendererText()
        self.cellrenderer_toggle = gtk.CellRendererToggle()
        self.cellrenderer_toggle.connect('toggled', self.column_toggled, self.model)
 
        # create the TreeViewColumns to display the data
        self.tvcolumntext = gtk.TreeViewColumn('TreeViewColumn 1')
        self.tvcolumntoggle = gtk.TreeViewColumn('tog', self.cellrenderer_toggle, active=0)
 
        # add the TreeViewColumns to the TreeView
        self.view.append_column(self.tvcolumntoggle)
        self.view.append_column(self.tvcolumntext)
 
 
 
 
        # add the cell to the tvcolumn and allow it to expand
        self.tvcolumntoggle.pack_start(self.cellrenderer_toggle, False)
        self.tvcolumntext.pack_start(self.cellrenderer_text, True)
 
 
        # set the cell "text" attribute to column 0 - retrieve text
        # from that column in treestore
        self.tvcolumntext.add_attribute(self.cellrenderer_text, 'text', 1)
 
 
 
        # make it searchable
        self.view.set_search_column(1)
 
        # Allow sorting on the column
        self.tvcolumntext.set_sort_column_id(1)
 
        # Allow drag and drop reordering of rows
        self.view.set_reorderable(True)
 
        self.sw = gtk.ScrolledWindow()
        self.sw.add(self.view)
        self.window.add(self.sw)
 
        self.window.show_all()
 
def main():
    gtk.main()
 
if __name__ == "__main__":
    tvexample = BasicTreeViewToggleExample()
    main()

Creating a DVD Slideshow in Linux

For my brother’s wedding, about a week ago, my sister wanted to do a slideshow for them. She’s done this before and she’s known for spending lots of time making very nice, emotional slideshows with carefully chosen pictures and music. Previously, she would count in her head while manually switch the slides with a traditional projector. (We have a lot of great family photos that are only on slides.) Anyway, she figured she’d use computers this time around and my assistance was “enlisted.” I kept thinking, “If only I had a Mac, I’m sure this would be easy….” But it turns out there’s a reasonable command-line program available on Linux that is just a little cumbersome (mostly because it’s command-line tool for something that really needs to be visual) – but works quite well: dvd-slideshow. I’m going to go over what I did, mention some quirks and how to work around them.

First, install dvd-slideshow (a set of command-line tools).

sudo aptitude install dvd-slideshow

You may want to get the latest version from the webpage and manually install that.

Update: While writing this, I have since discovered “slcreator” which looks like it would fill in the glaringly absent graphical component of dvd-slideshow. Though it hasn’t been updated for quite a long time…. it’s definitely worth investigating before going through the manual process yourself.

Step 1: Organize your digitized photos within a directory

Since my sister was the creative force behind this, she needed to see the photos as she was deciding on the order. Nautilus thumbnails were good enough, so I simply showed her how to rename files and made suggestions for organizing them by name (like naming a photo “12a.jpg” if you want the photo to be in between “12.jpg” and “13.jpg”). This worked in Nautilus, but in the next step, the ordering would be changed to 12a.jpg, 12.jpg, 13.jpg – which is probably a bug in dir2slideshow. (You could work around this by always using a single letter after the number.)

Step 2: Generate input file from images directory and customize

dir2slideshow -o output_directory -t seconds_per_picture -c crossfade_seconds images_directory

This will output a text file in the output_directory that contains all the images in the images_directory with specified transition and duration times. The order of the pictures should be how it is listed by name in your file browser, minus the bug I mentioned earlier. You can manually edit this file and then pass it to dvd-slideshow.

Multiple Directories:
My sister had arranged photos in multiple directories, each consisting of a theme (childhood, Halloween, travel, etc) and a specific song to go with it. So I just generated multiple input files with appropriate names, worked on individual sections, and eventually copied them all into a master input file keeping the desired order.

Adding Music and Silence:
Another bug I encountered was getting music to fade out at the correct time. In the input file, the format for adding music is this: audiofile:track:effect1:effect1_params:effect2:effect2_params . So I had my_sad_song.mp3:1:fadein:0:fadeout:5 saying I wanted it to spend 5 seconds fading out. Additionally, I wanted about 10 seconds of silence at the very end. Your are supposedly able to specify silence:duration_in_seconds but at the end of the slideshow, it wasn’t forcing the song to fade out in time to include that amount of silence – it seemed to be ignoring it at the end if there was no more photos. I got around this by creating a small file of silence, silence.wav, and using that instead of the built-in silence option.

Nice looking fonts
Another quirk I encountered was terrible looking fonts with the built-in title:duration:thought_provoking_title. I didn’t want to spend too long looking at the cause of this, so I just created some title images in the Gimp.

Step 3: Generate the Slideshow

dvd-slideshow -mp2 -nomenu -o tmp/working -f tmp/ALL.txt

The mp2 option is required to avoid an error message and has worked on all DVD players I’ve heard of, so far. The nomenu option is for creating a DVD with no menu – I just wanted it to start playing the slideshow when the disc is inserted into the player. The o option specifies the output directory and the f option specifies the input file created earlier. Once this finishes (it might take a while) you should have a DVD .vob (MPEG2) file and an xml file in the output directory.

Debugging:
I like to see how the final product will look, so I chose not to use the L (low quality) option for debugging. Instead, I created a smaller input file with specifically what I wanted to test. When I was happy with the test, I copied the changes into my master input file.

Step 4: Create the DVD Filesystem

dvd-menu -f tmp/working/ALL.xml -nomenu -mp2 -o tmp/working-dvd

This will output a folder dvd_fs in the output folder (tmp/working-dvd) containing VIDEO_TS and AUDIO_TS directories with the required files for a proper DVD.

Adding Content:
This is where you optionally add more files to the DVD. For me, I added two folders, Music containing the music used in the slideshow and Photos containing the photos used in the slideshow. A good idea would also be to add the source file and commands used to create the DVD and then you are distributing the source. 😉

Step 5: Make an ISO to burn

mkisofs -dvd-video -udf -o ~/Desktop/slideshow.iso tmp/working-dvd/dvd_fs

This creates an ISO called slideshow.iso on the desktop.

Step 6: Burn the ISO

There’s many ways to burn an ISO, but just use Nautilus: right click on the icon on your desktop and select Write to Disc…. That’s it! Test it out in your DVD player.

References

Lots more info about specific commands and useful examples can be found at the dvd-slideshow’s documentation page.

Playing Video from your Linux PC on your Wii

Maybe you’ve watched youtube videos on your Wii using the Internet Channel or the promo videos on the Nintendo Channel and you thought it would be cool to watch other videos from your (Linux) PC. I know I did. But I wasn’t sure if it would be possible in a reasonable quality. Since then, I’ve decided the quality was unacceptable for me… But I’ll try to quickly document what I did for others.

You basically have two options: Put a decompressed copy of your video on your SD card and watch it in the Photo Channel OR watch it streaming from your PC over your network via the Internet Channel (like youtube).

1. Playing it directly off your SD card

Instructions for how to convert the video to play in the Photo Channel can be found here:
http://icculus.org/~dolson/wii-video-conversion.html
HOWEVER, 3/4 of an hour of decent quality video will cost 1+ gigabytes, due to the format. The quality will be maintained, but unless you have a 2GB card and/or small videos, this may not be feasible. I couldn’t get my 45min (350MB originally, I think) file to fit on my 1GB SD card in the appropriate format, so I gave up on this method. I was more interested in browsing multiple files on my PC, anyways.

On to the other option….

2. Stream it from your computer

For this method, you need a few more things:

  • A home PC accessible from the network via your Wii
  • Videos you want to play need to be converted to Flash video (FLV). To do this, you will need ffmpeg.
  • sudo aptitude install ffmpeg
  • Web server running on your home PC. I’m using Apache on an Ubuntu PC.
  • sudo aptitude install apache2 apache2-utils

Most of what follows can be configured, but I’m going to try and follow what’s default in Ubuntu (if I can remember correctly).

To keep things clean, I enabled user directories. To do this, you must enable the userdir mod in apache:

sudo a2enmod userdir

What are user directories?

This is a directory (usually called “public_html”) that every user can use to publish things (like webpages) on the webserver from their home directory. For me, my home directory is /home/steve/ so my user directory is /home/steve/public_html/ . It is optional, so I have to create it if it doesn’t already exist.

mkdir ~/public_html/

When accessing these user directories via a web browser (Internet Channel), you must enter your Home PC’s IP address, followed by a tilde (~) and your username.

"http://your.pc's.ip.address/~username/"

So accessing my public_html directory is done as follows: http://192.168.0.99/~steve/ . (Note that 192.168.0.99 is a private IP address and unless your computer is set up on your local network with the same IP AND your username is “steve”, this won’t work for you. 😉 )

Test it, and make sure you’ve installed Apache and set up user directories correctly.

Flash Video Player

Now you need a compatible flash player to embed into your webpage. Wii’s Internet Channel is based on Opera, and includes Flash version…. 7?! Doh! Newer FLV players won’t work! Also, Full-screen mode isn’t possible so you want the video to be as large as possible, or to be easily zoomed in and centred – yup, it’s a pain. The best player I found for this was FLV Player, but feel free to look around for more. 😉 Now put your player of choice (I chose player_flv_maxi.swf) in public_html somewhere so that it can be included in your webpage.

Example Preparing Video

An example command for converting your video to FLV using ffmpeg:

ffmpeg -i input_video.avi -ar 22050 -b 1280 -s 320x240 output.flv

Example Webpage

An example of an html page containing a video:

< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 
	<title>Wii Video Test</title>
 
	<style type="text/css">
		body { background-color: #000; padding: 0 20px; color:#000; font: 13px/18px Arial, sans-serif; }
		a { color: #360; }
		h3 { padding-top: 20px; }
	</style>
 
</head>
<body>
 
    <object type="application/x-shockwave-flash" data="player_flv_maxi.swf" width="624" height="352">
        <param name="movie" value="player_flv.swf_maxi" />
        <param name="allowFullScreen" value="true" />
        <param name="FlashVars" value="flv=my_converted_video.flv&amp;autoload=1" />
    </object>
 
</body>
</html>

Note: both player_flv_maxi.swf and my_converted_video.flv must be in the same directory as this html page. For testing purposes, call this index.html and put it in your public_html directory.

That’s it, I think. Again, I wasn’t really satisfied with the compression of FLVs and the frame rate of bigger videos, so I ended up not using either of these two methods. I suppose a media PC, Apple TV, or PS3 or something would be better suited – none of which I have. 🙂

Related

Hacking the Printer

Look into my eyes, Brother (MFC420-CN)… repeat after me, “I still have ink left.”

This ink never runs out!

This ink never runs out!

I have a Brother MFC420-CN (multifunction printer) and it religiously cleans its heads as long as it is plugged in. This combined with the facts that it will not print unless it has ink and the cost of ink make for a pretty nice business plan for Brother. This is common practice with most budget bubble jets, I suppose, since I’m sure they lose some money on the ~$100 device. Even if you want to print in black, and you’re magenta is empty, it will refuse to print. I’m a little conflicted about how I feel about this, because Brother does provide open support for Linux, which is a good thing. Anyway, the solution is clear: trick the vile thing into thinking it has ink. In fact, all the times I’ve received the “replace ink” message, there has still been a little ink in the cartridge…. and after tricking it, you can still print in that colour (until it actually runs out, of course). Googling resulted in a post on a forum somewhere about applying a strip of black tape to the ink cartridge, but wasn’t very clear. After some trial and error, I hope this picture clarifies things. I guess the tape blocks light of some sort, which it uses to monitor ink level.

(Wasn’t really sure how to classify this post… don’t have a how-to category. I should upgrade to WP 2.3 and use tags….)

How to open a folder with the default file-manager in mono/C#

using System.Diagnostics;

Process.Start (“file:///home/”);

Did a bit of IRC channel ping-pong today. Went over to #f-spot to ask a user-related question about f-spot, and got pulled in by curiosity on a totally unrelated topic: opening a folder with the default file-manager. Initiated some discussion on #mono and discovered this was, in fact, not trivial – which seemed odd. But I’ve never personally written any C#, or much desktop code at all, for that matter. So I started playing around with various suggestions from the good folks in #mono, and writing my very first C# application.

(Yeah, basically a one-liner. You gotta start somewhere! ^_^) Anyway, for something so simple, there seemed to be a lot of uncertainty and discussion about it (even from the man, himself! – He claims his memory is fading…), so I figure it’s worth documenting. More info can be seen here under Process.

On FreeDesktop systems it will use xdg-open, if not, it will try to use gnome-open or kfmclient to open the files.

Not sure if this will work on Windows. The file:// prefix is required.

Update: According to ccoish, this will work on Windows.

Passing this info back to #f-spot resulted in a patch to allow you to open the folder containing your photo. Thanks, Gabriel! Open source is cool. 🙂

Not sure if I’ll look at C#/Mono much more, was kinda gonna do the Python thing for a while… but this was a fun distraction. 🙂

Faking MAC Address in Linux

I’m house-sitting for my brother, and I brought my computer over so I didn’t die of boredom, alone, in a house for a week. The problem is the Internet over here is hooked up directly to the modem, and the Internet provider will only provide an Internet address (IP address) to the ethernet card that was registered to them: the one in my brother’s computer. So, I turned on the computer, checked out the advanced properties of the ethernet card to get the MAC (physical) address and wrote it down. In Linux, using ifconfig, you can tell a particular interface to pretend its address is something else. If you’re using a Debian derivative (I’m using Ubuntu), you’ll probably need sudo before the command.

Note: Copy your current MAC address and put it somewhere safe, just in case – I haven’t tested to see if this is permanent, yet.

On the command line:

sudo ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx

Or, to make it permanent, put it in /etc/network/interfaces


...
auto eth0
iface eth0 inet dhcp
...
hw ether xx:xx:xx:xx:xx:xx
...

If you get an error message, saying the “Device or Resource is busy” then you probably have to bring the interface down first: sudo ifconfig eth0 down. Use ifconfig eth0 to check that it worked – it should show the new address if no error was reported. Once that was done, I connected my computer to the modem and the provider was much more cooperative with my DHCP requests. 😀 Yay, Internet on my computer again! 🙂