by Malini Das at 2014-06-29 19:26:52

300g king oyster mushrooms, wiped clean of dirt and lightly washed in cold water, dried off, sliced in 4-5mm slices lengthwise

oil proportion:
2/3 olive oil, I used about 1 1/2 tbsp
1/3 butter, I used about 1 tbsp

coat and add some thyme and rosemary (more thyme than rosemary)

375F, roast for 18 mins, then add salt, flip, add salt, then roast for 8 more mins.

This would go really well with a pasta with cream sauce

0 comment(s)

Related tags:
recipe, food

by Malini Das at 2014-05-01 01:02:03

New and improved!

2 lb pork shoulder
3 tbsp apple cider vinegar
3 tbsp delicious mustard. I used Kozlick's Rosemary Mustard. If you don't have this, try some dijon and fresh rosemary.
3 tbsp soy sauce
1 tbsp brown sugar
1/2 of a standard mug, so about 10 tbsp, lapsang souchong tea, steeped for 7-8 minutes
8 tbsp of maple syrup
1 tsp of cayenne pepper
8 cloves garlic, minced
1/2 onion, minced
1/2 tsp sea salt

Mix all these together with the pork shoulder, and marinate for at least an hour.

Slow cook on medium for 6 hours. I'm sure you can slow cook it on low for longer (8 hours or so) for better results. It should be easy to pull, and should taste sweet, salty and savoury!

0 comment(s)

Related tags:
food, recipes

by Malini Das at 2014-05-01 00:54:24

I made this recipe up spontaneously. I really wanted a soup that was warming, mildly sweet and flavourful. I think I captured it with this recipe.

1-2 pounds of chicken thighs, sliced thinly
300g or more of cremini mushrooms, sliced
1 bushel of kale, chopped
2 medium sized sweet potatoes, cubed
2-3 tablespoons soy sauce
2 tablespoons of sesame oil
1 tablespoon of honey
4 star anise
1 teaspoon of black peppercorns
1 2-inch stick of cinnamon
1 small onion, diced
4 cloves of garlic, crushed
1 teaspoon of ginger
1 liter (4 cups) of chicken stock
1 teaspoon salt
Flour, for coating the chicken

Add the chopped kale and sweet potatoes to the pressure cooker. Slice and coat the chicken with flour. Add the sesame oil to a pan, heat it to medium-high, and start frying up the chicken. After it begins a brown a bit, reduce the heat and add the honey, so it caramelizes and coats the chicken. Toss the chicken into a pressure cooker.

Add a little more oil and fry up the garlic, onions and the aromatics (star anise, peppercorns, cinnamon) until the onions brown. Deglaze with some of the chicken stock and add it all to the pressure cooker. Pour in the rest of the stock, soy sauce, and a cup or so of water and mix thoroughly. Cook on high for about 40 minutes.

You will end up with some super tasty soup!

0 comment(s)

Related tags:
food, recipes

by Malini Das at 2014-05-01 00:55:19

I wanted brisket so badly, I decided to make some. Here's my first attempt! It was successful and tasty!

* Note: There are revisions below, in the Notes section *

2 lb brisket

1 clove garlic minced
1 teaspoon cayenne pepper
1/2 teaspoon freshly ground pepper

tasty sauce:
5 tbsp maple syrup
1/2 tsp dry mustard
6 tbsp ketchup
2 tbsp vinegar
2 tbsp Worcestershire sauce

Apply the dry rub over the brisket, massaging it in.
Mix the sauce very well. It should have a thick, even consistency.
Place brisket in slow cooker, and pour the sauce over it.
Slow cook on either a) low for 8-10 hours or b) high for 5-6 hours.

Om nom nom

Could use: more vinegar, less cayenne, more pepper, add a little cumin and clove.

Additional Notes!
We realized that this is super delicious with some tomato (or maple) baked beans. We added it to our sammiches and oh man, it was happy times.

0 comment(s)

Related tags:
food, recipes

by Malini Das at 2013-01-03 20:12:04

Damn, I'd post a picture, but we ate it too fast. The measurements below are estimated!

2 lb pork shoulder
3 tbsp vinegar
4 tbsp delicious mustard. I used Kozlik's Sweet and Smoky Mustard
3 tbsp soy sauce
2/3 of a standard mug, so about 10 tbsp, steeped lapsang souchong
1/2 cup or more of maple syrup (I'm heavy handed with this)
1-2 tsp of cayenne pepper
8 cloves garlic, minced
1/2 onion, minced
1 tsp sea salt
1/2 tsp freshly ground pepper
1 ground clove

Mix all these together with the pork shoulder, and slow cook on medium for 6 hours. I'm sure you can slow cook it on low for longer (8 hours or so) for better results.

This is the first time I'll recommend this, but you're gonna want some Tabasco sauce (or your favorite vinegar based hot sauce) to really make it pop out. Serve on kaiser buns with the juices and Tabasco:)

0 comment(s)

Related tags:
food, recipes

by Malini Das at 2012-08-26 12:07:14

I just got a little Boston Terrier!

Her name is Chell, since she's super inquisitive and looks like she's trying to solve puzzles all the time. She's 3 months old, super cute, poops all the time, and you can see her in her element on her very own youtube channel!

0 comment(s)

Related tags:

by Malini Das at 2012-08-20 12:45:37

Now that I have my website up again, I'd like to let you all know that, thanks to the efforts of mwu, we have pandaboards running Boot2Gecko (B2G)! To get you started with your pandaboard, I wrote up some B2G Pandaboard instructions based on my somewhat painful experiences:) You'll want to follow these instructions, because simply doing the typical './ <device>' and './' instructions for other devices won't cut it!

So why run B2G on a pandaboard? The answer is we want to get the framerate and other video performance metrics of a device running B2G. For the last few weeks, I've been working on getting Eideticker, a performance metric framework, working with a pandaboard running Boot2Gecko (B2G). A great explanation of Eideticker is found on William Lachance's blog, but briefly, it performs analysis on the video output itself, so we can get measurements like frames-per-second, all by capturing and analysing raw video data. The pandaboard has HDMI out, and is close enough to the target devices we'd like to use, so we're using these are our Eideticker devices. You can track the eideticker/B2G effort with this main tracking bug.

0 comment(s)

Related tags:

by Malini Das at 2012-03-06 16:55:00

So alongside my work with Marionette, I've been working with the DXR folks to help get their builds tested. Since a lot of DXR status updates occur over at the #static IRC channel on, here's a quick rundown of what's going on:

Many of you have been asking if DXR is ready to replace MXR, and what the timeline for that is. Well, now there's some good news! Most of the implementation work to get DXR's search features running, and running quickly, are done, and all that's left to get MXR parity is a few UI features and tweaks. Taras, the manager of the DXR team, is aiming to have these UI changes worked out next month, so expect big things for DXR in the short future.

Right now, the Lanedo team is developing the codebase, and I'm running between them and release engineering to get production builds built out on release engineering's infrastructure. Once that's cleared up, we can get these builds tested and pushed to the production machine, and life will be spectacular.

If you'd like to take a look at DXR in its current state, you can visit This is being developed by the Lanedo team. If you'd like to start contributing to DXR, please drop in at the #static channel!

3 comment(s)

Related tags:

by Malini Das at 2011-10-13 12:13:18

are somewhat resolved by this insane set of hacks!

Now go there and save yourself some time. These steps work with getting the Broadcom 4331 wireless chip recognized, so your wifi will finally work. I still have no ethernet connection, but I can't be bothered right now, I already wasted enough time on this today ;)

0 comment(s)

Related tags:
ubuntu, mac, dualboot, network,

by Malini Das at 2011-08-12 15:54:34

We've just introduced a change to Mozilla's Mochitest harness to improve test run times, as per Bug 367393. This involved the removal of unnecessary MochiKit usage. We found that we were including a minified version of MochiKit, packed.js, in all our tests and within the harness, but we would only use a small portion of this enormous suite. That added an extra load of about 5 minutes per debug test run, so we removed MochiKit from our harness and added replacement functionality to SimpleTest. Note that the SimpleTest.js file in MXR may not yet be updated, so pull the latest mozilla-central code to see latest changes!

What this means for you: If you're writing a test that doesn't require MochiKit, please do not include packed.js in your test. This just adds extra load. If your test does require some part of MochiKit, please check if that functionality isn't already part of SimpleTest. If it isn't, then include the only the relevant parts of MochiKit (ex: <script type="text/javascript" src="/MochiKit/Base.js"></script>) instead of pulling in all of packed.js.

1 comment(s)

Related tags:
mozilla, mochitest, mochikit

by Malini Das at 2011-03-02 15:59:34

... and I realize that it actually made me an avid reader!

So I bought a Kindle a few months back. I bought it because I got out of the habit of reading, and more into the habit of playing mindless videogames (Team Fortress 2 and Left 4 Dead 2) and I wanted to kick-start my interest in reading again by pushing money into it as an investment. So, my thoughts on this investment? It was a glorious one!

The low price-point of books on the Kindle store enticed me to buy books I would otherwise have not have purchased, but rather have borrowed from a library or a friend or something. So I started by joining my two interests, gaming and reading. I will admit to this incredibly nerdy purchase: I bought Mass Effect Ascension, since I love the Mass Effect universe. That book was devoured within 2 nights. It wasn't the best book (or even a good book, sadly), but it got me interested in novels again, so I picked up some of the stuff on Amazon's Free Classics Section, and read Alice in Wonderland, War of the Worlds, and a bit of Picture of Dorian Gray, until I realized it was a terribly boring book about a bunch of whiny guys who have everything in the world but still want more. I bought a few more books like Mort by Terry Pratchett, which was a fun read. These books piqued my interest in reading again, and outside of the Kindle world, I'm current reading Carl Sagan's The Demon Haunted World, going through some of Dijkstra's Manuscripts, and feverishly checking reddit for more things to consume!

The financial investment totally guilt tripped me into using the device, and it is actually working. Also, the speed at which you can buy and download books (um, near-instant) combined with my impulsiveness makes me buy books, and it's portable, so I actually read it wherever I go. It hasn't been damaged in my travel bags yet (I got a leather case for it). The guilt made me actually force myself to find time, and I finally got back into the habit of reading. I've finally moved past the guilt-tripping, and now it's habit again. Joy!

3 comment(s)

Related tags:
reading, kindle

by Malini Das at 2010-11-21 03:13:06

As usual, I've been a delinquent blogger. But I've finally come to the point where my sentiments about my role and my work have finally (somewhat) gelled.

I wasn't always a computer geek. Sure, I was always interested in computers, but I never programmed anything before setting foot in university. I just liked solving problems and building things. When I chose Computer Science (quite randomly, as you'll soon find out), I never really understood what developers did outside of code-monkeying, and I was not at all clear about what my role would be as a software developer.

I entered my first year of Computer Science without ever having programmed before. Why? Well, I actually wanted to be a doctor, but realized I only really liked the science and the romanticized ideal of helping people. I didn't actually want to see anyone die, or diagnose anyone with some terrible illness. A part of you has to be removed from your patient, and I didn't want to sacrifice that feeling of solidarity; I wasn't, and am still not, okay with death or chronic illness. Also, the unimaginable hours would have made me go insane. So in my last year of CEGEP (a Quebecois flavor of pre-university and vocational school), I opted to go into engineering because I liked solving problems. So which kind of engineering to pick? I was leaning toward materials engineering, since it combined all my favorite subjects, but I had a strange and rather inexplicable desire to try something completely different. Both my career counselor and father told me that computer science was something I'd probably be good at, and potentially enjoy. I had never been the kind of person to be afraid of a computer, or be afraid of learning something new, so I said "What the hell, why not try it out?" My plan was to take my chances and try Computer Science at Waterloo for one year, and if I didn't like it, I would go back to McGill for their materials engineering co-op program. Now that I reflect on it, my decision was pretty out there, but I'm extremely glad I took that chance, because I loved the material the first day of class. But going to Waterloo is far from just an academic experience, it also ensured that I would be going through a series of internships. The internships were a key factor in deciding where I wanted to go for school, because I had no idea what being a "computer scientist" would entail. I knew that with this program, I would be on my way to an eye-opening journey.

My first internship was a strange one. I was totally new to programming, so I opted for a QA job (I started class 8 months prior, so at that point I barely even understood the concept of tree traversal). The job itself was something I had no passion for; I love building things and solving problems, not trying to break other people's software or writing test scripts. The environment wasn't one for me either. It was quite corporate, and not one where I felt I could easily contribute outside of my designated role as tester. After that experience, I realized I should move on to developer positions, since my passion lay elsewhere.

My next few internships were at start-ups, and they were great. I loved wearing different hats, and doing whatever was needed to get the job done. I loved the chaos. I loved being part of such small teams, and building out systems from the ground up. It was fun, exciting, and I was always learning something. I had applied a lot of the academic knowledge I acquired, as well as just general coding principles and designs. Having done rapid development for a few internships, I wanted to see what else was out there.

This brings me to my last internship. I heard good things about Amazon, and it seemed like the perfect introduction to a "corporate" developer environment. I'm now in my 3rd month here, and it has definitely been an interesting experience. The small team sizes and the amount of freedom we are given is very reminiscent of the start-up culture. The real difference was the involvement I had with the entire software development lifecycle.

At start-ups, you're always on the beginning part of that cycle. Get specs (or at least some data or proof of concepts), build, build more, refactor, build again, test. Scrap occasionally. Build more. At Amazon, I was given many tasks at different levels of the cycle. The interns are given projects where they must seek out the right people to get specs from, design a solution, build it, and release it. I had never been given any customer-facing roles, so this was a new and truly enlightening experience for me. I had also been tasked with adding parts to a maintained system, and had seen quite a few projects being obsoleted and replaced by better solutions. Students always hear about this 'software development lifecycle' and we all know how it works, but seeing this concept in action and being part of each division gave me a real appreciation for the work we all do as software developers. There are many lessons I have learned here so far, but it can all be summed up by the fact that this experience has made me truly understand the software lifecycle, and my role as a developer in creating software solutions. To continuously build and improve, and listen to your users.

I had always had a narrow field of view on the work I was doing. I understood my role as a coder, but not as a developer. My job isn't just about coding, but also working with others to find a solution that helps everyone, finding and addressing issues, and understanding to let go of something when the time comes. It is a true and full form of constant problem solving. I completely get that now.

This internship was the perfect conclusion to my undergraduate career. I have learned so much from school and from my internship experiences, and I now feel like I have a grasp of what my role is, and where I want to go from here. We'll see what the future brings!

1 comment(s)

Related tags:
software development, internship, co-op, programming, work, computer science, school

by Malini Das at 2014-12-10 19:50:04

So I got my Arduino Duemilanove earlier this week, and I've been completely stoked. After getting blinky going, I promptly took out my breadboard from the plastic container, assembled a jumble of jumper wires, resistors, LED and buttons into what became an on-off switch for the LED. Fascinating. Bloody gorgeous. What next?

Well, since I have the button presses as digital input, and the LED as digital out, I thought a neat project would be to record a 3 second button input pattern, and replay that pattern through the LED. That would familiarize me with some of the Arduino's code, and would just be really fun to see live.

For the LED, I connected a jumper cable from the digital out (pin 11) to the breadboard. Then I connected a 1k ohm resistor to the LED, then a jumper cable from the LED to ground. For the next part of the circuit, I connected a jumper cable from a digital read slot (pin 2) on the Arduino the breadboard. I then added a pull-down resistor of 2k ohms from the jumper cable to ground, and lastly, I connected the 5V slot to the button via another jumper cable. This mini-project took about 1-2 hours (coding, after a day of coding, can be tiresome on the ol' noggin), followed by 1 hour of button pushing in awe :)

In any case, I've included a video of it, and the code. Word of warning about the code: It can definitely be done more efficiently (ex: arbitrarily large arrays = fail), I am a computer science major after all, but I also have better things to do:P I haven't really looked at the Arduino API, and it's pretty much just hacked together. Anyway, here's a video, a sketch of the circuits, and the code:


// set pin numbers:
const int buttonPin = 7; // the number of the pushbutton pin
const int ledPin = 11; // the number of the LED pin

// Variables will change:
int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin

// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 50; // the debounce time; increase if the output flickers
int hold = 0; //keeps state of the button
int beeps = 0; //number of button pushes
int start = 0; // are we starting a new pattern?
long startTime = 0;
long duration = 3000; //duration of the recording
long delayArray[200]; //no dynamic arrays! randomly large number. shut up.

void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);

void loop() {
// read the state of the switch into a local variable:
int reading = digitalRead(buttonPin);

// check to see if you just pressed the button
// (i.e. the input went from LOW to HIGH), and you've waited
// long enough since the last press to ignore any noise:

// If the switch changed, due to noise or pressing:
if (reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();

if ((millis() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:
buttonState = reading;
if (reading == LOW){
hold = 0; //otherwise, we're still holding the button!
if(hold == 0){ //if the button was let go
if( (start == 1))
long time = millis();
if ((time - startTime) < duration ){
if (buttonState == HIGH){
delayArray[beeps] = time;
reading = LOW;
hold = 1;

//replay the signals on the led
int i = 0;
long lastTime = delayArray[0];
long now, next, span;
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin, LOW);
for(i=1; i<=beeps; ++i){
next = delayArray[i];
now = millis();
span = now + (next-lastTime);
while( (span - now) > 0){
now = millis();
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin, LOW);
lastTime = next;
start = 0;
beeps = 0;
beeps = 0;
if(buttonState == HIGH){
start = 1;
startTime = millis();
delayArray[0] = startTime;
reading = LOW;
hold = 1;

// save the reading. Next time through the loop,
// it'll be the lastButtonState:
lastButtonState = reading;

2 comment(s)

Related tags:
arduino, beginner, electronics, circuitry, programming

by Malini Das at 2010-03-19 04:44:13

So I got my Arduino Duemilanove earlier this week, and I've been completely stoked. I've had no previous work with circuitry aside from some high school classwork, and all I could remember from that was V=IR... and I had forgotten what the 'I' stood for:P So why this sudden interest? Because electronics are awesome, and have now become extremely accessible to create and personalize.

The Arduino, simply said, is a ridiculously easy-to-program microcontroller. You stick an LED onto the Arduino, write a program, upload it via USB, and boom, something happens. It's great for anyone interested in one day building their own robots, pet projects, or any kind of circuit, but have had no previous experience. It's even great for people with no experience in programming, since the programming aspect is extremely simple to grasp: there is a loop function, and it sends and receives information to and from the Arduino on each cycle. The Arduino software comes with tons of plug-n-play examples, with concise and understandable comments. Out of the box, the Arduino is an extremely user-friendly experience.

Three cheers for the simplicity, but why would someone even want one? Well, if you're interested in rapid prototyping, this is a great solution, but most people don't even know what 'prototyping' means. So if you're one of those people, like me at one point, and have even an inkling of interest in electronics or circuitry, this is the most accessible tool to get magic happening. The high learning curve of coding and interfacing with AVRs, and all that other jazz is just not there with this handy tool. The grunt work is done for you, and you can go straight to testing. It's a great learning tool, and you can finally apply those principles you learned in physics! It's also dirt cheap, you can get one for around $30 USD, and starter kits with resistors, LEDs, and other useful components are available as well. But the most important reason is this:

There's something completely magical about seeing a working Arduino that you crafted. When I first loaded up the blinking LED program, I felt something real, something extremely tangible. With that first blink, a thousand ideas of how I can control that light came into my head, and the possibilities are truly endless. And that wasn't even code I personally wrote!

Coming from the world of software, where most of my code and thought goes into making things happen on screen and not really into something I take with me and use offline, making this simple circuit in the flesh made me feel like what I was doing was more... real. It made me feel the same way I did when I first started programming: awed. For this reason alone, I recommend people to at least give this little circuit board a whirl. It's bound to please.

2 comment(s)

Related tags:
arduino, beginner, electronics, circuitry, programming

by Malini Das at 2010-02-01 13:44:16

Anyone working with CouchDB for any large-scale project would probably like to be able to shard their database and/or use a cluster of couch instances. Those of you interested in doing this would most likely turn to CouchDB-Lounge. Unfortunately, getting Lounge to work is a huge pain in the ass. It took me a while to figure out why things weren't working, what packages I was missing and what code I had to alter (Lounge is not completely free of hardcoded configs!). There weren't too many useful sites out there, so this post is for all those out there struggling with CouchDB-Lounge and need some help. If I missed something, please comment.

Firstly, I'm assuming a fresh install of some Linux distro (I used ubuntu). Note: Configuring for OS X is different and apparently a bit harder to do for some reason. I was going down that path until I spoke with Randall Leeds (tilgovi, one of the Lounge devs) on the #couchdb IRC channel, and he warned me the install hasn't been properly tested on Macs, and more tweaking might be involved.

So, for dumbproxy to work, you need to download and compile json-c as directed on the Lounge wiki, but also remember to get the python-pyicu package. Once you get that running, read THIS. Fix this bug, otherwise, your nginx process will be running with the wrong config.

For smartproxy, you'll need python-cjson package, and for replicator, you'll need the pycurl package. I think I ran into more problems, but I'll check my logs and get back to this post in a bit.

Now here's the meat of the problem. After running this and setting up my shards.conf file to point to two couch instances on different ports, when I'd submit any request to the main lounge instance (running off port 6984), my requests were virtually ignored. So after running around reading the sparse documentation, the immense log files and reading the code, I found this line in

me = 'http://' + socket.gethostname() + ':5984/' (line 40)

which retrieved my laptop name, and completely ignored my conf files! So it was effectively trying to use http://malini-laptop:5984 as the main couch instance, and my laptop name didn't resolve to, so my requests were shot to nowhere. In the end, I fixed this by adding another section in my local.ini conf file that contained the URL for the main couch instance, and I changed that line to pull from the conf file. Beware of this problem if your configuration points to anywhere but (hostname):5984!

Aside from configuration problems, Lounge does what it's supposed to do, which is pretty sweet. I hope this prevented people from wasting their time trying to figure out what was wrong with their configuration:)

Ou, as a side note, it might be useful for those using python-couchdb to modify Server's 'create' method. Lounge uses nginx, and the current python-couchdb (0.6.1) seems to assume you're running Apache or some other web server, since it currently sends no headers with the PUT request. Nginx throws up HTTP errors when it sees that there are no headers (it assumes it's a chunked request, which it does not handle), so I patched it to send:

self.resource.put(validate_dbname(name), headers={'Content-Length':'0'}) [line 17]

This tells nginx that you're simply making a PUT request with no data.

1 comment(s)

Related tags:
couchdb, lounge, cluster, shard