In part one, I talked about how to go about using only free software on your desktop or laptop computer, mostly leaving other consumer electronics out of the conversation. Hence, part 2.
Most people in the developed world have a multitude of computers around them. Most people don't even consider most of these computers to be computers, though some are more similar to laptop and desktop computers than others.
Just to name a few examples of the computers which surround us, most of us own a gaming system, cell phone, television, car, several set top boxes, kitchen appliances, networking and computer paraphernalia, and a multitude of other devices which contain embedded computers. As a software engineer, it makes me uncomfortable that I don't really know what these devices do while I'm not looking. And as a software engineer, it makes me think there must be a better way.
Why Is It The Way It Is?
Hackers are busy people, and their time is valuable to them. They
tend to work on what has the most payoff. That doesn't usually describe
flashing the firmware on their microwave ovens. It does however
describe flashing the firmware on their routers and game systems. As a
result, there are several GNU/Linux distributions made for routers such
as DD-WRT and OpenWrt and for all of the major game consoles, there is a
"homebrew" project soon after release.
In short, we hackers who are interested in exercising control over our devices choose our battles.
Which Devices are Lacking Free Software?
As I see it, the important devices which have yet to bet touched by
a significant amount of user-controllable Free Software are the majority of mobile phones, televisions, some set-top boxes, computer peripherals such as scanners and printers, and automobiles.
Mobile phones have more control of our lives by the day. They allow almost our entire lives to be tracked. As many of you are already aware, it is possible for law enforcement to activate virtually all commercially available cell phones' microphones for covert surveillance. Aside from the fact that this is a power law enforcement has not been able to exercise over citizens before, this back door is vulnerable to exploitation by malicious parties. Why should we as owners of these devices allow this?
For televisions, the issue is more the fact that a television not in your control is one which you cannot use to its full capacity. If your television has a sufficiently powerful embedded computer, and you wish to be able to play games from said embedded computer, there's no reason why you as the owner of the television should not be able to do this.
Set-top boxes have the capability of limiting your freedoms to do with your content as you wish. Some already heed the "broadcast flag" which can prevent DVR's from recording content even from local broadcast television stations.
Among computer peripherals, printers are probably the most important devices to bring Free Software firmware to. Virtually all commercially available printers print virtually invisible dots on every page which may be used to track down the printer on which it was printed. The potential for abuse here is also great.
And, finally, automobiles' firmware touches on issues of safety, privacy, and efficiency, among others. With vulnerable firmware, a vehicle may be unsafe. Many vehicles these days have GPS built-in, making privacy a concern. And, the firmware has a strong effect on the feul efficiency as well.
Many other such devices exist which users have a need to be able to control. However, we must choose our battles and focus on the highest-priority devices first.
What Can Be Done?
For many, porting a GNU/Linux distribution to an embedded device such as a mobile phone or a set-top box is not an insurmountable task. If you're interested in porting GNU/Linux to an embedded device, I can recommend the Gentoo Embedded Handbook. If you have other resources for interested parties, please post them in the comments.
In some cases, Free Software has been brought to devices without porting an operating system to them. For instance, the Nintendo Wii has the Homebrew Channel. This not an operating system, but it does allow for writing software for the Wii (as well as installing at least a couple of different GNU/Linux distributions.) For information on this type of approach, Andrew "Bunny" Huang's book "Hacking the Xbox" is an excellent resource.
Until next time, happy hacking.
Showing posts with label software. Show all posts
Showing posts with label software. Show all posts
Tuesday, January 3, 2012
Wednesday, December 28, 2011
Technology to Empower the Users
Technology can assist governments and corporations in their ends, often to detrimental and oppressive ends. Some countries monitor and censor communications using firewalls and deep packet inspection. Some companies produce software laced with DRM and antifeatures for their own benefit.
But there is another side to technology. More individuals are using technology to put power back into their own hands.
These efforts are overwhelmingly grassroots and community driven projects. In fact, it's questionable whether a technology imposed in a top down manner can give power to the users in any meaningful way.
This blog post is meant to give a quick introduction to just a few of the specific projects and technologies out there for giving power to individuals previously retained by those with power.
The RepRap Project
The RepRap Project is an active and so far extremely successful effort to bring the ability to manufacture consumer goods to individuals everywhere. "RepRap" is short for "Replicating Rapid Prototyper." At this point, the project is less than seven years old and has already designed from scratch four official RepRap devices. With the proper software (all of which is free and open source), users can design a 3D model on a computer and "print" the three dimensional object using the RepRap in various types of plastic in only a few hours.
The 3D models that one person designs may be easily shared via the Internet. At this point, the most popular place for sharing these 3D model files seems to be Thingaverse. Not all of the models on that site may be printed using a RepRap, but the majority are, and all are able to be rapid prototyped in some manner.
Perhaps the most interesting feature of the RepRap is that it is designed to be able to print many of its own parts. 3D model files of these parts are freely available on the RepRap project's wiki. This has some amazing benefits. The user has the ability to print backup parts for themselves, print the parts for a friend to ease the process of getting into desktop manufacturing, and modify the 3D model files and print the new parts so that s/he may improve and/or customize the device.
An assembled, functional RepRap may be purchased for under $1,400 at Botmill, among many other places.
GNU Radio
GNU Radio is a project to allow users to detect and analyze radio signals in their current area. Almost any radio signal may be analyzed from ham radio bands to Wifi and television bands. The project allows users even to decode digital television signals for audio/visual playback.
Whereas other means of detecting signals require a crystal to be tuned to each frequency individually in order to get a signal, GNU Radio allows for "listening on all channels at once." This does require some specialized hardware which can be a bit expensive, but the payoffs are great.
Tor
Tor (The Onion Router) is a project for protecting users' anonymity online. One of the greatest benefits the Internet has given us is the ability to speak and be heard without experiencing negative repercussions. This anonymity allows Internet citizens to be truly honest about their opinions, which they may not be willing to express in "real life."
Tor is software which establishes peer-to-peer connections between computers, allowing them to use each other as proxies. This allows users to engage in internet communication without a significant risk that somebody (such as and ISP, government, or other third party) will be able to trace the communication back to them. This can be done both for clients and servers, allowing for freer expression than should be conducted without such protections.
Tor can be and has been used by political dissidents attempting to spread their messages as well as those attempting to publish and view unpopular information.
These projects should be the subject of several later posts. They have the ability to change the world in positive ways by giving more power to accomplish useful things to individuals interested in making a difference.
But there is another side to technology. More individuals are using technology to put power back into their own hands.
These efforts are overwhelmingly grassroots and community driven projects. In fact, it's questionable whether a technology imposed in a top down manner can give power to the users in any meaningful way.
This blog post is meant to give a quick introduction to just a few of the specific projects and technologies out there for giving power to individuals previously retained by those with power.
The RepRap Project
The RepRap Project is an active and so far extremely successful effort to bring the ability to manufacture consumer goods to individuals everywhere. "RepRap" is short for "Replicating Rapid Prototyper." At this point, the project is less than seven years old and has already designed from scratch four official RepRap devices. With the proper software (all of which is free and open source), users can design a 3D model on a computer and "print" the three dimensional object using the RepRap in various types of plastic in only a few hours.
The 3D models that one person designs may be easily shared via the Internet. At this point, the most popular place for sharing these 3D model files seems to be Thingaverse. Not all of the models on that site may be printed using a RepRap, but the majority are, and all are able to be rapid prototyped in some manner.
Perhaps the most interesting feature of the RepRap is that it is designed to be able to print many of its own parts. 3D model files of these parts are freely available on the RepRap project's wiki. This has some amazing benefits. The user has the ability to print backup parts for themselves, print the parts for a friend to ease the process of getting into desktop manufacturing, and modify the 3D model files and print the new parts so that s/he may improve and/or customize the device.
An assembled, functional RepRap may be purchased for under $1,400 at Botmill, among many other places.
GNU Radio
GNU Radio is a project to allow users to detect and analyze radio signals in their current area. Almost any radio signal may be analyzed from ham radio bands to Wifi and television bands. The project allows users even to decode digital television signals for audio/visual playback.
Whereas other means of detecting signals require a crystal to be tuned to each frequency individually in order to get a signal, GNU Radio allows for "listening on all channels at once." This does require some specialized hardware which can be a bit expensive, but the payoffs are great.
Tor
Tor (The Onion Router) is a project for protecting users' anonymity online. One of the greatest benefits the Internet has given us is the ability to speak and be heard without experiencing negative repercussions. This anonymity allows Internet citizens to be truly honest about their opinions, which they may not be willing to express in "real life."
Tor is software which establishes peer-to-peer connections between computers, allowing them to use each other as proxies. This allows users to engage in internet communication without a significant risk that somebody (such as and ISP, government, or other third party) will be able to trace the communication back to them. This can be done both for clients and servers, allowing for freer expression than should be conducted without such protections.
Tor can be and has been used by political dissidents attempting to spread their messages as well as those attempting to publish and view unpopular information.
These projects should be the subject of several later posts. They have the ability to change the world in positive ways by giving more power to accomplish useful things to individuals interested in making a difference.
The Unix Philosophy
I'm a software engineer by trade. One thing I've learned is that college is not enough to make you a good software engineer (or programmer, for that matter). You have to make a lot of mistakes yourself to get good at it.
One viewpoint which leads to a lot of such mistakes, and one which must be discarded in order to be a good programmer, is the idea that "more features is better." The result of such a misnomer is bloated software which tries to do everything and doesn't do anything very well. Not only that, but the resulting software has limited configurability and uses more resources than necessary.
The "Unix Philosophy" is a perspective on software development which is aimed at addressing this problem. It consists of a list of rules of thumb that programmers and software engineers should apply to their work. There is a bit of disagreement about some of the wording, but the spirit of the Unix Philosophy is well agreed upon.
From Wikipedia, Mike Gancarz's version of the unix philosophy:
1. Small is Beautiful
A large program has many potential points of failure. If there's a bug, it's easy to find because there's not as much program to look through as if it's a big program. Also, if it's small enough, it's easy to keep the entire inner workings of it in your head at once. It's easier to grasp. And it takes less work for somebody unfamiliar with the program to become familiar (or even an expert) with the software.
But how small is small? Let's take an example of a class of software applications generally considered to be required to be "large" -- web browsers. Sloccount (a tool for counting how many lines of source code a program consists of) reports that Firefox 8.0 (a fairly recent release) consists of 3,291,364 lines of code. Surf is a minimalistic browser which follows the Unix Philosophy. Sloccount indicates that the recent 0.4.1 release of Surf consists of 753 lines of code. That's an incredible difference.
2. Make Each Program do One Thing Well
In other words, each program should have exactly one feature. No more. No less. A program which does two things is unnecessarily complex. If you need two features, use two programs. Simple.
3. Build a Prototype as Soon as Possible
Often, this is phrased as "release early and release often." If you release a prototype, you can get feedback early, which allows you to fix problems early on.
4. Choose Portability Over Efficiency
Portability gives you more options. It allows you (and others) to test on faster hardware and slower hardware which allows you to ferret out issues nicely. Also, it will pay off later when the niche technology you decided not to use becomes abandonware.
5. Store Data in Flat Text Files
Flat text files give a lot of power to the users as opposed to binary formats. Binary formats, even if the code for parsing them is open source, just take a lot more work to work with. Flat text formats can be edited in text editors. It can't get much easier than that.
This one in particular is the subject of some controversy. Many object that databases are often times the right tool for the job of storing data, even if they do have some drawbacks such as making it more difficult to port the data to other means of storage.
6. Use Software Leverage to Your Advantage
Code has some interesting properties. One is that a useful function or library may be written once and used in multiple places. Many mistakes may be made in the process of writing software which makes it difficult to reuse useful bits of software, however. "Using Software Leverage" means making your software easy to reuse so that you don't have to rewrite it later.
7. Use Shell Scripts to Increase Leverage Portability
Shell scripts are wonderful things. They're written to run in the shell, which means they are written in the same language as the commands you type directly on the shell. A single line in a shell script can actually do a surprisingly powerful operation. Also, shell scripts can be made very portable very easily.
8. Avoid Captive User Interfaces
A "captive user interface" is one which requires (or virtually requires) a human to operate. Just about any interface which requires a mouse is a captive interface. These are not always a bad thing, but are almost always a bad thing. They restrict the ways in which the program may be used.
9. Make Every Program a Filter
A "filter" is a program which takes input and produces output without any other effects. A good example of a filter is the Unix command "sort" which takes a bunch of text (one word per line) sorts the lines lexographically, and prints out the sorted version. It does nothing but sort the input and print out the sorted version.
This is just an overview of the Unix Philosophy. There is much more to be said. There are in fact books on the topic.
But don't worry. You'll be hearing a lot more about the Unix Philosophy and applications which employ it.
Happy hacking.
One viewpoint which leads to a lot of such mistakes, and one which must be discarded in order to be a good programmer, is the idea that "more features is better." The result of such a misnomer is bloated software which tries to do everything and doesn't do anything very well. Not only that, but the resulting software has limited configurability and uses more resources than necessary.
The "Unix Philosophy" is a perspective on software development which is aimed at addressing this problem. It consists of a list of rules of thumb that programmers and software engineers should apply to their work. There is a bit of disagreement about some of the wording, but the spirit of the Unix Philosophy is well agreed upon.
From Wikipedia, Mike Gancarz's version of the unix philosophy:
- Small is beautiful.
- Make each program do one thing well.
- Build a prototype as soon as possible.
- Choose portability over efficiency.
- Store data in flat text files.
- Use software leverage to your advantage.
- Use shell scripts to increase leverage and portability.
- Avoid captive user interfaces.
- Make every program a filter.
1. Small is Beautiful
A large program has many potential points of failure. If there's a bug, it's easy to find because there's not as much program to look through as if it's a big program. Also, if it's small enough, it's easy to keep the entire inner workings of it in your head at once. It's easier to grasp. And it takes less work for somebody unfamiliar with the program to become familiar (or even an expert) with the software.
But how small is small? Let's take an example of a class of software applications generally considered to be required to be "large" -- web browsers. Sloccount (a tool for counting how many lines of source code a program consists of) reports that Firefox 8.0 (a fairly recent release) consists of 3,291,364 lines of code. Surf is a minimalistic browser which follows the Unix Philosophy. Sloccount indicates that the recent 0.4.1 release of Surf consists of 753 lines of code. That's an incredible difference.
2. Make Each Program do One Thing Well
In other words, each program should have exactly one feature. No more. No less. A program which does two things is unnecessarily complex. If you need two features, use two programs. Simple.
3. Build a Prototype as Soon as Possible
Often, this is phrased as "release early and release often." If you release a prototype, you can get feedback early, which allows you to fix problems early on.
4. Choose Portability Over Efficiency
Portability gives you more options. It allows you (and others) to test on faster hardware and slower hardware which allows you to ferret out issues nicely. Also, it will pay off later when the niche technology you decided not to use becomes abandonware.
5. Store Data in Flat Text Files
Flat text files give a lot of power to the users as opposed to binary formats. Binary formats, even if the code for parsing them is open source, just take a lot more work to work with. Flat text formats can be edited in text editors. It can't get much easier than that.
This one in particular is the subject of some controversy. Many object that databases are often times the right tool for the job of storing data, even if they do have some drawbacks such as making it more difficult to port the data to other means of storage.
6. Use Software Leverage to Your Advantage
Code has some interesting properties. One is that a useful function or library may be written once and used in multiple places. Many mistakes may be made in the process of writing software which makes it difficult to reuse useful bits of software, however. "Using Software Leverage" means making your software easy to reuse so that you don't have to rewrite it later.
7. Use Shell Scripts to Increase Leverage Portability
Shell scripts are wonderful things. They're written to run in the shell, which means they are written in the same language as the commands you type directly on the shell. A single line in a shell script can actually do a surprisingly powerful operation. Also, shell scripts can be made very portable very easily.
8. Avoid Captive User Interfaces
A "captive user interface" is one which requires (or virtually requires) a human to operate. Just about any interface which requires a mouse is a captive interface. These are not always a bad thing, but are almost always a bad thing. They restrict the ways in which the program may be used.
9. Make Every Program a Filter
A "filter" is a program which takes input and produces output without any other effects. A good example of a filter is the Unix command "sort" which takes a bunch of text (one word per line) sorts the lines lexographically, and prints out the sorted version. It does nothing but sort the input and print out the sorted version.
This is just an overview of the Unix Philosophy. There is much more to be said. There are in fact books on the topic.
But don't worry. You'll be hearing a lot more about the Unix Philosophy and applications which employ it.
Happy hacking.
Labels:
design,
do one thing,
engineering,
good programmer,
mike gancarz,
minimal,
philosophy,
programming,
sloccount,
small is beautiful,
software,
software design,
software engineering,
unix,
unix philosophy
Subscribe to:
Posts (Atom)