Monday, October 6, 2014

Azure: What to use, what to avoid

Azure is clearly the second-tier choice for cloud services these days, well behind Amazon Web Services, but (so far as I can tell) still well ahead of Google Cloud and all the other players. But since I’ve been building Payboard’s infrastructure on the Microsoft stack – Visual Studio 2013 is pretty nice, and C# remains my favorite language by a significant margin – Azure was a natural choice.

Since making that choice, Payboard has processed some 30 million events from our customers, with several hundred thousand more coming in every day. That’s pretty small beer compared to some folks, but it’s not insignificant, and it’s given us a chance to stress test Azure in the real world. In the process, I’ve developed some strong opinions about what works well in Azure and what I would at all costs avoid the next time around. What follows here is just the experience of one team – so caveat developor.

Azure Websites: Thumbs up

Azure Websites aren’t suited for every task, with their main limitation being that they can’t scale up beyond 10 instances.  But if you’re not going to bump up beyond that, they’re very nice. We haven’t had any reliability problems to speak of, and they have very nice rollout stories. My favorite is their git integration: once you get it setup, you just push to Github, and that’s it. Azure notices your push, builds it, runs all your unit tests, and then if they succeed, pushes it to the website automatically. Very handy, and a nice workflow.

Azure SQL: Adequate

SQL Server is a great database, and I’m not at all sorry that we went with it. But Azure SQL starts getting spendy if you’re pushing any significant traffic to it at all, and it has some weird limitations that you won’t find in standalone SQL Server. (The one that’s bit me most recently is that it doesn’t support NEWSEQUENTIALID() – good luck keeping those clustered indexes defragmented.) Like SQL Server in general, it doesn’t have a great scale-out story: you can do it, it’s just a significant PITA. And finally, Azure SQL seems to have a lot of transient connectivity errors. At least half a dozen times a day, we simply can’t connect to the DB, sometimes for upwards of several minutes. MS insists, quite correctly, that you need to wrap every attempt to write to the DB in a retry block. But sometimes the errors last longer than your retry block on a busy server can reasonably be expected to continue retrying. My recommendation: if you’re building a financial application, or any application where you simply can’t afford to lose data, don’t use Azure SQL.

Azure Table Storage: Adequate (barely)

Azure Table Storage is insanely cheap, unbelievably scalable, astonishingly reliable, and if you’re using it the way it was intended, blazingly fast. It’s also missing a whole host of vital features, and is extremely brittle and thus painful to use in the real world. It’s not quite as bad as the “write-only datastore” that I initially dismissed it as being, but it really needs some TLC from the Azure team. For a good sense of what it’s still missing after years of neglect, check out of the UserVoice forums. Despite all that, if you’re willing to repeatedly pivot and re-import your data into ATS, it can be fairly effective. It’s basically a really cheap place to dump your log data. If you need to read your log data back, you can do it, you just need to be willing to repeatedly copy your data into a whole bunch of different tables, with each table having a separate partition key/row key schema. That’s more-or-less acceptable when you have a few million rows of data; it’s a lot less workable when you’ve got a few billion. It would be better if I’d been able to get the 5-20K rows / second imports that Azure advertises; unfortunately, even after a lot of tuning, I haven’t been able to get more than (sometimes) 1000 rows per second. (I’m sure that there may be ways to do it faster – but the fact that I haven’t been able to figure it out after a lot off effort goes right back to my point about brittleness.)

Azure Service Bus: Thumbs Down

Uggh. When we decided to switch over to an asynchronous queuing architecture for our event imports, we initially went with Azure Service Bus, mostly because it was newer (and presumably better) than Azure Storage Queues, and because it offered a notification-based approach for servicing its queues. Unfortunately, it was neither reliable nor scalable enough. We suffered through repeated outages before switching over to Azure Storage Queues. In addition, it basically doesn’t have a local development story. You have to use a real Azure instance, which is annoying and a PITA if you ever need to develop disconnected. (MS does have a Service Bus instance that you can install on your local machine, but at least as of this writing, it’s badly out-of-sync with the Azure implementation, and doesn’t work with the latest client library off of nuget.)

Azure Storage Queues: Thumbs Up

Very fast, very scalable, and rock solid. It’s poll-only, but that’s not hard to wrap. It has very large maximum queue sizes, which mostly makes up for the fact that its maximum message size is only 64K. On the whole, recommended.

Azure Worker Roles: Thumbs Up

They do what we need them to do. I still think that they’re more difficult to use than they need to be – I wish I could use Kudu with them, to enable the same “push to git” workflow that works so nicely with Azure Websites  – but I guess I don’t mind the flexibility that comes with requiring me to go through a separate publishing step. And once you get them configured, they’re easy to scale up and down. (I especially like the option to scale them up or down automatically based on queue size.)

Azure Managed Cache: Thumbs Down

Azure’s in-house cache implementation is slow and unreliable. When we finally abandoned it, we were experiencing multiple outages a day, and even when it was working, we were averaging about 300 ms / lookup, which was unacceptably slow for a cache. Not recommended.

Azure Redis Cache: Adequate

Redis is, indeed, as blazingly fast as you’ve heard. Our lookups often take less than 10 ms, which is kind of hard to believe, when you consider network latency and everything else. Unfortunately, after an initial period of stability, we’ve lately been having several (brief) outages a day. It’s just a cache, and we’ve wrapped our Redis cache with a (briefer)  in-memory cache, so this hasn’t been crippling, but it’s not what you like to see. In addition, I have some gripes with the recommended StackExchange redis libraries – the basic problem being that they don’t provide any automatic reconnect after a connection issue. Yes, you can wrap that, but it seems like the sort of thing that ought to be handled for you by the library itself.

Friday, July 25, 2014

“502 Bad Gateway” error on Azure Websites

I ran into a strange problem the other day. It made perfect sense as soon as I understood what was going on, but I was scratching my head about it for a while, so I thought I’d document it here in case anybody else runs into it.

I recently switched Payboard’s website over to use the new Azure redis cache, instead of the native Azure Managed Cache Service. We’d been running into all sorts of problems with the Azure Managed Cache, with requests to the cache averaging over 400 ms – way, way, way too slow for a cache system. Once we switched to redis, our average request time dropped to under 25 ms. Not perfect, but much better.

The only problem was that certain requests to the website started (randomly, it seemed) returning “502 bad gateway” errors. This had me quite puzzled. I was able to definitively track it down to our use of redis – as soon as I switched back to a simple in-memory cache, the errors disappeared. And when I switched back to redis, they started showing up again. However, none of these errors were showing up in our site’s error logs – they weren’t getting caught by any of the error handling attributes that we decorate all our controllers with, like so:

/// <summary> /// Log unhandled exceptions /// </summary> public class PayboardApiErrorHandlerAttribute : ExceptionFilterAttribute { private static readonly Logger logger = LogManager.GetCurrentClassLogger(); public override void OnException(HttpActionExecutedContext exceptionContext) { try { var exception = exceptionContext.Exception; var exceptionMessage = exception.CompleteMessage(); string userName = null; if (HttpContext.Current != null) { userName = HttpContext.Current == null ? "" : HttpContext.Current.User.Identity.Name; } var origin = ""; var ctx = exceptionContext.ActionContext; if (ctx.Request.Headers.Contains("Origin")) { origin = ctx.Request.Headers.GetValues("Origin").FirstOrDefault(); } var content = ctx.Request.Content.ReadAsStringAsync().Result; var ipAddress = ctx.Request.GetClientIp(); var message = string.Format("Controller: {0}; Url: {1}; User: {2}; Origin: {3}; IpAddress: {4}; Error: {5}; Content: {6}", exceptionContext.ActionContext.ControllerContext.Controller.GetType().Name, exceptionContext.ActionContext.Request.RequestUri, userName, origin, ipAddress, exceptionMessage, content); var prefix = string.IsNullOrWhiteSpace(userName) ? "Anonymous WebApi Error: " : "User-visible WebApi Error: "; } catch (Exception ex) { logger.Error("Error logging error - and yes, that's as circular as it seems: " + ex.CompleteMessage()); } base.OnException(exceptionContext); } } }

Because we weren’t seeing any errors in these controllers, that made me think that it must be something on Azure’s side. After the bad experience we’d had with the Azure Managed Cache, and given that Azure’s redis cache offering is still in preview, it seemed a real possibility. I just couldn’t figure out why an error in the redis caching system was causing our site to return a “bad gateway” error. The only explanation I could come up with was that perhaps both our site and the redis cache were using the same ARR instance, and maybe ARR was getting confused. That didn’t seem likely, but it was the only idea I had.

But after some playing around, I was able to reproduce the error – or at least, an error – on my dev machine, on the same pages. And it turns out that it was my fault (it usually is).

The problem is that I was using JSON.NET for serializing objects that I was sending to the cache. Unfortunately, I had it configured incorrectly.  I was setting my JSON serializer settings like this:

var jsonSerializerSettings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Serialize };

And it should have been like this:

var jsonSerializerSettings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Serialize, PreserveReferencesHandling = PreserveReferencesHandling.All };

In other words, I was telling it to serialize reference loops, but I wasn’t telling it to only include one instance of each object reference in the graph. As a result, whenever I tried to serialize (say) an EntityFramework object graph that included reference loops (for instance, a Customer object which contained a list of Events, each of which in turn contained a reference back to its parent Customer object), it would try to serialize the whole damn infinite loop, which resulted in a stack overflow.

And here’s the key. You can’t catch a stack overflow exception. You just can’t. It simply crashes your app domain. You don’t even get a chance to log it. Your app just goes bye-bye. Of course, IIS recovers from this and continues to serve more requests, but it plays all-to-hell with the current request. But this is the key part: if you’ve got a load balancer sitting in front of your web app, the load balancer isn’t even going to see an HTTP 503 error, or any sort of HTTP error. It’s just going to see that its TCP connection to the web server dropped. And in that case, it only has one option, to return a “502 Bad Gateway” error to the browser.

As soon as I figured that out, I fixed my serialization code, moving it all into a separate class so that I could unit test it, and all was well.

At any rate, that’s a bit of a long story, but the key lesson is this: if your website is simply failing to return requests (without even a 5xx error), or if the load balancer in front of your website is returning “502 bad gateway” errors, suspect a stack overflow exception somewhere in your code. That, and write more unit tests.

That’s all. Carry on.

Saturday, April 5, 2014

In Defense of Mozilla

I’m no fan of JavaScript. It’s a language that has been pushed far beyond anything its creator could have envisioned, and it shows. But there’s still something to be said about a language that has become the foundation of the modern Internet. And there’s something to be said for having been the dude who invented the whole thing.

That’s why it was not at all surprising that Mozilla’a board recently appointed Brendan Eich, their long-time CTO and the inventor of JavaScript, as their CEO.

File:MozillaCaliforniaHeadquarters.JPG

It was a bit more surprising that the same board then turned around and fired him only a few days later. The sin for which Brendan Eich was removed is that six years ago, he had made a donation to Proposition 8, the California ballot measure that defined – or rather, acknowledged the reality – of marriage as one man and one woman.

Now, there’s lots that ought to dismay us in this episode, none more worrisome than the fact that this decision was taken in the name of tolerance and diversity. In a blog post announcing this decision, Mozilla wrote:

Our organizational culture reflects diversity and inclusiveness. We welcome contributions from everyone regardless of age, culture, ethnicity, gender, gender-identity, language, race, sexual orientation, geographical location and religious views. Mozilla supports equality for all.

That’s an odd way to frame removing somebody because of his political and (presumably) religious views. On the contrary, this decision makes it abundantly clear that there are certain religious views – namely, those of any orthodox Jew, Muslim or Christian – which are not at all welcome at Mozilla. I'm still trying to understand how neither Mozilla’s board nor Eich’s detractors didn't see the irony there. Their blinders are more complete than I would have suspected.

This decision also raises concerns about the possibility of any real dialogue with folks on disparate sides of the issue. Mozilla’s logic would have made a certain sense if Brendan Eich had been a neo-Nazi or a member of the KKK, if his position had been so exclusionary and repellant that no quarter should be given, no compromise possible or desirable. This is apparently what Mozilla’s board believes, that opposition to gay marriage is a moral outrage, an evil so pernicious that it truly can be rejected in the name of diversity and tolerance.

That’s silly, of course. Even Barack Obama, until roughly a year ago, claimed the same perspective for which Brendan Eich was sacrificed. (Nobody believed him, but I don’t think that changes my point.) I don’t know what percentage of folks worldwide are opposed to same sex marriage, but I’m guessing that it’s well north of 75%. One may be forgiven for regarding dubiously any claim to universal tolerance and cosmopolitan diversity which rejects tout court three out of every four human beings on the planet. As Inigo Montoya said, “You keep using that word. I do not think it means what you think it means.” 

In short, if you think a witch hunt, purge, or inquisition is in order, that’s your business. But have the guts to call it by its right name, and don't pretend you're being tolerant.

But there’s another part of this decision that we ought to respect.

Mozilla took these actions because they felt that, as a corporation, they needed to support a particular understanding of morality. It's a highly idiosyncratic and provincial understanding of morality, of very recent origin and dubious provenance. It is an understanding of morality that I do not share. They were disingenuous and hypocritical to wrap their decision in the language of diversity and inclusiveness. But I very much affirm their desire, as a private corporation, to take actions based on what they believe to be moral, just and right.

This is nothing new. That's precisely what folks on the left have been arguing for decades that companies need to do. Corporations need to act according to the precepts of basic morality. They need to treat employees with respect and pay them a living wage. They need to take proper care of the environment. They need to act, in other words, as if they had a moral obligation to society. Corporations are not - or should not be - amoral agents. They are moral actors, and need to act as such.

And I agree. Corporations do have an obligation to justice. They cannot be indifferent to concerns about human flourishing. They must be concerned with the environment and society in which they are placed, and must give due weight to these considerations, even when they may affect the bottom line.

But consider this. This is nothing more than what Hobby Lobby wants to do, the same Hobby Lobby who is routinely mocked by the left for its lawsuit against the Affordable Care Act. Hobby Lobby’s owners want their company to act in a way that they believe is moral, right and just, and reflects an appropriate concern for human flourishing. It’s entirely legitimate to argue that these beliefs do not, in fact, promote human flourishing. But it’s a very strange argument to hear from my friends on the left recently, that corporations cannot have beliefs about morality and should not act in a way that reflects moral concerns. That argument might make sense if these same people hadn't been making exactly the opposite argument right up until the moment Kathleen Sebelius decided that free birth control was more important than religious liberty.

To be clear, I don't always know, in any specific case, whether a given religious freedom claim should be allowed to prevail, whether the actor in question is a company or an individual. In general, though, the Religious Freedom Restoration Act - passed almost unanimously by both parties - provides a good framework for deciding these questions. It says, in effect, that the government can't impose a burden on the expression of religious beliefs (even in a religiously neutral law) unless it (a) has a damned good reason to do so, and (b) can't get the same result any other way. So the government can outlaw human sacrifice, even if it impinges on the free expression of Aztec religious beliefs. But it can't, say, outlaw the use of peyote in Indian religious ceremonies. (That last was the case that got RFRA passed.)

Now, clearly, if Hobby Lobby was claiming that they get to decide whether women can get birth control, that would be an overreach. But despite what you regularly hear from the left, they aren’t. Actually, (a) Hobby Lobby is perfectly fine with paying for contraception and already does, (b) the only "contraception" they have an issue with are drugs that probably work by causing abortions, and (c) Hobby Lobby's objection is not to women getting those drugs, but to Hobby Lobby being forced to pay for them. Well, that's a different matter, and I expect the Supreme Court to find rationally. Hobby Lobby - and the Green family - has a genuine religious interest, there's no compelling government interest, and even if there were, there are lots of other ways to accomplish it.

On the other hand, I would expect the courts to find very differently in a case involving Jehovah's Witnesses who objected to an insurance policy covering blood transfusions, or to a Christian Scientist who objected to paying for insurance policies at all. In those cases, there is a genuine religious interest - I don't want to deny that there isn't - but there is also a compelling governmental interest, and regrettably, there may not be any other way to accomplish it.

I’m not saying that any given First Amendment claim to religious freedom or to primacy of conscience should always prevail. I am saying that it should be considered, and given due weight, even if the entity making the claim is a for-profit corporation. This is exactly what the Mozilla Corporation believed it was doing; and that is why I want to affirm their desire to do so, even though (in this particular case) their actions were silly, dangerous and counter-productive, precisely on their own terms.

Wednesday, April 2, 2014

That’s Gotta Hurt

David Jang’s community has been having a terrible, horrible, no good, very bad week.

First there was the Guardian article which outlined the connections between David Jang and Newsweek, and then, in a fit of political correctness, tried to convince everyone – with daunting success – that Johnathan Davis’ opinions about gay reparative therapy were newsworthy.

This was followed, much more damningly, by a Mother Jones article which laid out some pretty solid reasons for being concerned about the cavalier attitude towards immigration and labor laws evinced by both IBTimes and Olivet University. And of course, these articles resulted in a great deal more chatter back and forth over the Interwebs, with responses ranging from thoughtful to inane and naive.

But the really bad news landed today. According to the Hudson Valley Reporter, Olivet University (or, I suppose more precisely, its management company, Olivet Management LLC) got hit with a $2.3MM fine from the Department of Labor for “exposing its employees to asbestos and lead during a renovation.”

Olivet Hit with $2.3M Fine for Exposing Workers to Asbestos During Wingdale Psychiatric Center Renovation

Ouch.

image

I have to imagine that Olivet is going to contest the fines – because from everything I’ve seen, Jang’s community tends to run their budgets pretty close to the red line, and only make it from month-to-month by depending heavily on donations from students and community members (and more troublingly, from community members’ families, who aren’t necessarily told the truth about how their money is going to be spent). Unless IBT and Newsweek are rolling in a lot more cash than you’d think online news publications are likely to throw off, it’s going to be difficult for Olivet to come up with the money to pay this fine.

This enforcement action also raises the interesting question of the precise relationship between Olivet Management, LLC, and Olivet University. For instance, if Olivet Management declares bankruptcy (which definitely seems within the realm of possibility) can the DOL go after Olivet University for the money? Some very expensive lawyers are probably coming up with some very expensive opinions on that topic right now.

If the concerns raised by the recent Mother Jones article have any merit (and I’ve seen independent evidence that suggests they do), this may not be the first time that David Jang’s community has played fast and loose with federal labor laws. Now that they have the attention of the Department of Labor, they may want to rethink that habit.

Touchy

An independent journalist by the name of Ben Reeves posted a very interesting story today about his job writing articles for IBTimes, the proud new owners of Newsweek, and (I would guess) the primary revenue engine behind Olivet University’s recent expansions.

Compared to the recent Mother Jones piece, Ben’s story didn’t break much new ground, but it was interesting to read about his experiences. It’s been clear for a while that David Jang and Olivet and IBTimes were closely intertwined, and the documents Ben included in his story were further evidence of that. Similarly, the chats and emails he reproduces had some worthwhile details, including a – supposed – recent massive spike in revenues for Olivet University.

I was a bit mystified by this comment from his article:

Nevertheless, intimate connections between the founders of a company and a university run by an evangelical religious group aren’t a problem in and of themselves, however distasteful this may seem.

I’m glad he acknowledged that having well-educated Evangelical Christians running a business wasn’t necessarily a problem, but it was surprising to me that he assumed his readers would find the whole idea repugnant. If that really is how most folks view religiously committed folks these days – well, in the end, First Amendment protections are only as good as the society that values them.

But aside from that, the most interesting part of the article, I thought, was how Olivet responded when they found out that Reeves was working on the story. Reeves said that he initially sent them this list of questions:

1) Can you provide us with copies of your most recent student handbook and Ministry Practice Handbook?
2) Please describe the relationship between Olivet University and IBT since the company’s foundation in 2006.
3) What was Johnathan Davis’ role at the school?
4) How is Etienne Uzac connected to the school? What is his current role, and has he ever served as an officer of the university?
5) Your course catalogue states that one purpose of the journalism program is to teach students how to “apply Gospel values” to the news. What are Gospel values and how should they be incorporated into the news?
6) How do you define “ministry” with respect to internships?
7) What is the Ministry Practice Program and how does it work?
8) How long must students intern through the Ministry Practice Program?
9) What companies are students in the Ministry Practice Program authorized to intern at?
10) Were Olivet University students interning at IBT through the ministry practice program paid? What were their duties at the company?
11) What are the demographics of Olivet University’s student body? How many students are there, and where do they come from?

Olivet’s response was telling. Rather than trying to answer the questions, they immediately sent for their attorneys. Ben received this message a few days later:

Dear Mr. Reeves:

This firm serves as litigation counsel to Olivet University (“Olivet”). It has come to our attention that you intend to publish a news article about a supposed connection between Olivet University and International Business Times (“IBT”). It has further come to our attention that your news article will include false and defamatory statements about Olivet and false and defamatory statements about the supposed connection between Olivet and IBT, including insinuations that Olivet has used IBT for improper purposes and/or to further its own agenda. Any such false statements would be unlawful and would cause immediate and irreparable harm to Olivet.

Wow. That’s touchy. Olivet’s assumption is that any article published about them “will include false and defamatory statements”. If you didn’t know better, you’d almost think they had something to hide, and were desperately trying to use their lawyers to make sure the information didn’t get out.

Monday, March 31, 2014

Who’s Behind Newsweek?

The reporting behind Ben Dooley’s Mother Jones story on IBTimes, Newsweek and David Jang is phenomenal. Very, very in-depth. You can tell that he’s been working on this story for years.

Who's Behind Newsweek

I should note that while my sources and Ben’s overlap to some degree (for instance, the Chuas), it’s quite clear that he has other sources I’ve never had any contact with. But it’s significant that they tell basically the same story. For instance:

As a new member, Anne started with "basic" Bible study focused on traditional Christian concepts. But as the courses progressed, Jang's name popped up with increasing frequency. Parables related by the pastor appeared side by side with the teachings of Jesus and other biblical characters. "We listened to him a lot," she told me. "We memorized the articles."

The lessons all seemed to lead toward some larger revelation. After completing the final reading, another former member told me, her tutor drew a question mark on the page and asked in a whisper, "Do you know who is the Second Coming Christ?" She hesitated for a moment before responding, "Pastor David." "They make you confess it," she told me, "like Peter did to Jesus Christ." The secret of Jang's true identity, she was told, must be protected because nonbelievers would "kill the Second Coming Lord as they did the first one."

Susan Chua, another former Community member, gave me a similar account. Indeed, every ex-Community member I spoke to either said they believed Jang was the Second Coming or said they were aware that others believed it. But Jang himself has repeatedly denied that he is the Second Coming and discouraged his followers from using the term. Several investigations by the heresy committee of the Christian Council of Korea concluded there was "no evidence" to indicate that he had made such claims, and in 2009, a Korean court sanctioned a newspaper for saying that Young Disciples taught that Jang was the Second Coming. In the Times, Davis and Uzac vigorously dismissed the idea that they considered Jang the Messiah.

I asked Anne whether she ever heard anyone in the Community publicly refer to Jang as Christ. "No one said directly," she replied. "But I think he was. Just like I ask you, 'Two plus two equals?' The answer is four. They only said, 'Two plus two.' No one said four directly." Back then, did she believe it was true? "Yes," she said. "With all my heart."

As folks get more and more interested in who’s controlling Newsweek, the media response has mostly centered around the Guardian’s report that Jonathan Davis endorsed gay reparative therapy. But that’s a sideshow. The biggest long-term impact will necessarily center around the story’s allegations that Olivet and IBTimes have repeatedly encouraged their students and/or employees to work in violation of their visas and for almost no money.

But if there's room for interpretation in the F-1 rules, the regulations for F-2 visa holders, such as Anne, are quite clear: They may not work, on campus or off—not even in unpaid internships. Yet Olivet officials appear to have instructed these visa holders to do just that. "If every single person attends all ESL classes and other major courses, we can't really find enough workers for each ministry on campus," Lydia An, an employee in Olivet's finance office, wrote from her official Olivet account on January 2012. "We cannot let everyone on campus to focus on study only…We've came to a decision that F-2 students should focus on ministries more while F-1 students study in classes for 2011 winter quarter. Rooms and food will be provided free of charge as long as F-2 students work and maintain a certain work performance in a ministry."

That makes no sense, says Anna Stepanova, an immigration lawyer who has worked on F-1 and F-2 visa cases: "There are no F-2 students," she said. "They're dependents. They accompany F-1 students. They're not supposed to work."

Tracy Davis says An's email referred to cooperative child care. "This is an email that's talking to married students in the context of family work and child rearing," she said. "If you put the word 'family' in front of this word 'work,' it's not talking about work where you get a W-2. It's talking about family work and shared child care."

Susan Chua, who says she was dispatched to the San Francisco offices of the Christian Post after coming to Olivet on an F-2 visa, says that doesn't reflect what she was told. For believers like her, she says, working in the Community's businesses was simply another way of serving the Lord. "Whether they came to US with F-1 or F-2 visas, the majority of them were devoted members to the community and their belief system. They were going to work extremely hard and sacrificially and obediently and joyfully for the building of the ark—the various ministries in the whole community."

"There was no concept of pay at that time in the community," Chua added. "You were feeling obligated to donate and contribute instead of receiving. The little money given by the ministry office you were working in was to cover bus fares and cheap meals in [Olivet's] Student Union."

Another former student told me, "The members suffer. They are young, naive, believe the teachings. After some time they find themselves without money, because they donated what they had. And they work basically for free…The visa thing and being far from home makes things more complicated."

I should note that Tracy Davis’ explanation of this particular incriminating email – that the “work” was “family work” – makes little sense, as the email clearly refers to maintaining “a certain work performance in a ministry”. Sometimes the denials issued by Jang’s community do them more harm than good, I think.

At any rate, read the Mother Jones article. It’s very good.

Saturday, March 8, 2014

“An Account Of”

Several years ago, I spent some time wondering where the phrase “an account of” came from, or at least, why it had recently seemed to reach such prominence. I never did figure it out, and it’s a question that’s been sitting in the back of my mind ever since.

I was reading a passage from Gregory of Nazianzus today – his famous critique of Apollinarianism – when I ran across this sentence:

“Further let us see what is their account of the assumption of Manhood, or the assumption of Flesh, as they call it.”

Or in Greek:

“Τις δε και ο λογος αυτοις της ενανθρωπησεως, ιδωμεν, ειτουν σαρκωσεως, ως αυτοι λεγουσιν.”

In other words, the phrase “an account of” is really just a translation of the famous Greek stand-by, “logos”.

Well, that makes sense. And you learn something new every day.