Michael Kimsal asks a very good question: Why do browsers still not have file upload progress bars?
In preparation for people coming to Accordion City to attend the RubyFringe conference (as well as those of you who are coming here this summer for other reasons), I’m writing Joey’s Unofficial RubyFringe Guide to Toronto, a series of articles with useful tips for visiting our fair city.
So far, I’ve published one article: Where Did All the Cigarettes Go?, in which I explained to visiting smokers that you can buy cigarettes in stores here; they’re just hidden in large, featureless cabinets behind the counter.
In this article, I’m going to cover the cheapest way to get to the conference hotel, the Metropolitan, from the airport.
There are Two Metropolitan Hotels!
This may be a source of confusion, so make sure you’re aware of this: there are two Metropolitan Hotels in town. Both are owned by the same hotel chain, and they’re a fifteen-minute walk from each other!
RubyFringe is taking place at the Metropolitan Hotel Toronto, located at 108 Chestnut Street, which is behind City Hall and on the edge of Chinatown. If the front of the hotel looks like the photo below, you’re in the right place:
The other hotel is the SoHo Metropolitan Hotel on 318 Wellington Street West and is a hop, skip and a jump away from Toronto’s domed stadium, The Rogers Centre. If the front of the hotel looks like the photo below, you’re in the wrong place!
(There’s nothing wrong with the Soho Met: it’s a nice place and swankier than the Metropolitan Toronto; it’s just that the conference isn’t taking place there.)
For this article and any other in this series, when I refer to the Metropolitan Hotel, I’m referring to the Metropolitan Toronto, the conference venue.
The Distance
Lester B. Pearson International Airport (airport code YYZ, which is where Rush got the name for their song with Neil Peart’s legendary drum solo) is a bit of a hike from downtown Accordion City. It’s 27 kilometres (about 17 miles) from the airport to the Metropolitan Hotel, a span on par with the distances between Los Angeles International Airport and its downtown core, Chicago’s O’Hare Airport and the Chicago Loop and Newark’s Liberty Airport and midtown Manhattan.
The Most Expensive Way: Renting a Car and Driving (Round trip: $lots)
If you were to drive from the airport to the hotel, you’d get on Highway 427 and go south to the Gardiner Expressway and follow it east. Google Maps says to exit at Spadina, I say take the Bay/York Street exit and follow York Street to where it forks and take the University Avenue fork (Spadina has fewer lanes and is downtown Chinatown’s main drag, which makes it slower going). Either way, you go north to Dundas, at which point you turn east and go a short way to Chestnut Street, where the hotel is.
Google Map showing directions from Pearson Airport to the Metropolitan.
Click the map to see it on its Google Maps page.
The Second Most Expensive Way: Taking a Cab or Airport Limo (Round trip: $90 – 100)
If you were take a cab or airport limo from the airport to the hotel today, it would cost around $40. However, cab fares are going up in July because of skyrocketing gas prices, so a cab ride will probably cost more by the time RubyFringe takes place. The trip should take about 35 – 40 minutes if traffic isn’t too bad. It’s probably the fastest, lowest-hassle way to get to the hotel from the airport.
The Cheapest Way: The TTC (Round trip: $5.50)
The cheapest way to get to the hotel is via public transit — the TTC. It will cost you a grand total of $2.75 and take about 45 minutes to an hour. It involves a bus trip, followed by a ride on the subway.
The first leg of the trip is to take the 192 Airport Rocket bus. It stops at both Terminal 1 and Terminal 3.
(Don’t worry about it not stopping at Terminal 2: it’s being renovated and not being used for anything!)
I know that going to a strange town and not knowing what things look like can throw you off, so I’ve gathered some photos to help orient you. TTC bus stops are marked by signs that look like this:
Here’s what the airport bus stop looks like:
And here’s what a TTC bus looks like:
Make sure that you board only the 192 Airport Rocket bus; it’s an express bus that goes straight to the subway station. The others will eventually take you to a subway station, but they’re regular bus routes and take much longer.
In case you were wondering, the $2.75 fare you pay on the bus will cover the whole trip to the hotel.
Here’s the schedule for the Airport Rocket. The trip to Kipling subway station should take about 20 minutes.
Once you’re at Kipling station, take the train east to St. George station. At St. George station, you’ll go up one floor, which takes you to the north-south-running trains on the Yonge-University-Spadina line. Take the train south to St. Patrick station.
Click the map to see it at full size.
Exit St. Patrick station, and you’ll be a mere two blocks away from the hotel:
The Middle-of-the-Road Way: Airport Express Bus (Round trip: $29.95)
The Airport Express bus stops at both Terminals 1 and 3, involves less lugging stuff around than taking the subway and takes slightly longer than a cab would. It stops at a number of hotels in the downtown core, including the Metropolitan.
They advertise that their buses are WiFi equipped, which might come in handy if you really feel the need to check your email or IM everyone that you’ve arrived.
Here we are the third installment of Enumerating Enumerable, my attempt to do a better job of documenting Ruby’s Enumerable
module than RubyDoc.org does. In this installment, I cover Enumerable#collect
and its syntactic sugar twin (and the one I prefer), Enumerable#map
.
In case you missed the earlier installments, they’re listed (and linked) below:
Enumerable#collect/Enumerable#map Quick Summary
In the simplest possible terms | Create a new array by performing some operation on every item in the given collection. collect and map are synonyms — you can use either. I personally prefer map as it’s shorter and makes sense if you think of the method as being like functional mapping. |
---|---|
Ruby version | 1.8 and 1.9 |
Expects | A block containing the criteria. This block is optional, but you’re likely to use one in most cases. |
Returns | An array made up of items created by performing some operation on the given collection. |
RubyDoc.org’s entry | Enumerable#collect / Enumerable#map |
Enumerable#collect/Enumerable#map and Arrays
When used on an array and a block is provided, collect
/map
passes each item to the block, where the operation in the block is performed on the item and the result is then added to the result array. Note the the result array has the same number of elements as the given array.
[1, 2, 3, 4].map {|number| number ** 2} => [1, 4, 9, 16] ["Aqua", "Bat", "Super", "Wonder Wo"].map {|adjective| adjective + "man"} => ["Aquaman", "Batman", "Superman", "Wonder Woman"]
When the block is omitted, collect
/map
uses this implied block: {|item| item}
, which means when applied on an array without a block, collect
/map
is the identity function — the resulting array is the same as the given array.
[1, 2, 3, 4].map => [1, 2, 3, 4] ["Aqua", "Bat", "Super", "Wonder Wo"].map => ["Aqua", "Bat", "Super", "Wonder Wo"]
Enumerable#collect/Enumerable#map and Hashes
When used on a hash and a block is provided, collect
and map
pass each key/value pair in the hash to the block, which you can “catch” as either:
- A two-element array, with the key as element 0 and its corresponding value as element 1, or
- Two separate items, with the key as the first item and its corresponding value as the second item.
Each key/value pair is passed to the block, where the operation in the block is performed on the item and the result is then added to the result array. Note the the result array has the same number of elements as the given array.
burgers = {"Big Mac" => 300, "Whopper with cheese" => 450, "Wendy's Double with cheese" => 320} # What if I had just half a burger? burgers.map {|burger| burger[1] / 2} => [160, 150, 225] burgers.map {|sandwich, calories| calories / 2} => [160, 150, 225] burgers.map {|burger| "Have a tasty #{burger[0]}!"} => ["Have a tasty Wendy's Double with cheese!", "Have a tasty Big Mac!", "Have a tasty Whopper with cheese!"] burgers.map {|sandwich, calories| "Have a tasty #{sandwich}!"} => ["Have a tasty Wendy's Double with cheese!", "Have a tasty Big Mac!", "Have a tasty Whopper with cheese!"] burgers.map {|sandwich, calories| ["Half a #{sandwich}", calories / 2]} => [["Half a Wendy's Double with cheese", 160], ["Half a Big Mac", 150], ["Half a Whopper with cheese", 225]]
When the block is omitted, collect
/map
uses this implied block: {|item| item}
, which means when applied on an hash without a block, collect
/map
returns an array containing a set of two-item arrays, one for each key/value pair in the hash. For each two-item array, item 0 is the key and item 1 is the corresponding value.
burgers = {"Big Mac" => 300, "Whopper with cheese" => 450, "Wendy's Double with cheese" => 320} burgers.map => [["Wendy's Double with cheese", 320], ["Big Mac", 300], ["Whopper with cheese", 450]]
Special Case: Using Enumerable#collect/Enumerable#map on Empty Arrays and Hashes
When applied to an empty array or hash, with or without a block, collect
and map
always return an empty array.
# Let's try it with an empty array [].map => [] [].map {|item| item * 2} => [] # Now let's try it with an empty hash {}.map => [] {}.map {|sandwich, calories| "Have a tasty #{sandwich}!"} => []
Welcome to the second installment of Enumerating Enumerable, my project to do a better job of documenting Ruby’s Enumerable
module than RubyDoc.org. This installment will cover Enumerable#any?
, which I like to think of as Enumerable.all?
‘s more easy-going cousin (I covered Enumerable.all?
in the previous installment).
Enumerable#any? Quick Summary
In the simplest possible terms | Do any of the items in the collection meet the given criteria? |
---|---|
Ruby version | 1.8 and 1.9 |
Expects | A block containing the criteria. This block is optional, but you’re likely to use one in most cases. |
Returns | true if any of the items in the collection meet the given criteria.
|
RubyDoc.org’s entry | Enumerable#any? |
Enumerable#any? and Arrays
When used on an array and a block is provided, any?
passes each item to the block. If the block returns true
for any item during this process, any?
returns true
; otherwise, it returns false
.
# "Fromage de Montagne de Savoie" is the longest-named cheese in this list # at a whopping 29 characters cheeses = ["feta", "cheddar", "stilton", "camembert", "mozzarella", "Fromage de Montagne de Savoie"] cheeses.any? {|cheese| cheese.length >= 25} => true cheeses.any? {|cheese| cheese.length >= 35} => false
When the block is omitted, any?
uses this implied block: {|item| item}
. Since everything in Ruby evaluates to true
except for false
and nil
, using any?
without a block is effectively a test to see if any of the items in the collection evaluate to true
(or conversely, if all the values in the array evaluate to false
or nil
).
cheeses.any? => true cheeses = [false, nil] => [false, nil] cheeses.any? => false # Remember that in Ruby, everything except for false and nil evaluates to true: cheeses << 0 => [false, nil, 0] >> cheeses.any? => true
Enumerable#any? and Hashes
When used on a hash and a block is provided, any?
passes each key/value pair in the hash to the block, which you can “catch” as either:
- A two-element array, with the key as element 0 and its corresponding value as element 1, or
- Two separate items, with the key as the first item and its corresponding value as the second item.
If the block returns true
for any item during this process, any?
returns true
; otherwise, it returns false
.
# Here's a hash where for each key/value pair, the key is a programming language and # the corresponding value is the year when that language was first released # The keys range in value from "Javascript" to "Ruby", and the values range from # 1987 to 1996 languages = {"Javascript" => 1996, "PHP" => 1994, "Perl" => 1987, "Python" => 1991, "Ruby" => 1993} languages.any? {|language| language[0] < "Pascal"} => true languages.any? {|language, year_created| language < "Pascal"} => true languages.any? {|language| language[0] < "Fortran"} => false languages.any? {|language, year_created| language < "Fortran"} => false languages.any? {|language| language[0] >= "Basic" and language[1] <= 1995} => true languages.any? {|language, year_created| language >= "Basic" and year_created <= 1995} => true languages.any? {|language| language[0] >= "Basic" and language[1] <= 1985} => false languages.any? {|language, year_created| language >= "Basic" and year_created <= 1985} => false
Using any?
without a block on a hash is meaningless, as it will always return true
. When the block is omitted, any?
uses this implied block: {|item| item}
. In the case of a hash, item
will always be a two-element array, which means that it will never evaluate as false
nor nil
.
And yes, even this hash, when run through any?
, will still return true
:
{false => false, nil => nil}.any? => true
Special Case: Using Enumerable#any? on Empty Arrays and Hashes
When applied to an empty array or hash, with or without a block, any?
always returns false
. That’s because with an empty collection, there are no values to process and return a true
value.
Let’s look at the case of empty arrays:
cheeses = [] => [] cheeses.any? {|cheese| cheese.length >= 25} => false cheeses.any? => false # Let's try applying "any?" to a non-empty array # using a block that ALWAYS returns true: ["Gruyere"].any? {|cheese| true} => true # ...but watch what happens when we try the same thing # with an EMPTY array! [].any? {|cheese| true} => false
…now let’s look at the case of empty hashes:
languages = {} => {} languages.any? {|language| language[0] < "Pascal"} => false languages.any? {|language, year_created| language < "Pascal"} => false languages.any? => false # Let's try applying "any?" to a non-empty hash # using a block that ALWAYS returns true: {"Lisp" => 1959}.any? {|language| true} => true # ...but watch what happens when we try the same thing # with an EMPTY hash! {}.any? {|language| true} => false
Ten Most Densely Populated Technology Startup Regions is a list created by Valleywag by using the Google Maps mashup Startup Warrior. The regions listed are: Downtown Palo Alto, San Francisco around the 101 between McAllister and Grove, Mountain View near Google, Midtown Manhattan between 34th and 40th, Downtown Manhattan just west of South Street Seaport, Seattle near James Street, Santa Monica near where the Santa Monica Freeway turns into Palisades Beach Road, Sunnyvale near Yahoo!, Austin around Congress Avenue, Downtown Vancouver – especially around Gastown.
We’re less than a month away from RubyFringe, the self-described “avant-garde conference for developers that are excited about emerging Ruby projects and technologies” being put on by my friends at Unspace. RubyFringe promises to be an offbeat conference organized by the offbeat people at Unspace, an offbeat software development shop, with offbeat speakers and MCs (I’m one of them) making some offbeat presentations, which will be followed by offbeat evening events. It stands to reason that it should come with an offbeat guide to its host city, and who better than Yours Truly, one of the city’s most notorious bloggers and a long-time resident, to write one?
From now until RubyFringe, I’ll be writing a series of articles posted under the banner of Joey’s Unofficial RubyFringe Guide to Toronto, which will cover interesting things to do and see here in Accordion City. It’ll mostly be dedicated to the areas in which RubyFringe and associated events will be taking place and provide useful information about Toronto for people who’ve never been here (or even Canada) before. I’ll also try to cover some interesting stuff that the tourist books and sites don’t. If you’re coming up here — for RubyFringe or some other reason — I hope you’ll find this guide useful.
I thought I’d start the series by covering a topic with which I have almost no familiarity: smoking. It’s a safe bet that at least a few smokers will be coming to the conference from outside Ontario: if you’re one of these people, this article’s for you.
The Rules for Smoking in Ontario
If you really feel like poring over a legal document, you can read the Smoke-Free Ontario Act. If you’d rather not slog through the legalese, they can be boiled down to these two rules:
- You have to be at least 19 years old to purchase cigrarettes.
- No smoking indoors in public places.
Canadian Cigarette Brands
You’re going to have to ask someone else about which Canadian brands to smoke. Beyond “quit now,” I can’t really make any recommendations. What I know about Canadian cigarettes versus American ones isn’t much:
- I am told that American cigarettes are “raunchier” than Canadian cigarettes. Can any cross-border smokers comment on this?
- If you’re really homesick for Marlboros, you can get “Rooftop” brand cigarettes, which are Marlboros with packaging that makes use of Marlboro’s “rooftop” design but not the word “Marlboro”. The cigarette marketing site Filter Tips explains these “no-name” Marlboros, if you’re interested.
Canadian Cigarette Warning Labels
If you’re a smoker coming in from the United States and don’t travel outside the country much, you might not be aware that your country has the teeniest cigarette warning labels in the world, despite being the first to put warnings on cigarette packs in the first place.
Here in Canada, cigarettes have to devote half the visible surface of cigarette packaging to health warnings, which have livelier copy and are backed with pictures. Here are my two favourite warnings: first, the “mouth cancer” one…
…and the “trying to stick a marshmallow into a parking meter” one:
If you’re going to ignore the warnings, you might as well be entertained by them, right?
Canadian Cigarette Displays
And finally, I’ll come to the title of this post, Where Did All the Cigarettes Go?
If you set foot into a convenience store here, the first thing you’ll notice after the bilingual packaging is that there are no cigarettes to be seen. What you might see is a blank wall behind the shopkeeper that is almost completely devoid of features or markings. It’s a cigarette cabinet:
This started only a couple of weeks ago in Ontario, when the law banning the open display of cigarettes in stores came into effect. This “out of sight, out of mind”-inspired law requires people who sell cigarettes to store them in featureless cabinets, and it seems that they’re not allowed to post anything on them, even if it’s not tobacco-related. If you wander into a convenience store and are wondering where the cancer sticks are, they’re in the blank cabinets.