A massive marathon has resulted in my lumail mail client working well.
Functionally the application looks little different to the previous C-client, but it is a lot cleaner, neater, and nicer internally.
The configuration file luamail.lua gives a good flavour of the code, and the github repository has brief instructions.
Initially I decied that the navigation/index stuff was easy and the rest of the program would be hard; dealing with GPG-signatures, MIME-parts, etc.
But I'm stubborn enough to keep going.
If I can get as far as reading messages, with MIME handled properly, and replying then I can switch to using it immediately which will spur further development.
I'm really pleased with the keybinding code, and implementing the built-in REPL-like prompt was a real revelation. Worht it for that alone.
The domain name lumail.org was available. So I figured why not?
About a year ago I migrated all my workstations, laptops and netbooks to Arch Linux. Since then, I've setup Arch Linux on a Raspberry Pi and this server was also recently migrated to Arch Linux.
I've had no major issues issues during the last year and have upgraded through five major Linux kernels, transistioned to systemd and upgraded from Gnome 3.2 to 3.8.
Although I have been disciplined about merging .pacnew files frequently, during the upgrades and my many experimentations I have packages installed that I no longer require and obsolete files kicking about.
After the upgrade to Gnome 3.8 I decided to clean up a little. I rarely dip into the AUR, but when I do I always use packer to clearly seperate what is official from what is not.
Finding what is installedThe following commands are useful for identifying installed packages based on where they were installed from. The package lists generated from the commands below can be quite big but often highlight packages that I know I'm no longer using nor require.
Listing installed packagesList packages installed from the official repositories.
pacman -Qq | grep -Fv -f <(pacman -Qqm)List packages installed from the AUR.
pacman -Qqm Listing installed packages by sizeUse pacsysclean to list installed packages sorted by size, it helps identify large packages that are no longer required which can the be manually uninstalled.
Listing orphaned packagesList ophaned packages install from the official repositories.
pacman -Qqtd | grep -Fv -f <(pacman -Qqtdm)List ophaned packages from the AUR.
pacman -Qqmtd Getting package informationGet package information for a package in the official repositories.
pacman -Si <package>Get package information for a package in the AUR.
packer -Si <package> Removing orphaned packagesRemoving ophaned packages manaully can be very time consuming, but is by far the safer option. However, I decided to take a brave pill a uninstall all orphaned packages automatically.
Remove all ophaned packages installed from the official respositories.
sudo pacman -Rs `pacman -Qqtd | grep -Fv -f <(pacman -Qqtdm)`Remove all ophanced packages install from the AUR.
sudo pacman -Rs $(pacman -Qqtdm) Re-installing what you do needWhen you do something scary like removing all the obsolete packages automatically, then you should really make sure you do have everything install that you require.
Re-install 64-bit base sudo pacman -S --needed `pacman -Sqg base multilib-devel | grep -v gcc-libs | tr '\n' ' '` Re-install 32-bit base sudo pacman -S --needed `pacman -Sqg base base-devel | tr '\n' ' '`Reinstall the groups required for a Gnome 3 desktop.
sudo pacman -S --needed `pacman -Sqg gnome gnome-extra telepathy | tr '\n' ' '`Install all missing dependencies for packages in the official repositories.
sudo pacman -S --needed `pacman -Si $@ 2>/dev/null | awk -F ": " -v filter="^Depends" \ '$0 ~ filter {gsub(/[>=<][^ ]*/,"",$2) ; gsub(/ +/,"\n",$2) ; print $2}' | grep -v smtp- | sort -u`Install all missing dependencies for packages in the AUR. This will re-install even if the package is already installed. I can't be arsed to filter it out for a one liner.
sudo packer -S --noedit --noconfirm `packer -Si $(pacman -Qqm) 2>/dev/null | awk -F ": " -v filter="^Depends" \ '$0 ~ filter {gsub(/[>=<][^ ]*/,"",$2) ; gsub(/ +/,"\n",$2) ; print $2}' | grep -v java- | sort -u` Find files not associated with a packageWhen packages are removed they may leave some files behind. The following will find all files not associated with a package. These files can not be automatically deleted, each entry requires assessment.
pacman -Qlq | sort -u > /tmp/db sudo find /bin /etc /sbin /usr ! -name lost+found \( -type d -printf '%p/\n' -o -print \) | sort > /tmp/fs comm -23 /tmp/fs /tmp/dbAs with all sping cleaning chores, I got bored by this stage as my workstation was looking pretty tidy. Much of what is presented in this blog post is a rehash of what others have already contributed to the Arch Linux Wiki. I've just organised what "Works For Me ™" so I know what to do next year.
ReferencesThe story chosen to represent the Peter Davison era of Doctor Who at the BFI’s 50th anniversary screenings was Caves of Androzani. It’s an odd choice, as it is unlike other stories being produced at the time. It’s a excellent story, an excellent script and very well directed. But it’s not fun. The few quips and jokes in the script raised only muted laughter from the audience and, apart from the two leads, every character is flawed. There are no heroes in the story and almost every character dies, an ignominious end awaiting each of them. There are no blazes of glory here. The Doctor doesn’t influence events particularly, he doesn’t right any wrongs. He just wants to cure Peri and get out of there alive. Even then, he only half manages it.
The story was introduced by Mark Gatiss. Half way through. composer Roger Limb talked about his time at the Radiophonic Workshop. By a happy coincidence, the music from Caves of Androzani has just been released on CD.
The discussion panel afterwards was lively. To say the least. After his brief appearance at last month’s screening, I hadn’t expected to see Matthew Waterhouse this month, but there he was. The BFI even showed Adric’s death scene while the panel was on the stage. There was a fair bit of good natured ribbing between Peter and Janet, and some less good natured ribbing of Matthew. But things settled down and Matthew raised some interesting points. A refreshing number of questions from the audience were directed at Graeme Harper, and a fair few people who thanked Peter for being “their Doctor”.
Afterwards a small group of podcasters gathered in the by-now-traditional car park stairwell to review the story and the panel. It will be available from The Doctor Who Podcast Facebook page very soon. You can still download our review of “Robots of Death”, the 4th Doctor BFI screening.
Pin ItThe new stable version of Debian, codenamed Wheezy, is finally here.
Main features of Debian 7.0 Wheezy are multiarch support,
specific tools to deploy private clouds, a greatly improved
installer and a complete set of multimedia codecs and front-ends which remove the need for third-party
repositories.
For a complete list of new features and updated software, take a look at the
official announcement.
Want to give it a try?
Check out the live images!
Want to install it?
Choose your favourite installation media among Blu-ray Discs, DVDs,
CDs and USB sticks.
Already a happy Debian user and you only want to upgrade?
You are just an apt-get dist-upgrade away from Wheezy!
Find how, reading the installation guide
and the release notes.
Some useful links:
To recap: given the absence of other credible alternatives I had two options:
I think there is room for a new console client, because mutt is showing its age and does feel like it should have a real extension language - be it guile, lisp, javascript(!), Lua, or something else.
So I distilled what I thought I wanted into three sections:
So how did I do? I wrote a ncurses-based client which has Lua backed into it. You can fully explore the sidebar-mode - which lets you select multiple folders.
From there you can view the messages in a list.
What you can't do is anything "real":
For a two-day hack it is remarkably robust, and allowing scripting shows awesomeness. Consider this:
-- -- show all folders in the Maildir-list. -- function all() -- ensure that the sidebar displays all folders sidebar_mode = "all"; -- we're going to be in "maildir browsing mode" cmail_mode = "sidebar"; reset_sidebar(); refresh_screen(); end -- -- Test code, show that the pattern-searching works. -- -- To use this press ":" to enter the prompt, then enter "livejournal". -- -- OR press "l" when in the sidebar-mode. -- function livejournal() sidebar_pattern = "/.livejournal.2"; sidebar_mode = "pattern"; reset_sidebar(); refresh_screen(); end -- -- There is a different table for each mode. -- keymap = {} keymap['sidebar'] = {} keymap['index'] = {} keymap['message'] = {} -- -- In the sidebar-mode "b" toggles the sidebar <-> index. -- -- ":" invokes the evaluator. -- "q" quits the browser and goes to the index-mode. -- "Q" quits the program entirely. -- keymap['sidebar'][':'] = "prompt-eval" keymap['sidebar']['b'] = "toggle" keymap['sidebar']['q'] = "toggle" keymap['sidebar']['Q'] = "exit" -- show all/unread/livejournal folders keymap['sidebar']['a'] = "all" keymap['sidebar']['u'] = "unread" keymap['sidebar']['l'] = "livejournal"Neat, huh? See the cmail.lua file on github for more details.
My decision hasn't really progressed any further, though I can see that if this client were complete I'd love to use it. Its just that the remaining parts are the fiddly ones.
I guess I'll re-hack mutt, and keep this on the back-burner.
The code is ropey in places, but should you wish to view:
And damn C is kicking my ass.
A few weeks back my friend Lucy sent me a message asking if I would be prepared to spend some time talking about photography and sharing some techniques. Lucy studied photography at GCSE (proper “wet” photography) and has been getting into digital photography recently. Of course, I said “yes” and on Sunday we met up on the South Bank. It’s a great place to explore, with plenty of colour, shade, textures, areas and angles. That’s even before you look at the collection of street performers, which on this particular day included a fire-belching euphonium and a man stood in the Thames playing electric guitar.
I’ve never tried to teach anyone photography skills before, even in an informal setting like this. I’d been thinking through what I wanted to talk about beforehand, but kept feeling overwhelmed by how much detail I found myself including. It was reassuring to me that I understood all the technical stuff in that depth, but an interesting challenge to pick and choose the most important bits. Lucy wanted to focus on the technical stuff, so we didn’t talk about interacting with people too much. Hopefully next time!
We started by working through the “exposure triangle”, the mixture of shutter speed, aperture and ISO that gives the perfect exposure. I made Lucy take photos of me (poor thing!) until we had a good exposure, then varying one setting and adjusting the others to compensate. We also talked about the artistic impact that each setting has on an image, using aperture to separate a subject from their background and shutter speed to freeze or harness motion. Oh, and I also managed to blather on about direction and quality of light, metering, white balance, focal length, composition, angle, patterns.
Lucy posted some great images after our walk. Hopefully my witterings were of use, but I enjoyed catching up with Lucy and talking about my favourite subject with her.
Pin It