I recently became curious about creating some edit-in-place controls: things that look like static text until you click them, and they magically become editable. It turns out that creating this sort of thing is almost trivial with jQuery, which is now my favourite JavaScript framework. I’m a big fan of functional-style programming, and jQuery plays right into that.
It was still surprising that the bulk of what I wanted to do can be done in about 16 lines of code. That’s right: sixteen.
The plan was to create an edit-in-place system that would degrade nicely in browsers with JavaScript disabled. This isn’t necessarily as elegant as it could be and it doesn’t yet handle all input types, but that’s what version one is for! So without further ado, I present the code:
$.fn.in_place_edit = function() {<br />
this.each(function() {<br />
var $eip = $('<span></span>');<br />
var $el=$(this).hide().after($eip);<br />
$eip.text($el.val());<br />
$eip.click(function(){ $eip.hide(); $el.data('origval', $el.val()).show().focus().select(); });<br />
$el.blur(function(){<br />
if($el.is('select')) $el.data('origval', $el.val());<br />
$eip.text($el.data('origval')).show(); $el.hide().val($el.data('origval'));<br />
});<br />
$el.keydown(function(e){<br />
if (e.which==27) $el.val($el.data('origval')).blur();<br />
if (e.which==13||e.which==9) {<br />
e.preventDefault();<br />
$el.data('origval', $el.val()).blur();<br />
}<br />
});<br />
});<br />
};
Usage:
$(function(){ $('input, select').in_place_edit(); });
So, what does all this do? First of all, we create a new function on the main jQuery object, called in_place_edit. This then iterates over elements matching the selector. It hides the input and creates a placeholder <span> element with the input’s value. Then we simply set up event handlers to deal with the placeholder being clicked, the input losing focus, and various keypresses (enter/tab to accept, esc to cancel). To see it in action, I’ve put together a rough-and-ready demo.
Planned future enhancements:
- Checkbox input types (display using the labels?)
- Radio input types
- File input types (if possible)
- Textareas
- Any other types…
Maybe further updates later on!
Note: This is a fairly rambling explanation of recent events. I assume that you have at least a passing knowledge of LVM and its terminology. This was written to prove that it is possible to recover from pvmove failing (in certain cases) due to the way it performs its operations and backs up metadata. Continue reading “Recovering from pvmove failure” »
Many hearing aids can handle direct audio input (DAI), often via a “shoe” that attaches to contacts on the aid itself. This shoe then provides a DAI jack (sometimes called a europlug or eurojack) that cables can be plugged into.
There seems to be a complete lack of cables designed for people with a single hearing aid, so one of my upcoming projects will be to convert a Y-cable that can serve two hearing aids into a joint DAI/earphone cable instead.
 DAI connector pinout
The DAI connector has the following pinout:
- short/thick pin: ground
- long/thin pin: VDD (apparently — doesn’t seem to actually be connected to anything on a 3.5mm cable)
- short/thin pin: signal
Remember that a standard 3.5mm audio plug has the following pinout:
- tip: left signal
- inner sheath: right signal
- outer sheath: ground
Next stage: connecting an earphone to the plug on one side of the cable, to see if there are any impedance issues, although the cable I am using (an fmGenie one) is a very low-impedance cable because I have an Oticon hearing aid. Measured with a multimeter, it seems to be around 0Ω, so I think that’s good enough for me. I believe attenuated cables have a 330kΩ resistor in series with each signal line (according to Neil Ferguson’s bluetooth hearing aid hack page).
My ultimate goal is to get hold of a DAI jack that I can solder directly to an old earphone, so that I can just plug the spare DAI cable into the earphone directly, almost as if it were a hearing aid itself. Unfortunately, it seems that it is impossible to get hold of such things. According to Connevans, DAI jacks are only custom-made for hearing aid shoes. After some discussion, it seems like I should be able to make one myself though (with some help!) so we shall have to see how that turns out.
I’ve been thinking recently about Insight again, and I’ve been considering part of the problem with naming and uniqueness.
Names in a traditional file system are made unique based on a full path to the file, but most people think of a file name as just the final component. This would then cause a problem with the move to Insight, as a file could appear in multiple directories, and its only distinguishing feature would be the final component of its path. This is counter-intuitive and can cause all sorts of problems.
Consider makefiles, for example. They rely on a standard named file (Makefile) appearing at various levels in the hierarchy in order to work. Obviously, you would want different makefiles at different levels and in different projects, but Insight as it stands has no way to handle this.
I then started thinking about what makes a file unique. In the end, I came up with two things: name and content. This covers the makefile case (same name, different content) as well as the backup case (same content, different name). It then occurred to me that, in the general case, all you need to distinguish a file is its content, and then actually finding it can all be left up to metadata.
Continue reading “A content-based file manager” »
I recently had to restore a server that failed to boot after a power cut. This machine was a Linux VMWare host, and it had three Linux guest virtual machines that were running at the time. While we had full backups available, I decided to set myself the challenge of recovering the entire images, to save the pain of a complete rebuild.
The host server partitions were LVM-formatted volumes on top of hardware RAID-1, and each of the virtual hosts were partitioned with LVM too, internally. This means that the restore process will not be at all trivial. With just a complete image of the host system, I would need to restore (deep breath) files on a partition on an LVM logical volume (inside a volume group, on a physical volume) in a VMWare hard disk stored on LVM (logical volume inside volume group of physical volumes) inside a disk image that is itself a file on a disk. How very convoluted.
I used a Gentoo system to restore the data, although any Linux system with the appropriate packages should be able to do it. No searches turned up information on doing all of this, and I had to come up with some of it myself, so I thought I would document the process.
Continue reading “Restoring from LVM and VMWare disks” »
I’ve begun the long and (hopefully) interesting task of working on mod_sqltemplate. I have not yet found a tutorial or guide to working with APR’s DBD API (the database abstraction layer for the Apache Portable Runtime), so I’ll write one and publish it here as I go along…
The number of projects I have in mind just keeps growing… I really need to get something together to organise them, and remember them! But here are two more to add to the list: an Apache module for dynamic configuration generation and a PHP framework inside an extension. Read on for a monster post with more information…
Continue reading “Modules for Apache and PHP” »
So I’ve decided now that, as I have some free time and I will soon have some disposable income, that it’s time to start on an idea that’s been brewing for a little while: HackWeekend. This is a radical departure from some of my previous ideas, in that it’s a social thing.
When we were coming to the end of our time at university (and consequently our time as housemates), my good friend Alex Yong and I decided that this should not be the end, and we should all get together regularly afterwards. As we technical types aren’t that good at small talk, we thought that rather than just meeting up and chatting, we should actually have an aim in mind. An independent idea from another friend (Dave Durant) around the same time was that he and I should get together for a weekend sometime with lots of Red Bull and pizza and very little sleep, and to see what we could code/prototype.
Continue reading “HackWeekend: an introduction” »
I’ve been developing Insight even though the uni project has come to an end, because it’s fun! I also want to make it more stable and eventually release it under an open-source licence of some kind. There will be an update coming soon, I promise! I now have Internet, so I can write up some things… Anyway, one of the interesting things I wanted to do for Insight was an in-place form of uniq for an array, ideally without any additional memory allocation. It seems that this is something nobody else has done yet! So I set about doing it myself… For those of you who are unfamiliar with the Linux/UNIX command uniq, it takes a sorted list and removes any duplicates. This is almost exactly what I’m trying to do, with one caveat: I need to keep the “discarded” duplicates. What happens is that I have an array containing a number of strings, and these have all been dynamically allocated via malloc() or calloc(). If I just remove or overwrite their pointers, they’ll vanish and cause a memory leak. While I’ve now fixed a large number of leaks thanks to Valgrind, I’m trying to actively avoid any possibility of adding them. Read on for the details… Continue reading “In-place array uniq in C” »
So, today our ceiling fell in. With about as much warning as that! I was in our kitchen, preparing a cheese toastie for lunch. I opened the oven to put it under the grill to melt, while talking to one of my housemates. Suddenly he yelled “Move… MOVE!” and shoved me back. Up until he did that, I assumed he was just kidding around. And then, a fraction of a second later, the ceiling above the oven collapsed, showering down dust, plaster, bricks, and a bit of old copper piping. A brick went through the space the back of my head had been occupying just a heartbeat before. Needless to say, my plans for lunch were ruined It would have been one hell of an excuse for not handing in my project report on time though! To see pictures, read more… Continue reading “A funny thing happened today…” »
|
|