Category Archives: General

Warmup Hike: Mt. Evans (14,265′)

Greetings! I have returned from my long sabbatical from blogging and once again will make empty promises about keeping the world more up to date with my musings and whereabouts.

In one week I am off on my next big trip, this time to Nepal (via Dubai) for 3.5 weeks of trekking and exploring! The current plan (which is flexible) is to fly to Kathmandu for a few days, then fly to Lukla (the world’s most dangerous airport according the the History channel — hence not true). From Lukla trek up to Namche and acclimatize for a day before trekking to Everest base camp (EBC) and beyond! I will do what I can to update the world on my progress, but communications may be slow and unreliable. Figuring trekking to EBC was a somewhat challenging enterprise, a dry-run was in order, an overnight trek up Mt. Evans, which, as a 14er is about as high as you can get in the CONUS. I convinced my friend and colleague Mark to tag along by promising many photo ops, which at 6AM might have been the only thing motivating him out of bed.

After a filling meal of waffles, eggs and pancakes, Mark and I drove up to Echo Lake (~10,000′), parked and got hiking. I was lugging more stuff than strictly needed for such a short jaunt, but in the aims of prepping for a longer trip, it was good exercise. Past Echo Lake and down over a stream we passed the Idaho Springs reservoir and crossed into the ‘Wilderness’. Hiking through coloring aspen groves, Mark dropped behind to take some pictures, and I was alone for a mile or so, just my thoughts and the numerous birds and small animals. Imagining 3.5 weeks of solitude of solo trekking is very exciting so these small moments were wonderful.

Reaching the Chicago lakes, we regrouped and trekked on, up a short but very steep section to reach Upper Chicago lake, where a break and more photos were in order. We had heard from a hiker coming down the path that a mud slide had damaged part of the next section of trail (which was going to be the hardest bit of the day’s hike already) and to be careful. Mark and I reached the mudslide and saw to our dismay there was no trail anymore, replaced by a steep section of loose gravel and rocks that would slide given a stern look. “Suck it up cupcake” I mused as I set about hauling my over-packed bag up a mudslide at 12,000′, gasping for breath and fighting to keep the world from spinning.

After the slide, and a half mile more of slow going, our trip into the wilderness was very quickly ended as we arrived at a road-accessible overlook complete with crying babies, loud tourists and no semblance of ‘being out there’.

A quick water stop at Summit Lake (12,900′) and Mark and I hightailed it out of there, feeling the massive, snow-covered ridge above us press down as a constant reminder that the hard part was still to come. Back in the Wilderness area, we set about looking for a camp site, trying to balance all the rules and guidelines of back-country camping: 100′ from water, 100′ from trail, and don’t go off the trail. We picked the first two to follow, and carefully wound our way to a boulder field out of the wind as a surprise snow squall came ripping over the ridge (thanks weather.com for a 0% chance of precip.). A quick meal of cous-cous and salmon and we tried to sleep on a slanted, uneven ground surrounded by echoing coyote calls and strong gusts of wind. In our altitude-addled (13,250′) state, every gust of wind flapping the tent sounded like someone (or something) just outside. It was a long night, with minimal sleep, but Mark took that to mean more time for photos:

At 3:38AM, we stiffly rose and packed our camp, I was feeling the altitude and lack of sleep, a splitting headache and nausea was my breakfast on the go. Stashing our overnight gear and switching to summit bags, we trekked up onto the ridge, now with full exposure to the freezing wind. Walking along the ridge was an incredible experience, the moon was bright, causing the rocks to glow in a lunar light, we commented that we had left the terrestrial confines and were on another plane (or planet), or so our hypoxic minds thought.

After a number of false summits, and rough rock-hopping, the summit was reached at a few minutes before 7 (and a few minutes after sunrise). Time for more photos, some trail mix and jubilation, we had the morning and summit to ourselves, basking in the sun and seeing Denver slowly wake up far below us. My second 14er had been hiked (I’ve biked up Pike’s Peak) and I was one step closer to Nepal.
Peace and chow,
Jacob
NB: All photos (C) 2013 Mark Bridgman

Reflections On Frost

As I sit at my computer on this cold Vermont day, looking at the frost slowly melted by the Sun’s first rays, I began to think back over this long hiatus of not blogging, and how I had returned from Iceland safely, traveled to Canada to camp to lead a 10th grade school trip and made a number of weekend get-a-ways, from Montreal to New York to see Phantom of the Opera, to Seneca Lake for some lakeside fun.

Travels aside, I have been keeping busy, after returning from Iceland, I started working as a Research Engineer for a small cyber-security company which has kept be busy with hard challenges and learning almost constantly. I have also been working to finish my Masters degree from Clarkson, taking two classes this semester: COSI and an Independent Study with Tino about Darknets and their detection. For my COSI project, I’m working on creating a custom Ubuntu distribution that is more security-aware than the vanilla install (more on that later). I have also been getting into mountain biking since the purchase of my Gary Fisher, tearing up single track trails and biking through puddles and mud. Chelsea and I attempted to run the Quebec City marathon, but in the almost 90F weather, we decided after 20 miles to try again when it is cooler. While that was certainly a disappointment, 20 miles is still an accomplishment to be proud of, and it makes the marathon distance far less daunting.

Hope everyone is enjoying the nice weather and getting outside on these nice fall days,

Peace and chow,

Ranok

Long Time No Post

It’s been quite a while since I’ve posted here, and to my devout readers I apoligize. As many of you know, this has been my last semester of my undergraduate studies, so I have been very busy over the past few months. This post will hopefully act as a dump of what I’ve been up to and what I will be doing until my next post.

Things I did:

  • Developed a method for calling parts of functions to minimize/obfuscate programs
  • Worked with Ryan on OSP to get a web based cluster management system integrated into the cluster administration page
  • Played with return-to-libc attacks and got them working on the latest version of Ubuntu Linux

Things on the horizon:

  • Working full-time for AIS
  • Traveling to Iceland for 3 weeks
  • Working on a computer security textbook
  • Running a marathon in August

It is very weird to me to think that today is the last day of classes for me as a traditional full-time student. I’ve been going to school since I was 5 and it is very weird to think that come August I will not be returning to the classroom as my primary past-time. I am excited to travel and get away from the normal swing of things for a while to reflect on the new changes in my life, and excited to begin working, especially due to the extra leisure time after work.

Peace and chow,

Ranok

Introduction to Mnesia I


Warning: Invalid argument supplied for foreach() in /home/public/wp-content/plugins/ionhighlight/Text/Highlighter/Renderer/Html.php on line 308

Today in my Advanced Concepts in Operating Systems class I led the discussion on the Mnesia paper from PADL’99, while this paper has numerous typos it does do an excellent job highlighting the features and advantages of Mnesia. For those of you who are unaware, Mnesia is a distributed, fault-tolerant object DBMS written in Erlang. One thing about Mnesia that I have found to be lacking is a tutorial written for the lay person from the ground up, this gap I intend to try and fill. This multi-segment tutorial assumes you have knowledge of Erlang, and the basic ┬áconcepts of manipulating data with DBMSes, other than that, I hope to provide enough information and code to demystify a fairly complex system. However, I still am on the road to mastery, so if I make any errors, or you have any tips for improvement, I’d be happy to add them in.

To get started, start up the Erlang shell (erl) with a name, I will use -sname foo in the following examples. Below is a transcript of starting up and creating a disk-based

ranok@orion:~/Desktop$ erl -sname foo
Erlang R13B01 (erts-5.7.2) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
 
Eshell V5.7.2  (abort with ^G)
(foo@orion)1> mnesia:create_schema([node()]).
ok
(foo@orion)2> mnesia:start().
ok

The most important call made here, create_schema, takes a list of nodes to replicate the schema table to on disk. You can add additional disk-based nodes or ram-based copies later (we’ll get to the details later). After you’ve created the schema (this will make a folder for all the Mnesia table data), you can start the application with the start function.

Now that we have the database running, we need at least one table to store the data in, we will start with a very simple record to just store simple key/value data. The nice thing about Mnesia, is that the data we store can be pretty much anything, from a simple atom to a function. We will start learning the basics from the mnesia_test module, which I have uploaded here.

The first few lines of the module start off like any Erlang code, a module declaration, what functions to export, including the QLC (Query List Comprehensions) include file (you may need to find it for your system) and a record definition:

-record(data, {key, value}).

Which will define our record for the table also named data. In the function setup_and_start/0, we tie in what we already went over with the create_table function, which in our case looks like

mnesia:create_table(data, [{disc_copies, [node()]}, {attributes, record_info(fields, data)}])

The create_table function has a number of options, the most basic of which we will deal with at the moment: the name of the new table, where and how the table will be stored and what fields the table has (this code used the record_info() function to pull those out of the data record for us). Now that we have our table, we need a way to get the data in and out of it.

Many databases provide the ability for multiple queries to be joined into one transaction to be executed atomically. Mnesia is no different, but for the most part, all queries are executed through the transaction manager (there is a dirty interface which will be discussed later), this makes working in a distributed environment much easier. The way to perform a transaction in Mnesia is to pass a fun to the mnesia:transaction() function that will atomically run.

The actual function to enter data (both insert and update) is write(Record). We wrap this into the mnesia_test:insert(Key, Val) function displayed below:

insert(Key, Val) ->
Record = #data{key = Key, value = Val},
F = fun() ->
mnesia:write(Record)
end,
mnesia:transaction(F).

To now retrieve this data back from the database, the read function is now used, the read function takes two arguments: the table name (in this case, data) and the key to retrieve. The mnesia_test retrieve function wraps this nicely for us, and is shown below:

retrieve(Key) ->
F = fun() ->
mnesia:read({data, Key})
end,
{atomic, Data} = mnesia:transaction(F),
Data.

mnesia:transaction will either return {aborted, Reason} or {atomic, Rows}, where Rows is a list of all the retrieved data. If the key we tried to retrieve could not be found, then it will return an empty list.

Say however, we want to search the table for certain values that are not the index of the table. For that there is the matching functions, the simplest of them is the match_object whose usage can be seen here:

search(Val) ->
F = fun() ->
mnesia:match_object(#data{key = '_', value = Val})
end,
{atomic, Data} = mnesia:transaction(F),
Data.

As you can see, simply fill in all the values that are known and that you want to search for, and use the ‘_’ unmatched value for all the other values. This transaction will return the same forms as the read transaction.

There is another method for filtering through Mnesia tables, which is very similar to the list comprehensions builtin to Erlang which is called QLC. The QLC version of the above function is below:


search_qlc(Val) ->
F = fun() ->
qlc:eval(
qlc:q(
[X || X <- mnesia:table(data), X#data.value == Val] )) end, {atomic, Data} = mnesia:transaction(F), Data.[/code] What the query here is doing is is returning a list of Xs where every possible X comes from our data table, and X#data.value == Val. This should be very intuitive for those of you who are familiar with list comprehensions. What qlc:q() does is form a query handle (much like a function object) which gets evaluated by qlc:eval() inside of our transaction object. Again, this will return the same values from mnesia:transaction. Well, that about covers the basics of Mnesia, you now should be able to setup Mnesia on your computer, create a table and insert/retrieve data from it. In the next installment, we will look at distributed Mnesia and the dirty interface, which provides faster queries by bypassing the transaction manager. After that we will put all of what we've learned into creating a system that will take advantage of Mnesia and give a pseudo real-world problem a fitting solution. Please check back soon for the next installment! Peace and chow, Ranok

Hurry Up and Slow Down

Now that I’ve had a chance to settle into my new apartment above Misty Hollow on Market Street, and I have all the needed utilities, I thoughts I take a break and reflect on my first two weeks of my senior year. My schedule this semester has me in class for 11 hours Monday and Wednesday, and practically without class the other week days (I do have class every few Saturdays). This schedule is requiring some work to get used to, either I’m feeling rushed to make it to my next class and keep everything straight (philosophy to statistics) or I’m wondering what to do with all my spare time. I have however found a few things to keep myself occupied on my off days, I’m working for Clarkson as a campus photographer, shooting lots around the area for brochures, the website or mailings. This is a great way for me to practice and improve my photography skills and work with a professional! I will update my Flickr when I have some great shots, so keep checking it out! Of course I’m also still the co-director of COSI, which has a large amount of interest this year, and I’m hoping for good things to turn up. naturally I’m still working on my baby, OSP (a post on that soon). Lastly, I’ve joined the Potsdam Rescue Squad, and am enrolled in the NY state EMT course, which I am enjoying, and excited to become a more useful member as my knowledge grows.

Well, I think that about covers all in my life for the time being.

Peace and chow,

Ranok