I didn't realize this was at all difficult. I just want a program which waits for user input before terminating. Just like any old Windows console program, where there's just enough output to warrant the user looking at it, but not enough to generate a whole graphical UI or a logging interface for it.
It's Windows, so you don't expect a user to open up a console to run the program... solution?
Yes, it's really that "complicated."
But, here I am on a Linux system, wanting to replicate it (at this point, more for curiosity's sake than anything else). How do I do it?
I tried at first making STDIN unbuffered, ie.
fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
... but that didn't quite work, because then my subsequent read() just returns right away with EAGAIN. The problem is that the terminal is buffering a line until an EOL character is found, because it wants to be clever and let you getline and all that cal.
OK then, terminal, it's on. While the manpage for tcsetattr() and tcgetattr() should in no way be considered well laid-out and readable, one coffee later, I had it.
struct termios tcattr;
// the spacing of the ellipsis matters if you want to look like DOS.
printf("Press any key to continue . . . \n");
// disable 'Canonical mode' which assumes you want line-buffering.
tcattr.c_lflag &= ~ICANON;
/* Set TIME = 0, and MIN = 1, thus telling the terminal that we want to
* send along the stdin buffer when a minimum of MIN or chars requested
* by read() is available, ie. in our case 1 (since read() just returns
* immediately if you want 0 chars), and to disable the timeout which
* governs how long to wait before sending the stdin buffer along.
tcattr.c_cc[VTIME] = 0;
tcattr.c_cc[VMIN] = 1;
// engage - NOW!
tcsetattr(0, TCSANOW, &tcattr);
read(0, &b, 1);
BAM! This should be portable to any system that conforms to POSIX.1-2001, ie. SuSv3
, so your favourite OS has now had almost 10 years to support my code.
8 comments | post a comment
Holy mother of God.
If you want to install xfonts-jmk, notable for its wonderful Neep (and my personal preference, "Neep Alt") fonts, under Debian, and actually have these fonts available to use in your Gnome/X applications, or say, from the Preferences -> Appearance -> Fonts menu, *don't just sit there scratching your ass wondering why everything you've done seems right, but fontconfig and friends just don't recognize and pick up the fucking font*.
(yes, that -config at the end is intentional).
*ENABLE BITMAPPED FONTS*. Really, I can't believe they disabled this by default. Holy gods, Debian, I swear to god I'm going to kill someone.
Then, a mere:
xset fp rehash
and you're done.
I can't believe I need to do this shit in the 21st
post a comment
So your old router died (it was a custom build box using components from LogicSupply, not known for their robustness, which died in a thunderstorm). You replaced it with a Pentium II-400 that you cobbled together from spare parts, which is now on its third CPU fan and making hideous grinding noises - and where do you find replacement fans for a Slot 1 motherboard these days?
You bit the bullet. You had your housemates partially subsidize the purchase of a Soekris Engineering net5501 along with a flash card, correct power adapter, all the works. You found a Linux box, downloaded a version of pfSense that matched your compact flash size, correctly ran
gunzip -c <path_to_pfSense_file> | dd of=/dev/<path_to_compact_flash> bs=16k
and you're ready to get your hardon for no moving parts satisfied. (running Windows like the other 95% of the desktop market? Try this
So you plug the thing in, and nothing happens. Huh.
How anti-climactic. I guess it's time for some debugging.
The biggest impediment to my debugging was that, despite years of owning old computers and even living with Mr. Langmaid
, I failed to find a null-modem cable
around the house - that being the only way to stare the router in the metaphorical teeth.
Hm. Well, a quick trip to Canada Computers
- which, for the record, only closes at 19:30 on weekdays, what the crap is up with that? - and I come home with $6 of null-modem cable. Time to get to work.
I stare at the asses of a bunch of my computers and note that the only (functional) one with a COM port is the old Pentium III that I took with me to University. Oh man has that thing served me well. Hook one end of the cable into the COM port (/dev/ttyS0 in the old PIII), the other into the pfSense/Soekris box, and you're good to roll.
I used minicom
to connect to the Soekris, because I suck and don't really know how to use other serial communication programs. Though I had to learn. Read more. About the only trick to manipulating the net5501's BIOS is that you have to set the connection to 19200 bps 8N1, hardware flow control. This guide
helps a lot with minicom stuff. I'll refer to it again when discussing BIOS updating, which it turns out you should do if your net5501 has a BIOS revision that happens not to boot your CF card
. For now, the first thing you should do, if you're running pfSense, is to change the baud rate to a paltry 9600 bps, since otherwise you won't really be able to see your BSD prompt.
In the BIOS prompt (after a Ctrl + P on your keyboard), try:
(as you're rebooting, remember to modify minicom to run at 9600 bps)
OK. Now even if you boot BSD, you'll actually see stuff on the screen which doesn't resemble voodoo hieroglyphs.
Next up, if you're running an old firmware version and you can't boot off of your compact flash, or just for shits, you should update your BIOS version to the latest released by Soekris. I had to use the steps outlined at the bottom of the minicom section in the link above
, since minicom 2.1 (on the old Pentium III, which is still running Ubuntu 6.06
) was just plain broken and didn't want to do XMODEM transfers at all. sx (of lrzsz
fame) worked well.
Once you've transferred the file,
and you're set. You may want to set time/date in the BIOS as well if you're pedantic.
Honestly, as anti-climactic as this may sound, this *just worked* and I was able to boot my pfSense immediately (and much more speedily than I was accustomed to). I configured a few basic things, and tomorrow I'll update with my further attempts to just move (scp?) my config file from my old pfSense-enabled PII to the Soekris box, so that I don't have to suffer the indignity of setting up all the port-forwards, static IPs, etc. manually.*UPDATE 2010/11/16 00:50*
It turns out pfSense just comes with a method of storing and loading the XML configuration (OK, that's disgusting, but whatever, I don't have to parse it) it uses for the system, and then restoring it onto another system, all via the web-based GUI. This feature *almost* worked flawlessly; there were some hitches because I had a number of packages installed in my previous version which were no longer available, and they've remained as dead, hanging links in my web menu, and aren't functional. It also failed to install any packages which were available and compatible, so I had to go and do it manually myself. That said, this took 5 minutes, so let's not exaggerate.
I've now got the net5501 purring (not literally, of course, since it's all solid-state and makes no noise) and the network is running smoothly. Nothing to see here, other than a Pentium II which I can rip apart and sell for scrap metal.
1 comment | post a comment
"So, do you think I should even look at these ones? I mean, they're $50 cheaper."
3 comments | post a comment
"If I looked at them, I'd only be doing it so that I could scorn them and objectively tell myself that the ones for $50 more are actually worth it."
"So in fact, it would be a total waste of your time and mine, and I'd only be doing it to alleviate my own consumer guilt, and so that I can pretend that I didn't just buy these out of sheer vanity and preference for their appearance."
"I'll take these ones. No, not those, these ones for $50 more."
It appears that if I view my own entries without signing in, there are ads in my journal.
7 comments | post a comment
In my journal.
Despite years of ad-free service, it appears that Russian management is the same in this day and age as during the 18th century: expansionist, imperialistic, and willing to stamp their dominance on people.
Well, thankfully, I'm no longer physically in Poland, but in Canada, and this gives the opportunity to evade my would-be Russian dominators.
Be advised that my search is on for an alternative blogging service, where I won't be fettered with bullshit ads.
I will attempt to transport my old entries there; in the event that I'm unsuccessful in any mass import, I'll leave this journal up as an archive and merely post new entries elsewhere.
After 9 years here, this is how they treat me. Fuckers.
That does it. Today, I received something like the 500th invite to join some dumbass Facebook group from wannabe concerned citizens attacking British Columbia's initiative to enact the HST. Instead of actually joining such a group, nor joining a group that says "stop fucking bugging me with your misspelled and ignorant pleas," I decided to take time out of my day, yes, time that could be spent doing something actually productive, to read all about the HST in BC, and actually figure out whether it's worth bitching about or not. I admit; my initial bias was in favour of the HST, if only because the documents I saw from the government had actually passed by an editor who wasn't a semi-literate tree-hugging malcontent. That said, I attempted to examine all the evidence as best I could.
22 comments | post a comment
If you're not from British Columbia, or Canada at all, or you are from British Columbia and are an apathetic social mooch, here's the deal, in summary.
In general, if you live somewhere in Canada, you have three government structures above you: a municipal government (your city), a provincial government (Canada is split into ten provinces and three territories), and our Federal government (one ring to bind them all...). Each of these generally has a corresponding set of taxes that are levied for various services. This debate concerns (as it pertains to the province of British Columbia, or 'BC') the merging of the BC Provincial Sales Tax (PST) with Canada's Goods and Services Tax (GST) to create a new Harmonized Sales Tax (HST).
The idea is premised on a similar transition that the Canadian provinces of Nova Scotia, New Brunswick, and Newfoundland made in 1997, an operation evidently deemed successful by the BC government. Despite the apparent success, it's impossible to simply deduce whether BC's transition will be successful, since each province administers its own version of the PST differently, and, as such, the effects of a transition will be different.
I aimed to discover whether BC's transition plan is actually solid.
I'm not going to go into my research or reading about the Atlantic provinces and their transitions, because, as I state above, it's not terribly relevant. If there's a reference which is relevant, either factually or to support a point below, I'll include a link, but for the most part, let's look just at the facts as they pertain to BC's situation.
Very basically, the current GST rate on applicable goods in Canada is 5%. In BC, the PST rate on applicable goods is 7%. Therefore, the set of goods to which both GST and PST applies in BC is taxed at 12% (each tax is applied to the retail price, and not to the retail price plus one of the taxes). The main argument which makes adopting an HST in BC 'bad', it seems, is that the HST will make the union, or entire set of items, which were previously exempt from PST but not from GST, charge 12% instead of 5% tax.
In short, this is a tax hike.
That said, this is pretty much where the average Joe's cognitive abilities have ended. Time to go out into the streets and riot, you slack-jawed yokels! This level of comprehension negates the full breadth of the situation. No government would levy new taxes at a time when they could do immense harm (has anyone heard of our economic recession? I'm sure Gordon Campbell has.) just to piss people off. Well, how are they justifying this, then?
The government, in the usual manner governments tend to do, put out a very consistent but enthusiastic website on this issue. You can find it here. To prevent you from needing to wade through propaganda, I summarize the main motivations they state for the HST (colour commentary provided later):
- the HST will be a value-added tax (VAT), rather than the PST, which was a sales tax. More on this distinction later.
- the government ministry responsible for handling PST collection will be downsized and folded into the Canada Revenue Agency (CRA), reducing the 'heavy foot of government', as it were.
- the above bullet means that businesses will only need to remit and keep track of one set of taxes and remittance dates for collected taxes.
- as a result of the transition to a VAT and simplified administration, they expect a lot of savings for businesses, which will translate into job growth.
- in addition to job growth this way, they expect VAT to cut effective marginal tax rates on capital, which should stimulate monetary investment, particularly into industries with high capital purchase requirements.
- as a result of sales tax transitioning to VAT, they expect consumer item prices to go down over time (explained a bit later).
- ... if all that wasn't enough, to offset the increased taxes from formerly PST-exempt items, and riding the lowered administrative cost for the provincial government, there are planned tax cuts, in the form of lowered income tax and tax rebates.
OK, that's the summary. How do they envision this is going to work? First, let's explain the big difference between sales taxes and VAT. A sales tax is one that's applied at the point of sale on an item that's not being resold. What does that mean? It means that if I'm running a hardware store, a hammer, a tool which I purchase and resell to you (the consumer), I can buy without paying a sales tax. Paper on which I print my receipts, however, I have to pay taxes on, since I am the end user of the paper. When I sell you the hammer, I charge you sales tax on it, and remit that to the government. Effectively, this means that I, as a business have to cover the cost of my inputs (in my example, the receipt paper and the hammer) as well as the sales tax paid on my inputs (the sales tax on receipt paper).
In VAT, what I remit to the government is the difference between my input taxes and my output taxes. In the example above, I pay VAT on both, the hammer and the receipt paper. I also charge you, the consumer, VAT on the hammer when you purchase it from my store. However, what I remit to the government is the difference between what I charged you in tax, and what I paid. This means that, assuming that my taxes collected outweigh the taxes I paid, I only have to cover the untaxed cost of my input items as a business expense.
This has very interesting consequences down a long supply chain. Let's look at a very, very fictional example involving 3 companies:
- a company which sells paper (for receipts, work, etc.)
- a lollipop maker
- a pen manufacturer where the employees eat lollipops
First, a sales tax example. The paper manufacturer sells you paper. Let's assume that $1 of paper is required (for whatever administrative reasons) for the lollipop maker to create a lollipop. Assuming a sales tax rate of 10%, the paper manufacturer will sell it to the lollipop manufacturer for $1.10 ($1 + 10% of $1). Let's assume, for simplicity, that this was the only input cost on lollipops (impossible, I know, but just bear with me). The lollipop manufacturer wants to make a profit of 50% on his lollipops. He paid $1.10 for the raw material for his lollipop, so 50% is $0.55. He thus sells lollipops to the pen manufacturer for $1.82 (($1.10 + $0.55) * 1.1). The pen manufacturer marks up and sells pens to make $0.30 profit per pen. In order for this profit to be there, all of the input costs need to be covered. Suppose that the workers work for free, and one worker makes one pen, and for every pen, he eats one lollipop. Then, the cost of the lollipop is the input cost to make the pen. The pen maker paid $1.82 for the lollipop, so he charges you (the consumer) $2.33 (($1.82 + $0.30) * 1.1) for your pen. At the end of the day, the government gets $0.10 from the paper manufacturer, $0.17 from the lollipop manufacturer, and $0.21 from the pen maker in remitted taxes, for a grand total of $0.48, and you're out $2.33 for your pen. The paper maker made $1, the lollipop manufacturer $0.55, and the pen maker made $0.30.
Now let's look to see if VAT was in place, and the stores had the same motivations. Again, assume a VAT of 10%. The paper manufacturer is still selling his wares for $1 + 10%, or $1.10. The lollipop manufacturer wants to make a 50% profit. He knows that, since he's going to mark up his item, ie. 10% of his cost of sale will be greater than 10% of the cost of his inputs, he can disregard the tax he paid from his 50% profit calculation. Thus, he sells a lollipop for $1.65 (($1 + 50% of $1) * 1.1). The pen maker, wanting to make $0.30 on the sale of their pen to you, knows the same thing, so they charge $1.98 (($1.50 + $0.30) * 1.1), assuming a similar situation as above regarding total input cost of the pen. The end result? You're only out $1.98, saving yourself some money from the previous example. The government gets $0.10 from the paper manufacturer, $0.05 (= $0.15 charged - $0.10 paid) from the lollipop manufacturer, and $0.03 from the pen maker (= $0.18 charged - $0.15 paid), for a total of $0.18. The paper manufacturer made $1 in profit, the lollipop maker made $0.50 (= 50% of his costs, his goal), and the pen maker made $0.30, as they desired. Everybody won, except the government, which got less money than the previous example.
Most importantly, the example above illustrates that you the whiny consumer claiming they get taxed too much, actually saved money with VAT in place, because manufacturers were able to offer lower prices throughout the supply chain and still meet their profit goals. Let's say that each of our manufacturers wants to make an extra $0.02 in profit. That translates to roughly $0.07 in cost passed on to you, for a grand total of $2.05, which is still cheaper than the sales tax example. However, these companies each now have an extra $0.02 to invest into expanding their operations, and new hires.
That was the long example. Further ones should be shorter. Regarding the folding of the body administering PST into the CRA, well, once you get rid of some office assistants and redundancy in personnel between the CRA and the BC tax collectors, you save salary money. The important part for businesses here is that rather than keeping track of two filing deadlines, and hiring accountants to remit and calculate two sets of figures (GST and PST), only one set needs to be calculated, saving the expense and overhead of administrative calculation. Personally, as part of the management team at EQL Data, I can tell you that government remittances are no fun, and keeping track of them is a pain. Less time wasted on this overhead means more money which can be spent on hiring people and invested back into the company.
Regarding the argument for HST implying increased investment, in a very long-winded report the government commissioned on economic growth, the main argument is that the tax cut will help lower the marginal effective tax of capital, which will promote investment. What does this mean? Suppose that I'm a mining company, and I'm thinking of getting investment for a new drill. The investment only makes sense to me if my return on the drill (after I pay the government) is equal to my cost of funds for the drill. Let's suppose here that someone is willing to loan me money at 5% interest. The drill only makes sense if my return on it is 5% of the purchase price. Amongst other things, the report goes on to say, sales tax means that my return must be higher than the VAT case for me to be able to justify the expense. In my example, if my sales tax is 10% (and say this is the only government cost), then my drill actually has to make me a 5.56% return such that I can justify taking the loan (since 5.56 - (10% of 5.56) = 5). In the case with VAT, assuming that my sales are good, I may be able to completely write off the government cost, so that it makes sense for me to buy the drill even if it only makes me a paltry 5% return on its cost. Modern economics seem to generally agree that the marginal effective tax of capital is a significant factor for companies when looking to make investments.
Why would anyone think any of this is bad, then?
To that, we turn to the most organized contra-HST site I could find, and the main one pushed by counter-HST "proponents," if I can call you drooling apes that. For the purposes of objectivity, I will ignore the fact that a video starring Mr. Bill Vander Zalm adorns the front page of this site, and try to skip to the main arguments the site pushes against HST. Please feel free to email me more (lkosewsk małpa gmail.com). The arguments are:
- a number of goods which were formerly PST-exempt will now incorporate full HST, including (prominently) funeral home services and restaurant meals.
- marginal effective tax on capital is not an effective measure of corporate desire to invest, thus HST will not make a difference in actual business capital investment.
- the HST structure shifts tax burden from businesses (which, as in our example above, don't pay as much tax) to consumers (due to the non-PST exempt items costing extra).
- similar effects to the HST on business could be had by just eliminating the PST on capital investments.
- no public consultation before deciding to implement HST.
- even if the HST helps some businesses, does the help offset the damage done to the restaurant industry as a result of higher food prices?
- HST will cost an 'average' BC household an extra $2100/year.
- the HST removes BC's constitutional right to set and collect provincial sales taxes.
- the Liberal government (in power in BC) promised not to implement the HST.
- BC's economy is struggling, and the extra tax will hurt the economy further.
Hm. That seems like a pretty significant list of complaints. Let's attempt to discuss them all to see their validity.
Of course some services are going up 7% in tax. That was openly admitted. Unless these businesses are already earning less in revenue than they pay in input costs, though, the math we did above demonstrates that, in fact, their prices can be lowered, and their profit margin remain the same. It's difficult to calculate whether or not their prices can be lowered to offset a 7% tax increase right away, because that depends heavily on their supply chain, however, so we can't draw many conclusions there.
One thing we can attempt to work out is whether, assuming no change in consumer habits (which is unreasonable, because you can, in fact, assume consumers won't eat at restaurants so much if the prices are higher - mind you, in Canada, the taxes are not included in the prices listed on a menu, so the effect of the migration away from restaurants is also rather hard to flat-out predict due to human psychology), if the 7% tax increase in certain goods will actually hurt the BC consumer.
Here are some of the offsetting rebate initiatives planned by the government to counter the increased tax:
- No effective tax increase for hospitals or schools (link).
- Gasoline, books, diapers, and residential energy consumption are amongst the new items designated as exempt from the 7% portion of HST (link).
- Something I personally find very interesting: under PST, the private resale of used goods was subject to PST (mentioned here). Despite the fact that this was often overlooked by the government, reselling items (ie. homes) and not paying the government PST was actually tax evasion. For the purposes of more realistic laws, and fairness, HST is not being applied to the sale of used items (link, with regards to home buying. The link also discusses rebates on purchases of new homes - which are subject to HST)
- Despite the fact that this is probably backpedaling on their part to retroactively justify some tax cuts, they claim that tax credits for low income families (link) following general income tax reductions and increases in the basic personal amount for BC residents (link) are related to HST.
Alright, so some of this sounds like retroactive justification and flailing. But certainly, measures like the recently-introduced no HST on residential electricity sound good to me. I guess what I want to say with the above is that the figure of "$2100 increased cost for the average home" is probably just as made-up as the claim that BC's capital stock will somehow jump by $14.4 billion by 2020 because of this initiative. It's hard to say, without accurate income figures and other expenses, whether the raise in tax, balanced by cuts and rebates, will actually impact a person's real salary, particularly if the prices for products go down (and, in a properly fostered competitive environment, it's not impossible for them to do so).
There is more to explore. On the topic of public consultation regarding taxes: I'm glad the government didn't, frankly. Though I am very anti-totalitarian (unless I'm the tyrant in power), the amount of idiot opinions about the economy I hear every day from you flaks leads me to believe that it's very good none of you were consulted about tax structures. Nor do I care about the Liberals' promises not to invoke the HST... if I promised to never drive a car, but then broke my promise one day because you needed a lift to the hospital, you probably wouldn't be bitching much. There are valid reasons to break promises. As John Maynard Keynes put it: "when the facts change I change my mind. What do you do, sir?"
Where was I... marginal effective tax on capital. I personally don't buy the argument that it doesn't help with capital investments, if only because the one author who makes the claim also makes the claim that PST reduction could have been explored. That's terribly fishy to me, since PST reduction on capital also equals a reduction of marginal effective tax on capital. Are you for or against, friend? I don't know, but your argument here is on very slippery ground. This concept might actually be the very undoing of the whole "restaurants will go out of business if they have to charge 7% extra for food" argument. Consider; all restaurant expenses, from noodles to new chopsticks, fridges, tables, etc., can be written off of their HST in a way that PST never could be. While I don't own a restaurant, and am hard pressed to give you accurate figures into the running of restaurants, my hunch is that this 7% raise could be forgotten if food prices on menus start dropping (again, because tax prices are not included in menus on BC). The psychological effects alone could *increase* restaurant business.
This covers almost all the points I've seen against HST, with the exception of sales tax as a BC constitutional right (which you either care about or you don't, and I happen to sit in the latter camp). It's now 3:48 AM, which means I've spent far too much time sitting around writing this, and it's so long I doubt you'll get to the bottom of it. It has a bottom line though, which is really my plea.
Stop joining stupid anti-tax rhetoric without understanding the full ramifications of what's happening first. Governments don't take the decision to change tax structures lightly. Perhaps there is benefit in this for you after all.
I don't actually recall the amount of time I slept the night prior, but it couldn't have been more than 7 hours, and was probably objectively less. John called me at 3:06 AM to ask if I had seen Victoria's cell phone anywhere, and I snoozed through the call and passed out contentedly.
Wait a second. I don't have any friends who spell their name "John." And the only Victoria I know is Julian's cousin. What just happened, and why were these people at my house? Why am I referring to them on a first-name basis?
This spontaneous meetup, my friends, was the result of Canada's gold-medal-winning performance on the ice at the culmination of the Vancouver 2010 Olympic Games. The bars poured out, including the one I was at with my Waterloo crowd (the name of this bar was Lou Dawgs, and if you're a fan of Louisiana-style cuisine and reasonably inexpensive beer, it's not a half-bad place). Where were we headed? Who knew!
What mattered was that we had done it, our national identity boosted by winning at the sport that forms the basis for over 50% of Canadian stereotypes. By winning more gold medals at a Winter Olympics than any other nation in history. It was us, we pulled as a team, we willed Crosby to score, and he did not disappoint us. Now the wait was over, we had every right to celebrate, and celebrate we did. We danced, we yelled, we sang. As traffic in downtown Toronto ground to a complete halt we kissed, shook hands with, and celebrated with the drivers, we conglomerated in the (commercial) heart of our fair city, Dundas Square, wherein we, as Canadians, celebrated our identity and cheered like it was nobody's business.
We waved flags. We waved clothes. The party lasted for a long time. Consider that, in Eastern Time, the game began at 3:15 PM, and that we had hit bars at 2:00 PM just to get a seat... give the game 3 hours, and you've got about 12 hours of drinking intermingled with 9 hours of uproarious cheer and love.
This morning when I woke up, I could hardly believe it had even happened. A Service Canada representative was at my door at 10:00 AM to verify my identity and get EQL Data signed up for filing Record of Employment forms online rather than using paper filings. He was crisp, professional, and when I asked him if he had celebrated last night, he shrugged his shoulders and mentioned that no, he hadn't really been out very late. He looked a little put-off by the state of my living room, what with several bottles of vodka scattered precariously over the foosball table, the whole house smelling of hops and lees, and jackets and blankets draped over every piece of furniture. Courteously, he mentioned that his other colleagues might not consider this a very professional meeting.
Throughout the day, this bizarre obliviousness to the happenings of February 28 only deepened. Kat said it best in a text message: "Vancouver was a gong show! Love it. Back to reality today, fuck." As I took a subway later that evening to visit Liz, reality really depressed me. Older women who smiled happily and whose cheeks I would jubilantly kiss last night leered at me from beyond raised copies of Metro, disapproving of my tattered jeans and unkempt haircut. Professionals in suits sat quietly playing with their BlackBerry phones, when only yesterday they would high-five and whoop. Girls who flung their arms around you and danced to the tune of being Canadian stood bundled up in their coats, nodding along silently to their headphones. The train was quiet and demure. We were no longer Canadian, all sharing in the full joys of this word, we were girls and boys, we were white, black, Asian and brown, we were rich, poor, we were professionals or plebeians.
The jubilation, the love, the exuberant joy was gone, we were back at work contributing to our GDP or lost in our own problems.
After a quiet dinner spent enjoying shawarma sandwiches and x-rays of Liz's new hand-bone fractures (acquired in an inebriated game of soccer during the post-Olympic gold celebration), I went home, demure and introverted, reluctant to leave the emotion of yesterday behind, but not wanting to immerse myself in what was only a dream.
As I walked up the stairs from St. Patrick station towards University and Dundas, I was quietly whistling O Canada to myself. As I passed a boy and a girl going in the opposite direction, the boy suddenly excuses himself, turns towards me, and begins to match my tune, our whistling finding a common octave. I turned around and, for what was probably the first time today, smiled broadly. Ironically, this ended our duet, but just for a moment, we had both connected, and our eyes relived the magic.
Maybe it wasn't all a dream.
Olympic gold medal hockey game, Vancouver 2010 Winter Olympics. Canada 3, USA 2 in OT. Thanks for the memories.(The photograph is courtesy of Steve Gircys, whom I bumped into late into the evening. You can also see that even our hockey game can't get in the way of my mildly leftist agenda.)
1 comment | post a comment
Another day, another update. This is almost too frequent for me. Where do I find all this time? After a few presentations and such, things have quieted down a bit over at EQL Data, so I'm back to my "usual" (ie. maniacal) rate of development.
Every once in a while though, a person must reflect and write an entry about something nifty and new that they come across in the course of their work. Today, that new knowledge manifests itself in being able to delete open files in Windows.
First, a quick recap. Why would you want to do this? Let's look at a piece of code to find out:
int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC);
// do stuff with fd, because the file still exists
Why on earth
is this useful? Well, let's say 'filename' is a temporary file. It's going to get removed at some point in our computation, and, unless we have debugging code, chances are we have no need of this file even if our computation produces some kind of exception condition.
The method above is a very simple way of doing this without keeping 'filename' around for removal at the conclusion of the temporary file's use, or within an atexit() or signal handler. Moreover, it ensures that we won't have any issues with name clashes if we use functions like tempnam() or tmpnam() to create our temporary filenames for us.
Of course, it works because every modern operating system only actually
removes a file when all open file handles to it are closed... until then, it simply removes it from its parent directory listing, thus preventing any other
attempts to open the file.
Conclusion: you can see a use for this procedure. And, until recently, I thought it was impossible in Windows. Windows disallows removal of files if there are any open filehandles to said file, which sounds discouraging.
... that is, until I decided to port bsdsort
Bsdsort happens to use the above algorithm in the creation of their temporary files (for intermediate radix sort
stages and such), and, rather than decipher the logic of the program and figure out where to insert a manager for removing temporary files (not to mention handling their removal on all the testing errors I stumbled upon during porting), I took it upon myself to discover how to do this.
The key, it appears, is to use the Win32 API, since the POSIX layer for Windows happens to be missing these (new?) features. Let's see what the code ends up looking like:
HANDLE h = CreateFile( filename,
GENERIC_READ | GENERIC_WRITE,
if (h == INVALID_HANDLE_VALUE)
// handle error
if ((fd = _open_osfhandle((long)h, 0)) == -1)
// handle another possible error
// Go ahead and use fd, and check your filesystem: no 'filename'!
... ta da! What have we here? We've opened 'filename', and removed it... but our filehandle is still open! What have we done?
The key, of course, is the call to CreateFile. You'll note, upon examining the MSDN documentation for CreateFile
, that the third parameter is dwShareMode, ie. all the permissions you wish to grant other processes (and your own process) on this filehandle while you have it open. FILE_SHARE_DELETE is the crucial part of this equation... it indicates the obvious: this file can be deleted while you have it open. I won't go into the other parameters to this call: I suggest reading the MSDN documentation to match this function to your needs.
In order to obtain a POSIX filehandle for the corresponding HANDLE returned by CreateFile, we call the less-known _open_osfhandle
, which gives us exactly what we want.
A bit of error handling later, and we've accomplished our goal: we have an open POSIX file, and 'filename' is gone.
Another win for team EQL. The next challenge was to port bsdsort to C++
(mostly to allow interoperation with the excellent WvStreams
library)... but that's a story for another day!
post a comment
Hey team. Team here is of course figurative, unless you consider "the set of people who might read this posting" to be a team.
post a comment
It's getting quite later than I'd hoped, and I was still going to send out more emails. There are exciting things in the works, and, as most of this past year has gone, they deal with EQL Data, aka the company which continues to increase in awesome every day.
The newest... news... I suppose, on the EQL front, is that we're been invited to another conference to do a presentation. Unlike the last one, where we ran a booth displaying both our wares, and our business model, as inspiration to young entrepreneurs at the Impact National Conference, I'm going to announce this one, so that you can come out and see what EQL is all about. Thank you to those who bumped into me at Impact and suggested being more vocal about this, you found us despite the complete lack of any announcement!
Back to current events. I've been invited to present our feature product, OnWeb at the Connecticut Access User Group (CTAUG), to a room-full of curious Microsoft Access professionals on Wednesday, December 9, at the Microsoft corporate centre in Farmington, CT.
The focus? How to use OnWeb to deploy fully internet-friendly Access applications on the Web with no dedicated effort, redevelopment, and no need for migration. Yes. We do suggest you keep using Access!
My passport has been verified, and my presentation is progressing nicely. Since CTAUG generously gave me up to an hour of presentation and question time, I figure this is the first time to really discuss some of the nitty gritty of OnWeb. How does it put Access on a webserver? Why does it export Access databases to our proprietary format before synchronizing? What are deferred updates, and why are they safe? What interfaces are supported? How did we manage to get printing to work? How has the architecture of Access stomped and tried to block us at every turn? Is it scriptable? What is the roadmap going forward?
If you can be in Connecticut on Wednesday, you too could be asking these questions and more.
I'll also be unveiling a look at one model of the planned EQL in-house appliance... whoops! Did I just preannounce that? I think so. I'll be writing about that in the days to come.
Time to move into the 21st century.
post a comment
Winamp. If you're relatively new to the Internet world, or if your participation 15 years ago wasn't obsessive compulsive, this name might have eluded it completely. If you've tried it recently, it might as well stand for "Windows Media Player part deux." However, once upon a time, those of us who searched for a reasonable music player to play the assortment of audio formats beginning to proliferate the web found Winamp, at that point 1.x, and later 2.x, and loved it. It was small, fast, and got the job done.
4 comments | post a comment
I found it so incredibly tailored to my needs, that to this day, I have a Windows machine for almost unitary purpose of running Winamp 2.80 to talk to my speakers and give me music.
Winamp 2.80 has a few drawbacks though, namely, its MP3 decoder comes from back in the stone age, and has some annoying troubles decoding variable bitrate (VBR) MP3s, particularly in computing their running length, as well as reading back ID3v2.4 tags, particularly ones which use a character encoding which isn't either ASCII or UTF-16.
Well, for those of us running Winamp 2.x, there is still some friendliness in the world.
As I discovered recently, when I attempted to give my Winamp some ability to properly read back my ID3v2.4 tags (since I tag all music using UTF-8 encoded tags, and ID3v2.3 doesn't support UTF-8 encoding) Winamp 2.x has the same plugin architecture used by newer versions of Winamp, specifically, as I discovered using a bit of the ol' binary search, Winamp versions <= 5.22 still use the same identical plugin format.
What does that mean for you, the savvy Winamp user? It means that you can go grab Winamp 5.22 (disgusting though it is), and rip out its in_mp3.dll file from the plugins/ subdirectory, then go back and replace the old in_mp3.dll that shipped with your Winamp 2.x. Restart, and voila! Now you can benefit from many of the improvements to said .dll made by Nullsoft during your refusal to upgrade, without compromising the quality of your music player!
The in_mp3.dll which ships with 5.22 also isn't perfect; sadly it still mangles genres and dates in ID3v2.4, and occasionally (I don't quite know why this is) can't find the artist name. However, it certainly works *better*, and has much less trouble with VBR files.
Winamp 2.x. Still the best, since its faults are still miniscule compared to every other competing solution.
For reference, only *actual insane people* think they're smarter than mktime().
Do not attempt to replicate its behaviour under any circumstances.
Had I known this a few hours ago, I would have saved myself a few hours.
post a comment
I haven't updated in a very long time, and that's unlikely to change, as I've been fairly busy lately, and the busier I get, the less interesting my personal anecdotes, so the less to write about. I did come back from 2 months in Europe though, and I'm still alive, so I guess that's something.
post a comment
I have had a bit of time to write up articles in my more technical (yes, it's possible) blog over on http://www.navarra.ca/blog, though, if you're into that sort of thing.
It's been a while since my online self has gone and written up one of my usual stream-of-consciousness blunderpieces about my recent experiences, so, being sick for the second week in a row and ejecting kilograms of phlegm onto my keyboard every half-hour, I figured today was a great day to do little-to-no work and feel better by talking about myself.
I've been very busy in the last while, for starters.
For those not 'in the know,' ie. who don't live with me or interact with me on a daily basis, my startup-starting life has taken a turn for the repetitive, as I've gone and co-founded a new shop; EQL Data. Rather, the shop is the same, a room in my house, but the premise is new. Rather than my usual system of yelling loudly about 'the system,' why it sucks, and attempting to disrupt people's habits and way of life, the premise here is to improve and simplify something that they grapple with yet find necessary due to its significant benefits; that mysterious 'something' being Microsoft Access. That's right, that Access, the one that mysteriously shows up in your copy of Office, and that you've either used on a daily basis for the last several years of your life, or have never touched because it's confusing and you like Excel better.
For those latter people, consider Access as Excel's bigger brother, when a single spreadsheet with a number of rows isn't enough, you can switch to multiple spreadsheets all linked to each other. The neat thing about Access is, unlike all of its competing products, you can use it without ever knowing how to program. The significantly less-neat thing is that Access has a lot of downsides, mostly completely unrelated to lack of programming, but annoying to the user nonetheless. Do you like to lose your data if multiple users are poking at your database? Access has that feature covered.
For years now, Microsoft and other entities have been 'solving' this and other shortcomings of Access by suggesting migration paths and tools to move you to other technologies, and then conveniently letting you field the price for this migration. It's expensive, it's time consuming, and it suddenly has people finding that their once-simple database operations need programming expertise.
No longer. EQL Data. Check it out.
That mostly summarizes the abstract of what I'm doing. Specifically, at least lately, my part in this fine adventure has been spreading the good word, educating my common man, and implementing a translator and generator for web-viewing Access queries. Check it out: one of the features EQL Data wants to provide is the ability to display your Access database on the web. Throw it into EQL and suddenly it's all there for you to view; want to show inventory information, particular tables, customer data, columns, or query results to friends, business connections, or customers? No problem! One button click and it's all there.
The tricky part is that Access queries are basically formatted as a configuration file with a whole bunch of parameters, and there doesn't exist a parser into some sane format for this, nor a translator from said format to the back-end we've concocted to store data. My work has gone pretty well... though it's taking significantly longer than I expected, I can translate the vast majority of Access query objects I've encountered now. In the process, I've learned some things about tokenizing
and parsing, and designed a whole wackload of new datastructures for testing and storing intermediate data. It's been fun. Only a few more things to go.
I've also met with a lot of people to spread the love. Want to hear more? That's what coffee meetups are for my friends.
That part said, it isn't why I decided to make this entry. The reason I decided to write this is because I just finished reading the 'original' Ender Series
(read; "Ender's Game
", "Speaker for the Dead
", and "Xenocide
"), again, and have drawn new conclusions from my last reading years ago. Since my dear friends skonakov
and Katya bought me the entirety of the series (including new books I hadn't even heard of) for my last birthday, I feel compelled to re-read the whole series as a token of my appreciation. That included re-reading the books I had read long ago and had come to forget.
Now, why is this entry important. Well, some years back, I remember having an argument with either Mr. Samir Patel or icedrake
, I can't remember who, where I argued that Xenocide is a better book than Ender's Game. I completely disagree with my claim, though I still agree with the arguments I presented, ie. that Xenocide was a far more expansive imagination at work, a more concrete tying together of science-fiction ideas, and generally a more difficult, philosophical novel to grasp.
The problem is that I don't necessarily care about that anymore.
When I made this argument, I must have been 19, maybe 20. Maybe I was even 18... second-year sounds about right. Regardless, I was very young, impetuous, egotistical, and I was still sponging up tons of new ideas to juggle around my brain. I was still forming my ideas of what relationships between humans mean and how they function, and more importantly, I didn't really care
, I was entering a stage of life where all relationships seemed transient, and every day that I woke up I felt that my past self was inconsistent with my beliefs and values.
As I write today's entry, I'm 25. Sure, in the scale of human experience, I've just barely entered real adulthood, I've only recently joined the quarter-century club, and I've only just left the coveted 18-24 statistical age group. That said, a lot of things change between 18 to 25. For one, you change far more gradually as a person, every morning that you wake up is not a wild shift of being and personality; it's a slow evolution where any new information you receive only minutely impacts your core tenets. You don't grow drastically, you're not driven purely by hormones, you understand more about long-term goals and how to strive to gradually achieve them. Your life is less a set of jerky motions of a steering wheel to attempt to keep the vehicle going straight instantaneously, it's more looking to the horizon and gently orienting the wheel to point towards it, eventually.
My perspective on relationships has been molded by many more years of varying interactions, by both applied and theoretical understanding of humans, by interactions at soccer games, Starbucks, in markets, on trains, in the emergency aisle on an airplane, sharing laughs and beers, and between the pages of works by Erich Fromm, Robert M. Pirsig, and many others.
My perspective, therefore, on the Ender series, has shifted significantly
. The punchline? I think "Speaker for the Dead" was the best book of the series. Here's why, in a lengthy exposition.
"Ender's Game" was a monumental work. Not only for my developing science-fiction mind when I read it, but in general. It centred around a protagonist who, unlike the brazen, teenage heroes present in other works, those striving for personal success at the cost of their own stability, willing to uproot themselves and fight for a goal throughout the galaxy, was merely a child in his formative stages, shaped by others and ultimately, used by them for a goal he never would have reached for himself. Its character development was unique and special, one might wonder if Shinji Ikari
of Neon Genesis Evangelion
was at all influenced by Ender
, the child in question. Like books written by the Strugatsky brothers
, the science-fiction components, while brilliant in their own right, served as a backdrop for the wonderful human drama which played out in the book. "Ender's Game" received critical acclaim. It built whole communities of people who could truly identify with the protagonist and the essence of his struggles, who absorbed the book and made it their own. It prompted science-fiction to be better.
What made Ender's Game so amazing to me was that it was merely a precursor, a set-up to Speaker for the Dead. I should be clear; even the first time I read the series, I thought so, I was shocked that something so compelling as Ender's Game could be merely an introduction, a precursor for a work so involved that it needed an entire novel as an introduction. The first time I read Speaker, I thought it was 'good.' It was more conservative, more reserved in its science fiction, and that's why I didn't readily latch on to it, that's why, as an 18-year-old looking for punch and catharsis, it didn't mesh and didn't register in my mind. All these reasons are also exactly why Xenocide did
But, that was years ago, and the parties with whom I had my verbal spar already know what I said, or have long forgotten.
The point is, this
time, as I read Speaker, I was enthralled by how real
every single sentence of the book felt, and how it flowed so naturally and subtly that only when you put down the book for another coffee did you, the reader, realize that the book talked about a distant human colony on a planet far out of our solar system, surrounded by a deadly mutating virus and a culture of extraterrestials, in a universe set several thousand years past our own.
The characters were so beautifully done, so human. As I read in an excerpt of Orson Scott Card
's after the fact, he himself realizes exactly this. He realized, through some stroke of genius, that what makes characters be truly real is not what they ponder in their internal monologues, it's how they act in relation to others. Speaker centred on several characters; Libo, Pipo, Novinha, Ender, Miro, Ela, Ouanda, Olhaldo, and Grego. And one other boy, whose name I can't immediately recall. I blame Enya
, whose music has insidiously creeped onto my playlist. The point is, we've got nine characters here. Let's eliminate the first two, because what I'm about to say concerns primarily the last seven - what Card found is that a character is defined in the mind of the reader by how they bounce off of their relations when surrounded by others. For example, say we have characters A and B. We have only one relationship to describe, with two perspectives; the relationship between A and B, from each of their viewpoints. If we have three characters, A, B, and C, we suddenly get up to four relationships- A & B, B & C, A & C, and all three of them together. As you can see, the number of relations and viewpoints increases exponetially with the number of characters. Seven characters (as those seven were caught interacting frequently) mean a lot of potential relationships and viewpoints to consider, yet, Card did this without hesitation, without trepidation, he wrote this absolutely fantastic novel where the relationships were characters were so fluid that I completely forgot I was reading a work of fiction. That
my friends, that
is writing genius. That is the level of writing proficiency I would love to achieve one day. To have the interactions between the characters so amazingly natural that the background setting, the flight of fantasy which the author is allowing me to experience, seems like a walk in the park rather than interstellar travel to other planets.
Here, however, is where the fourth wall is broken - Xenocide. While I accept the author's claim that he never really intended to write a trilogy, and that his agent basically asked him to write a third book because she had already sold the "Ender trilogy," it in no way excuses what I consider the absolutely sub-par writing that I was presented with in Xenocide. Let me explain; compared to many other works I've read, the work was brilliant. Visionary. Calculated. Well-argued, fundamentally supported. By all rights, it was genius. However, when it came to the pawns playing out their roles in the Universal framework Xenocide provides, I found that, more often than not, those pawns seemed like caricatures of their former selves in Speaker for the Dead, undeveloped manakins juggled by the hands of a skillful author. Key; I no longer saw them as human beings depicted by the author, I saw them as actors in a play scripted by the author
. Perhaps it was the lack of experience, Orson Scott Card is only 57 himself, yet he was writing about adults in their sixties, people who have an outlook and reflection on life which he himself did not yet possess. Truthfully, though, I think even this is an excuse, the characters who were children in Speaker for the Dead are in their twenties and thirties here, and they are just as poorly drawn out as the adults. They are no longer real, their interactions don't seem to match their personalities half of the time, and I find that their descriptions are rushed, unbelievable, and inconsistent with their ages and even internally inconsistent with their prior descriptions. Bricklayers turn out to be philosophical geniuses from tender young ages, siblings who have grown up with each other for 20 years turn out as vile and embittered with each other as young teenage siblings. There is no growth, they seem confined to their childlike characters in perpetuity. Ender himself seems to have experienced stagnation; he seems much the same at 60 as he did at 20, except that less of the book focuses on him, and so glimpses of him almost seem annoying, distracting, as while reading them I remembered the brilliance of Speaker, and was constantly reminded that I am reading a book which is failing to capture the essence of its predecessor. Jane, an entity with so much experience in her memory that a mere 30-40 years could hardly change its personality, is, by contrast, so vastly different from her description in Speaker that I could barely tolerate her portrayal.
I don't know how I failed to see these things the first time I read this trilogy, but the fact that I did fills me with a certain glee and a brooding understanding that, if I ever needed proof that age does indeed change a person's outlook and viewpoints, this is it.
To whomever I made arguments defending Xenocide; I humbly concede the point. You were right. Ender's Game is a better book. If, however, you wish to attempt to convince me that Ender's Game is a better book than Speaker... well. We've got a new argument on our hands :)
post a comment
I just spent 20 minutes on the phone waiting to talk to a clerk at the Toronto Humane Society. During the time I was on hold trying to get instructions for what to do with a house sparrow that I found outside with either a dislocated wing or tail, the sparrow got away and was lost in a sea of people going to lunch. I wasn't able to locate it anymore.
post a comment
I am not terribly impressed with a society that apparently has $10.7 million or more to spend annually, given that they care for approximately 9000 animals. Assuming, say, 4 months of care and rehabilitation per animal, you're talking just short of $10/animal/day, which, given the tendency of shelters to put animals in the same cage, buy food in bulk, and have caretakers service many cages, is actually a fair bit of money.
I'm pretty sure that though Marta (my dog in BC) is 15 years old, care for her costs substantially less than $10/day.
You could really afford another receptionist, Toronto Humane Society, so that I wouldn't have to stand outside trying to figure out what the best procedure to save a wounded sparrow is.
As I've discovered with more research, the Toronto Humane Society seems very well publicized, but is perhaps not such an awesome idea. The city of Toronto manages its own shelters, apparently having pulled the contract away from the Humane Society in the '80s. I didn't know about these shelters at all, but will definitely contact them instead in the future.
Yes, I'm bitter, but hopefully you learned something.
I've been slacking on posting here, replying to emails, or generally being social outside of Toronto. It's holiday season; time to change that.
3 comments | post a comment
Extended trip to BC from the 17th (tomorrow) to the 9th of January.
Tons of time to visit Victoria, Portland, Seattle, and maybe... San Francisco?
Related people will be hearing more.
In the meantime, if you want a Vancouver postcard, you know who to email with your address.
OMG! Fallout 3 is available on Steam in 2 hours!
post a comment
I've got my finger on the trigger.
Today I decided to cook something fancy, because, you know, I'm sick and at home and have lots of time to spare before dinner, for once.
post a comment
My choice was lamb chops braised in a mixture of red wine, tomatoes, and olives. I used a derivative of this recipe, if you're interested.
The result was quite good indeed... the lamb turned out much more tender and juicy than I've ever managed to make lamb before, the sauce was quite excellent (though I found that I had to reduce it for significant periods of time to get the desired thickness), and the meal went over deliciously with mashed potatoes.
- though I found a nice dry table wine to use here, I think a shiraz was a poor idea. I settled on a 2004 Ruitersvlei (South Africa) Shiraz, and it turned out to have a slightly smoky flavor which was at odds with the kalamata olives and succulent tomatoes I chose.
- Also, I added a few too many olives, and, coupled with the added time I allowed the mixture to simmer and reduce, this made the resulting sauce a little too salty.
All notes for next time...
OK, so I was going to do this shortly after playing the game for the first time, and that failed miserably, because I was a combination of too lazy, and preoccupied with other things.
4 comments | post a comment
However, it's now 1:10 AM on a fine Saturday night, and I'm sick as a dog avoiding playing videogames or doing actual work, so I figure updating my Stalker review seems reasonable. I also happened to be too sick to attend uwmathgal's birthday, which is unfortunate, nor my friend A.'s loft-warming party. Oh well. Instead, you get a follow-up to S.T.A.L.K.E.R. Clear Sky review part 1.
I left off on the previous review by discussing the stupid machine gun at the Cordon.
I'm going to ignore most of that review, as I played the game again, with patch 188.8.131.52, and it fixed a lot of the things I bitched about, while introducing only a few things which pissed me off.
Notably, the hard 50 kg weight limit (no matter what weight limit you actually had via suit and artifacts) was fixed, a whole fuckton of crashes were fixed, and distribution of ammunition was significantly amended (to the point where it's almost feasible to use 5.56x45 mm rounds for most of the game, though I still didn't), not to mention the fact that I actually managed to get a Heckler & Koch G36 this time around... and join the bandits.
OK, let's get back to discussion here. My sole (read: only) objective this time around was to join the bandits. I hadn't been able to do it before, and I wanted to see how this would play out. Let me break the tension here by saying that I did succeed, but I quit the game a mere 8 gameplay-hours afterwards, because I was so frustrated with it.
First of all, one of the things 184.108.40.206 changed was that, when coming into the Cordon, it's no longer possible to escape the auto-firing chaingun of bullet death by just heading North throughout the swamps, and heading over to Sidorovich by crossing the train tracks. The Stalkers protect the train tracks, and they now dislike you (as they're supposed to, I guess, though they sure didn't when I played the game the first time). They will fire on you if you get too close. Take a deep breath and get ready to use those bandaid/medkit buttons, because you'll need them to survive that gun.
As in 220.127.116.11, the Stalkers on a hill in the Cordon by the vehicle factory offered to help me get all those crates of ammo supposedly stored there by the military for 500 RU, but sure enough, just as in that patch, whether you give them money or not, they're sure as hell unhelpful and don't move at all. Whatever. Fuck you guys, I'll keep my 500 RU and use my MP5 to mow those fuckers down. Oh, right, they have AK-74s. Well, a few loads and saves later, I have your ammo, bitches.
Anyway, yada yada, you do the Stalker mission, you go wipe out the military base and steal the NPR-21 medkit (and get yourself 2 AN-94s, as I mentioned in the previous article, my choice weapons for the game), and then you head up to the Garbage. Play out the storyline elements there, and you've now hit the actual QA boundary of the game, since after this point everything still fucks up... just not as badly as in 18.104.22.168. The Freedom dudes at the north entrance to the Dark Valley from the Garbage no longer give you a mission (which you auto-fail) every time you enter the Dark Valley, only the first time. However, they still won't talk to you, ever, and don't actually move, so if you want Freedom to succeed in killing Duty, you'll have to mow them down, though you're on their team, since they're not getting with the program and capturing any control points.
But... the story is mostly unimportant. I thought about what I would say about it, and other than some things which are irrelevant in 22.214.171.124 (though they sure pissed me off in 126.96.36.199), there are only a few comments I have about the ending... OK, what the fuck, you're entitled to my opinions:
- Sakharov: He'll give you the coolest quest in the game; go meet up with some Stalkers and wipe out Zombies. Holy fuck *yes*. Give it to me baby. Lemme rip those fuckers apart. This will, refreshingly, be the only time in the game you're paired with A.I. that doesn't make you want to cut the programmers' balls off for being so dumb. These guys work as a team to kill more zombies than you yourself can. Anyways, that's not the comment, the comment is that, once you complete this mission, his dialogue will forever be "Please go to Lefty (Lefty is the leader of said Stalkers)." Hm. OK. Why don't I trade with you instead, given your insanely low barter prices on high-end armours? Stupid.
- The Red Forest: Try entering it with an armor that isn't the Bulat armor, the SEVA suit, or the Exoskeleton. I dare you. Come on. Do it. Guaranteed death from radiation, psy, whatever. Given the fact that the Stalkers/Duty members around you are wearing nothing but rags, and old Forester has that cheesy Russian winter hat, this pissed me off to no end. Repairing a SEVA suit is expensive.
- Upgrading any gun that was given to you pre-upgraded, or that you found in such a state: notice how you couldn't do it? OK, in 188.8.131.52 you can, lucky devil, but 184.108.40.206 meant that you'd never be able to upgrade those guns past the state which you acquired them in.
- The "Flame" quest: At the Army Warehouses, you really, really want to talk to the Freedom dudes lounging around there picking their asses. One of them will give you a quest to give him a "Flame" artifact, and though you'll lament losing such a nice artifact, he'll give you an FN F2000 as a reward. Booyeah (since I was unable to buy this gun anywhere).
- Limansk: Sucks balls. Seriously. It looks so cool when you look at a map of it, and there's all these guys firing at you everywhere... but when you've gone through it all, why the hell is it really just one linear path? Give me back the Prypiat of the original Stalker! Fuck that bullshit.
- The helicopter at the abandoned hospital: oh fuck! It's attacking me with side-mounted barbette miniguns, and all I have is this assault rifle! How the fuck do I take it down? Oh... I shoot at it. With my assault rifle. Good thing its minigun doesn't actually damage me much. Stupid.
- Machine gunner shooting at your Clear Sky dudes as they run around a building: The scripting here is pretty neat. The fact that GSC put an actual dude behind the machine gun which is mowing you all down tells you a lot though... while you're supposed to let your scripted dudes take out the gun with a grenade or whatever, they actually suck at it and keep dying, so it's probably in your best interests to just take off the machine gunner's head and silence the nest yourself.
- The ending: sucks. This was the worst part of the game for me, as I had poured hours into playing it, and expected a tough but winnable final battle replete with explosions, squads pelting each other left and right, great team-play, and a captivating ending. What I got was random gunfire all around me (ineffectual), while all the enemies who spawned near me shot at me immediately. I got (with no explanation) Strelok running around with some kind of psy armor? Which my gauss rifle was supposed to weaken? I got no squad support whatsoever, and I got guys from something like 3 stories down lobbing the usual grenade with pin-point accuracy at my feet while I was hidden behind some crates avoiding a hail of bullets from team Monolith. Worst of all, and I really mean worst, the script governing how Strelok moves sure didn't anticipate him being hit by a grenade and flipping over the side of the railing of the platform he was on, and hitting the ground. He stood there, motionless, with his psy-shield nearly full, health full, convulsing like he was having seizures, and it gave me no satisfaction to just deliver headshots to him with the Gauss rifle while he didn't even move. Sigh. I felt utterly robbed of my victory.
Anyways, those are my thoughts on the actual story itself. Forget that shit. Let's talk about why I played the game again - the bandits. I'll give you my definitive version of joining the bandits and doing work for them. Hopefully, you don't run into the same scripting bugs I ran into joining them, but, if you do, this may be of some use to you.
So, obviously, don't join the Stalkers. Don't join Duty (as they are immediately hostile to the bandits even though they have no objectives which involve explicitly killing them). Freedom is cool, they're so laid back that they don't really care about the bandits. Oh, Freedom. I joined them too. That made for a real problem when you're an enemy with the Stalkers... I'll get to that shortly.
If you talk to Yoga (bandit leader) when you get to the Garbage, you'll be able to do all the prerequisite tasks for joining the bandits, kill some dudes, take over the Flea Market (only to have the bandits lose it when you walk off the map... idiots). Then, you'll ask to join... he'll give you some crap about checking your background before contacting you. I checked the forums for this, and it appears to be a hack by GSC to prevent you from joining the bandits too early... people have said you have to do Duty's quest (clearing the underground) and then come back to the Garbage before Yoga contacts you and allows you to join the bandits.
.... not so for Luke here. I cleared out the underground. I went back to the Garbage... nothing. I tried talking to Yoga... oh oh. He won't talk to me. No dialogue button, I don't get a "talk" option looking at him. Maybe it's a temporary bug... leave to the Dark Valley, come back, same thing. Go to Yantar, complete Sakharov's objectives, come back... same bug.
I was pretty devastated. No communique, and I was pretty sure I was just fucked.
Well... not entirely. Some circumstances (which I don't fully understand) cause Yoga to leave the bandit base. He just kind of... walks around the map for no reason? As he runs around the map, two interesting consequences follow: you can kill him. In the Bandit base, you can't draw your gun, but while he's outside, he's unprotected. Killing him seems to produce nothing positive for you, though... I killed him once while being a member of the bandits; my popularity with them didn't drop at all, but the bartender doesn't take over control of the clan at all... nothing seems to happen, except Yoga is gone. Sigh. The other consequence is that, while he's running, he's not buggy and will talk to you. So, I found him running around outside at one point, talked to him, and sure enough, he lets me in. And... holy shit! 20000 RU for joining! Giddy up boys, I'm all yours. Let's kick some ass!
I found that kicking ass with the bandits, however, is very difficult. They want to take superiority in the garbage, while Freedom, the Stalkers, and Duty are piling into it. You don't want to piss off Freedom (since, hint hint, if you're friendly with both the Bandits and Freedom, you'll be able to fully upgrade every gun in the game except the machine gun. That's right, between those two technicians, you'll have everything. So, don't piss off Freedom), so you've got to kill Duty and the Stalkers, but... Duty is constantly sending squads into the Garbage. It's a relentless stream. Your bandit friends will try to shoot at them from 300 metres with shotguns... useless clods. Duty with their assault-upgraded AN-94s will mow down your bandits and keep beating you back unless you're there... which gives you precious little time for expansion. Tons of bugs regarding the usual point-ordering in which you have to grab points also doesn't help... needless to say at one point I just let Duty run amok while killing Stalkers (who, since they seemed to have recaptured the Flea Market, were sending reinforcements at me from both sides; the Flea Market, and their base in the Cordon), and when the Stalkers were sufficiently weakened, I ran back and forth between the barricades by the Bandit base and southern control point which leads to the Agropom... in this fashion, I somehow managed to get the Bandits to get into the Cordon. This was HOURS of gameplay. I ran into the Cordon after them, and took out the Stalker base by myself, knowing all too well that I had very little time before the Bandits lost some control point they needed for an objective and this mission would disappear. For 3-5 seconds (I didn't really keep track), I had the Stalker base. Then, the Bandits indeed lost some point, and though for another 9 hours of game time, I tried replicating this feat, I was unable to.
For once in their miserable lives, the game designers seem to have properly concocted a reward for this seemingly impossible task... Tooth at the Bandit base will give you a whole fuckton of Rubles, a GP 36, and a Bulldog 6 (real-life RG-6 grenade launcher) stocked with VOG-25 grenades! Wow! I thought this was amazing, and the GP 36 truly lives up to being an amazing sniper-assault rifle... other than that pesky 5.56x45 mm ammunition it needs. Not only is it still rarer than the 5.45x39 mm ammo, it also damages your gun far more to fire it... and the GP 36 isn't cheap to keep repairing. Disappointing, though inevitable.
Regardless... bandits. If you really want to waste hours of your life; worth joining. Will frustrate you so much (especially if you join Freedom later, and realize that without killing bandits - who you don't want to kill because you want access to their technician - it's impossible to effectively take control of the Garbage) that you will finally uninstall this game to play Bioshock.
OK, I'm getting massively tired, and I only have a few more comments anyways. M209 grenades... more plentiful (though not by much) in 220.127.116.11. Finally, you can use those NATO assault rifles, which is great because, though no rifle in the game matches the AN-94 (fully upgraded) for rate of fire, the SG 550 comes close, does more damage (important in a close-assault rifle where going for the head may be prohibitive), is more accurate, and uses the SUSAT scope rather than the PSO-1 (personally, I prefer the PSO-1; it's more universal since my assault rifles and sniper rifles use a derivative of the same scope, and it allows you to do rangefinding and precision shooting, though really that only matters if you use it to shoot targets at above 800 m - below that just use the top chevron and you're fine - which is unlikely with an assault rifle, however, the SUSAT works better in low-light shooting since it has superior illumination).
Next, why, WHY did they seemingly remove all the helpful artifacts which increase my carrying capacity more than 10 kg?! Finally, with 18.104.22.168, the extended carrying capacity actually works. However, I wasn't able to find a single artifact which increases it more than 10 kg... and believe me, I remember running through this game the first time and finding many. Huge piss-off when I've got the Bulat armor and I see a bunch of AN-94s I can sell for cash sitting in front of me.
Lastly, since you've made it this far in my reviews, you get a bonus: a much more concise and entertaining review of Clear Sky than my own: The Zero-Punctuation Review! (thanks cpirate!)! Yay brevity!
OK friends, I'm sure I have more to rant about in this game, but let's just pretend I don't and move on with our lives.
OK, so I haven't finished the previous update yet. Lots of reasons involving inebriation are responsible.
post a comment
Regardless, I'm heading off to New York city again this Friday morning, and will be there until Tuesday night. That means if you want a postcard, you know who to email with your address.
See you peeps later!