Speaking of, it might be interesting to make a learnperlthehardway book, ala Write your own LxTHW and the companion site LearnCodeTheHardWay.org.
Wednesday, October 26, 2011
Perl for newbies
Sunday, October 16, 2011
Homework!
I'm taking two courses at Stanford this fall. Maybe you know someone else in one of them? There are one hundred thousand people in my AI class. 100,000. Even our largest freshman intro courses at Caltech had fewer than 215 people, so this is three decimal orders of magnitude larger. Wow. I'm not sure how many people are signed up for the Machine Learning class, but it's probably similarly large.
Back to work!
Saturday, October 15, 2011
Author dependencies in Dist::Zilla
It's easy to get the minimal pieces installed, so let's get to it.
Basic steps for building/using a Dist::Zilla based module from raw source:
- Check out module source
- install Dist::Zilla:
cpanm Dist::Zilla - install author deps:
dzil authordeps | cpanm - install module deps:
dzil listdeps | cpanm - build module with dzil:
dzil build
1. Check out module source
For my example, I'm migrating my own App::PM::Website sources from an old laptop to a new one. Looking for example code to checkout? Try searching for dist.ini on github to find an interesting perl module. ;)
% git clone git@github.com:spazm/app-pm-website
% cd app-pm-website
Check the code out of the repository and cd into the top level.
2. Install Dist::Zilla
On this relatively clean perl 5.12.3 install,cpanm Dist::Zilla brought in 81 packages.
% cpan Dist::Zilla
[andrew@fred]% cpanm Dist::Zilla 127 (git)-[dev] ~/src/app-pm-website--> Working on Dist::ZillaFetching http://search.cpan.org/CPAN/authors/id/R/RJ/RJBS/Dist-Zilla-4.300002.tar.gz ... OK
[... snip ...]
Building and testing Dist-Zilla-4.300002 ... OKSuccessfully installed Dist-Zilla-4.30000291 distributions installed
3. Install author dependencies
dzil authordeps will show the modules necessary for Dist::Zilla to build the module from raw source into a built module. Pipe this to cpanm to install the modules.
% dzil authordeps
Dist::Zilla::Plugin::MetaResources
Dist::Zilla::Plugin::AutoPrereqs
Dist::Zilla::Plugin::Repository
Dist::Zilla::Plugin::NextRelease
Dist::Zilla::PluginBundle::Basic
Dist::Zilla::Plugin::AutoVersion
Dist::Zilla::PluginBundle::Git
Dist::Zilla::Plugin::PkgVersion
Dist::Zilla::Plugin::MetaJSON
Dist::Zilla::Plugin::PodWeaver
% dzil authordeps | cpanm
Dist::Zilla::Plugin::MetaResources is up to date. (4.300002)
--> Working on Dist::Zilla::Plugin::Repository
[... snip ...]
Successfully installed Dist-Zilla-Plugin-PodWeaver-3.101641
11 distributions installed
4. Install module dependencies
Install the authordeps before module dependencies, in case authordeps are required for dzil to calculate the module dependencies. E.g. I needed PodWeaver installed via authordeps before I could rundzil listdeps to see the module dependencies.
% dzil listdeps
App::Cmd
App::Cmd::Command
App::Cmd::Tester
base
Config::YAML
Data::Dumper
Date::Parse
DateTime
DateTime::Format::Strptime
ExtUtils::MakeMaker
HTTP::DAV
Net::Netrc
POSIX
strict
Template
Test::Class
Test::Class::Load
Test::More
warnings
% dzil listdeps | cpanm
App::Cmd is up to date. (0.312)
base is up to date. (2.15)
--> Working on Config::YAML
[...snip...]
Successfully installed Test-Class-0.36
Test::More is up to date. (0.98)
10 distributions installed
5. Build module
dzil build will build the module into a directory and tar it up ready for cpan.
Similarly, dzil test will build the code and run the tests, you'll use this to verify your changes to the target module.
And now I can get back to the task at hand, improving this module. I'll let you know how that goes too.
% dzil build
[DZ] beginning to build App-PM-Website
[DZ] guessing dist's main_module is lib/App/PM/Website.pm
[DZ] extracting distribution abstract from lib/App/PM/Website.pm
[DZ] writing App-PM-Website in App-PM-Website-0.112890
[DZ] building archive with Archive::Tar; install Archive::Tar::Wrapper for improved speed
[DZ] writing archive to App-PM-Website-0.112890.tar.gz
Friday, September 16, 2011
Fix linux DNS issues with .local addresses on MS domain
B.L.U.F.:
Microsoft uses.local as the recommended root of internal domains, and serves them via unicast dns. Linux uses .local as the root of multicast dns. If you're stuck on a broken MS network like this, reconfigure your linux multicast DNS to use a different domain like .alocal.
To do this, add a "domain-name=.alocal" line to the "[server]" section of "/etc/avahi/avahi-daemon.conf", then restart avahi-daemon: "sudo service avahi-daemon restart".
#/etc/avahi/avahi-daemon.conf [server] domain-name=.alocal
You may need to flush the DNS,mDNS and resolver cache, as well as restart your web browsers to clear their internal cache.
Background.
I was seeing the strangest behavior on my work linux box. I could look up local addresses, but not contact them in my browser. Turns out I could look them up but not ping them, either.% host foo foo.corp.local is an alias for bar.corp.local bar.corp.local has address 10.1.2.3 % host foo.corp.local foo.corp.local is an alias for bar.corp.local bar.corp.local has address 10.1.2.3 % ping foo -q -c 1 PING bar.corp.local (10.1.2.3) 56(84) bytes of data. --- bar.corp.local ping statistics --- 1 packets transmitted, 1 recieved, 0% packet loss, time 0ms % ping foo.corp.local unknown host foo.corp.localI spent a while thinking this was a resolver issue in
/etc/resolv.conf, since I knew that was getting modified by the VPN. Everything was fine in the resolver. What I'd forgotten about was /etc/nsswitch.conf!
The hosts line in /etc/nsswitch.conf put mdns4_minimal before dns AND set a reply of "NOTFOUND" from mdns to propagate back directly without hitting DNS.
# /etc/nsswitch.conf hosts line: hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4We could side-step the problem by removing mdns4_minimal from the hosts search path, but this will lead to potentially long dns timeouts from mistyped .local addresses. (Ok, that's not a very bad side effect, but still let's fix it correctly).
Dig a little deeper into .local and mdns, and you'll find Avahi. Avahi "facilitates service discovery on a local network via the mDNS/DNS-SD protocol suite," what Apple calls Bonjour or Zeroconf. They have a warning page about unicast .local DNS zones that gets to the crux of the problem : linux has mdns (multicast dns) support configured for .local, but Microsoft support suggests using .local with unicast DNS. The two don't get along at all.
mDNS/DNS-SD is inherently incompatible with unicast DNS zones .local. We strongly recommend not to use Avahi or nss-mdns in such a network setup. N.B.: nss-mdns is not typically bundled with Avahi and requires a separate download and install.
-- Avahi and Unicast Dot Local wiki page
Fixes:
- move avahi mdns from .local to a different name (e.g. .alocal)
- or Remove mdns from
/etc/nsswitch.confor remove mdns module.
domain-name=.alocal line to the [server] section of /etc/avahi/avahi-daemon.conf, then restart avahi-daemon: sudo service avahi-daemon restart.
If that doesn't work (and you restarted your browsers, with their insidious dns cache, right?) you can try removing mdns from the hosts entry in /etc/nsswitch.conf.
replace this line:
hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4with this line:
hosts: files dnsLinks:
Tuesday, August 9, 2011
Demand Media buys RSS Graffiti
"Demand Media Acquires RSS Graffiti RSS Graffiti's Talented Engineering Team and Popular Facebook Application to Help Accelerate Demand Media's Social Publishing Strategy"
-- http://www.marketwatch.com/story/demand-media-acquires-rss-graffiti-2011-08-09
"In addition to releasing its Q2 earnings today, content aggregator Demand Media (NYSE: DMD) has made two acquisitions: it’s bought a long-running partner, the blog ad network IndieClick and RSS Graffiti, a Los Angeles-based developer of social media products, primarily Facebook. "
-- http://paidcontent.org/article/419-demand-media-buys-indieclick-for-14-million-expands-google-ad-deal/
Friday, August 5, 2011
irrational markets
Markets can remain irrational a lot longer than you and I can remain solvent.
---- John Maynard Keynes
When the facts change, I change my mind. What do you do, sir?
---- John Maynard Keynes
Thank you wikiquote!
Sunday, July 17, 2011
Wedding Dance
The source is up at github. Look in the wedding-dancer directory for the dancer project.
The dancer code is very short, because I'm not really using any dancer bits. I'm using dancer to provide an interface around templating code and page layout wrapping. As such, the pages are all pure templates.
Version .1 was very close to the following code snippet. Auto_page turns my template files into corresponding routes. I then created a template for each of my pages, spent a day futzing with CSS and poof: wedding website!
package sweetiebeast;
use Dancer ':syntax';
our $VERSION = '0.1';
set auto_page => 1;
get '/' => sub { template 'index'; };
1
When I launched, I put the site behind an apache proxypass directive. So I added Dancer::Plugin::Proxy to create links relative to the external proxy. I query Dancer::Plugin::Proxy to explicitly create link targets in the model to simplify my views.
package sweetiebeast;
use Dancer ':syntax';
use Dancer::Plugin::ProxyPath;
our $VERSION = '0.2';
set auto_page => 1;
get '/' => sub { template 'index'; };
before_template sub {
my $tokens = shift;
$tokens->{uri_base} = proxy->uri_for("/");
$tokens->{uri_for_index} = proxy->uri_for("/");
$tokens->{uri_for_faq} = proxy->uri_for("/faq");
$tokens->{uri_for_location} = proxy->uri_for("/location");
$tokens->{uri_for_travel} = proxy->uri_for("/travel");
$tokens->{uri_for_guests} = proxy->uri_for("/guests");
$tokens->{uri_for_images} = proxy->uri_for("/images");
};
true;
Monday, June 27, 2011
Macintosh Fork Failure
Let's double that:
% sudo sysctl -w kern.maxproc=1024
kern.maxproc: 532 -> 1024
% sudo sysctl -w kern.maxprocperuid=1024
kern.maxprocperuid: 512 -> 1024
Now let's check the ulimits, now that only my shells are affected.
% ulimit -a
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) 0
-v: address space (kb) unlimited
-l: locked-in-memory size (kb) unlimited
-u: processes 266
-n: file descriptors 2560
% ulimit -a 512
Now, why am I still getting fork errors when opening a new terminal? What process has this 266 locked in?
Friday, June 17, 2011
my first yapc
I was supposed to go last year while I was at Rubicon Project, but my trip got canceled (some mix of busy, crunch time, and politics).
I haven't been to a focused perl conference since the short lived "O'Reilly University" circa 2000 in nyc. MJD was the bomb! It'll be interesting to compare with our <shameless_plugs> excellently run LA pm</shameless_plug> and all the other LA tech meet-ups.
what do I need to do to prep? Rest my brain and liver, I suppose.
Grub prompt after upgrade to ubuntu 11-04
Using information from aaron kelleys blog[1] and information available from tab completion I performed the following steps which led to a successful boot. After the root command, filename tab completion looks at that drive.
Boot from grub prompt:
root (hd0.5)
linux /vmlinuz root=/dev/sda ro
initrd /initrd.img
boot
Alternative, equivalent boot from grub prompt:
After booting, these steps updated grub on the MBR for my root drive:
linux (hd0,5)/vmlinuz root=/dev/sda ro
initrd (hd0,5)/initrd.img
boot
sudo grub-install /dev/sda
sudo update-grub
For a taste of the flip side, I restarted into windows for windows update. Looks like it's been 6 months since I booted windows7, so 300Meg to download. Question: Will it be finished or pwned when I get home tonight?
links:
Saturday, June 4, 2011
migrate Subversion repository/dump to Git & Github, with tags and branches
I migrated a work repository from Subversion to Git last week. It went surprisingly smoothly. There were a more steps than I expected after reading various, selected, sources.
My repository was in "standard layout" containing only a single tree/project. I was sent a dump of the repository created with svndump. If you have direct access to your svn repository, skip step one. Similarly you can skip the github steps or replace them with your own "primary git server."
Note, if you don't want to maintain the svn tags and branches, then there is a simple single step solution using git-svn. This works if you don't have tags and branches to keep, or you just want a personal git checkout of a remote svn repository.
git svn clone --no-metadata --stdlayout
--A users.txt http://svn/repo/here/ new_checkout_name/
Overview:
- import svn dump into svn repository
- create mapping file of svn committer to email address
- create empty git repository
- cd to git repository
- import from svn repo to git repo
- pull branch and tag information from svn to git
- create github repository
- add remote repository
- push all tags and branches to github repository.
- import svn dump into svn repository from dump file svn_repo.dump
% svnadmin create svnrepo % svnadmin load svnrepo < svn_repo.dump
- create mapping file of svn committer to email address
Create a file called authors.txt and fill it with line separated “svn-name = git-name” pairs. #example: % cat authors.txt user_a = Alpha <alpha@example.com%gt; user_b = B Dawg <bdawg@github.example.com%gt;
- create empty git repository
% mkdir gitrepo % git init gitrepo
- import from svn repo to git repo
svn repo path must be an absolute path when using file://# git svn clone file:///pathto/svnrepo /pathto/gitrepo –no-metadata -A authors.txt --stdlayout
% git svn clone file://$(pwd)/svnrepo gitrepo/ --no-metadata -A authors.txt --stdlayout
- cd to the git repository
% cd gitrepo
- pull branch and tag information from svn to git
tags and branches are both viewed as remote branches, tags are prefixed with "tag/".
For each branch you want to migrate, make a local branch.
For each tag, make a local tag.% git svn fetch # fetch remote branches and tags from svn % git branch -r # view remote branches % git branch local_branch remote_branch # for each branch to migrate % git tag local_tag tags/remote_tag # for each tag to migrate % git branch # check work by viewing local branches and ... % git tag -l # ... local tags
- create github repository
( github repo ui, create yourrepo )- add remote repository
% git remote add origin git@github.com:yourname/yourrepo
- push all tags and branches to github repository.
% git push origin --tags # push all tags % git push origin --all # push all branches
- create empty git repository
Crashed Kindle
The reboot key-combo is "shift-alt-r". After a couple of soft-resets I tried a reboot and it worked! woo!
Of course, I had to verify. I navigated to the same page and hit back again. Now it's back to being wedged.
No, it isn't the case causing crashes in my case, it's my own converted-from-chm-emailed-to-my-kindle ebook.
Edit: update, she's working again now that I'm done writing this post. Perhaps it was just really really busy finding that page?
Friday, April 29, 2011
Dude, what function am I in?
I've been using this (exuberant) ctags based approach for years. It's quite handy and works across more languages than I use: 41 languages from ant to YACC. I've tested with perl, python, C, java and ruby.
The plugin has options to display the function name in the status bar or in the xterm menu bar. It takes care of generating the ctags files on the fly.
I've blogged before on using vim with tags file, recommending using ctags to create a tags file for your codebase. Using the tags browser to jump to subroutines defined in other files is just ... super fun.
- ctags plugin for vim:
- http://www.vim.org/scripts/script.php?script_id=610
- exuberant ctags:
- http://ctags.sf.net/
- My blogpost on effective VIM with perl and tags. http://www.lowlevelmanager.com/2010/12/perl-tags-and-vim-effective-code.html
These are the options I use with the plugin:
let g:ctags_statusline=1 let g:ctags_title=0 let g:generate_tags=1 let g:ctags_regenerate=1
PS. OSX comes with a different version of ctags, you'll need to install exuberant ctags for the ctag plugin to work, it's available in both fink and MacPorts.
Wednesday, April 27, 2011
More LWP SSL 500 issues! Now with HTTP::DAV crossover
For https://... default to verified connections with require IO::Socket::SSL and Mozilla::CA modules to be installed. Old behaviour can be requested by setting the PERL_LWP_SSL_VERIFY_HOSTNAME environment variable to 0. The LWP::UserAgent got new ssl_opts method to control this as well.I use HTTP::DAV to push changes to the Los Angeles Perl Mongers website. When I tried to push updates for tonight's meeting, HTTP::DAV threw an error
" The URL "https://groups.pm.org/groups/losangeles/" is not DAV enabled or not accessible.".
This seemed familiar -- in fact I filed a bug against HTTP::DAV ( Bug 59674 ) to pass through SSL errors from LWP when SSL libraries were not installed. ( Cosimo, I am sorry that I didn't respond in a timely manner when the fixes were proposed. Thanks for fixing it!). The fix for 59674 included having a specific message for various classes of errors out of LWP::UserAgent.
## Error conditions
my %err = (
'ERR_WRONG_ARGS' => 'Wrong number of arguments supplied.',
'ERR_UNAUTHORIZED' => 'Unauthorized. ',
'ERR_NULL_RESOURCE' => 'Not connected. Do an open first. ',
'ERR_RESP_FAIL' => 'Server response: ',
'ERR_501' => 'Server response: ',
'ERR_405' => 'Server response: ',
'ERR_GENERIC' => '',
);
LWP::UserAgent is returning a 500 level error in the case of a self-signed site key. Not 501 as in the prior case.
Example:
Output Snippet:
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use Data::Dumper;
my $url = "https://groups.pm.org/groups/losangeles";
my $ua=LWP::UserAgent->new();
my $resp = $ua->get( $url );
print Dumper $resp;
LWP::Protocol::https::Socket: SSL connect attempt failed with unknown errorerror:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed at /Library/Perl/5.10.0/LWP/Protocol/http.pm line 51.
One can get around this by setting an environment variable export PERL_LWP_SSL_VERIFY_HOSTNAME=0, or by using the ssl_opts option to UserAgent. A third, preferred solution would be import the key and mark it as "OK" on the client side.
I pushed my website changes by using the PERL_LWP_SSL_VERIFY_HOSTNAME=0 workaround. Now let's see if I can figure out workarounds 3 and 2.
Friday, April 22, 2011
FIXED: 500 Can't verify SSL peers without knowning which Certificate Authorities to trust
Mozilla::CA.
500 Can't verify SSL peers without knowning which Certificate Authorities to trust
Props to Corion for posting this tip to perlmonks.
2011-03-08 Release 6.00Unbundled all modules not in the LWP:: namespace from the libwww-perl distribution. The new broken out CPAN distribtions are File-Listing, HTML-Form, HTTP-Cookies, HTTP-Daemon, HTTP-Date, HTTP-Message, HTTP-Negotiate, Net-HTTP, and WWW-RobotRules. libwww-perl-6 require these to be installed.
This release also drops the unmaintained lwp-rget script from the distribution.
Perl v5.8.8 or better is now required. For older versions of perl please stay with libwww-perl-5.837.
For https://... default to verified connections with require IO::Socket::SSL and Mozilla::CA modules to be installed. Old behaviour can be requested by setting the PERL_LWP_SSL_VERIFY_HOSTNAME environment variable to 0. The LWP::UserAgent got new ssl_opts method to control this as well.
Support internationalized URLs from command line scripts and in the proxy environment variables.
The lwp-dump script got new --request option.
The lwp-request script got new -E option, contributed by Tony Finch.
Protocol handlers and callbacks can raise HTTP::Response objects as exceptions. This will abort the current request and make LWP return the raised response.
-- LWP 6.00 release notes 2011/03/08(emphasis mine).
Monday, April 18, 2011
CPANTS: down?
Is this because CPANTS.perl.org wasn't getting used in favor of www.cpantesters.org? I was afraid we'd lost the awesome CPAN testing infrastructure. According to the CPAN::Testers documentation, CPANTS was a project to track "Kwalitee" & metadata of modules on the CPAN. So what does that mean?
CPANTS - The CPAN Testing Service
CPANTS is currently down due to terminal bitrot.
If you're interested in having it back, please contact domm AT cpan.orgCPANTS and Site maintained by Thomas Klausner - domm AT cpan.org
Hosting and bandwidth provided by Vienna.pm.
-- cpants.perl.org
Saturday, April 16, 2011
Moving at Scale : Etsy
Warning, the video is a couple of hours long.
- Make deployments easier
- No-fault post-mortems
- everyone works on head, no branches in source control, lots of
if(0){ ... }blocks - configuration file that determines which features are live, to which percentage of the population.
- public logging and metrics
- ...
- Change are quick, easy and encouraged.
- maintains the "can do" "default is yes" attitude of the early startup.
- mean time to notice problems: <5 minutes, mean time to fix problems: 4.5 minutes.
- ...
- profit
They have released two projects as openSource, available on github:
- logster
- https://github.com/etsy/logster
- Forked from ganglia-logtailer, they removed the daemon mode to simplify the code.
Logster is a utility for reading log files and generating metrics in Graphite or Ganglia. It is ideal for visualizing trends of events that are occurring in your application/system/error logs. For example, you might use logster to graph the number of occurrences of HTTP response code that appears in your web server logs.
- Forked from ganglia-logtailer, they removed the daemon mode to simplify the code.
- statsd
- Github: https://github.com/etsy/statsd
- Blogpost: measure anything measure everything/
A network daemon for aggregating statistics (counters and timers), rolling them up, then sending them to graphite.
- Blogpost: measure anything measure everything/
Saturday, April 2, 2011
Better programming reading list
How to become a better programmer in 90 days -- a lightning talk.
http://www.foraker.com/how-to-become-a-better-programmer-in-90-days/
I stumbled upon this lighting talk by Neal Enssle. In it he recommends three books to improve our craft. I admit to not having read any of them, but I have heard of some of the authors.
- The Passionate Programmer, Chad Fowler
- Love what you do, your attitude comes through. Highlight a daily win.
- Clean Code, Robert C. Martin
- A language for describing our code.
- Refactoring, Martin Fowler
- 60 refactoring patterns.
Thursday, March 31, 2011
MacBook Air 13" -- lockup in iTunes, fixed?
"This update addresses an issue that makes the system unresponsive when using iTunes. It is recommended for all 13" MacBook Air (Late 2010) users running Mac OS X v10.6.7."
-- Mac OS X 10.6.7 Supplemental Update for 13" MacBook Air
In other news, yes, I bought a MacBook Air 13" last Friday. My previous Mac purchase was an 68000 MacSE running 8.6, purchased 20 years ago. Fully pimped out, this was a big impulse buy on Ebay (after a week of watching ebay and craigslist, it still felt like a impulse to start and finish bidding last friday morning). It did run my 3x as much $$ as the Acer (4x retail). What will I do with two tiny laptops?
It is both bigger and smaller than my lovely Acer 1810T. The 13" Air has a hugely larger footprint to the acer, at 13 vs 11. The whole body is slightly lighter and much thinner. Having gotten used to the size of the 11", this feels really big. How do people carry around 17" monsters? The screen is larger and has more pixels at 1400x900 vs 1366x768, albeit at a lower DPI of 130 vs 135 dots per diagonal inch. It also has more pixels than the 13" macbook pro, why are they still using a lower res screen on those?
The 13" Air has a larger battery spec and seems to have considerably larger real-world battery usage. The battery lasts a full workday, though I get nervous when it says an hour or two left. Wake from sleep is wicked fast, and sleep seems to be a very low power situation. I put my acer to hibernate and it takes about 20 seconds to boot with the SSD -- ~8 of that is just the bios time to get to the bootloader. I haven't been able to compare wake from hibernate on the Air since I can't force hibernation -- it happens automatically if it is in sleep mode "long enough."
I'm still trying to get used to the change in keyboards -- the wrist rest area is ginormous on the Air. The large wrist area makes it sit in my lap differently than the Acer, and typing is more awkward. It does rest more softly in the lap -- similar weight over a larger surface area.
I found myself trawling ebay looking for an 11" as a companion to this one. The 11" air is a very close alternative to the 1810T. If you can live without a second mouse button and page-up/page-down dedicated buttons. The larger trackpad really is nicer than the Acer, though I was quite used to that smaller trackpad. The 11" has roughly the same specs, a slightly faster chip, similar quoted battery life, same footprint, much thinner and a tad lighter. Counting the big SSD I put into the 1810T the prices are comparable.
Note, if you are looking to buy an Air, know that the RAM is hard soldered at the factory, so there is a large difference between the 2G and 4G versions. Do the resellers (bestbuy, frys, buy.com etc) even get 4G models to sell? It is possible to replace the SSD, it is non-standard but they are available. The ram you won't get to change.
Wednesday, March 30, 2011
Startup Toolkit.
I don't need perfect, but I would like good-enough.
I suppose this is close to what Atlassian provides, but that's a little too much corporate proprietary synergistic kool-aid for me. Maybe I'm judging too harshly after the Rubicon Atlassian experience, which was soured more by the lack of system and sysadmin resources to upgrade/install/approve the tools than by the tools themselves.
Some options I'm considering now:
- Issue Tracking
- Trac
- bugzilla
- redmine
- github issue tracker
- Source control
- git, shared via github private account
- Continuous Integration
- hudson/jenkins
- buildbot
- cruise-control / cruise-control-rb
- Code Review
- mondrian (hosted by google appengine)
- Configuration management and bootstrapping onto ec2
- chef (pretty far down the chef road at this point)
- puppet
- cfengine
- Monigoring (using all of these for different aspects:
- nagios
- ylastic
- aws console
- statistics and graphs
- ganglia
- log aggregation
- splunk -- hadn't considered this, but was suggested by friends at GumGum, to monitor logs across a cloud of app-servers
TODO(andrew): add links for the projects.