Wednesday, October 14, 2009

qpaeq dynamic band subdivision

So heres a slick little feature to qpaeq you aren't likely to find in any other equalizer out there... simply widen the window and watch the magic happen.

Normal - this is the default number of bands available in most equalizers

A little more...

a little bit mooore...

and here's the widest I've ever made it


Notice that this still all has an octave feel to it. You get diminishing returns with that - all you've got to do is change the DEFAULT_FREQS in the qpaeq.py though, preferably to something linear. I'll make a linear bands an option in the future (along with the default of octaves) - it's useful for my own purposes as I explain below.

Why did I do this? Elementary my dear Watson - hand crafted notch filters, that's why! I've got a bunch of songs with horrible noise in them that I can never find the frequency the noise belongs to - this makes it only a few minute ordeal and I've gotten results much better than audacity's stuff in less time. Oh and it just looks cool - go get qpaeq and try it out - it's nice and interactive while you stretch and shrink.

One of these days I'll try and record filtered audio (not too hard thanks to pulseaudio and monitors) to show people the difference equalization can make.

Oh, btw - I'm finally in pulseaudio mainline. You can also get qpaeq in releasish form here: https://sourceforge.net/projects/qpaeq/

Configuring redmine to be your all in one project manager

Well, it was a lot of work (when I did it the first time), but it could have been worse. The goal was to take redmine's user/group information and tie it into the sourcecode management stuff with all the groups preserved. There are recipes for subversion integration of this kind and this was a great base, but not only was this subversion only, I didn't like that a magic script ran every x minutes to create repositories that didn't exist. But I used all of the stuff up to and including the mysql auth stuff. So follow that tutorial first and break off when you've completed mysql nss/pam configuration. A word of warning btw, I tried to make this stuff as secure as possible, but I could not do everything needed without resorting to two very careful entries in the /etc/sudoers file.

I should also point out that you probably will want to run redmine as a system user. I created a redmine user for this and wrote an appropriate configuration for lighttpd. I also made redmine work over HTTPS, but this is something googleable. From here on out, it's assumed that the redmine user exists and is whom redmine runs as.

Lets configure and take a look at the environment.

Perform the following actions as root.
mkdir /home/redmineusers
chown -R root:root /home/redmineusers
cd /home/redmineusers
mkdir bin projects
chown -R root:root bin
chown -R redmine:root projects


After following the above tutorial, make a change to the shell_column property:
users.shell_column = "/bin/rbash";
users.homedir_column = "/home/redmineusers/";

/home/redmineusers/.profile
umask 0007
export PATH=$HOME/bin/
There are symbolics links from .bashrc and .bash_login. This seemed necessary for ssh to work ok with the environment.

/usr/local/bin/hg.wrapper
#!/bin/bash
SRVSTRING="^-R projects/[a-z0-9-]+ serve --stdio$"
export PATH=/bin:/usr/bin:$PATH
CWD="$(dirname "$PWD/")/$(basename "$PWD/")"
HOME="$(dirname "$HOME/")/$(basename "$HOME/")"
if [[ $CWD == $HOME && $@ =~ $SRVSTRING ]]
then
/usr/bin/hg -R "$2" serve --stdio
if [[ $? == 0 ]]
then
/usr/bin/sudo /usr/local/bin/fixrepoperms "$2" 2>/dev/null
exit 0
else
exit 1
fi
else
exit 1
fi
Make a symbolic link in /home/redmineusers/bin/hg -> /usr/local/bin/hg.wrapper

/usr/local/bin/createrepo
#!/bin/bash
ROOT_PATH=/home/redmineusers/projects/
#RE="^[a-zA-Z0-9 ]+$"
RE="^[a-z0-9-]+$"
if [[ $1 =~ $RE ]]
then
cd "$ROOT_PATH"
/usr/bin/hg init "$1"
chown -R redmine:"$1" "$1"
chmod -R o-rwx "$1"
find "$1" -type d -exec chmod a+s "{}" ";"
chmod -R g+rw "$1"
true
else
false
fi

/usr/local/bin/fixrepoperms
#!/bin/bash
#RE="^[a-zA-Z0-9 ]+$"
RE="projects/[a-z0-9-]+"
export PATH=/bin:/usr/bin:$PATH
CWD="$(dirname "$PWD/")/$(basename "$PWD/")"
HOME="$(dirname "$HOME/")/$(basename "$HOME/")"
if [[ $CWD == $HOME && $@ =~ $RE ]]
then
prj=`basename "$1"`
chown -R redmine:"$prj" "$1"
chmod -R o-rwx "$1"
find "$1" -type d -exec chmod a+s "{}" ";"
chmod -R g+rw "$1"
else
false
fi
And now two additions to to your /etc/sudoers:
redmine ALL = NOPASSWD: /usr/local/bin/createrepo
ALL ALL = NOPASSWD: /usr/local/bin/fixrepoperms
And now you apply a patch. Its dirtyish code but it works ok and is much cleaner than things I've seen in the past for this stuff - for instance when you create your project, you won't have to wait x minutes for the repo to show up!

Index: app/controllers/projects_controller.rb
===================================================================
--- app/controllers/projects_controller.rb (revision 2924)
+++ app/controllers/projects_controller.rb (working copy)
@@ -74,6 +74,13 @@
@project.enabled_module_names = Redmine::AccessControl.available_project_modules
else
@project.enabled_module_names = params[:enabled_modules]
+ r = Repository.factory("Mercurial",:root_url => "/home/redmineusers/projects/#{@project.identifier}",
+ :url => "/home/redmineusers/projects/#{@project.identifier}")
+ @project.repository = r
+ g = Group.new({ "lastname" => @project.identifier} ) #blidly create a new accompanying group
+ gr = Role.givable.find_by_name("Developer")
+ gm = Member.new(:principal => g, :roles => [gr], :project => @project)
+ @project.members << m =" Member.new(:user"> User.current, :roles => [r])
@project.members << controller =""> 'projects', :action => 'settings', :id => @project
end
end
+
+
end

def copy
Index: extra/svn/create_views.sql
===================================================================
--- extra/svn/create_views.sql (revision 2924)
+++ extra/svn/create_views.sql (working copy)
@@ -13,7 +13,7 @@
from projects;

CREATE OR REPLACE VIEW nss_users AS
-select login AS username, CONCAT_WS(' ', firstname, lastname) as realname, (id + 5000) AS uid, 'x' AS password
+select login AS username, CONCAT_WS(' ', firstname, lastname) as realname, (id + 5000) AS uid, 'x' AS password,
from users
where status = 1;
Make sure you rerun the create_views.sql script. It should rerun just fine and now users have to be active rather than just exist.

If you've completed the above, congratulations. You now have a secure, private sandboxed environment for every project (in which you're protected by good old unix permissions) that is tied to your redmine user/group database. Each project gets it's own group on creation and you must add developers to this group to get sourcecode management access. You also have a secured / restricted environment for users to ssh into - but really only as a gateway to hg serve. You should be able to configure this to your needs for your flavor of SCM. Redmine should also have your repository entered upon project creation (it seems you must make a commit though before it looks like it works, this is understandable).

project management - the FOSS choices

Long time no post. Well, I've recently had to come up with a sourcecode management system, one which would work well for a growing buisiness. I took to researching the available options and here is a summary of my results. I checked out many options, but mainly two came out on top (and the only two I have time give a blog based comparison to).
  • Trac
  • Redmine
Trac is well known and quite good if you've only got one project. But given it's limitation's, it's had many offshoots now. Officially, trac is only subversion, but things are changing and branched projects exist for using git at least. Of keen interest though is that while there is a issue/ticket tracking system - there is only support for one project. There is a goal to change this in the future but we're all in the here and now.

Redmine, though. Here's the underdog. I mean who's heard of it, right? It's built on ruby on rails, if you care about that. For me, given prior knowledge of similar frameworks, that made it pretty easy to hop in and get some interesting things done, in a more proper way than the typical alternatives (these still are hackish things though). I'll go into those changes next post. But there's a few great features up for consideration that are built in to redmine:
  • Built in non hackish support for multiple projects and the management framework for users/groups.
  • tickets are cross project (after the option is clicked in the admin settings)
  • support for most any SCM (mercurial, git, bzr, subversion) out there
Now of considerable importance to me was mercurial. I view mercurial/git/bzr as mostly equivilent but their crossplatform support is anything but. mercurial has tortoisehg for the non cli window users though and works without a hitch other places though and thus is my SCM of choice for a business environment. What's that, why not subversion? Subversion, while useable sucks. The master repo goes down, well guess what - you can't check in your changes or have a VCS until its back up. Alternatively, this means you can work locally without having inet or being connected to that master server. Additionally, there's no tree support - this kills parallel development by multiple users. Well anyway, to recap -
I was motivated to find project management software which handled multiple projects, had ticket tracking, and SCM integration (focusing on mercurial) with users/groups working as expected all throughout the stack. I didn't find a complete and ready solution, but I got very close, and I'd be interested if anyone found something better. Until then, I thank the redmine crew, they've made an excellent system.