<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}
	
.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see AdvancedOptions
<<importTiddlers>>
Since I use Vodafone mobile broadband via a USB HSPA modem, I simply grabbed the 2.0b3 Vodafone Betavine package from [[here|https://forge.betavine.net/frs/download.php/269/vodafone-mobile-connect-card-driver-for-linux-2.0.beta3-ALL-i386-installer.run]] and ran it from a terminal window to install.

I strongly recommend checking for updated versions. This one works perfectly, and although I've seen mention that you need to fix permissions on {{{/opt/etc/vmc/ppp/peers}}}, that is //wrong// - what you do need is to reboot, since it adds {{{user}}} to the {{{vmc}}} group, which gives you the right permissions.

After installation, you can add {{{/usr/share/applications/vmc.desktop}}} to the [[Acer desktop|Adding apps to the Acer launcher]] //after// you add the lines:

{{{
Version=1.0
Comment=Connect via 3G/HSPA
}}}

to the {{{.desktop}}} file. Otherwise, the launcher will crash, since it requires those fields to be present.
The key file to edit to add applications to the Acer desktop is {{{/user/.config/xfce4/desktop/group-app.xml}}}. Editing the file manually and adding any standard {{{.desktop}}} launcher will make it appear on the Acer desktop without any hassles.

However, the {{{.desktop}}} files __must__ list a version number and have usable icons - otherwise the launcher will crash and you'll get a black screen.

Also, do not use position 7. For some reason, that seems to confuse the launcher to no end.

(A word of advice: It is easier to add the apps without bothering with order and changing the order by drag and drop on the GUI.)

A quick way to see available apps is to navigate to {{{/usr/share/applications}}}. Thunar will interpret the {{{.desktop}}} files, though, so you'll have to obtain the correct filenames via the terminal.

To test/apply your settings, kill and relaunch the {{{xfdesktop2}}} process:

{{{
killall xfdesktop2; xfdesktop2 &
}}}
For some forsaken reason, the Citrix client is still dependent on OpenMotif and libXp, and therefore requires one of two approaches:

* Finding a suitable RPM for OpenMotif
* Hacking other libraries (such as {{{lesstif}}}) so that they work.

Furthermore, the shipped {{{libxcb}}} is buggy, so you have to update that as well. But that is a minor issue when compared to the OpenMotif dependency.

Me, I chose to use [[this RPM|http://download.tuxfamily.org/rpm/drpixel/fedora/8/i386/openmotif-2.3.0-0.1.9.4.fc8.drpixel.i386.rpm]], and installed everything like so:

{{{
sudo yum install libXp libxcb
sudo yum --nogpgcheck install openmotif-2.3.0-0.1.9.4.fc8.drpixel.i386.rpm
sudo yum --nogpgcheck install ICAClient-10.6-1.i386.rpm 
}}}

I also used [[this great icon|http://www.shawnbass.com/Portals/0/Articles/CategoryImages/Citrix.png]] for the launcher.

If you've [[upgraded Firefox|Firefox 3]], you should then associate {{{.ica}}} files with {{{/usr/lib/ICAClient/wfica}}}.
Background: #fff
Foreground: #000
PrimaryPale: #888
PrimaryLight: #ccc
PrimaryMid: #444
PrimaryDark: #000
SecondaryPale: #888
SecondaryLight: #ccc
SecondaryMid: #444
SecondaryDark: #000
TertiaryPale: #888
TertiaryLight: #ccc
TertiaryMid: #444
TertiaryDark: #000
Error: #f88
Assuming you got the kernel source from [[here|ftp://[email protected]/Aspire_One_Linpus_Linux/Aspire_One_Source/linux-2.6.23.9lw.zip]], you can rebuild the modules on the Aspire One itself by unpacking it in {{{/usr/src}}}:

{{{
yum install make gcc
# the above will also install a kernel-headers package, which is mostly harmless but that you might want to remove later.
cd /usr/src
unzip /home/user/Downloads/linux-2.6.23.9lw.zip 
cd linux-2.6.23.9/
cp /boot/config_080627 .config
cd include
rm -rf asm
cd ..
make oldconfig
make modules
}}}
This will leave things set up for compiling extra modules.
[[Introduction]]
[[Disclaimer]]
If like me you need the Home/Windows key for emulation, standard key bindings, etc., the way to get it back is to edit the {{{~/.XHkeys}}} file and replace key code 115 with 116 (that's the code for the right-hand "super" key, which isn't present on the built-in keyboard).

Doing {{{killall -HUP xhkeys}}} will apply the changes without a reboot.
Since many of the notes herein involve low-level tinkering with the Acer Aspire One's customized environment, it bears pointing out that if you attempt to replicate them, ''you do so at your own risk'' - i.e., I cannot be held accountable for any damage or data loss __you__ bring upon yourself by following them.

As such the documentation in this Wiki is supplied without any guarantee of accuracy, completeness, or suitability towards any specific goal.
Navigate to {{{/usr/share/applications}}}, launch the Xfce desktop preferences, go into the //Behavior// tab and click the //Show desktop menu on right click// option.
To my considerable surprise, [[Evernote|http://www.evernote.com]] for Windows runs perfectly fine under [[WINE]] (including accepting formatted text from the OpenOffice clipboard), although the toolbars look a mess.
Since I occasionally have to mount remote filesystems and prefer to store some things with a modicum of security, I also set up FUSE and two of its most common filesystems, {{{sshfs}}} (that allows you to mount remote filesystems over [[SSH|SSH, SFTP, etc.]] and {{{encfs}}}, which I prefer to TrueCrypt on the Acer because it appears to be more stable.

To install both, you need to use the base {{{fedora}}} versions and force installation of the required RPM files like so:

{{{
sudo yum install yum-utils
sudo yumdownloader --disablerepo=updates fuse fuse-sshfs fuse-encfs rlog
sudo rpm --nodeps -ivh fuse-* rlog
}}}

({{{rlog}}} is a dependency of {{{encfs}}} that can be installed normally, but in this case I just packed it together)

Afterwards, you need to add your user ({{{user}}} to the {{{fuse}}} group in {{{/etc/group}}}) and reboot.
Although I tried to stick to applications that could be installed from the default Fedora repositories and avoid bleeding edge software, the F11 full-screen mode is too good not to have on the Aspire One, so I made an exception. 

Unlike most people who try to install Firefox 3 from RPMs, I opted to use the standalone (even if slightly heavier) package available [[here|wget http://download.mozilla.org/?product=firefox-3.0.1\&os=linux\&lang=en-US]].

Like [[macles|http://macles.wordpress.com/2008/07/22/firefox-3-on-the-acer-aspire-one-a110/]], I set it up in {{{/opt/firefox}}}, but I did __not__ replace the Firefox 2 binary - I left everything as it was and simply modified the existing {{{mozilla-firefox.desktop}}} file to point to {{{/opt/firefox/firefox}}}.

The only really important bit is that you don't forget to link all the old plugins:
{{{
sudo ln -s /usr/lib/mozilla/plugins/* /opt/firefox/plugins
}}}
...and reinstall [[MediaWrap|https://addons.mozilla.org/en-US/firefox/addon/1879]] to get the status bar control for some of them.

As to the {{{.desktop}}} file, you can find it in {{{/usr/share/applications/mozilla-firefox.desktop}}}, and [[add it to the Acer Launcher|Adding apps to the Acer launcher]] without replacing the built-in browser.

I also did three other things:

* moved {{{.mozilla}}} to the SD card under {{{/tmp/posixdir}}}
* set up a master password (always a good policy)
* set {{{network.prefetch-next}}} to {{{false}}}
Most people don't use Xfce, so they don't know that hitting __Alt+F2__ will bring up a "Run" prompt. Hitting Return will pop up a terminal window.
Hello there. This page is [[a self-contained Wiki|http://www.tiddlywiki.com]] where I compiled all my notes regarding customizing the Acer Aspire One 110's Linux environment with minimum hassle //and// minimum impact.

Most people make two mistakes when they start using the AA1:

* They assume it's a general purpose machine
* They assume the Linpus environment is completely locked down

Both of these assumptions are wrong. If you want a general purpose machine, you shouldn't be using an AA1, and if you know your way around Fedora and Xfce, you can customize the machine to an amazing degree without breaking anything and save yourself the trouble of installing something (be it Windows or Linux) that will probably never be completely functional.

These notes are broken down into several groups, tagged as <<tag basics>>, <<tag essentials>>, <<tag advanced>>, etc.

Use the navigation links to get around, and feel free to edit this for your own purposes. You can [[drop me a line|http://the.taoofmac.com/space/About]] if you have any other information you'd like to contribute to this file, but bear in mind that I won't tell you how to set up application {{{foo}}} or fix {{{bar}}} if you can't do it yourself - quite honestly, I don't have the time.
For some reason, Acer set up the Aspire one in such a fashion that Ctrl+A does __not__ select all text in some applications. 

To fix that, invoke xfce-settings-manager at a [[Terminal|Getting a Terminal]], go to keyboard settings and set keyboard map to "Default" instead of "Emacs"
As much as I personally detest KDE, I must admit that it does work very well on the AA1, for a number of reasons:

* KMail is marginally more usable than [[Thunderbird]] in a small screen (despite its hideous UI)
* KWrite provides a pretty decent general purpose editor
* Konqueror performs {{{sftp}}} transfers without the hassle of dealing with [[sshfs|FUSE, sshfs and encfs]]
* The built-in KWallet security framework works with {{{ksshaskpass}}} and does not collide with Acer's modified {{{gnome-keyring}}}.

Plus upgrading the few KDE libraries shipped with the AA1 did not significantly break the environment, so despite my personal tastes it was a reasonable thing to do.

To install the whole thing, just do:

{{{
sudo yum install kdebase kdepim kdeutils
}}}

I saw no real point in installing {{{koffice-suite}}}, but it's there (and working) if you're interested. Just remove the built-in Kolourpaint first.

Finally, if you mess up the {{{kpowersave}}} battery icon by messing around with KDE themes, just remove {{{~/.kde}}}. There's probably a finer way to fix this without losing all of your KDE settings, but I'm OK with it.
[[Introduction]]
<<tag basics>>
<<tag essentials>>
<<tag advanced>>
[[Disclaimer]]
The only annoying bit of the Acer AA1 for me is the somewhat noisy fan, and it was with some interest that I came across [[this very neat solution|http://wiki.aspireone.net/index.php/How_to_hack_the_noisy_fan]], that I'm summarizing here for later reference:

* Place [[acer_ec.pl]] and [[acerfand]] in {{{/usr/local/bin}}}, marking them as executable
* Add a call to [[acerfand]] from {{{/etc/rc.local}}}
* If necessary, tweak the fancontrol by creating {{{/etc/acerfand.conf}}}, which defaults to:
{{{
INTERVAL=5
FANOFF=60
FANAUTO=70
}}}
That's a 5 second polling interval, off at 60C, auto speed at 70C. I set mine to run 5 degrees cooler (55/65).
If, like me, you use [[Mercurial|http://www.selenic.com/mercurial]] to manage your stuff, a simple {{{sudo yum install mercurial}}} will get you going.
<!--{{{-->
<div class='header'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
This is one of the tricky ones, because by installing Pidgin you will completely break the Acer mail and IM applications.

You start by removing the built-in {{{libpurple}}}, which will remove those as well (since they're all integrated):

{{{
sudo yum remove libpurple
sudo yum install pidgin
}}}

Some people also remove {{{evolution-data-server}}} to completely remove all Acer custom components related to this (your mileage may vary).

//Note: If you absolutely __must have__ video over MSN, you shouldn't do this (Pidgin doesn't support that yet).//
This one was easy - Acer published a keyboard layout settings icon as part of a recent update, so all that was required was to run live update.
To my considerable surprise, VirtualBox runs fine on an unexpanded (i.e., 512MB RAM) One. I installed {{{VirtualBox-1.6.4_33808_fedora8-1.i586.rpm}}} in the usual way after installing the [[kernel sources|Compiling Kernel Modules]] without any ill effects.

Just don't forget to add {{{user}}} to the {{{vboxusers}}} group and reboot.

The resulting setup can run a minimal Windows XP installation inside the One with pretty decent speed __and__ seamless windows (although I only find it snappy if I close everything else, since VirtualBox will use a considerable amount of RAM in the process).

The only thing that took me a while to figure out was how to get {{{vboxdrv}}} to run on boot, since for some reason {{{init}}} appears not to invoke it (or maybe it is invoked and fails - I have not yet figured it out completely).

But it can be fixed by adding

{{{
sudo /etc/init.d/vboxdrv start
}}}

To {{{/etc/rc.d/slim/nowait.sh}}}. I initially used {{{/usr/bin/add_driver.sh}}}, but this seems to be a somewhat neater way to do it.

If you're having trouble with video modes in XP, increasing the virtual machine's video RAM setting to 64MB will allow you to have a full screen (or seamless) 16-bit display.
Once you install SSH via:

{{{
sudo yum install openssh-clients
}}}

...the built-in {{{gftp}}} will be able to do file transfers over SSH. It's pretty basic, but works (and supports remote file editing).
Making Linpus Linux usable
Acer Aspire One Notes
Downloading the [[Fedora 7 package|http://www.skype.com/go/getskype-linux-fc7]] worked fine (the installer figured out the Qt dependencies and downloaded the appropriate packages without any issues).

Then [[add it to the launcher|Adding apps to the Acer launcher]] by inserting {{{/usr/share/applications/skype.desktop}}} somewhere.

Skype video does //not// work with compositing, and some people have reported that the webcam fails after resume - so far, I have not experienced that.
[[Customizing TiddlyWiki|http://tiddlywikiguides.org/index.php?title=TiddlyWiki_Themes]]
/*{{{*/

body { font-family: arial,helvetica,sans-serif; }
.editor textarea {font-family: monospaced; font-size: 11pt; height: 400px;}
.editor input, .editor textarea {border: 1px solid #ccc;}

.header {background: [[ColorPalette::Background]]; padding: 10px;}
.headerShadow {position:relative; padding:1em; left:0px; top:10px; background:[[ColorPalette::Background]]; border-top: 4px solid [[ColorPalette::Foreground]]; font-size: 0.8em;}
.headerForeground {display:none;}

.siteTitle {font-size:2em; font-weight: bold;}
.siteSubtitle {font-size:1.2em;}

.viewer pre {border-left:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::Background]];}

/*}}}*/
* Don't assume you can upgrade //any// package
* Don't mess around with GTK packages
* Don't remove Adobe Acrobat (it's required for the help system)
* Ever, __ever__ replace {{{gnome-keyring-daemon}}} or mess around with the {{{root}}} keyring, because that will break the automagic Network Manager setup. To get that back go [[here|http://update.linpus.com/ACER/AspireOne/v1.0.9/]] and reinstall the {{{NetworkManager109.sh}}} update (or anything newer).
Just doing {{{sudo yum install thunderbird}}} will do, and you can of course [[add it to the launcher|Adding apps to the Acer launcher]] without any problems - I replaced the built-in Acer mail and calendar applications.

Installing it via {{{yum}}} will update {{{nspr}}} and {{{nss}}}, but I have not noticed any ill effects. But you can also grab the tarball and install it like I did with [[Firefox|Firefox 3]].

You will, however, have some trouble with screen height (since the compose window is one of the stupidest UI designs to ever come out of Mozilla). You can follow [[this HOWTO|http://wiki.eeeuser.com/howto:shrinkthunderbird]] for reducing the size of the compose window, but I honestly didn't bother yet.
Just drop everything inside {{{~/.fonts}}}.
I fiddled around with {{{twitux}}} (which you can install via {{{yum}}} without any ill effects, but eventually settled on the Twitterfox add-on since I keep [[Firefox|Firefox 3]] open permanently anyway.
Although the Acer Aspire One with SSD isn't really meant to be a multimedia machine, it already has a pretty decent {{{mplayer}}} installation.

However, since I occasionally have to test RTSP streaming video, VideoLan is always useful to have around. I installed the 'official' Livna packages like so:

{{{
sudo rpm -ivh http://rpm.livna.org/livna-release-8.rpm
sudo yum install vlc python-vlc mozilla-vlc
sudo ln -s /usr/lib/mozilla/plugins/* /opt/firefox/plugins
}}}

The last line binds the VLC plugin to [[Firefox 3|Firefox 3]].
Nothing much to it. {{{sudo yum install wine}}} does everything, but you might want to move {{{drive_c}}} to an SD card. 

Also, I disabled window manager integration to have the standard Windows 2000 look (helps a bit in terms of look and feel).

Installed applications get their own {{{.desktop}}} files (usually inserted in the menus under {{{~/.local}}}, and you can place them in the [[Acer launcher|Adding apps to the Acer launcher]] just like any other application.

There is a significant caveat, though: I can't get it to work properly with the Portuguese keyboard yet - although I've set {{{LC_ALL=pt_PT.UTF8}}}, accented characters can't be typed.
This is a script to read the Acer Embedded Controller, taken from [[here|http://code.google.com/p/aceracpi/wiki/EmbeddedController]].

{{{
#!/usr/bin/perl -w

# Copyright (C) 2007  Michael Kurz     michi.kurz (at) googlemail.com
# Copyright (C) 2007  Petr Tomasek     tomasek (#) etf,cuni,cz
# Copyright (C) 2007  Carlos Corbacho  cathectic (at) gmail.com
#
# Version 0.6.1 (2007-11-08)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.


require 5.004;

use strict;
use Fcntl;
use POSIX;
use File::Basename;

sub initialize_ioports
{
  sysopen (IOPORTS, "/dev/port", O_RDWR)
    or die "/dev/port: $!\n";
  binmode IOPORTS;
}

sub close_ioports
{
  close (IOPORTS)
    or print "Warning: $!\n";
}



sub inb
{
  my ($res,$nrchars);
  sysseek IOPORTS, $_[0], 0 or return -1;
  $nrchars = sysread IOPORTS, $res, 1;
  return -1 if not defined $nrchars or $nrchars != 1;
  $res = unpack "C",$res ;
  return $res;
}

# $_[0]: value to write
# $_[1]: port to write
# Returns: -1 on failure, 0 on success.
sub outb
{
  if ($_[0] > 0xff)
  {
    my ($package, $filename, $line, $sub) = caller(1);
    print "\n*** Called outb with value=$_[1] from line $line\n",
          "*** (in $sub). PLEASE REPORT!\n",
          "*** Terminating.\n";
    exit(-1);
  }
  my $towrite = pack "C", $_[0];
  sysseek IOPORTS, $_[1], 0 or return -1;
  my $nrchars = syswrite IOPORTS, $towrite, 1;
  return -1 if not defined $nrchars or $nrchars != 1;
  return 0;
}

sub wait_write
{
	my $i = 0;
	while ((inb($_[0]) & 0x02) && ($i < 10000)) {
		sleep(0.01);
		$i++;
	}
	return -($i == 10000);
}

sub wait_read
{
	my $i = 0;
	while (!(inb($_[0]) & 0x01) && ($i < 10000)) {
		sleep(0.01);
		$i++;
	}
	return -($i == 10000);
}

sub wait_write_ec
{
	wait_write(0x66);
}

sub wait_read_ec
{
	wait_read(0x66);
}

sub send_ec
{
	if (!wait_write_ec()) { outb($_[0], 0x66); }
	if (!wait_write_ec()) { outb($_[1], 0x62); }
}

sub write_ec
{
	if (!wait_write_ec()) { outb(0x81, 0x66 ); }
	if (!wait_write_ec()) { outb($_[0], 0x62); }
	if (!wait_write_ec()) { outb($_[1], 0x62); }
}

sub read_ec
{
	if (!wait_write_ec()) { outb(0x80, 0x66 ); }
	if (!wait_write_ec()) { outb($_[0], 0x62); }
	if (!wait_read_ec())  { inb(0x62); }
}

sub write_kc
{
	if (!wait_write(0x64)) { outb($_[0], 0x64); }
	if (!wait_write(0x64)) { outb($_[1], 0x60); }
}

sub print_regs
{
	initialize_ioports();

	my @arr = ("00","10","20","30","40","50","60","70","80","90","A0","B0","C0","D0","E0","F0", "");

	my $i = 0;
	my $t = 0;
	print "\n  \t00\t01\t02\t03\t04\t05\t06\t07\t|\t08\t09\t0A\t0B\t0C\t0D\t0E\t0F\n";
	print "  \t__\t__\t__\t__\t__\t__\t__\t__\t|\t__\t__\t__\t__\t__\t__\t__\t__\n";
	print "00 |\t";
	for ($i = 0; $i < 256; $i++)
	{
		$t = read_ec($i);
		print $t;
		print "\t";
		if ((($i + 1) % 8) == 0){
			if ((($i + 1) % 16) == 0) {
				if ($i != 255) { print "\n$arr[(($i-(($i + 1) % 16)) / 16) + 1] |\t"; }
			} else {
				print "|\t";
			}
		}
	}
	
	print "\n";
	
	close_ioports();
}

sub write_temp
{
	initialize_ioports();
	write_ec($_[0],$_[1]);
	close_ioports();
}

sub testnum
{
	my $i;
	for ($i = 0; $i<256;$i++) {
		if ($_[0] eq "$i") { return 1 };
	}
	return 0;
}

my $ii;

if (!$ARGV[0]){
        print "wrong arguments!\n";
	print "usage:\n";
	print "\'acer_ec regs\' \t\t\t\tdumps all ec registers\n";
	print "\'acer_ec ledon\' \t\t\t\tswitch on 'mail LED' (WMID)\n";
	print "\'acer_ec ledoff\' \t\t\t\tswitch off 'mail LED' (WMID)\n";
	print "\'acer_ec getled\' \t\t\t\tget 'mail LED' status (WMID)\n";
	print "\'acer_ec getled2\' \t\t\t\tget 'mail LED' status(AMW0)\n";
	print "\'acer_ec getwireless\' \t\t\t\tget 'wireless' status (AMW0)\n";
	print "\'acer_ec gettouch\' \t\t\t\tis the touchpad disabled?\n";
	print "\'acer_ec setfanthresh <temp>\' \t\t\t\tset temperature threshhold to <temp>, DANGEROUS!\n";
	print "\'acer_ec getfanthresh\' \t\t\t\tget temperature threshhold\n";
	print "\'acer_ec <temp-number> <temperature>\' \tfor setting a temperature\n";
	print "where <temp-number> is from 0-7, and <temperture> is from 0-255\n";
	print "\'acer_ec ?= <reg>\' \t\tQuery register's value\n";
	print "\'acer_ec := <reg> <val>\' \tSet register's value\n";
	print "\'acer_ec +f <reg> <val>\' \tOr register's value with val (to set flags)\n";
	print "\'acer_ec -f <reg> <val>\' \tAnd register's value with ~val (to clear flags)\n";
	print "\'forcekc\' \tTry all possible values on writeable RAM of keyboard controller\n";
	print "\'kcw <cmd> <val>\' \tWrite a command and a value to the keyboard controller\n";
} elsif ($ARGV[0] eq "regs") {
	print_regs();
} elsif ($ARGV[0] eq "getled") {
	# TM2490 only (WMID)
	initialize_ioports();
	if (read_ec(0x9f)&0x01) {
		print "Mail LED on\n";
	} else {
		print "Mail LED off\n"; }
	close_ioports();
} elsif ($ARGV[0] eq "getled2") {
	# Aspire 5020 only (AMW0)
	initialize_ioports();
	if (read_ec(0x0A)&0x80) {
		print "Mail LED on\n";
	} else {
		print "Mail LED off\n"; }
	close_ioports();
} elsif ($ARGV[0] eq "getwireless") {
	# Aspire 5020 only (AMW0)
	initialize_ioports();
	if (read_ec(0x0A)&0x4) {
		print "Wireless on\n";
	} else {
		print "Wireless off\n"; }
	close_ioports();
} elsif ($ARGV[0] eq "gettouch") {
	# TM2490 only - needs testing
	initialize_ioports();
	if (read_ec(0x9e)&0x08) {
		print "touchpad disabled\n";
	} else {
		print "touchpad enabled\n"; }
	close_ioports();
} elsif ($ARGV[0] eq "?=") {
	initialize_ioports();
	my $r = hex($ARGV[1]);
	printf("REG[0x%02x] == 0x%02x\n", $r, read_ec($r));
	close_ioports();
} elsif ($ARGV[0] eq ":=") {
	initialize_ioports();
	my $r = hex($ARGV[1]);
	my $f = hex($ARGV[2]);
	my $val = read_ec($r);
	printf("REG[0x%02x] == 0x%02x\n", $r, $val);
	printf("REG[0x%02x] := 0x%02x\n", $r, $f);
        write_ec( $r, $f);
	printf("REG[0x%02x] == 0x%02x\n", $r, read_ec($r));
	close_ioports();
} elsif ($ARGV[0] eq "+f") {
	initialize_ioports();
	my $r = hex($ARGV[1]);
	my $f = hex($ARGV[2]);
	my $val = read_ec($r);
	printf("REG[0x%02x] == 0x%02x\n", $r, $val);
	printf("REG[0x%02x] := 0x%02x\n", $r, $val | $f);
        write_ec( $r, $val | $f);
	printf("REG[0x%02x] == 0x%02x\n", $r, read_ec($r));
	close_ioports();
} elsif ($ARGV[0] eq "-f") {
	initialize_ioports();
	my $r = hex($ARGV[1]);
	my $f = hex($ARGV[2]);
	my $val = read_ec($r);
	printf("REG[0x%02x] == 0x%02x\n", $r, $val);
	printf("REG[0x%02x] := 0x%02x\n", $r, $val & ~$f);
        write_ec( $r, $val & ~$f);
	printf("REG[0x%02x] == 0x%02x\n", $r, read_ec($r));
	close_ioports();
} elsif ($ARGV[0] eq "ledon") {
	# TM2490 only - needs testing
	initialize_ioports();
	if (!wait_write(0x64)) { outb(0x59, 0x64); }
	if (!wait_write(0x64)) { outb(0x92,   0x60); }
	close_ioports();
} elsif ($ARGV[0] eq "ledoff") {
	# TM2490 only - needs testing
	initialize_ioports();
	if (!wait_write(0x64)) { outb(0x59, 0x64); }
	if (!wait_write(0x64)) { outb(0x93,   0x60); }
	close_ioports();
} elsif ($ARGV[0] eq "getfanthresh") {
	initialize_ioports();
	$ii=read_ec(0xa9);
	close_ioports();
        print "Temperature threshhold: $ii (celsius)\n";
} elsif (($ARGV[0] eq "setfanthresh") && testnum($ARGV[1])) {
	write_temp(0xA9,$ARGV[1]);
} elsif ($ARGV[0] eq "setbright") {
	# Aspire 5020 only (AMW0)
	if ($ARGV[1] >= 0 && $ARGV[1] <= 15) {
		write_temp(0x83, $ARGV[1]);
	} else {
		print "second argument must be a number between 0 and 15\n";
	}
} elsif ($ARGV[0] eq "forcekc") {
	# Be smart - we only send the commands for writing to keyboard RAM
	initialize_ioports();
	my ($kbdata, $cont, $kbreg);
	for ($kbreg = 0x40; $kbreg <= 0x5f; $kbreg++) {
		for ($kbdata = 0; $kbdata < 256; $kbdata++) {
			write_kc($kbreg, $kbdata);

			print sprintf("%0#4x", $kbreg), ", ", sprintf("%0#4x", $kbdata), "\n";
			print "Continue? y/n: ";
			$cont = <STDIN>;
			if ($cont eq "n") {
				last;
			}
		}
	}
	close_ioports();
} elsif ($ARGV[0] eq "kcw") {
	initialize_ioports();
	write_kc($ARGV[1], $ARGV[2]);
	close_ioports();
} else {
	print "wrong arguments!\n";
}
}}}
This is a shell script to manage the fan speed, obtained via [[this Wiki page|http://wiki.aspireone.net/index.php/How_to_hack_the_noisy_fan]].

{{{
#!/bin/bash
#
# acerfand - Rudimentary automatic fan control for noisy Acer Aspire One models
#
# Author Rachel Greenham
#
# version 0.01

LOGGER=$(which logger)
if [ ! -x $LOGGER ] ; then
	LOGGER="/usr/bin/logger"
fi
if [ ! -x $LOGGER ] ; then
	echo "Warning, logger can't be found. Will log to stdout"
	unset LOGGER
fi

LOGLEVEL="info"

log() {
	if [ ! -z "$LOGGER" ] ; then
		$LOGGER -p daemon.$LOGLEVEL -t acerfand "$@"
	else
		echo "$@"
	fi
}

info() {
	LOGLEVEL="info"
	log "$@"
}

notice() {
	LOGLEVEL="notice"
#	log "$@"
}

err() {
	LOGLEVEL="err"
	log "$@"
}

if pgrep acerfand  | grep -v $$ > /dev/null; then
	info "acerfand already running"
	exit 0
fi

ME=$(readlink -f $0)

ACEREC=$(which acer_ec.pl)
if [ -z $ACEREC ] ; then
	ACEREC=$(dirname $ME)/acer_ec.pl
fi

if [ ! -r $ACEREC ] ; then
	err "acer_ec.pl can't be found"
	exit 1
fi

INTERVAL=5
FANOFF=60
FANAUTO=70

if [ -r "/etc/acerfand.conf" ] ; then
	source "/etc/acerfand.conf"
fi

R_FAN=55
R_TEMP=58

FAN_CMD_OFF=1f
FAN_CMD_AUTO=00

FAN_STATE_UNRECOGNIZED=0
FAN_STATE_AUTO=1
FAN_STATE_OFF=2
FAN_STATE_NAMES=("Unrecognized" "Auto" "Off")
FAN_STATE_CMDS=("$FAN_CMD_OFF" "$FAN_CMD_AUTO" "$FAN_CMD_OFF")

acer_ec() {
	perl $ACEREC $@
}

getTemp() {
	TEMP=$[$(acer_ec ?= $R_TEMP | cut -f 3 -d' ')]
	notice "temp: $TEMP"
}

getRawFanState() {
	RAW_FAN_STATE=$(acer_ec ?= $R_FAN | cut -f 3 -d' ')
}

getFanState() {
	FAN_STATE=$FAN_STATE_UNRECOGNIZED
	getRawFanState
	if [ "$RAW_FAN_STATE" == "0x1f" ]; then
		FAN_STATE=$FAN_STATE_OFF
	else
		let A="$RAW_FAN_STATE & 0x10" || true
		if [ "$A == 0" ] ; then
			# ASSUMPTION: All values with nybble 1==0 denote auto
			FAN_STATE=$FAN_STATE_AUTO
		fi
	fi
	notice "read fan state ${FAN_STATE_NAMES[$FAN_STATE]}"
}

setFan() {
	info "Set fan ${FAN_STATE_NAMES[$1]}"
	acer_ec := $R_FAN ${FAN_STATE_CMDS[$1]} > /dev/null
}

govern() {
trap "info exiting;setFan $FAN_STATE_AUTO; exit" INT TERM EXIT
info "Starting to govern acer fan speed. Interval: $INTERVAL, fan-off: $FANOFF, fan-auto: $FANAUTO"
while true; do
	getTemp
	getFanState
	case "$FAN_STATE" in
		$FAN_STATE_AUTO)
			if [ "$TEMP" -le "$FANOFF" ] ; then
				setFan $FAN_STATE_OFF
			fi
			;;
		$FAN_STATE_OFF)
			if [ "$TEMP" -ge "$FANAUTO" ] ; then
				setFan $FAN_STATE_AUTO
			fi
			;;
		*)
			# weird state. Let's turn it off,
			# then decide next time around
			setFan $FAN_STATE_OFF
			;;
	esac
	sleep $INTERVAL
done
}

set -e

govern &
}}}
Set {{{keepcache}}} to 0 in {{{/etc/yum.conf}}} to prevent files being cached locally.