<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-13428507</atom:id><lastBuildDate>Sat, 14 Sep 2024 22:49:26 +0000</lastBuildDate><title>Waystination</title><description>The way is the destination.</description><link>http://waystination.blogspot.com/</link><managingEditor>noreply@blogger.com (Len Budney)</managingEditor><generator>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-13428507.post-4216685960782826534</guid><pubDate>Mon, 22 Feb 2016 16:00:00 +0000</pubDate><atom:updated>2016-02-24T09:09:40.123-08:00</atom:updated><title>A Christadelphian Reading List</title><description>In a previous post, I mentioned the &quot;enormous amount of material&quot; I&#39;d read to learn about the Bible, and my community&#39;s views on the Bible. This post will summarize that, in case you&#39;re curious. It really is &quot;enormous,&quot; so you probably won&#39;t read much of it, but you might find interesting bits to skim. I&#39;ll summarize them here, and give links you can read online. (Note: various folks post these books on their web sites; linking to them doesn&#39;t mean I agree with them or that they represent the Christadelphians.)&lt;br /&gt;
&lt;br /&gt;
1) &lt;i&gt;Elpis Israel&lt;/i&gt;, John Thomas, 1848. (&lt;a href=&quot;http://www.christadelphia.org/books/elpis.htm&quot;&gt;read online&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
This is the &quot;original&quot; Christadelphian book: the Christadelphians grew out of the readership of a magazine by John Thomas, most of them Campbellites. Thomas gradually parted ways with Campbellite teaching over a couple of decades, until he was finally expelled. Somewhere along the way his readers asked for a summary of his views, and he responded by writing this book.&lt;br /&gt;
&lt;br /&gt;
As the first book it&#39;s highly respected, but it doesn&#39;t dictate Christadelphian belief (except in the eyes of a very small minority). There are things in the book that few would agree with today. Although someone who agrees with John Thomas will certainly not be considered a heretic, however in the minority he may be.&lt;br /&gt;
&lt;br /&gt;
That&#39;s especially true of Part III. It&#39;s a good overview of Thomas&#39;s views on Bible prophecy. Till recently a majority of Christadelphians agreed with him. A growing minority disagreed with almost everything he said, and they were free to do that without repercussions. At this point I&#39;m not sure whether Thomas&#39;s views are the majority view or a minority view.&lt;br /&gt;
&lt;br /&gt;
2) &lt;i&gt;Christendom Astray from the Bible&lt;/i&gt;, Robert Roberts, 1884. (&lt;a href=&quot;http://www.christadelphia.org/books/chrastoc.htm&quot;&gt;read online&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
Originally called &quot;Twelve Lectures,&quot; this book is based on a series of lectures by Robert Roberts spelling out the basic teachings of the Christadelphians. As the title implies, it mostly talks about &quot;standard&quot; Christian beliefs that Christadelphians disagree with, like the Trinity, the immortality of the soul, a supernatural devil, heaven-going, hell, etc.&lt;br /&gt;
&lt;br /&gt;
3) &lt;i&gt;God&#39;s Way&lt;/i&gt;, John Carter, 1947. (&lt;a href=&quot;http://www.christadelphia.org/books/godsway.htm&quot;&gt;read online&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
When my family started our first Bible study with the Christadelphians, this was the book we used. It&#39;s shorter than either of the previous two. It&#39;s more readable than &lt;i&gt;Elpis Israel&lt;/i&gt;, which is very much a 19th Century book. And it&#39;s more upbeat than &lt;i&gt;Christendom Astray&lt;/i&gt;: instead of attacking mainstream Christian teachings it first positively advances Christadelphian teachings. And &lt;i&gt;then&lt;/i&gt; it attacks mainstream Christian teachings. Each chapter has a &quot;Part II&quot; that compares the teaching in Part I with mainstream Christian teaching.&lt;br /&gt;
&lt;br /&gt;
4) &lt;i&gt;Phanerosis&lt;/i&gt;, John Thomas, 1869. (&lt;a href=&quot;http://christadelphianvault.net/index.php?action=downloadfile&amp;amp;filename=Phanerosis.pdf&amp;amp;directory=John%20Thomas/WRITINGS&amp;amp;&quot;&gt;download PDF&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
The linked PDF is prefaced with about 30 pages defending the book from critics. The book itself begins on page 29. As you can guess, some of the material is controversial.&lt;br /&gt;
&lt;br /&gt;
This book outlines what Thomas saw as &lt;i&gt;the&lt;/i&gt; core teaching of the Bible: that God&#39;s entire purpose is to make people into &quot;His image,&quot; reflections of Himself, and that He operates through agents who get to speak in his name, or even in select cases be equated with God himself. Jesus, and the angel in the burning bush, would be two examples of this. Both are called God and/or referred to themselves as God, but neither actually was God. This doctrine drives Thomas&#39;s interpretation of Bible passages that seem to identify Christ with God, since Thomas rejected the doctrine of the Trinity.&lt;br /&gt;
&lt;br /&gt;
While Thomas&#39;s view here is defensible, and some modern theologians who aren&#39;t Christadelphian would agree with him, there are defects in this work. In a way, these defects speak to a fundamental handicap of most Christadelphians. Thomas bases his idea on careful arguments about the original languages, mostly Hebrew, but Thomas himself was not a Hebrew scholar. He was a layperson who was decently competent with reference materials and at least somewhat read in the scholarship of others. Not all of his arguments hold up. To this day few Christadelphians are scholars of the original languages, and we continue to labor out of our depth in this area.&lt;br /&gt;
&lt;br /&gt;
5) Other misc. works by John Thomas (see &lt;a href=&quot;http://christadelphianvault.net/index.php?&amp;amp;direction=0&amp;amp;order=&amp;amp;directory=John%20Thomas/WRITINGS&quot;&gt;here&lt;/a&gt; for quite a few of them)&lt;br /&gt;
&lt;br /&gt;
John Thomas wrote rather prolifically, and a well-read Christadelphian would be at least familiar with a lot of it. He also edited more than one magazine, over more than twenty years, which are still available. See &lt;a href=&quot;http://literature.christadelphianresources.com/author.html&quot;&gt;here&lt;/a&gt; for example; they have eleven years&#39; worth of his &lt;i&gt;Herald of the Kingdom and Age to Come&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve read almost all of this material over the years. Obviously most of it I&#39;ve read only once, and I probably skimmed a fair bit of it, so only so much has stuck with me, but as you can imagine it&#39;s enough to keep one busy for a very long time.&lt;br /&gt;
&lt;br /&gt;
One of the funniest things in the collection is an &lt;a href=&quot;http://christadelphianvault.net/index.php?action=downloadfile&amp;amp;filename=Catechesis.pdf&amp;amp;directory=John%20Thomas/WRITINGS&amp;amp;&quot;&gt;actual catechism&lt;/a&gt; written by Thomas. It&#39;s funny because a lot of his writings savaged the Catholic church, especially for its creedal nature. The Christadelphians also adopted a statement of faith (i.e., a creed) in 1877 (&lt;a href=&quot;http://www.christadelphianaudio.org/books/UnamendedStatementOfFaith.pdf&quot;&gt;PDF&lt;/a&gt;), six years after Thomas&#39;s death.</description><link>http://waystination.blogspot.com/2016/02/a-christadelphian-reading-list.html</link><author>noreply@blogger.com (Len Budney)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-13428507.post-9059044986097009045</guid><pubDate>Mon, 15 Feb 2016 16:00:00 +0000</pubDate><atom:updated>2016-02-15T08:13:46.884-08:00</atom:updated><title>The Making of a Christadelphian, Part 3</title><description>This post is really part four. This series starts with an &lt;a href=&quot;http://waystination.blogspot.com/2013/06/pleased-to-meet-you-hope-you-guess-my.html&quot;&gt;Overview of the Christadelphians&lt;/a&gt;, followed by &lt;a href=&quot;http://waystination.blogspot.com/2014/06/the-making-of-christadelphian-part-1.html&quot;&gt;my own story&lt;/a&gt; leading up to my baptism, and then a &lt;a href=&quot;http://waystination.blogspot.com/2014/07/the-making-of-christadelphian-part-2.html&quot;&gt;description of our theology&lt;/a&gt; masquerading as the story of my early post-baptism Bible study.&lt;br /&gt;
&lt;br /&gt;
I was somewhat (but not terribly) unusual because I got baptized at age eleven. I was even more (but still not terribly) unusual because I was a convert, who got baptized at age eleven. This put me in a weird position in our community. As I said in my &lt;a href=&quot;http://waystination.blogspot.com/2013/06/pleased-to-meet-you-hope-you-guess-my.html&quot;&gt;overview&lt;/a&gt;, we are a lay, patriarchal, millenarian, unitarian, evangelical,&amp;nbsp;apolitical,&amp;nbsp;community of Bible students.&lt;br /&gt;
&lt;br /&gt;
The first problem was what to do with an eleven-year-old brother in a patriarchal community. Kids my age attended Sunday School, and Sunday School was generally taught by women. But the rule in our community is that women don&#39;t teach men, by which we mean baptized males. So as soon as I was baptized I was pulled out of my Sunday School class--but nobody really knew where to stick me. For a while they tried putting me in the adult Sunday School class, but I didn&#39;t enjoy it much. Then they found a brother willing to teach me for a while, which lasted until he finished his degree and moved away. Then they decided the solution was to make me a Sunday School teacher myself, and from then on I taught a precocious five-year-old one on one. This lasted about a year, until &lt;i&gt;my&lt;/i&gt; family moved away and we stopped attending for a while.&lt;br /&gt;
&lt;br /&gt;
The second problem was what to do with an eleven-year-old brother in a lay community. Every baptized brother (remember, patriarchal) is normally expected to take a turn leading the services on Sunday, giving the sermon, leading Bible readings, etc. This problem was handled by ignoring it: they simply didn&#39;t ask me to do those things because I was &quot;too young.&quot; That&#39;s sensible enough, but it came up surprisingly often. Do you? You don&#39;t? Why not? When will you?&lt;br /&gt;
&lt;br /&gt;
After a year or so they started calling me up to do the scripture readings. That was all, until I was about sixteen. A few things happened around that time. I started attending Community College full-time at 15 1/2 (a story for another time); I found a nursing home that would hire me as a &lt;a href=&quot;http://explorehealthcareers.org/en/career/120/nurses_aidenursing_assistant&quot;&gt;nurses&#39; aide&lt;/a&gt; at 16; and the church decided that it was about time I started giving sermons. This lasted a couple years, until I transferred as a junior to Brown; at that time the church secretary, who disliked my family, unilaterally dropped me from the speaker list. (&quot;Oh. I didn&#39;t realize you&#39;d be coming home every weekend and attending church. Too late now, though.&quot;)&lt;br /&gt;
&lt;br /&gt;
Over the years between ages eleven and eighteen I was doing the &quot;catch up&quot; Bible study described in my &lt;a href=&quot;http://waystination.blogspot.com/2013/06/pleased-to-meet-you-hope-you-guess-my.html&quot;&gt;previous post&lt;/a&gt;. On the one hand I covered an enormous amount of material (which I&#39;ll give links to in a future post for the curious). On the other hand, it was pretty much all Christadelphian material. So while it felt like an enormous education, and in some ways it was, this education took place in a bit of an echo chamber. There was an enormous amount of material I &lt;i&gt;wasn&#39;t&lt;/i&gt; learning, which I&#39;ll get to in the next couple of posts.&lt;br /&gt;
&lt;br /&gt;
The effect of all this was that I wasn&#39;t only learning about the &lt;i&gt;Bible&lt;/i&gt;; I was also learning about my community and its views and standards. And I wasn&#39;t only &lt;i&gt;learning&lt;/i&gt; about these things; I was also starting to enforce those standards on myself and others. That&#39;s what I&#39;d like to look at in my next installment.</description><link>http://waystination.blogspot.com/2016/02/the-making-of-christadelphian-part-3.html</link><author>noreply@blogger.com (Len Budney)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-13428507.post-4049437074764873141</guid><pubDate>Sat, 12 Jul 2014 14:48:00 +0000</pubDate><atom:updated>2014-07-12T07:54:46.052-07:00</atom:updated><title>The Making of a Christadelphian, Part 2</title><description>This post is really part three, to be technical: the first part was really an&amp;nbsp;&lt;a href=&quot;http://waystination.blogspot.com/2013/06/pleased-to-meet-you-hope-you-guess-my.html&quot;&gt;overview of the Christadelphians&lt;/a&gt;. Part 1 of&amp;nbsp;&lt;a href=&quot;http://waystination.blogspot.com/2014/06/the-making-of-christadelphian-part-1.html&quot;&gt;my own story&lt;/a&gt;&amp;nbsp;summarizes how I came to be baptized at age 11. In a nutshell, I always believed in God (apart from a one-day flirtation with atheism at age 5 or 6), and was always some sort of Christian (a half-baked Catholic who did not often attend church, but when I did it was Baptist). I believed the Bible was God&#39;s word. When we discovered the Christadelphians, their emphasis on Bible study--and the fact that their beliefs seemed well-supported by scripture--made joining them the obvious choice. We joined them &lt;i&gt;because&lt;/i&gt;&amp;nbsp;they encouraged us to question and doubt what they taught, and &lt;i&gt;because&lt;/i&gt;&amp;nbsp;they agreed that even believing the Bible or believing in God&#39;s very existence was conditional on evidence.&lt;br /&gt;
&lt;br /&gt;
Not that I spent much energy questioning the Bible or God&#39;s existence. I already believed those things. When I did, it was focused mainly on evidence supporting the Bible; if the Bible is divine, then God&#39;s existence follows automatically. So I read about archaeology proving that the Bible was historically accurate, like the discovery of Sargon&#39;s Fortress (Dûr-Sharrûkin) that proved King Sargon of Isaiah 20:1 was a real historical figure after all. And I read about prophecy, especially the prophecy that Israel would be reestablished, as Christadelphians had been saying at least since&amp;nbsp;&lt;a href=&quot;https://archive.org/details/elpisisrael00thom&quot;&gt;&lt;i&gt;Elpis Israel&lt;/i&gt;&lt;/a&gt;&amp;nbsp;was first published in 1848--exactly 100 years before it happened. And I savored&amp;nbsp;&lt;a href=&quot;http://smile.amazon.com/J-BLUNTS-UNDESIGNED-SCRIPTURAL-COINCIDENCES/dp/1597812749/ref=smi_www_rcolv2_go_smi?_encoding=UTF8&amp;amp;*Version*=1&amp;amp;*entries*=0&quot;&gt;&lt;i&gt;Undesigned Scriptural Coincidences&lt;/i&gt;&lt;/a&gt;, which listed dozens of examples of internal consistency in the Bible. All of this was mostly recreational reading for me, though, since I already believed.&lt;br /&gt;
&lt;br /&gt;
What really consumed me was general Bible study. I read the Bible daily with my family, following the&amp;nbsp;&lt;a href=&quot;http://www.christadelphia.org/readplan.htm&quot;&gt;daily reading planner&lt;/a&gt;&amp;nbsp;used by most Christadelphians. It took us through the Old Testament once, and the New Testament twice, every year. Christadelphians are certainly Bible readers. All of them have read the Bible through several times. The ones who &quot;do the readings&quot; faithfully will read it dozens of times before they die. They can remember any story you care to mention, and can quote swaths of it from memory. Christadelphian kids by age eleven have read the Bible, or had it read to them, a half-dozen times already. Becoming one at that age meant I was already behind the 8-ball.&lt;br /&gt;
&lt;br /&gt;
Catching up meant doing those readings, paying attention in Sunday School, and reading on my own. I read lots of books, mostly written by Christadelphians.&amp;nbsp;&lt;a href=&quot;https://archive.org/details/elpisisrael00thom&quot;&gt;&lt;i&gt;Elpis Israel&lt;/i&gt;&lt;/a&gt;&amp;nbsp;was the first book ever written by a Christadelphian, and still considered a classic about our main beliefs. &lt;i&gt;Christendom Astray&lt;/i&gt;&amp;nbsp;(&lt;a href=&quot;http://thechristadelphians.net/images/CHRISTENDOM_ASTRAY_PDF.pdf&quot;&gt;PDF&lt;/a&gt;) was another early work that contrasted our beliefs with those of most other Christian denominations. The list is long, so I won&#39;t give it here. Many of our books are&amp;nbsp;&lt;a href=&quot;http://christadelphianbooks.org/&quot;&gt;available online&lt;/a&gt;, if you&#39;d like to peruse them.&lt;br /&gt;
&lt;br /&gt;
As I mentioned in previous posts, we are heavily biased against studying theology. A look at the contents of &lt;i&gt;Christendom Astray&lt;/i&gt;&amp;nbsp;will tell you why. We believe differently than most other denominations, and we generally assume that their flawed beliefs are the result of flawed theology. How would it help us to study flawed theology?&lt;br /&gt;
&lt;br /&gt;
Nor did we create an alternative theology of our own. Well, anyone who thinks about the Bible is doing theology, whether they want to or not, but we refused to try and systematize it. That smells too much like dogma to us. We don&#39;t like dogma, and for that matter we don&#39;t like hierarchy. We believe that anyone can &quot;understand the Bible for himself,&quot; as our lectures and pamphlets say, and we don&#39;t believe in interfering with someone else&#39;s conscience. If your conscience leads you to different beliefs than ours, we may not let you join our churches, and we may confidently tell you you&#39;re wrong, but we don&#39;t claim authority over your conscience.&lt;br /&gt;
&lt;br /&gt;
But we do have a theology whether or not we systematize it. We teach it by example instead. Reading Christadelphian books and magazines gives plenty of worked examples of Bible study. So do our weekly Bible classes and evening lectures. We all learn how it&#39;s done by imitation.&lt;br /&gt;
&lt;br /&gt;
The first thing I learned was to &quot;read the plain sense.&quot; If the Bible is a book for all times and cultures, meant to be understood by ordinary people without fancy degrees, then its message must be relatively plain. So if the Bible seems to be saying something clearly, then it is.&lt;br /&gt;
&lt;br /&gt;
The second thing I learned was to &quot;read the Bible in context.&quot; If a verse says, &quot;Oh, Lucifer, look how you&#39;ve fallen from heaven!&quot; we don&#39;t leap to the conclusion that &quot;Someone named Lucifer was up in heaven, and he fell down!&quot; We read the verses before and after it (it&#39;s in Isaiah 14), and we notice that the first four verses say, basically, &quot;When you return from captivity in Babylon, you will sing this taunt against the king of Babylon.&quot; It&#39;s clear from context that the bit about &quot;Lucifer&quot; is part of the taunting song, so it&#39;s clear that it&#39;s the king of Babylon who is called &quot;Lucifer&quot; (for whatever reason), and his &quot;fall from heaven&quot; refers to the fall of Babylon&#39;s power.&lt;br /&gt;
&lt;br /&gt;
When we talk about &quot;context,&quot; we also talk about historical context. We try to inform ourselves about the history, customs, and geography of Bible times. Many of us subscribe to&amp;nbsp;&lt;a href=&quot;http://www.biblicalarchaeology.org/magazine/&quot;&gt;Biblical Archaeology Review&lt;/a&gt;. We&#39;re somewhat uneven in how deeply we go into it, but we try.&lt;br /&gt;
&lt;br /&gt;
The third thing I learned was to &quot;compare scripture with scripture.&quot; This is where it gets interesting. We know that you can find verses that contradict each other (&quot;...when taken out of context!&quot; we hasten to add). We know that some passages are more obscure than others. But we assume that &lt;i&gt;IF&lt;/i&gt;&amp;nbsp;the Bible is God&#39;s word, &lt;i&gt;THEN&lt;/i&gt;&amp;nbsp;it must ultimately have a consistent message. The points and counterpoints must fit together, like brushstrokes, to paint a picture. Our job is to collect the verses, back up, and look at it until the picture comes clear.&lt;br /&gt;
&lt;br /&gt;
By the way, didn&#39;t I just contradict myself? I said at the top of this post we demand evidence before we believe. Aren&#39;t Bible contradictions evidence against the Bible (and therefore God)? And didn&#39;t I just say we assume them away? And doesn&#39;t that mean we reinterpret the Bible to paper over contradictions? Which we then claim somehow proves God?&lt;br /&gt;
&lt;br /&gt;
If we&#39;re not careful, then yes. If we really want to, we can explain almost anything away. There&#39;s a&amp;nbsp;&lt;a href=&quot;http://youarenotsosmart.com/&quot;&gt;whole blog&lt;/a&gt;&amp;nbsp;out there devoted to the ways we fool ourselves.&lt;br /&gt;
&lt;br /&gt;
On the other hand, apparent contradictions are a fact of life in general. If I tell a story twice, details will probably differ. Some overly-literal people will ask me which time I was lying. (No, really, that&#39;s happened to me. I&#39;ve come to the conclusion that the wisest course is just to avoid people like that once they&#39;ve outed themselves.)&lt;br /&gt;
&lt;br /&gt;
This is standard stuff for historians (as I understand it; I&#39;m not one). When we read copies of copies, of translations of translations, of stories that may be preceded by long oral traditions, how do we sift fact from fiction, or truth from error? There are ways, but it&#39;s not easy.&lt;br /&gt;
&lt;br /&gt;
It&#39;s also standard stuff for ethicists (as I understand it; I&#39;m not one). Isn&#39;t it a contradiction for &quot;pro-lifers&quot; to be pro-death-penalty? Yes, if you oppose all killing (including the unborn). No, if you believe that certain crimes forfeit the right to life. Isn&#39;t it a contradiction for a pacifist to eat meat? Yes, if you oppose &lt;i&gt;any&lt;/i&gt;&amp;nbsp;violence against &lt;i&gt;any&lt;/i&gt;&amp;nbsp;creature. No, if you distinguish humans from animals. Isn&#39;t it a contradiction to say, &quot;Thou shalt not kill,&quot; and then command people to go to war? Yes, it certainly sounds like it. But no, if you read it as, &quot;Thou shalt not murder,&quot; and you believe warfare isn&#39;t murder.&lt;br /&gt;
&lt;br /&gt;
So there&#39;s no way around &quot;comparing scripture with scripture,&quot; and it&#39;s a delicate business to resolve seeming contradictions while remaining open to the possibility that there are genuine contradictions there. I think closing our eyes to this possibility is a common way to lapse into fundamentalism.</description><link>http://waystination.blogspot.com/2014/07/the-making-of-christadelphian-part-2.html</link><author>noreply@blogger.com (Len Budney)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-13428507.post-4548981844388531623</guid><pubDate>Mon, 30 Jun 2014 19:45:00 +0000</pubDate><atom:updated>2014-06-30T12:50:33.844-07:00</atom:updated><title>The Making of a Christadelphian, Part 1</title><description>My&amp;nbsp;&lt;a href=&quot;http://waystination.blogspot.com/2013/06/pleased-to-meet-you-hope-you-guess-my.html&quot;&gt;previous post&lt;/a&gt;&amp;nbsp;was just over a year ago. On rereading it, I&#39;m still pleased with it as a fair and balanced description of the Christadelphian community overall. From there I originally planned to branch off in two directions: first, to go into more detail about Christadelphian beliefs; and second, to go into more personal detail about my growth in the community. I&#39;d like to tackle the second first.&lt;br /&gt;
&lt;br /&gt;
This isn&#39;t my &quot;personal testimony,&quot; if you&#39;ve seen that sort of thing before. It&#39;s also not meant to be autobiographical, except to the extent I can&#39;t help it since it&#39;s about, well, me. The point of this post is to sketch how one person came to join &quot;a lay, patriarchal, millenarian, unitarian, evangelical, apolitical, community of Bible students,&quot; what that person found when he got there, and where it led him.&lt;br /&gt;
&lt;br /&gt;
I &lt;i&gt;do&lt;/i&gt;&amp;nbsp;intend to be painfully honest about my shortcomings, including doubts or weak spots in my faith. It&#39;s not because I want other people to doubt along with me. It&#39;s because I&#39;m not trying to convince anyone that I&#39;m a hero of faith; I want to be honest about my doubts as well as my beliefs. You&#39;re free to take comfort that you&#39;re not the only doubter, or set me straight, or decide that I&#39;m an inadequate Christian, as the case may be.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Childhood: A (not-very-good) Catholic&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
My Dad&#39;s side of the family is Polish, so naturally I became a Catholic by default. I was christened, and a well-to-do relative (whom I&#39;ve never met, unless he was there for my christening) was named my godfather. After that I have no memory of ever attending church--when I was about 7, I went to a Catholic funeral with my Dad, and when he genuflected I rushed to grab his arm and help him back up, because I thought he had tripped.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Needless to say, I was never confirmed or given first communion. My parents sent me to catechism class for about a year when I was 5 or 6, though I don&#39;t know exactly why, and we didn&#39;t go to church that year either. There the nuns taught me to cross myself, say the Lord&#39;s Prayer and the Hail Mary, and to give things up for Lent. We were working on the Act of Contrition when my parents moved, and my religious education came to an end.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Although I never saw the inside of a Catholic church--as far as I can remember, apart from weddings and funerals--I did go to church with my cousin sometimes. We regularly had that conversation (I&#39;m a Catholic. Well, I&#39;m a Baptist.) but neither of us knew what the difference was. My cousin went because his mother made him, and I went because I was sleeping over.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Around the same age, sleeping over my cousin&#39;s house, I announced that I didn&#39;t believe in God. I&#39;m uncertain what prompted it, but I believe it was watching a rerun of the &lt;a href=&quot;http://www.imdb.com/title/tt0509891/&quot;&gt;premier episode&lt;/a&gt; of &quot;All in the Family,&quot; in which Michael and Gloria &lt;a href=&quot;http://www.sermoncentral.com/illustrations/sermon-illustration-timothy-smith-humor-creation-17499.asp&quot;&gt;said&lt;/a&gt;, &quot;We just don&#39;t see any evidence of God.&quot; Naturally, my cousin tattled at Sunday School the next morning. The teacher turned her full attention to me and asked me why, so I repeated what I&#39;d said the night before. She said, &quot;Oh yes, there is a God, and he loves you very much!&quot; I answered, &quot;Oh, OK,&quot; and from then on I believed in God.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;Also&lt;/i&gt;&amp;nbsp;around the same age, I had my first brush with death: my Aunt Gertie died, shortly after attending a big family dinner at my great grandfather&#39;s house. I didn&#39;t know her; my memory of her was an old lady walking around the yard with a big, heavy cane. But when my Mom got off the phone and announced that she had died, it sparked the usual conversations about what that meant, leading to the realization that it was going to happen to &lt;i&gt;me&lt;/i&gt;, and triggering my first bout with depression (though I was too young to articulate what was going on, and I don&#39;t think anyone knew). Funnily, my parents had a music box of a dancing bride and groom that played &quot;Theme from the Godfather,&quot; which Mom wound up every night to put me to sleep. For years afterward, hearing that waltz would depress me.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
That age also marked my first and last attempts at Bible reading for some years. I had the usual book of Bible stories for kids, which I read to myself. It led off with Adam and Eve bringing death on themselves and everyone else by eating the apple that God for some reason stuck in their garden, after a conversation with a snake that God for some reason put there. The story made me mad at Adam and Eve, and a little mad at God, but mostly it triggered more depression. I avoided reading the Bible for the next four or five years.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
Later Childhood: A Convert to the Christadelphians&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
When I was about 10, my parents took a fresh interest in religion. My mom signed up for catechism classes. For some reason they didn&#39;t sign up my sister or I, but they did get us the books, so I started to read them. I also started reading the &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Living_Bible&quot;&gt;Living Bible&lt;/a&gt;, and my sister started reading the &lt;a href=&quot;http://en.wikipedia.org/wiki/New_International_Version&quot;&gt;NIV&lt;/a&gt;. I read the gospels over and over again, and also started (hesitantly!) reading from Genesis. I got all the way through Kings that year. I still found Genesis 3 to be painful, and to that I added Genesis 11, which in the &quot;Living Bible&quot; gives the distinct impression that God sabotaged human progress because he was afraid they might someday pose a serious challenge to him.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I was ahead of my years in that I read the material easily and learned it quickly. I was also way, way behind, for lack of any meaningful religious education. I was quickly learning at age 10 what children normally learned a few years younger. I was also reading my Mom&#39;s adult catechism. A lot of the material has slipped away in the years since then, but at the time I was catching up quickly on the theory, such as the sacraments. Memorizing prayers wasn&#39;t much fun, so I didn&#39;t learn much liturgy.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
At the same time as we attempted to re-join the Catholic church, we were shopping around a bit. I read &lt;a href=&quot;http://www.jw.org/en/publications/&quot;&gt;Watchtower publications&lt;/a&gt; that my great grandfather bought from passing JW&#39;s just to be polite. I read the weird, new-agey&amp;nbsp;&lt;a href=&quot;http://www.scienceofmind.com/&quot;&gt;Science of Mind&lt;/a&gt; magazine, which my grandmother received for some reason. I read books on Eastern religions, and &lt;a href=&quot;http://www.amazon.com/Warren-W.-Wiersbe/e/B000APUA1Y&quot;&gt;books by Wiersbe&lt;/a&gt;. There wasn&#39;t much structure to my reading, and I ended up with a smattering of everything rather than any real depth in anything.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
In the midst of all this, we ran across the Christadelphian booth at the &lt;a href=&quot;http://www.thebige.com/ese/&quot;&gt;New England Fair&lt;/a&gt;. It was strategically located near the &lt;a href=&quot;https://www.vitamix.com/&quot;&gt;Vitamix&lt;/a&gt;&amp;nbsp;demonstration, which is a story in its own right. The Christadelphians appealed to us almost instantly, because their core values were about the same as the ones we&#39;d developed by this point. Within a year of meeting them, I began taking regular Bible classes with them, and was baptized in early 1982, aged 11. My parents were baptized a month or two later.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
My Core Values and Beliefs&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
At the time I was baptized, the following were my core values and beliefs. As you&#39;ll see, they&#39;re in logical order, but not quite in order of importance.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4&gt;
There is a God&lt;/h4&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
As I said above, I &lt;i&gt;just believed&lt;/i&gt;&amp;nbsp;this ever since a baptist Sunday School teacher assured me of it when I was 5 or 6. I didn&#39;t subject this belief to rigorous reexamination, and wasn&#39;t equipped to if I wanted to at the age of 10. I was bright, but not that bright. But the usual apologetics were good enough for me--mainly, the argument that the Bible is His word, and therefore he must of course exist. Which brings me to:&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4&gt;
The Bible is God&#39;s Word&lt;/h4&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
It sounds like I just set up a circular argument, but the argument that the Bible is God&#39;s word doesn&#39;t have to assume there&#39;s a God in the first place. Again, the usual arguments were good enough for me. The Bible is full of uncanny fulfilled prophecies--notably the reemergence of Israel, which Christadelphians had been confidently predicting for almost exactly 100 years before it happened. It&#39;s a self-consistent document, meaning that what contradictions there are either (a) can be explained away fairly easily, or (b) just aren&#39;t that important. It was ahead of its time, with clever advice like avoiding pork or shellfish, and practicing good hygiene. Etc., etc. The conclusion is that the Bible is a &quot;supernatural&quot; book, which implies a &quot;supernatural&quot; author. Therefore God.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4&gt;
The Original Meaning of the Bible is the Correct One&lt;/h4&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
In other words, whatever people in Jesus&#39; day understood the New Testament to mean, that&#39;s what it means. Whatever the people in Moses&#39; day understood the Torah to mean, that&#39;s what it means. This seemed self-evidently correct to me, and it naturally led me away from Catholicism. There&#39;s no question that biblical interpretation evolved over the history of the Church. For example, any good scholar--including Catholic scholars--will admit that the first century believers didn&#39;t have any conception of the Trinity as it came to be formulated over the next three centuries. This isn&#39;t a problem for Catholics, because nothing says their understanding of scripture can&#39;t evolve. It was a deal-breaker for me, however, because I was only interested in understanding scripture the way the first disciples understood it. Rejecting post-apostolic beliefs effectively ruled out a post-apostolic church.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
We can Understand the Bible for Ourselves&lt;/h4&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
That is, we can figure out how the first believers understood the New Testament, and how early Israelites understood the Torah, without the need for theologians or priests to interpret it for us. This is the other belief that led me away from Catholicism, since the Church reserves to herself the prerogative of interpreting Scripture.&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4&gt;
Truth is the Most Important Thing&lt;/h4&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
A common refrain among Christadelphians is (or was, at the time), &quot;If you can prove this Bible wrong, I&#39;ll throw it away.&quot; Variants included, &quot;If you can disprove God&#39;s existence, I&#39;ll stop believing in Him,&quot; and, &quot;If you can prove my beliefs wrong, I&#39;ll trade them in for whatever&#39;s right.&quot; The key idea here is that, in principle at least, our goal is to pursue whatever is true regardless of the cost.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This last value actually takes priority even over God&#39;s existence (again, in principle at least). I believe in God, and that the Bible is his word, but I&#39;m willing to let go of both beliefs if they turn out not to be True. You might ask what would ever convince me they weren&#39;t true, and that would be a good question, but the fact remains that I&#39;m open to the possibility that I&#39;m wrong about God&#39;s existence, and I&#39;m willing in principle to give up my religion if that turns out to be the case.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://waystination.blogspot.com/2014/06/the-making-of-christadelphian-part-1.html</link><author>noreply@blogger.com (Len Budney)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-13428507.post-5960934291656131404</guid><pubDate>Thu, 06 Jun 2013 13:44:00 +0000</pubDate><atom:updated>2013-06-07T08:34:28.216-07:00</atom:updated><title>Pleased to Meet You! Hope You Guess My Name!</title><description>On this blog, and elsewhere on the Internet, I talk about my religion. This post is a thumbnail sketch of the community I belong to.&lt;br /&gt;
&lt;br /&gt;
My denomination is a very small community. It&#39;s found worldwide, but all together we have about 60,000 members total. We call ourselves &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Christadelphians&quot;&gt;Christadelphians&lt;/a&gt;,&quot; and we believe that we&#39;ve managed to recreate the first-century Christian community. Well, we haven&#39;t recreated their practices, and I think most of us know that. Our practices come from our founding, in the 19th Century, and resemble the Puritans and other Protestant denominations like that. But we believe that &lt;a href=&quot;http://www.christadelphia.org/basf.htm&quot;&gt;our beliefs&lt;/a&gt; are extremely close to those of the 1st Century. I&#39;ll talk about our beliefs another time.&lt;br /&gt;
&lt;br /&gt;
Within our community, almost everyone knows almost everyone. And we have some fairly strict social norms. For the vast majority of Christadelphians, we are a lay, patriarchal, millenarian, unitarian, evangelical,&amp;nbsp;apolitical,&amp;nbsp;community of Bible students. What does that mean?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;A lay community.&lt;/b&gt;&amp;nbsp;That means we&#39;re a community of laymen. We don&#39;t have any clergy. Everyone takes turns leading the service on Sunday, or delivering the sermon, or performing baptisms or weddings. Everyone teaches, and everyone preaches, with few exceptions. Nobody is &quot;ordained.&quot; In fact nobody ever seeks an education in theology, Bible scholarship, or any related subject, with extremely few exceptions. We&#39;re not only laymen; we&#39;re self-taught.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Patriarchal.&lt;/b&gt;&amp;nbsp;That means we&#39;re lay&lt;i&gt;men&lt;/i&gt;. The men teach, preach, perform baptisms, etc. Women do not fill those roles. The few Christadelphian churches where women do those things, are considered extreme. In principle, it also means that the husband is the head of the household. In practice, most Christadelphian men would blush to &quot;rule&quot; their household in the way that a 19th-Century husband would consider a matter of course. But the average Christadelphian household is definitely an unequal partnership.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Millenarian.&lt;/b&gt;&amp;nbsp;That means we believe that Jesus Christ will literally return to the Earth, literally resurrect the dead, and literally set up a world-wide kingdom that will last for 1,000 years (that&#39;s the &quot;millenium&quot; in &quot;millenarian&quot;). This, or something close to it, was generally believed in the 1st Century. Millenarianism &amp;nbsp;has enjoyed surges of popularity over the centuries, including the 19th Century when our group was founded, but today that belief is at a low ebb, and we are one of fairly few denominations that actively believe this. (Technically, the Catholic Church teaches a version of this, but it&#39;s so severely de-emphasized that even most Catholics are unaware of it.)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Unitarian.&lt;/b&gt;&amp;nbsp;That means we believe that Jesus is distinct from God. We call ourselves &quot;biblical unitarians,&quot; to distinguish ourselves from &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Unitarian_Universalism&quot;&gt;unitarian universalists&lt;/a&gt;.&quot; They believe that Jesus was just &quot;a man with a unique relationship to God.&quot; We believe he was much more than that: he was literally the son of God, with only one human parent. That makes him more than human, and in fact makes him divine--without making him God himself.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Evangelical.&lt;/b&gt;&amp;nbsp;That means we believe in preaching the gospel. Like most &quot;evangelical&quot; churches, we consider preaching one of our highest values. Often, this is to the exclusion of things like giving to the poor, doing charitable work, etc. In practice, fewer of us preach, and preach less of the time, than we&#39;d like to believe about ourselves. That&#39;s not surprising, though: our ideal is so lofty that it comes with a heavy load of guilt, and to some extent we reduce the guilt by kidding ourselves. We try our best, though. (Note: we are not associated with the &lt;a href=&quot;http://en.wikipedia.org/wiki/Evangelicalism&quot;&gt;evangelical movement&lt;/a&gt;, even though we fit the general definition with regard to evangelism.)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Apolitical.&lt;/b&gt;&amp;nbsp;That means we don&#39;t vote, don&#39;t campaign for political candidates or parties, and don&#39;t seek positions of rulership over others. For some, it means that we also refuse jury duty. For most, it means that we wouldn&#39;t even run for a spot on the local school board--I&#39;m not sure whether any given Christadelphian ecclesia (i.e., church) would tolerate that or not. We consider ourselves &quot;separate from the world,&quot; and politics is the epitome of &quot;the world.&quot; We are also conscientious objectors to military service, for the same reasons.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;...of Bible Students.&lt;/b&gt;&amp;nbsp;Our very highest value is Bible study. Naturally, as with evangelism, that means we also deal with some guilt and some kidding of ourselves. Our study doesn&#39;t quite measure up to our aspirations, nor to our self-image. Nevertheless, as Christian denominations go, we are unusually committed to regular reading of the Bible and to thoroughly learning general Bible knowledge and also learning at least enough apologetics to preach and defend our beliefs. This makes us stick out from the rest to such an extent that our &quot;Learning to Read the Bible Effectively&quot; seminars usually attract lots of visitors from neighboring churches, and many of them continue attending our Bible classes for years--without ever leaving their present church--because, &quot;Our pastor just doesn&#39;t know the Bible like you do.&quot; We&#39;re not very sophisticated students, sometimes, but we&#39;re very sincere and, often, very devoted students.&lt;br /&gt;
&lt;br /&gt;
I believe that sums up my community in a nutshell. If anyone has something to add, or ask, or disagree with, then please feel free to comment below. Respectful comments only, please.</description><link>http://waystination.blogspot.com/2013/06/pleased-to-meet-you-hope-you-guess-my.html</link><author>noreply@blogger.com (Len Budney)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-13428507.post-3915042997539769888</guid><pubDate>Tue, 09 Apr 2013 14:21:00 +0000</pubDate><atom:updated>2013-04-10T09:48:35.325-07:00</atom:updated><title>The perception IS the event</title><description>A discussion recently happened in a private Facebook group that forced me to express something deeply meaningful to me. The group is for religious discussion within my denomination, and one participant said that he struggles with the discrepancies between the four gospels. To him a discrepancy between two witnesses means that one or both of them is wrong or lying.&lt;br /&gt;
&lt;br /&gt;
Others had already replied with the standard response to this--because of course, Christians have a standard response. Eyewitness testimony seldom agrees perfectly. In fact when it does agree perfectly, jurors usually take it to mean that they cooked up their story together, and are lying. Discrepancies are a mark of authenticity. They show that someone didn&#39;t go through afterward and &quot;fix&quot; all the accounts to make them match exactly. Scribes must have been tempted to do it--in fact there are a few known cases where they &lt;i&gt;did&lt;/i&gt; do it--but for the most part, they copied the text as it was, discrepancies and all.&lt;br /&gt;
&lt;br /&gt;
I do find that argument persuasive. By itself it doesn&#39;t prove that the gospel records are true. But it disposes of the notion that discrepancies are &lt;i&gt;a priori&lt;/i&gt; proof that one or more of them is false. The next thing to do is to look at the discrepancies and see if they&#39;re the sort of discrepancies you&#39;d expect from eyewitnesses or not. But that&#39;s not the road I went down. Instead I replied (in part):&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span data-ft=&quot;{&amp;quot;tn&amp;quot;:&amp;quot;K&amp;quot;}&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559804774050348}.0.[1].0.[1].0.[0].[0][2]&quot;&gt;&lt;span class=&quot;UFICommentBody&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559804774050348}.0.[1].0.[1].0.[0].[0][2].0&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559804774050348}.0.[1].0.[1].0.[0].[0][2].0.[3]&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559804774050348}.0.[1].0.[1].0.[0].[0][2].0.[3].0&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559804774050348}.0.[1].0.[1].0.[0].[0][2].0.[3].0.[3]&quot;&gt;The problem here seems to be (1) a conviction that there&#39;s only one &quot;true&quot; 
version of an event, and any other version is therefore false, and (2) 
that inspiration involves God forcing people to report the one true 
truth. That view will lead you to throw your Bible away, because it&#39;s 
perfectly obvious that the Bible doesn&#39;t fit that description.&lt;/span&gt;&lt;br id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559804774050348}.0.[1].0.[1].0.[0].[0][2].0.[3].0.[4]&quot; /&gt;&lt;br id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559804774050348}.0.[1].0.[1].0.[0].[0][2].0.[3].0.[5]&quot; /&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559804774050348}.0.[1].0.[1].0.[0].[0][2].0.[3].0.[6]&quot;&gt;I&#39;d
 suggest that every competent witness&#39;s version of events is equally 
valid, reflecting a different vantage point and different knowledge. Why
 would God force them all to recount things from His (probably 
incomprehensible to us) vantage point, rather than their own?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
This didn&#39;t sit well with the other person, who suggested I was describing a completely novel definition of &quot;inspiration.&quot; He asked, rhetorically I think, &quot;&lt;span data-ft=&quot;{&amp;quot;tn&amp;quot;:&amp;quot;K&amp;quot;}&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2]&quot;&gt;&lt;span class=&quot;UFICommentBody&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2].0&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2].0.[3]&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2].0.[3].0&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2].0.[3].0.[6]&quot;&gt;Is it: &#39;the Bible is a record of people&#39;s human impressions of events&#39; or &#39;the Bible is a record of events&#39;?&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span data-ft=&quot;{&amp;quot;tn&amp;quot;:&amp;quot;K&amp;quot;}&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2]&quot;&gt;&lt;span class=&quot;UFICommentBody&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2].0&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2].0.[3]&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2].0.[3].0&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2].0.[3].0.[6]&quot;&gt;I see a false dichotomy here, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span data-ft=&quot;{&amp;quot;tn&amp;quot;:&amp;quot;K&amp;quot;}&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2]&quot;&gt;&lt;span class=&quot;UFICommentBody&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2].0&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2].0.[3]&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2].0.[3].0&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2].0.[3].0.[6]&quot;&gt;&lt;span data-ft=&quot;{&amp;quot;tn&amp;quot;:&amp;quot;K&amp;quot;}&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2]&quot;&gt;&lt;span class=&quot;UFICommentBody&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0.[9]&quot;&gt;between
 &quot;human impressions of events&quot; and &quot;events.&quot; The events that we&#39;re talking about are &lt;i&gt;human&lt;/i&gt; events, as opposed to, say, astronomical events. They
 relate to the interaction of two or more people. Or rather, an 
interaction of two or more persons&#39; &lt;i&gt;perceptions&lt;/i&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span data-ft=&quot;{&amp;quot;tn&amp;quot;:&amp;quot;K&amp;quot;}&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2]&quot;&gt;&lt;span class=&quot;UFICommentBody&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2].0&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2].0.[3]&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2].0.[3].0&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559834624047363}.0.[1].0.[1].0.[0].[0][2].0.[3].0.[6]&quot;&gt;&lt;span data-ft=&quot;{&amp;quot;tn&amp;quot;:&amp;quot;K&amp;quot;}&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2]&quot;&gt;&lt;span class=&quot;UFICommentBody&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0.[9]&quot;&gt;Think about an event in your own life. Ideally, an event involving conflict. To be concrete, suppose you&#39;re a man who has invited over some dinner guests, expecting his wife to do all the preparations, only to find her in pajamas, in a messy house, with no dinner ready.&amp;nbsp; &lt;i&gt;Your&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span data-ft=&quot;{&amp;quot;tn&amp;quot;:&amp;quot;K&amp;quot;}&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2]&quot;&gt;&lt;span class=&quot;UFICommentBody&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0.[12]&quot;&gt;
 perception is that she disrespects you, or dislikes the guests, or is 
lazy, or something along those lines. Perhaps &lt;i&gt;her&lt;/i&gt; perception is that she has a stomach bug, 
or perhaps it&#39;s that you never asked her before inviting these guests 
and she already &lt;i&gt;told&lt;/i&gt; you that she wouldn&#39;t put together this 
dinner. There&#39;s an infinity of perhapses behind
 both of your behavior. Perhaps you planned the party in the first place
 to show her who&#39;s boss by making her prepare it. Perhaps she&#39;s in pajamas because it&#39;s your 
anniversary, which you forgot again, and now she&#39;s depressed.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span data-ft=&quot;{&amp;quot;tn&amp;quot;:&amp;quot;K&amp;quot;}&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2]&quot;&gt;&lt;span class=&quot;UFICommentBody&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0.[12]&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span data-ft=&quot;{&amp;quot;tn&amp;quot;:&amp;quot;K&amp;quot;}&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2]&quot;&gt;&lt;span class=&quot;UFICommentBody&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0.[15]&quot;&gt;The
 facts are thin soup: guests; messy house; wife in pajamas. Give 100 
people those facts, they can write 100 completely different short 
stories.&lt;/span&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0.[18]&quot;&gt; All of the meat of this event consists in both of your perceptions and 
motivations. That&#39;s what&#39;s interesting to the rest of us, hearing or reading about your I-Love-Lucy-style party disaster. And if you 
both wrote a synoptic account of this event, they would be 
different--perhaps unrecognizable as referring to the same event.&lt;/span&gt;&lt;br id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0.[19]&quot; /&gt;&lt;br id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0.[20]&quot; /&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0.[21]&quot;&gt;So
 what would be the &quot;God&#39;s eye view&quot; of this event? Possibly something on
 another plane entirely, like our perception of two hamsters fighting. 
But leaving that aside, I suspect that &quot;God&#39;s perspective&quot; on the 
&quot;actual event&quot; would be precisely to lay &lt;i&gt;both&lt;/i&gt; of your accounts before 
us. It would be amazingly instructive to notice how both of you are 
&quot;right,&quot; and both of you are &quot;wrong,&quot; about the details of the 
event--but the event itself &lt;i&gt;is&lt;/i&gt; the recounting of both of your 
impressions. That&#39;s what happened. Two sets of impressions collided.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span data-ft=&quot;{&amp;quot;tn&amp;quot;:&amp;quot;K&amp;quot;}&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2]&quot;&gt;&lt;span class=&quot;UFICommentBody&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0.[21]&quot;&gt;The Bible sometimes reads like a dry list of facts, like a history textbook at its most boring. A parade of kings plods by, each one waging this war, or committing that sin, or fighting with the other prophet, and finally being &quot;gathered unto his people&quot; with a royal funeral and being &quot;laid with his ancestors&quot; (or sometimes not). But even those dry sections are full of editorial spin. Who says this king was &quot;wicked&quot;? Who says that king was &quot;righteous&quot;? Why is king Ahaz to blame for the three-year drought, rather than the prophet Elijah who actually caused it? Why is Ahaz hardhearted for refusing to conform to the Jewish temple worship, while people died of the drought, but Elijah is not hardhearted for refusing to relent on his curse until Ahaz breaks? See--it&#39;s all editorial spin. We&#39;re being &lt;i&gt;told&lt;/i&gt; that Ahaz was bad and Elijah was good. We&#39;re supposed to take sides, and we&#39;re told which side to take.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span data-ft=&quot;{&amp;quot;tn&amp;quot;:&amp;quot;K&amp;quot;}&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2]&quot;&gt;&lt;span class=&quot;UFICommentBody&quot; id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0&quot;&gt;&lt;span id=&quot;.reactRoot[24].[1][2][1]{comment557973840900108_559949900702502}.0.[1].0.[1].0.[0].[0][2].0.[21]&quot;&gt;The Bible is full of this, at every level. Practically everything interesting in the Bible is about someone&#39;s perception of events. Usually, we&#39;re supposed to agree with the author&#39;s perceptions, but not always. The book of Judges is one long mind-bending &quot;what&#39;s wrong with this picture?&quot; puzzle. We read about a man&#39;s concubine being raped all night long, and her husband cutting her corpse in pieces and mailing it all around Israel, like we&#39;re reading the score of last night&#39;s baseball game. The author deadpans the entire event, without a hint of judgment or even mild disapproval. We&#39;re left to ask ourselves, &quot;Wasn&#39;t it bad to send his concubine out into a mob of rapists?&quot; or, &quot;Was it really appropriate to dismember her corpse?&quot; or, &quot;So, was the near-genocide of the rapists&#39; tribe a suitable and proportional response?&quot; The book of Judges raises all the interesting questions while refusing to answer any of them, and we&#39;re left frustrated--because we realize that the facts are not what&#39;s really important. What&#39;s really important is the perceptions of the people involved, and how we interact with them.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;</description><link>http://waystination.blogspot.com/2013/04/the-perception-is-event.html</link><author>noreply@blogger.com (Len Budney)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-13428507.post-1633168992008045824</guid><pubDate>Fri, 14 Dec 2012 16:03:00 +0000</pubDate><atom:updated>2012-12-14T08:03:53.335-08:00</atom:updated><title>Life was GOOD in the Third Reich</title><description>Seriously, it was. Obviously, it wasn&#39;t if you were Jewish, or &lt;a href=&quot;http://www.rromaniconnect.org/Romasintiholocaust.html&quot;&gt;Romani&lt;/a&gt;, or openly &lt;a href=&quot;http://www.homocaust.org/&quot;&gt;gay&lt;/a&gt;, a &lt;a href=&quot;http://www.ushmm.org/wlc/en/article.php?ModuleId=10005394&quot;&gt;Jehovah&#39;s Witness&lt;/a&gt; or &lt;a href=&quot;http://www.ushmm.org/museum/exhibit/focus/disabilities/&quot;&gt;disabled&lt;/a&gt;. But how many people are we talking about here? The population of &quot;greater&quot; Germany, including Bohemia, Moravia, Prussia, etc., was &lt;a href=&quot;http://www.tacitus.nu/historical-atlas/population/germany.htm&quot;&gt;87.1 million people&lt;/a&gt; in 1939. The 1939 census of the Reich counted &lt;a href=&quot;http://www.jstor.org/discover/10.2307/4464869&quot;&gt;318,000 Jews&lt;/a&gt;, including people deemed to have Jewish blood who would not be counted under Jewish law. Propaganda of the day estimated their numbers at closer to 1.5 million. There were something like &lt;a href=&quot;http://www.ushmm.org/wlc/en/article.php?ModuleId=10005482&quot;&gt;30,000 Romani&lt;/a&gt; living in Germany at the time. The number of homosexuals in Germany is difficult to determine, but it&#39;s estimated that up to &lt;a href=&quot;http://www.myjewishlearning.com/history/Modern_History/1914-1948/The_Holocaust/Early_Stages_of_Prosecution.shtml&quot;&gt;15,000 homosexuals&lt;/a&gt; were sent to the camps. Jehovah&#39;s Witnesses were banned, and &lt;i&gt;some&lt;/i&gt; were sent to the camps; there were about &lt;a href=&quot;http://www.myjewishlearning.com/history/Modern_History/1914-1948/The_Holocaust/Early_Stages_of_Prosecution.shtml&quot;&gt;25,000 JW&#39;s&lt;/a&gt; in Germany. It&#39;s estimated that about &lt;a href=&quot;http://www.ushmm.org/wlc/en/article.php?ModuleId=10005200&quot;&gt;70,000 disabled&lt;/a&gt; were put to death by the Reich. So the persecuted population of Germany would be approximately 458,000 people. For good measure lets double that: 916,000 people. That&#39;s 1% of the population of Germany in 1939.&lt;br /&gt;
&lt;br /&gt;
We never think about the 99%. We think about the 1% who died horribly, in a methodical program of extermination, and well we should. But if I asked you, &quot;What was life &lt;i&gt;actually like&lt;/i&gt; in Germany under the Third Reich?&quot; you would probably talk about cattle cars, and gas chambers, and forced labor camps. If the experience of the 1% is what life was &lt;i&gt;actually like&lt;/i&gt;, then life in America is all about flying private jets to Paris for a romantic breakfast of caviar and champagne. But no, I didn&#39;t ask about the 1%. I asked about the 99%. What was life like in Germany for the 99%?&lt;br /&gt;
&lt;br /&gt;
You can get a glimpse of the answer in Milton Mayer&#39;s book, &lt;i&gt;&lt;a href=&quot;http://www.amazon.com/They-Thought-Were-Free-Germans/dp/0226511928/lenbudneyshomepa&quot;&gt;They Thought They Were Free&lt;/a&gt;. &lt;/i&gt;But the broad outlines are obvious: 99% of Germans never stepped onto a cattle car, never looked out through barbed wire, were never interrogated by the Gestapo or hauled off to Berlin, and certainly never died in a gas chamber. For 99% of Germans, life under Hitler in 1940 was no different than life under &lt;a href=&quot;https://en.wikipedia.org/wiki/Friedrich_Ebert&quot;&gt;Friedrich Ebert&lt;/a&gt; in 1920. In fact it was immensely better! Under Ebert they experienced a hyperinflation so severe that the paper Mark in 1924 was worth one &lt;i&gt;trillionth&lt;/i&gt; of its value in 1918. Under the Third Reich, the government resisted the urge to devalue the currency and so &lt;a href=&quot;http://wiki.mises.org/wiki/Inflation_in_Nazi_Germany&quot;&gt;kept inflation in check&lt;/a&gt;. Hitler&#39;s nationalism inspired the ordinary German, not because the ordinary German was a homicidal maniac, but because he was sick and tired of being &lt;a href=&quot;https://en.wikipedia.org/wiki/Treaty_of_Versailles#In_Germany&quot;&gt;held completely to blame&lt;/a&gt; for WWI, of being forced to pay &lt;a href=&quot;https://en.wikipedia.org/wiki/World_War_I_reparations&quot;&gt;ruinous WWI reparations&lt;/a&gt;, of watching the &lt;a href=&quot;http://news.google.com/newspapers?nid=2507&amp;amp;dat=19380927&amp;amp;id=jkBAAAAAIBAJ&amp;amp;sjid=e1kMAAAAIBAJ&amp;amp;pg=1833,4112622&quot;&gt;plight of Sudeten Germans&lt;/a&gt; under Czech rule, etc.&lt;br /&gt;
&lt;br /&gt;
In short, hyperinflation was a thing of the past. Reparations, an immense national debt, were repudiated. Guilt over WWI was repudiated, and Germans--the 99% of Germans we&#39;re talking about here--felt pride in their nation. Unemployment was down from &lt;a href=&quot;http://www.spartacus.schoolnet.co.uk/GERunemployment.htm&quot;&gt;30% in 1932&lt;/a&gt;, to full employment in 1936, to a &lt;a href=&quot;http://www.ihr.org/other/economyhitler2011.html&quot;&gt;labor &lt;i&gt;shortage&lt;/i&gt; in 1938&lt;/a&gt;. Economically, life in the Third Reich was the best it had been since before WWI.&lt;br /&gt;
&lt;br /&gt;
And remember, these 99% never saw the inside of a concentration camp. They knew that Jews were being &quot;resettled,&quot; but the &quot;final solution&quot; was not publicized, and certainly not any of the gory details. No German needed to think about where the trains were headed, once they left the station. The ordinary German was shielded from these horrors, and could easily live in denial that they were going on at all.&lt;br /&gt;
&lt;br /&gt;
Similarly, we imagine Germans being challenged constantly with, &quot;Ihre papiere, bitte!&quot; But did they perceive this as the proof that they lived in a police state? Ask an American, who produces his driver&#39;s license on demand for police, who shows identification &lt;i&gt;and&lt;/i&gt; removes his shoes and belt before boarding a plane, who &lt;a href=&quot;http://usatoday30.usatoday.com/travel/news/2008-01-10-passport-cards_N.htm&quot;&gt;shows his passport&lt;/a&gt; to return from Canada or Mexico, and who applauds the movement to &lt;a href=&quot;https://www.nytimes.com/2012/07/22/opinion/sunday/in-arpaios-arizona-they-fought-back.html?_r=0&quot;&gt;demand proof of citizenship&lt;/a&gt; from hispanics, or the practice by New York City police of randomly &lt;a href=&quot;http://www.nyclu.org/issues/racial-justice/stop-and-frisk-practices&quot;&gt;stopping and searching people &lt;/a&gt;without probable cause. Ask this American whether he lives in a police state; it&#39;s obvious how he will answer. These measures are there to protect us from &quot;terrorists,&quot; and &quot;illegals,&quot; and &quot;gang bangers&quot;! Showing our papers doesn&#39;t make us any less free--in fact it&#39;s the price we pay &lt;i&gt;for&lt;/i&gt; our great freedom. Just so, the Germans &lt;a href=&quot;http://www.amazon.com/They-Thought-Were-Free-Germans/dp/0226511928/lenbudneyshomepa&quot;&gt;thought they were free&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Life was good, for Germans in the Third Reich. For 99% of them, anyway. If any chicken little should object that they were living in a police state, they could rightfully scoff. &quot;Have you ever been taken to Berlin, or loaded on a train, or gassed?&quot; No, of course not. &quot;Has any relative or friend of yours experienced any of these things?&quot; No, most likely not. &quot;So how can you call this a police state?&quot; Germans got up in the morning, went to work, went to the pub, came home, and went to bed. For most Germans, there was no visible sign of a police state, anywhere they looked.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve been asked before whether I&#39;ve ever been spirited away to Guantanamo, or tortured, or held without charges, or killed by a drone. I can honestly say I haven&#39;t. Nobody I know has experienced any of these things. I&#39;ve been frisked, rather intimately, in airports; I&#39;ve had my electronic communication monitored (as has everyone else, whether they realize it or not); I&#39;ve had to get a passport so I can visit Canada or Mexico; every package I&#39;ve ever ordered from China or Israel has arrived opened; all of these things are true. But that&#39;s just the price of freedom--those measures are all for my own good.&lt;br /&gt;
&lt;br /&gt;
What I wonder is, if the United States were ever to become a police state, how would we know?</description><link>http://waystination.blogspot.com/2012/12/life-was-good-in-third-reich.html</link><author>noreply@blogger.com (Len Budney)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-13428507.post-9083052563424066222</guid><pubDate>Mon, 15 Oct 2012 16:01:00 +0000</pubDate><atom:updated>2012-10-15T09:05:18.113-07:00</atom:updated><title>Salsa - My First Water-Bath Canning Experience</title><description>&lt;h2&gt;
Finally, canning again&lt;/h2&gt;
&lt;br /&gt;
I started canning in 2008. For practice, I canned a couple dozen quarts each of pinto beans (which were delicious, I must say), turkey stock, and applesauce. I bought an &lt;a href=&quot;http://www.amazon.com/All-American-25-Quart-Pressure-Cooker-Canner/dp/B0002808YS/lenbudneyshomepa&quot;&gt;All American Canner model 925&lt;/a&gt;, used, which I&#39;ve been delighted with (and also used to pressure cook whole chickens and some other things).&lt;br /&gt;
&lt;br /&gt;
Back then the problem was that our kitchen was a shambles. Our house was a duplex, and the downstairs kitchen had literally &lt;i&gt;no&lt;/i&gt; counter space apart from the foot or so on either side of the sink. Julie and I did these canning projects on folding tables, and it was pretty tough going. Thus began a project to remodel the kitchen, which is a long story for another day. The conclusion of that story is that we had a contractor finish the kitchen remodel for us, this past April, and the kitchen is now gorgeous. Every available foot of wall has cabinets and countertops. Ironically we still wish for more space, but we&#39;re &lt;i&gt;much&lt;/i&gt; better off now than we were in 2008. I wish we&#39;d done this four years ago.&lt;br /&gt;
&lt;br /&gt;
Since May I&#39;ve been meaning to resume canning, which was after all the original motivation for finally doing something about that kitchen. Finally, this weekend, we did.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Salsa?&lt;/h3&gt;
&lt;br /&gt;
Yes, salsa. We actually go through a tremendous amount of it. We use it for chips, but also over rice (Spanish rice in minutes!), on baked potatoes, on scrambled eggs (or in our case, Egg Beaters™), etc. I&#39;m vaguely dissatisfied with the stuff we buy, so making some might be the first step toward the perfect salsa, and it sounded easy enough to make. I was wrong about that.&lt;br /&gt;
&lt;br /&gt;
So on Saturday we stopped at a nearby farm stand and bought a crate of tomatoes (I&#39;m guessing it was about a half-bushel), some onions, jalapeños, garlic, and green peppers. Then I took a &lt;a href=&quot;http://runkeeper.com/user/556202048/activity/124651945&quot;&gt;ten mile bike ride&lt;/a&gt; to Walmart for some lemon juice, tomato paste, and cilantro.&lt;br /&gt;
&lt;br /&gt;
Sunday evening (after another &lt;a href=&quot;http://runkeeper.com/user/556202048/activity/124885140&quot;&gt;17-mile bike ride&lt;/a&gt; with my son), Julie and I optimistically set to work at almost 9:00 PM.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Prep Work&amp;nbsp;&lt;/h3&gt;
&lt;br /&gt;
Prepping the tomatoes wasn&#39;t hard work, but there was a lot of it. Before starting, I put 24 &lt;a href=&quot;http://www.amazon.com/Ball-Mason-Jars-Wide-Mouth-Freeze/dp/B001DIZ1NO/rlenbudneyshomepa&quot;&gt;pint jars&lt;/a&gt; into the dishwasher for a quick wash and heated dry--the jars need to be hot. I also put a sauce pan full of jar lids into the oven at 200°f, to keep them hot; it seemed like less work than simmering them on the stove, since they need to be watched to prevent boiling. I put about 4 gallons of water in the All American™ canner, and set it to boil (which takes forever!). Then I put a 12-quart stock pot on the next burner with about a gallon of water. When the stock pot was boiling, I cut an X in the bottom of four tomatoes at a time and dropped them in the pot for 1 minute. When the timer expired, I switched them into a bowl of ice water, and Julie peeled and cored them. It took perhaps a half hour for this operation.&lt;br /&gt;
&lt;br /&gt;
When the tomatoes were all peeled, Julie minced about 8 cloves of garlic and 12 jalapeños (without seeds!) in a little food processor, followed by 6 cups of onions and 2-3 green peppers. I removed the seeds and jelly from the tomatoes. At first I cut each one in half, and gently squeezed each half into a strainer; before long I tired of that, and found by experiment that it works nearly as well if you simply squeeze the whole tomato. The seeds and juice come out the hole where the core was. That took a solid half-hour as well.&lt;br /&gt;
&lt;br /&gt;
When the tomatoes were seeded, I ran them in the big food processor until they looked like salsa to me. I like salsa on the less chunky side, and Julie likes it more, so I tried to split the difference there. The crate of tomatoes came to almost exactly 6 quarts. Then into the (washed out) 12-quart stock pot went:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;6 quarts of tomatoes (processed)&lt;/li&gt;
&lt;li&gt;6 cups of onions (minced)&lt;/li&gt;
&lt;li&gt;12 jalapeños (seeded and minced)&lt;/li&gt;
&lt;li&gt;2 green peppers (seeded and minced)&lt;/li&gt;
&lt;li&gt;8 cloves garlic (minced fine)&lt;/li&gt;
&lt;li&gt;24-oz can diced tomatoes&lt;/li&gt;
&lt;li&gt;24-oz can puréed tomatoes&lt;/li&gt;
&lt;li&gt;4 cups bottled lemon juice (natural strength)&lt;/li&gt;
&lt;li&gt;2 tbs salt&lt;/li&gt;
&lt;li&gt;2 tbs sugar&lt;/li&gt;
&lt;li&gt;2 tbs ground cumin&lt;/li&gt;
&lt;li&gt;1 tbs black pepper&lt;/li&gt;
&lt;li&gt;1/2 cup cilantro leaves, minced&lt;/li&gt;
&lt;/ul&gt;
It took a good while to bring that to a boil, and then we simmered it for 30 minutes, stirring occasionally.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Processing&lt;/h3&gt;
&lt;br /&gt;
Once the salsa was cooked, we set up an assembly line. We put pot holders on one end of the countertop, about 4&#39; from the stove, and set the pot of salsa on that. Next to that we set the pan full of &lt;a href=&quot;http://www.amazon.com/Canning-Packed-Mulberry-Lane-Farm/dp/B005TTKH3C/lenbudneyshomepa&quot;&gt;lids&lt;/a&gt; and the &lt;a href=&quot;http://www.amazon.com/Back-Basics-174-Magnetic-Lifter/dp/B000FKGGYY/lenbudneyshomepa&quot;&gt;lid lifter&lt;/a&gt;; next to that the &lt;a href=&quot;http://www.amazon.com/Ball-Mason-Jars-Wide-Mouth-Freeze/dp/B001DIZ1NO/rlenbudneyshomepa&quot;&gt;bands&lt;/a&gt; (which came with the &lt;a href=&quot;http://www.amazon.com/Ball-Mason-Jars-Wide-Mouth-Freeze/dp/B001DIZ1NO/rlenbudneyshomepa&quot;&gt;jars&lt;/a&gt;); then next to the stove the &lt;a href=&quot;http://www.amazon.com/Back-to-Basics-Jar-Lifter/dp/B000FKEUUQ/lenbudneyshomepa&quot;&gt;jar lifter&lt;/a&gt;.&amp;nbsp; The water in the canner was gently boiling.&lt;br /&gt;
&lt;br /&gt;
The process was pretty easy from that point. Julie took a jar from the dishwasher, filled it with salsa, leaving 1/2&quot; head space, and wiped the rim of the jar with a damp cloth. I fished out a lid with the magnet, put on a band, and lifted the jar into the canner.&lt;br /&gt;
&lt;br /&gt;
As we worked, it became clear that a couple things weren&#39;t working out as I&#39;d planned. The canner is supposed to hold 19 pint jars. However, (1) that depends on the size of the jar, and (2) that refers to pressure canning, not water-bath. The wide-mouth Ball™ jars we used only fit 8 to a layer, or 16 total. And the second layer of jars comes near the top of the canner: when pressure canning, you only need a few inches of water in the bottom, and the work is actually done by steam that fills the canner; when water-bath canning, you&#39;re supposed to cover the jars to a depth of a couple inches. So technically the canner is only supposed to process one layer of jars when water-bath canning. And we ended up filling not 16 jars, but 23 2/3.&lt;br /&gt;
&lt;br /&gt;
We plowed ahead anyway: we put two layers in the canner, with less than 1/2&quot; water above the top, and gently set the lid. We had to scoop out a little to prevent it boiling over. Then we got out the &lt;a href=&quot;http://www.amazon.com/Ball-Waterbath-Including-Chrome-Plated-4-Piece/dp/B00212IHBY/lenbudneyshomepa&quot;&gt;water-bath canner&lt;/a&gt; and used it for the last seven jars. Getting both to a boil took a while--pro tip: on a normal kitchen stove, a giant canner will &lt;i&gt;never&lt;/i&gt; get to a rolling boil with the lid off. Once both were&amp;nbsp; boiling, we set a timer for 20 minutes. After 20 minutes in the water bath, I set another timer (Julie having gone to bed at this pint, since it was nearly 1:00 AM) for 15 minutes and turned off the heat. When they&#39;d cooled just a little, I pulled them out with the jar lifter and set them on towels to cool and seal.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
The Results&lt;/h3&gt;
&lt;br /&gt;
All the jars sealed, so that&#39;s great. We haven&#39;t tasted the canned salsa yet. The extra 2/3 jar tasted awesome--I had some on my eggs this morning--but it didn&#39;t go through the water bath, so it had about 1/2 hour less cooking time. The processed jars will no doubt taste different. I&#39;d expect the cilantro flavor to be less vibrant in the processed salsa. So the jury is still out, but it looks very promising.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://sphotos-a.xx.fbcdn.net/hphotos-prn1/564769_10151202153090900_6471062_n.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;239&quot; src=&quot;https://sphotos-a.xx.fbcdn.net/hphotos-prn1/564769_10151202153090900_6471062_n.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</description><link>http://waystination.blogspot.com/2012/10/salsa-my-first-water-bath-canning.html</link><author>noreply@blogger.com (Len Budney)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-13428507.post-3728652791587292058</guid><pubDate>Sat, 22 Sep 2012 23:01:00 +0000</pubDate><atom:updated>2012-09-22T16:04:30.658-07:00</atom:updated><title>Toodledo and If This Then That</title><description>&lt;h2&gt;
Toodledo and &lt;i&gt;If This Then That&lt;/i&gt;&lt;/h2&gt;
&lt;h3&gt;
Two great web apps that taste great together.&lt;/h3&gt;
There are a handful of tools out that that bowl me over with their possibilities. They seem to have infinite potential, even if I can&#39;t think of just what to do with them right now. One of them is Don Libes&#39;s &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/1565920902/lenbudneyshomepa&quot;&gt;&lt;i&gt;expect&lt;/i&gt; programming language&lt;/a&gt;. Another is the web app &lt;a href=&quot;https://ifttt.com/&quot;&gt;&lt;i&gt;If This, Then That&lt;/i&gt;&lt;/a&gt;, or IFTTT. Here&#39;s how I just set up a &quot;recipe&quot; on IFTTT to create to-do items by taking a voice memo on my cellphone.&lt;br /&gt;
&lt;br /&gt;
What is IFTTT? It does what the name says: it&#39;s a web service that arranges for &quot;that&quot; to happen whenever &quot;this&quot; happens. I have about a dozen and a half of these set up, so when I post this blog entry, an IFTTT action will tweet a link to it from my twitter account, and another will post a link to it on my Facebook page. When I upload a picture to Facebook, a copy will be saved to my Flickr account. When I mark something with a star in &lt;a href=&quot;https://www.google.com/reader&quot;&gt;Google Reader&lt;/a&gt;, that article will be saved in &lt;a href=&quot;https://www.instapaper.com/&quot;&gt;Instapaper&lt;/a&gt; for me to read offline later. If you &lt;a href=&quot;https://ifttt.com/recipes&quot;&gt;browse their recipes&lt;/a&gt;, you&#39;ll get the idea quickly. See what I mean about infinite possibilities?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So what do I want to do with all that infinite power? Well, one thing I want pretty badly is to do useful things with my &lt;a href=&quot;https://en.wikipedia.org/wiki/IPhone_4&quot;&gt;iPhone 4&lt;/a&gt;, like create to-do items in &lt;a href=&quot;https://www.toodledo.com/&quot;&gt;Toodledo&lt;/a&gt; by voice. The iPhone 4 is a museum piece--which is why I linked Wikipedia instead of Apple--and it doesn&#39;t support voice commands. For that I&#39;d need an iPhone 5 or at least a 4s. I used to have a cool voice-command app called Siri, but it was mysteriously &lt;a href=&quot;http://techcrunch.com/2011/10/04/the-original-siri-app-gets-pulled-from-the-app-store-servers-killed/&quot;&gt;pulled from the app store&lt;/a&gt; shortly before they announced that the iPhone 4s would talk to you in a feminine voice and go by the name of &quot;Siri.&quot; Hmmm.&lt;br /&gt;
&lt;br /&gt;
Since then I&#39;ve looked at any app that promises voice command. &lt;a href=&quot;http://itunes.apple.com/us/app/dragon-dictation/id341446764?mt=8&quot;&gt;Dragon&lt;/a&gt; is pretty good, but it&#39;s really nothing more than a notepad that takes dictation. &lt;a href=&quot;http://www.vlingo.com/&quot;&gt;Vlingo&lt;/a&gt; isn&#39;t too bad, but I&#39;ve found it frustratingly hard to use. Enter &lt;a href=&quot;http://itunes.apple.com/us/app/voice-assistant-just-use-your/id511757903&quot;&gt;Voice Assistant&lt;/a&gt;. It has pretty accurate voice recognition--but ironically, I found it the most useless of all. It&#39;s a &quot;do one thing&quot; app. If you tell it in the preferences that you want to send text messages, then that&#39;s all it can do. If you tell it you want to send emails, then &lt;i&gt;that&#39;s&lt;/i&gt; all it can do. It can only do one thing. How incredibly, utterly useless!&lt;br /&gt;
&lt;br /&gt;
But suddenly I find myself wanting to do only one thing. I just want to talk into my phone, and create a to-do item. How on earth is that so hard? (And if you&#39;re going to tell me to bite the bullet and buy an iPhone 5, I can only say to you, &quot;Shut up.&quot;) I used to use &lt;a href=&quot;http://www.nuance.com/for-individuals/by-product/voice-to-text/index.htm&quot;&gt;Jott&lt;/a&gt;, until they wanted me to start paying monthly for it. I tried to use &lt;a href=&quot;https://www.google.com/voice&quot;&gt;Google Voice&lt;/a&gt;, but I could never get its &quot;straight to voicemail&quot; feature to work--they&#39;re convinced that when I call from my cell, I want to &lt;i&gt;listen to&lt;/i&gt; my voice mails rather than &lt;i&gt;leave one&lt;/i&gt;. Which somehow makes the single-minded stupidity of Voice Assistant attractive. If I tell it to send a text message, then by golly that&#39;s exactly what it will do.&lt;br /&gt;
&lt;br /&gt;
But where to send the text? &lt;a href=&quot;https://www.toodledo.com/&quot;&gt;Toodledo&lt;/a&gt; doesn&#39;t accept text messages. I subscribed to the Pro service because it lets me create to-dos by sending an email message, but email is all it can do. What I need is some way to set things up so that &lt;i&gt;If&lt;/i&gt; I send a text message, &lt;i&gt;Then&lt;/i&gt; an email is sent to Toodledo...&lt;br /&gt;
&lt;br /&gt;
And lo and behold, I know of just such a service. Five minutes at IFTTT, and I have just what I need. Whenever I send a text message to Toodledo from my cell phone, they will use it as the subject line of an email from my Gmail account to my secret Toodledo email address, which Toodledo will funnel into my inbox. I&#39;ve shared the recipe with the public under the name &quot;Text messages -&amp;gt; Toodledo.&quot;&lt;br /&gt;
&lt;br /&gt;
Using it has a few moving parts, of course:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;First, sign up with &lt;a href=&quot;http://www.toodledo.com/&quot;&gt;Toodledo&lt;/a&gt; and subscribe to &quot;Pro Plus&quot; for $30/year.&lt;/li&gt;
&lt;li&gt;If you don&#39;t already have one, get a &lt;a href=&quot;https://accounts.google.com/&quot;&gt;gmail account&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Get yourself an iPhone and install &lt;a href=&quot;http://itunes.apple.com/us/app/voice-assistant-just-use-your/id511757903&quot;&gt;Voice Assistant&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Then, register with &lt;a href=&quot;https://ifttt.com/&quot;&gt;IFTTT&lt;/a&gt;, activating the &lt;a href=&quot;https://ifttt.com/sms&quot;&gt;SMS&lt;/a&gt; and &lt;a href=&quot;https://ifttt.com/gmail&quot;&gt;GMail&lt;/a&gt; channels.&lt;/li&gt;
&lt;li&gt;Find the &lt;a href=&quot;https://ifttt.com/recipes/58379&quot;&gt;Text Messages -&amp;gt; Toodledo&lt;/a&gt; recipe and click &quot;Use Recipe.&quot;&lt;/li&gt;
&lt;li&gt;Enter your secret Toodledo email address as the email &quot;To&quot; address, and save.&lt;/li&gt;
&lt;li&gt;Note the phone number the recipe gives you for sending your text messages to.&lt;/li&gt;
&lt;li&gt;On your iPhone, create a contact for &quot;Toodledo,&quot; using your secret email address and the SMS phone number from IFTTT.&lt;/li&gt;
&lt;li&gt;In Voice Assistant on your iPhone, enable &quot;Fast Access - SMS &amp;amp; iMessage,&quot; and choose the Toodledo contact as your &quot;Favorite Sms &amp;amp; iMessage&quot; preference.&lt;/li&gt;
&lt;/ol&gt;
That&#39;s it. Now whenever you dictate something in Voice Assistant, it will automatically pop up as a voice message. Tap &quot;send,&quot; and it will go to IFTTT, who will send an email to Toodledo, who will turn that into a to-do item. Somewhere in this chain of events, I&#39;m sure a pin pops a balloon, which scares a cat, which jumps onto a sleeping man&#39;s head, who rolls down a flight of stairs, landing with his nose on the RETURN key. </description><link>http://waystination.blogspot.com/2012/09/toodledo-and-if-this-then-that-two.html</link><author>noreply@blogger.com (Len Budney)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-13428507.post-8934569053447027127</guid><pubDate>Fri, 28 Sep 2007 16:36:00 +0000</pubDate><atom:updated>2007-09-28T10:11:19.731-07:00</atom:updated><title>Connecting OS X Leopard to a Cisco VPN</title><description>&lt;br /&gt;		&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;That nastiest part of being an early adopter is that we’re forced either to to without creature comforts, or to hack up substitutes. Now that Leopard is fairly stable (as of pre-release 9a559), some of us have started using it full-time--but the first bump in the road is that our Cisco VPN client doesn’t work, and we can’t connect to our offices to work from home.&lt;br /&gt;&lt;br /&gt;Luckily, there is a solution: &lt;a href=&#39;http://www.unix-ag.uni-kl.de/~massar/vpnc/&#39;&gt;vpnc&lt;/a&gt;. Vpnc is a command-line client for Cisco’s VPN concentrators, and it works on Linux, every flavor of UNIX, and most importantly, OS X &lt;em&gt;including Leopard&lt;/em&gt;. It’s simple to get up and running:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1. Install XCode Tools from the OS X install DVD&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;You’re going to be compiling some software by hand, so you need the compiler and other utilities included in XCode Tools. Pop in your DVD and look under “Optional Installs” for the XCode Tools package. Double-click it and follow your nose.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2. Install the TUN/TAP kernel extensions&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;a href=&#39;http://www-user.rhrk.uni-kl.de/~nissler/tuntap/&#39;&gt;Download&lt;/a&gt; the tun/tap drivers for OS X. The version for Tiger (OS X 10.4) works fine with Leopard (OS X 10.5) as well. Download the source package: inside it are the folders tun.kext and tap.kext, containing the pre-compiled kernel extensions. In a terminal window, locate those folders and install them as follows:&lt;br /&gt;&lt;br /&gt;        # sudo mv ./&lt;em&gt;PATH&lt;/em&gt;/tun.kext /Library/Extensions&lt;br /&gt;        # sudo mv ./&lt;em&gt;PATH&lt;/em&gt;/tap.kext /Library/Extensions&lt;br /&gt;        # sudo chown -R root:wheel /Library/Extensions/{tun,tap}.kext&lt;br /&gt;&lt;br /&gt;Then test them with the following commands:&lt;br /&gt;&lt;br /&gt;        # sudo kextload /Library/Extensions/{tun,tap}.kext&lt;br /&gt;        kextload: /Library/Extensions/tun.kext loaded successfully&lt;br /&gt;        kextload: /Library/Extensions/tap.kext loaded successfully&lt;br /&gt;&lt;br /&gt;        # sudo kextunload /Library/Extensions/{tun,tap}.kext&lt;br /&gt;        kextunload: unload kext /Library/Extensions/tun.kext succeeded&lt;br /&gt;        kextunload: unload kext /Library/Extensions/tap.kext succeeded&lt;br /&gt;&lt;br /&gt;3. Install &lt;em&gt;&lt;a href=&#39;http://www.gnupg.org/(en)/download/index.html#libgpg-error&#39;&gt;libgpg-error&lt;/a&gt;&lt;/em&gt; and &lt;em&gt;&lt;a href=&#39;http://www.gnupg.org/(en)/download/index.html#libgcrypt&#39;&gt;libgcrypt&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;/em&gt;The latest version of each should be fine; that’s what I’m using. You have to install them in the order listed: libgcrypt uses libgpg-error and won’t build without it. Download and unpack the tarball for each, then in a terminal window do the following:&lt;br /&gt;&lt;br /&gt;        # cd libgpg-error-&lt;em&gt;version&lt;/em&gt;&lt;br /&gt;        # ./configure&lt;br /&gt;        # make&lt;br /&gt;        # sudo make install&lt;br /&gt;&lt;br /&gt;        # cd libgcrypt-&lt;em&gt;version&lt;/em&gt;&lt;br /&gt;        # ./configure&lt;br /&gt;        # make&lt;br /&gt;        # sudo make install&lt;br /&gt;&lt;br /&gt;When configuring libgcrypt for an Intel Mac, you’ll need to say “./configure --disable-asm” or else the library will build and install fine, but programs using it will not work. You can leave that option off for PPC Macs.&lt;br /&gt;&lt;br /&gt;4. Install &lt;a href=&#39;http://www.unix-ag.uni-kl.de/~massar/vpnc/&#39;&gt;vpnc&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;a href=&#39;http://www.unix-ag.uni-kl.de/~massar/vpnc/&#39;&gt;Download&lt;/a&gt; the vpnc source code and unpack it in a convenient location. In a terminal window, build and install it:&lt;br /&gt;&lt;br /&gt;        # cd vpnc-&lt;em&gt;version&lt;/em&gt;&lt;br /&gt;        # make&lt;br /&gt;        # sudo make install&lt;br /&gt;&lt;br /&gt;If you installed the above libraries correctly, vpnc should build and install without errors. That’s it! You’re ready to be productive again! That is, as soon as you...&lt;br /&gt;&lt;br /&gt;5. Configure vpnc&lt;br /&gt;&lt;br /&gt;The vpnc distribution comes with a template configuration file, vpnc.conf, which looks like this:&lt;br /&gt;&lt;br /&gt;        IPSec gateway &amp;lt;gateway&amp;gt;&lt;br /&gt;        IPSec ID &amp;lt;group-id&amp;gt;&lt;br /&gt;        IPSec secret &amp;lt;group-psk&amp;gt;&lt;br /&gt;        IKE Authmode hybrid&lt;br /&gt;        Xauth username &amp;lt;username&amp;gt;&lt;br /&gt;        Xauth password &amp;lt;password&amp;gt;&lt;br /&gt;&lt;br /&gt;If your VPN uses group authentication and XAuth, you can fill in the blanks in this file and you’re set to go. You may need to change the IKE Authmode option from “hybrid” to “psk.” Put your username and password in the XAuth lines, and get the gateway IP address and group ID from your Cisco VPN configuration.&lt;br /&gt;&lt;br /&gt;The IPSec secret is your group password. If you don’t know it, you can look in:&lt;br /&gt;&lt;br /&gt;        /etc/CiscoVPNClient/Profiles/&lt;em&gt;VPN-NAME&lt;/em&gt;.pcf&lt;br /&gt;&lt;br /&gt;There you’ll find the encrypted group password. Copy and paste that into &lt;a href=&#39;http://www.unix-ag.uni-kl.de/~massar/bin/cisco-decode&#39;&gt;this web page&lt;/a&gt; to recover the original password, and put that in your vpnc.conf.&lt;br /&gt;&lt;br /&gt;Save the resulting file in /etc/vpnc/vpnc.conf&lt;br /&gt;&lt;br /&gt;5. Run vpnc&lt;br /&gt;&lt;br /&gt;Running vpnc conveniently involves several steps, so it’s best to put it in a shell script like the following. I named mine, imaginatively enough, “startvpn.”&lt;br /&gt;&lt;br /&gt;        #!/bin/sh&lt;br /&gt;&lt;br /&gt;        # Remember the default gateway&lt;br /&gt;        GATEWAY=$( route get default | egrep gateway | awk &#39;{print $2}&#39; )&lt;br /&gt;&lt;br /&gt;        # Reload the kernel modules&lt;br /&gt;        kextunload /Library/Extensions/tun.kext&lt;br /&gt;        kextunload /Library/Extensions/tap.kext&lt;br /&gt;        kextload /Library/Extensions/tun.kext&lt;br /&gt;        kextload /Library/Extensions/tap.kext&lt;br /&gt;&lt;br /&gt;        /usr/local/sbin/vpnc /etc/vpnc/vpnc.conf&lt;br /&gt;&lt;br /&gt;        # Switch the default gateway back&lt;br /&gt;        /sbin/route delete default&lt;br /&gt;        /sbin/route add default $GATEWAY&lt;br /&gt;&lt;br /&gt;This script first reloads the kernel modules, then starts the VPN, and finally resets your default gateway so that normal traffic will not go through the gateway. If you want &lt;em&gt;everything&lt;/em&gt; to go through the VPN, you can change the script accordingly. Note that this script is Darwin-specific; you’ll need to change it slightly to make it work on Linux or some other *NIX flavor.&lt;br /&gt;&lt;br /&gt;You should probably also create a “stopvpn” script like this:&lt;br /&gt;&lt;br /&gt;        #!/bin/sh&lt;br /&gt;&lt;br /&gt;        # Stop the vpn&lt;br /&gt;        /usr/local/sbin/vpnc-disconnect&lt;br /&gt;&lt;br /&gt;        # Unload the kernel modules&lt;br /&gt;        kextunload /Library/Extensions/tun.kext&lt;br /&gt;        kextunload /Library/Extensions/tap.kext&lt;br /&gt;&lt;br /&gt;The unloading and reloading of kernel modules is just for good hygiene; well-written kernel modules shouldn’t need reloading, but it can help clear leftover state from your last connection and avoid potential problems. &lt;strong&gt;TIP: &lt;em&gt;this is very useful for Cisco’s vpn client&lt;/em&gt;&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Put the two scripts somewhere in your path. Then, whenever you need to connect to your VPN, just open a terminal and say “sudo startvpn,” followed by “sudo stopvpn” when you’re done.&lt;br /&gt;&lt;br /&gt;Happy telecommuting!&lt;/div&gt;&lt;br /&gt;	</description><link>http://waystination.blogspot.com/2007/09/connecting-os-x-leopard-to-cisco-vpn.html</link><author>noreply@blogger.com (Len Budney)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-13428507.post-112238142391970704</guid><pubDate>Tue, 26 Jul 2005 12:37:00 +0000</pubDate><atom:updated>2005-07-26T05:37:03.933-07:00</atom:updated><title>Back from Bible School</title><description>It&#39;s been about three weeks since I&#39;ve written to the blog, but it&#39;s been a busy three weeks. No, losing Buttons hasn&#39;t driven me over the edge, though my son is still trying to figure out when Buttons is coming home to us. Sigh.&lt;br /&gt;&lt;br /&gt;The biggest thing to happen since early July is the new version of iTunes, which allows users to subscribe to podcasts. I&#39;ve been aware of podcasting for quite some time, but haven&#39;t actually followed any because it didn&#39;t seem worth the trouble. With the new iTunes, you can subscribe to a podcast and automatically get the latest one. You can also keep your podcasts synchronized with your iPod, which was a real lifesaver for me during last week&#39;s vacation. My current subscriptions are the Marty Roberts show, produced in Bethel, Israel, and the podcast from the von Mises institute. The former is an awesome news program, focusing on current events in Israel. The latter is a motley collection of lectures on Austrian economics--a version of classical economics that I strongly favor. Austrians tend to be libertarians, so there&#39;s a mix of libertarian commentary as well.&lt;br /&gt;&lt;br /&gt;Naturally, I&#39;ve started my own podcast. Lest you think I&#39;m (only) jumping on the bandwagon, I should say that I&#39;ve been planning to do it for some time--it&#39;s just the lure of publication on ITMS that finally clinched my resolve. So far the &quot;Len Budney Show&quot; is partly audio blog, partly comment on events in Israel, but I don&#39;t intend to be strictly an audio blog. Current events and issues will be a big part of it, but comment on various Bible topics as well. What&#39;s tricky is that I&#39;m still learning how to do the podcast thing; I was never a college DJ. Filling the air and keeping to defined time segments takes a bit of practice. Another challenge is balancing the content, because I don&#39;t plan on making a podcast with only Bible believers as the target audience. My idea is to keep things relevant, understandable, and at least a little interesting to non-believers. That&#39;s a tricky order, so I&#39;m feeling my way along there. So far three shows are &quot;in the can&quot;.&lt;br /&gt;&lt;br /&gt;Last week I attended the New England Christadelphian Bible School, in its new location at the Ascutney Mountain Ski Resort near Ascutney Vermont. It was an awesome week--the classes were great, the food was good, and the scenery was beautiful. From a technical standpoint it was a visit to the middle ages, because there was no cell coverage, no Internet, no nothing. That was tough. I did use my laptop extensively, but a laptop without Internet is basically lobotomized. I used it mostly to edit photos of the Bible School, and to take notes on the classes.&lt;br /&gt;&lt;br /&gt;I couldn&#39;t check my email or download the latest podcasts, since there was no Internet. Luckily I had a full collection of old podcasts to listen to. Every morning at 6:00 I took a three-mile walk through the resort, and the fully-loaded iPod kept me company. Schweet!&lt;br /&gt;&lt;br /&gt;Right now I&#39;m on the bus back to work. After eleven days away, I&#39;m looking forward to getting back into it! There&#39;s a daunting pile of stuff to get through my first day back, judging by the emails (the &lt;span style=&quot;font-style: italic;&quot;&gt;deluge&lt;/span&gt; of emails) I got on returning home. It should be a great week. I like having a nice full (but not overful!) pipeline.</description><link>http://waystination.blogspot.com/2005/07/back-from-bible-school.html</link><author>noreply@blogger.com (Len Budney)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-13428507.post-112044888590772432</guid><pubDate>Mon, 04 Jul 2005 03:48:00 +0000</pubDate><atom:updated>2005-07-04T08:34:36.870-07:00</atom:updated><title>Goodbye, Buttons</title><description>My cocker spaniel Buttons has a whiny sort of bark, which I admit is annoying. I spent three hours building her a kennel yesterday, because my wife is at Bible school with our five-year-old for the week. Since I catch the bus to work at 7:30 in the morning, and get home about 6:30 in the evening, the dog was going to have to stay outside. Eleven hours inside was a recipe for damaged carpets.&lt;br /&gt;&lt;br /&gt;Buttons&#39;s first introduction to the kennel came last night. I put her inside and, to see what she would do. The officer was very nice, and said that they had received four phone calls complaining that the dog had barked continuously. I explained the situation, and asked if I&#39;d get in trouble if I tried her again in the kennel to see if she settled down a bit. He replied that the worst that could happen was that the neighbors would complain again, and we&#39;d have another conversation. Nice man.&lt;br /&gt;&lt;br /&gt;So Sunday morning about 9:00, before church, I put Buttons back into her kennel. She didn&#39;t make a peep at that time, nor for the next fifteen minutes or so that I observed her from behind the kitchen curtain. I left for church. Afterward, my dad and I drove a block away in his car, and watched her for a bit. She was laying quietly in her kennel, not making a sound. We drove on to lunch.&lt;br /&gt;&lt;br /&gt;Perhaps a half hour after returning home, the police car arrived. I went out on the front step and hollered, &quot;Howdy!&quot; He said &quot;Hello,&quot; in that authoritative voice that cops like to use. I said, &quot;Come on inside!&quot; He replied, &quot;I&#39;m actually busy, and have no time for you. But,&quot; he added in an angry yet commanding tone, &quot;your noisy dog problems are &lt;span style=&quot;font-style: italic;&quot;&gt;over&lt;/span&gt;! We have a &lt;span style=&quot;font-style: italic;&quot;&gt;statute&lt;/span&gt; in this town! Here&#39;s your copy of the statute and your citation!&quot; He handed me a copy of the statute, and drove off.&lt;br /&gt;&lt;br /&gt;Inside, I told my dad that there was no answer but to return her to the pound. In a touching show of heart, he offered to do the evil deed for me. I agreed to stay home and tear down the kennel, in hopes of returning it to Home Depot. He put a leash on her and led her off.&lt;br /&gt;&lt;br /&gt;It&#39;s nighttime now, and the house is very quiet. Buttons&#39;s crate is still in my son&#39;s room, pillow inside and door ajar. Her leash is still hanging on the coat hook by the door. I dread my son&#39;s return from Bible school, to hear what happened to her. The house is very quiet, and I&#39;m very alone.</description><link>http://waystination.blogspot.com/2005/07/goodbye-buttons.html</link><author>noreply@blogger.com (Len Budney)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-13428507.post-112014184706594122</guid><pubDate>Thu, 30 Jun 2005 14:30:00 +0000</pubDate><atom:updated>2005-06-30T07:30:47.076-07:00</atom:updated><title>YAPC 2005 Day 3</title><description>As before, these are my raw notes on the talks I attended at YAPC, day three. Perhaps tomorrow I&#39;ll summarize YAPC in a readable, pithy little journal entry.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Where did My Memory Go?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A useful tool for profiling memory use is &lt;span style=&quot;font-weight: bold;&quot;&gt;Devel::Size&lt;/span&gt;, which offers both size() and total_size() methods. One does, and one does not, chase references to include their size in the total. If you hand it a reference, it knows to start &quot;one level down&quot; in reporting. It also knows enough not to follow circular references forever. Presenter Dan Sugalski proceeded to demonstrate the toolkit by finding out how large some scalars, arrays and hashes are. If you want to know, this is left as an exercise for the reader.&lt;br /&gt;&lt;br /&gt;One note: &quot;foreach (&amp;lt;FILE&amp;gt;)&quot; uses more memory than &quot;while (&amp;lt;FILE&amp;gt;)&quot;. Note that assigning a filehandle read to a scalar causes the entire file to be slurped into memory temporarily, so don&#39;t do that. (Double check that I caught the scenario correctly.)&lt;br /&gt;&lt;br /&gt;Concerning garbage collection, recall that file-scoped lexicals are basically never cleaned up. The GC clears variables when they pass out of scope. If you have something very large, you should undef it using the &lt;span style=&quot;font-weight: bold;&quot;&gt;undef&lt;/span&gt; function, &lt;span style=&quot;font-style: italic;&quot;&gt;not&lt;/span&gt; by assigning undef to the variable. If you assign an empty string to a scalar, for example, the storage used by that string is not cleared, in case it&#39;s needed. On the other hand, if your variable is going to end up big again, you &lt;span style=&quot;font-style: italic;&quot;&gt;might&lt;/span&gt; want to keep it around without deallocating it--profile, don&#39;t speculate. Generally, it&#39;s a pain to undef things, but you really should use it when your structure is hogging lots of memory.&lt;br /&gt;&lt;br /&gt;Watch out for circular references, since things are only garbage collected when the reference count drops to zero. Either break the reference chain manually, or use weak references. Ise &lt;span style=&quot;font-weight: bold;&quot;&gt;Scalar::Utils&lt;/span&gt; to make weak references with the weaken() method. Do note that perl will immediately garbage collect a structure if every reference to it is weak.&lt;br /&gt;&lt;br /&gt;Also note that every version of Perl leaks memory. At least, you should use the latest version. Before 5.8, closures leaked. Parameters passed to new threads used to leak. Modifying @_ resulted in leaks before 5.6. Before 5.8.6, lots of ithread shared variables leaked.&lt;br /&gt;&lt;br /&gt;The following will determine how much memory is being used by Perl in total.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$Devel::Size::warn = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$size = total_size(*::);&lt;br /&gt;&lt;br /&gt;You can also use &lt;span style=&quot;font-weight: bold;&quot;&gt;Devel::LeakTrace&lt;/span&gt; to find some cases of unfreed variables. It tends to be whiny about globals, which makes it tricky to find the real leaks. It also slows runtime down considerably, so you should only use it in debugging.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Lazy Test Development&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Joe McMahon promises to tell us about not only lazy test development, but also the necessary evils incurred in doing that. A common situation is stepping through the debugger to locate a problem, which is also a good time to think about creating a test. Joe created a module, &lt;span style=&quot;font-weight: bold;&quot;&gt;Devel::TestEmbed&lt;/span&gt;, that pulls Test::More into the debugger, so you can create tests while debugging. An additional method allows you to save the tests when you&#39;re happy.&lt;br /&gt;&lt;br /&gt;Building the module involved fiddling with the debugger, which isn&#39;t easy to change. It&#39;s about nine KLOC. Patching the debugger implies ongoing maintenance. Fortunately, the debugger offers an external interface that lets us write extensions without touching the debugger itself. There are some resources:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* A .perldb file, included with a &quot;do&quot; into the debugger.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* afterinit() is called right before the debugger prompt is first printed.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* watchfunction() lives right inside the debugger&#39;s command loop, and is called before each prompt is printed.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* @DB::typeahead allows you to stuff commands into the buffer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* @DB::hist lets you look at prior commands.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Debugger&#39;s eval behavior can also be exploited: unrecognized commands are evaled.&lt;br /&gt;&lt;br /&gt;Putting these together, a .perldb module is written that defines watchfunction() and afterinit(), and sets a magical $DB::trace to enable the watchfunction. The afterinit() stacks the &quot;use Test::More qw(no_plan)&quot; into the command buffer, so you don&#39;t have to type it. This was necessary to get the Test::More methods into the current namespace--if it were in the .perldb, it would import test methods into &lt;span style=&quot;font-style: italic;&quot;&gt;its&lt;/span&gt; namespace. The watchfunction dynamically imports tdump() into the current namespace in the program being debugged (so it follows you no matter where you are in the program). That&#39;s all watchfunction can do, because it runs outside the debugger&#39;s command loop.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Portable Perl - how to write code that will work everywhere&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ivor Williams started by mentioning some common misconceptions: although Perl is portable, a perl app may not be. Even if your app doesn&#39;t use XS, it may not be portable. At minimum, a motivation for writing portable Perl is that CPAN modules &lt;span style=&quot;font-style: italic;&quot;&gt;should&lt;/span&gt; be written portably. Exceptions usually have their own namespace, such as Win32::.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Be lazy--use existing portable modules whenever possible&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Modularize--make plugins that wrap OS-specific stuff you can&#39;t avoid&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Follow the rules in perldoc and perlport (on which this talk is based)&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;Filesystem Issues&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The obvious portability issue in Perl is filenames. Luckily, you can completely ignore this, because POSIX paths work on Windows and VMS. The only problem with this is that there&#39;s no provision for a &quot;volume&quot; or &quot;device&quot; specifier in a path. There are also variations in allowed character sets. There is also the issue of case sensitivity.&lt;br /&gt;&lt;br /&gt;The alternative to POSIX is to use native syntax. $^0 will tell you the OS name, so you can do what you must. But you can use the &lt;span style=&quot;font-weight: bold;&quot;&gt;File::Spec&lt;/span&gt; module that handles this for you. This is OO, but you can also use &lt;span style=&quot;font-weight: bold;&quot;&gt;File::Spec::Functions&lt;/span&gt; to import functions into the namespace.&lt;br /&gt;&lt;br /&gt;Other issues include file permissions, which vary per OS, and symbolic/hard links, which are supported differently or not at all on some platforms.&lt;br /&gt;&lt;br /&gt;Specifically in VMS, files are stored according to their version. That&#39;s why some modules say &quot;while (unlink &#39;Foo&#39;)&quot; for this reason.&lt;br /&gt;&lt;br /&gt;Specifically on the Mac, files have resource forks. Ivor is too chicken to talk about them any further.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;Invoking the Shell&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Just don&#39;t do it. Commands vary between platforms, so invoking shell commands won&#39;t work portably. Shell globs will also be handled differently per OS. Environment variables can&#39;t be relied on either, such as HOME, TERM, SHELL, USER, etc. Even PATH isn&#39;t always set.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;User Interaction&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A script might be started with file descriptors redirected. If you need to interact with the user, you can&#39;t count on STDIN, STDOUT and STDERR. Reading from &quot;/dev/tty&quot; is &lt;span style=&quot;font-style: italic;&quot;&gt;very not&lt;/span&gt; portable. There&#39;s a better way specified in perlfaq 8. You can use Term::ReadKey for this purpose, though it doesn&#39;t successfully disable echo on Windows. A combination of &lt;span style=&quot;font-weight: bold;&quot;&gt;Term::ReadKey&lt;/span&gt; and &lt;span style=&quot;font-weight: bold;&quot;&gt;Term::ReadLine&lt;/span&gt; can be used to do the trick. Note that Term::ReadLine is a wrapper around either &lt;span style=&quot;font-weight: bold;&quot;&gt;Term::ReadLine::Gnu&lt;/span&gt; or &lt;span style=&quot;font-weight: bold;&quot;&gt;Term::ReadLine::Perl&lt;/span&gt;. The latter is included in the &quot;CPAN bundle&quot; that the cpan command installs for you.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;Communications&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sharing files between machines with possibly different architectures, or communicating over the network, present portability challenges. Complying with some standard is helpful. Line-ending conventions are one example of this. Perl translates &quot;\n&quot; to be correct for the platform on which the script is running, which may not be the convention of the other endpoint.&lt;br /&gt;&lt;br /&gt;Sadly you should use binmode for anything that isn&#39;t known to be an ASCII file, for portability. It matters on some platforms (though not on UNIX). This will also affect character counts depending on line conventions and applicable character set.&lt;br /&gt;&lt;br /&gt;Endianness is an issue as well. Pack and unpack have a &quot;network standard&quot; format, specified with &#39;n&#39; and &#39;N&#39;, which should be used.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;Multitasking and Job Control&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Beware of forks and threads, non-blocking I/O, etc. A portable multitasking package like POE should be used instead.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Perl Blue Magic - Creating Perl Modules and Using the CPAN&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Famed comedian Jos&amp;#x00e9; Castro returns to the limelight for this talk. CPAN has over 5,000 modules, and over 2,000 active developers. There are ~200 developers with more than 5 modules.&lt;br /&gt;&lt;br /&gt;First tip: PICK GOOD NAMES FOR YOUR MODULES! Nobody will use it if they can&#39;t find it! Here Jos&amp;#x00e9; gave a few humorous examples of useless and/or strange module names.&lt;br /&gt;&lt;br /&gt;A module has lots of junk inside, but you don&#39;t have to make it yourself. You can use &lt;span style=&quot;font-weight: bold;&quot;&gt;h2xs&lt;/span&gt; and other modules for this purpose. Just do one of these here:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;h2xs -XAn My::New::Module&lt;br /&gt;&lt;br /&gt;It creates most of what you need, excluding a License or TODO file. There are other issues with h2xs modules. That&#39;s why Jos&amp;#x00e9; recommends Module::Starter instead:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;module-starter --module=My::New::Module --author=&quot;Me, Myself&quot; --email=&quot;&lt;a href=&quot;mailto:me@me.com&quot;&gt;me@me.com&lt;/a&gt;&quot;&lt;br /&gt;&lt;br /&gt;You can also use &lt;span style=&quot;font-weight: bold;&quot;&gt;ExtUtils::ModuleMaker&lt;/span&gt;. It prompts you through the creation process. You can also get help on &lt;a href=&quot;mailto:module-authors@perl.org&quot;&gt;module-authors@perl.org&lt;/a&gt; and &lt;a href=&quot;mailto:modules@perl.org&quot;&gt;modules@perl.org&lt;/a&gt;. But whatever you use, you should:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Have an idea - make sure it isn&#39;t already done&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Document it - make sure you know how you plan to do it&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Write tests&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Code&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Test&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Ship&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Maintain&lt;br /&gt;&lt;br /&gt;Documentation should contain the following stuff: name; synopsis; other things generally provided in the template by the above-mentioned utilities. Make darn sure you include acknowledgements! Note that if the version number contains an underscore, CPAN marks it as a developers&#39; version.&lt;br /&gt;&lt;br /&gt;If you ask for a PAUSE ID, and are rejected, resubmit your application. The guy that handles the apps sometimes forgets.&lt;br /&gt;&lt;br /&gt;Modules are &quot;registered&quot; when someone associated with CPAN decides they&#39;re &quot;good&quot;. Given a choice, pick the registered modules.&lt;br /&gt;&lt;br /&gt;Don&#39;t submit more modules than you can maintain.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Lightning Talks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is a series of five-minute talks. The pace is supposed to be fast, so my notes will be pretty skeletal.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Five Development Tools I Can&#39;t Live Without&lt;/span&gt;&lt;br /&gt;Casey West&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;span style=&quot;font-weight: bold;&quot;&gt;SQL::Translator&lt;/span&gt; can convert schemas from one DB format to another. It can also create a diagram&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;span style=&quot;font-weight: bold;&quot;&gt;HTTP::Server::Simple::Static&lt;/span&gt; provides a tiny web server without Apache&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;span style=&quot;font-weight: bold;&quot;&gt;Devel::Cover&lt;/span&gt; for coverage analysis&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;span style=&quot;font-weight: bold;&quot;&gt;podwebserver&lt;/span&gt; an index of the stuff you have installed&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;span style=&quot;font-weight: bold;&quot;&gt;Perl::Tidy&lt;/span&gt; to neaten perl code&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;span style=&quot;font-weight: bold;&quot;&gt;Test::Pod::Coverage&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;span style=&quot;font-weight: bold;&quot;&gt;DBI::Shell&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;span style=&quot;font-weight: bold;&quot;&gt;Module::Refresh&lt;/span&gt; refreshes changed modules in a running script&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;span style=&quot;font-weight: bold;&quot;&gt;CPAN::Mini&lt;/span&gt; to provide a local copy of the latest CPAN modules&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Refactoring Web Applications&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* What? Refactoring&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* When? Before adding a feature&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Why? To simplify feature additions&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* How? WWW::Mechanize and AT&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;DBD::SQLLite Intro&lt;/span&gt;&lt;br /&gt;Zachary Zebrowski&lt;br /&gt;&lt;br /&gt;SQLLite is a small OSS DB in a single executable. It is ACID compliant and supports up to two terabytes of data. It has bindings for multiple languages and stores the entire DB in a single file. The file can be moved across platforms and still work. It&#39;s handy for rapid prototyping, local tests, etc. On the flip side, it&#39;s a single-user DB and isn&#39;t networked.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Thirty Seconds or Less&lt;/span&gt;&lt;br /&gt;Larry something-or-other&lt;br /&gt;&lt;br /&gt;Couldn&#39;t get co-workers to learn Wiki markup. He responded to this situation by adding even more markup to his preferred Wiki.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;OpenGuides&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;An application for developing collaborative City guides in a wiki-like way.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Credit Cards&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are new security rules that apply to all merchants. Printed, they&#39;re an inch and a half thick. Compliance can be costly. Fines for non-compliance are also heavy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;CPAN Envy&lt;/span&gt;&lt;br /&gt;Casey West(?)&lt;br /&gt;&lt;br /&gt;Schwern tried to convince people to create a Javascript repository. CW decided to go ahead and create it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Regexp::Compost&lt;/span&gt;&lt;br /&gt;Paul Shields&lt;br /&gt;&lt;br /&gt;A perl module that takes as its input a text and produces a list of regexes that match that (and similar) texts. It exhibits an interesting heuristic for trying to create a regex that &quot;fuzzily&quot; matches a sample corpus of texts.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;What Has Meng Been Up To Lately?&lt;/span&gt;&lt;br /&gt;Meng Weng Wong&lt;br /&gt;&lt;br /&gt;Two years ago SPF was born at YAPC in FL. Microsoft decided to &quot;embrace it and extend it to Sender ID, which will roll out in Hotmail and Outlook. On the subject of DK, Meng tried to throw FUD in the air by pointing out that PGP and S/MIME &quot;didn&#39;t work&quot;. He&#39;s also fooling with methods of implementing &quot;collaborative blacklists&quot; called &quot;Karma&quot;. From there he went on to describe something that boils down to IM2000.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Perlcast&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A podcast dedicated to Perl. Go listen if you&#39;re interested.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Annotating CPAN&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The idea is to permit users to annotate packages, particularly where they thing there&#39;s a gap in the documentation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;A Mail Server in Perl&lt;/span&gt;&lt;br /&gt;Matt Sergeant&lt;br /&gt;&lt;br /&gt;Matt maintains QPSMTPD. It reputedly handles ~1M messages per day on some hosts.The author bills it as mod_perl for email.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description><link>http://waystination.blogspot.com/2005/06/yapc-2005-day-3.html</link><author>noreply@blogger.com (Len Budney)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-13428507.post-112005094388958567</guid><pubDate>Wed, 29 Jun 2005 13:15:00 +0000</pubDate><atom:updated>2005-06-29T06:15:43.903-07:00</atom:updated><title>YAPC 2005 Day 2</title><description>&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Day 2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As before, these are my raw notes from the talks attended on day 2 of the YAPC conference.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Apocalypse Now - Perl 6 is Here Today!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;Part I&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Autrijus Tang attempted to comfort the crowd by pointing out that the transition from Perl 4 to Perl 5 did manage to complete successfully. And by analogy, if that transition took years, we shouldn&#39;t lose hope for this one.&lt;br /&gt;&lt;br /&gt;Reviewing the features of Perl 4, Autrijius mentioned modules, closures, references and CPAN. As of today, CPAN has more than 8,000 modules by more than 2,500 authors. It also offers a tool for automatic download, testing and installation. CPAN is the greatest thing ever to happen to Perl. However, Perl is not necessarily the greatest thing to happen to CPAN. The Perl5 syntax imposes a tax on CPAN users.&lt;br /&gt;&lt;br /&gt;For example, sigils and references don&#39;t really behave consistently:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;%h&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$$s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$a[0]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$h{&#39;!&#39;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$s-&amp;gt;foo()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:-(&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:-(&lt;br /&gt;&lt;br /&gt;One explains to a newbie that the &#39;$&#39; sigil indicates a singleton, whereas &#39;@&#39; indicates a multiplicity, and &#39;%&#39; indicates a multiplicity tagged with names. But when dereferencing a reference, the &#39;$&#39; operator doesn&#39;t indicate anything about cardinality.&lt;br /&gt;&lt;br /&gt;As another example, there is considerable forced redundancy. The line &quot;my $self = shift&#39; may be as much as 10% of your code, if you write nice short subroutines like you should. The book &quot;Higher-Order Perl&quot; offers all sorts of fancy technology, but about 50% of it is nothing but bookkeeping.&lt;br /&gt;&lt;br /&gt;We&#39;re used to this &quot;language tax&quot;, because the language is useful enough to make us tolerate the cost. But in Perl 6, the tax is not necessary. In the case of sigils above, the situation resolves to:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;%h&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$$s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&amp;lt;crap, he switched slides too fast&amp;gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;Another savings pertains to &quot;perl&quot; the runtime engine, as opposed to &quot;perl&quot; the language. XS modules in Perl 5 are difficult to write and to maintain. Backward compatibility prevents us from cleaning up that situation. One engineer likened this situation to a game of Jenga: we have a convoluted pile of sticks, and we enhance it by piling more on top while creating holes lower down. All the guts of Perl have multiple applications because we&#39;re forced to keep drawing sticks from elsewhere in the pile.&lt;br /&gt;&lt;br /&gt;Inventive CPAN authors began creating Perl 5 dialects, using source filters created with tools like Filter::Simple to build a &quot;preprocessor&quot; stage. These dialects are mutually incompatible. Source filters are guaranteed not to work together, because each expects a strange dialect as its input.&lt;br /&gt;&lt;br /&gt;Another problem in Perl 5 is that the regex syntax imposes an arbitrary limit on what can be done. Similarly with operators and other aspects of the grammar. The Perl regex engine is not re-entrant, so modules built on them are guaranteed to be fragile.&lt;br /&gt;&lt;br /&gt;OO and functional code unfairly handicaps golfers. Golfers always converge on line-based text processing with y// and s// as their two main operators, because the syntax becomes too verbose elsewhere in the language. Unfortunately, that affects regular programmers instead of golfers, because we always take the path of least resistance.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;Fast Forward to Perl 6&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Perl 6 is faster: soft, incrementally typed, with program-wide optimizations. Stronger types can be retro-fitted to a program. It&#39;s also friendlier: you can call Perl5, C, Tcl or Python libraries directly. It&#39;s also easier: common usage patterns are dramatically shortened. You can even read a one-liner with comprehension! It&#39;s stronger, because it includes support for OO, Functional and Data-driven styles. It&#39;s leaner because it offers sane semantics instead of endless workarounds (that have become entrenched idioms, of course).&lt;br /&gt;&lt;br /&gt;Autrijus then demonstrated a perl 6 script for uploading modules to CPAN. It was written to be interpreted using pugs, and has some workarounds for perl6 weaknesses by evaling some code in a perl5 context. You can run all your perl5 code under perl6 by writing a perl6 script that pulls it in and runs it. But before you laugh, remember that the early perl5 scripts still used perl4 libraries, because there wasn&#39;t a body of perl5 libraries available. The first perl6 scripts will behave similarly.&lt;br /&gt;&lt;br /&gt;Today the pugs interpreter cheats by linking in libperl, so of course it works. As an aside, it is also subject to perl5 garbage collection bugs as well.&lt;br /&gt;&lt;br /&gt;Going the other way, you can imbed perl6 code in perl5 scripts by invoking the &quot;use pugs&quot; pragma in your perl5 code. You can turn off the perl6 behavior with the &quot;no pugs&quot; pragma. That works today (but, not very well). Sicne it uses Inline::Pugs and source filters, it won&#39;t play nicely with source filters. It also invokes a pugs process and shuffles code back and forth to it, so you can&#39;t use it with things like DBI. Don&#39;t use it in production today. Folks are trying to fix it up so it works more reliably--stay tuned for the second part of the talk. You can get the pugs stuff at &lt;a href=&quot;http://www.pugscode.org/&quot;&gt;http://www.pugscode.org/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In response to a question, Autrijus replied that he has no idea when the perl6 camel book will come out. There are two books on the market already--the only problem being that 50% of the material is outdated, and you don&#39;t know which 50%. The questioner seemed a bit frustrated and kept demanding some hint when perl6 will be production quality. He turned the question around beautifully by suggesting that the questioner could do a great deal to hasten the day.&lt;br /&gt;&lt;br /&gt;Pugs was started on Feb 1, so it&#39;s only five months old. It started as an exercise based on &quot;Types and Programming Languages&quot;, which is another recommendable book, along with &quot;Higher-Order Perl&quot;. The exercise at the end of the book said, &quot;Implement a small language that you know of.&quot; (There was general laughter at this point.) The first cut took only two days, because it was written in Haskell. Haskell is optimized for compiler writing. As an aside, Autrijus commented that Perl 5 closures leak memory horribly. Switching to lazy references resulted in random seg-faults. These problems are what drove him to use Haskell.&lt;br /&gt;&lt;br /&gt;Autrijus summarized the progress to date, but it was a list of test scripts and such, so I didn&#39;t write it all down. Recently, someone created a pugs-based IRC bot called evalbot, so IRC users can test evaluate perl6 commands. The most popular command seems to be &#39;system(&quot;rm -rf /&quot;)&#39;, but &quot;we aren&#39;t completely mad, so that doesn&#39;t work.&quot; Haskell makes it easy to identify unsafe commands, so a safe mode was created that prevents users from doing things like &quot;print&quot; or &quot;system&quot;.&lt;br /&gt;&lt;br /&gt;Pugs has over 100 committers, mostly because Autrijus hands out committer permissions to passers by. There have been over 5,000 revisions committed. There seems to be a positive feedback cycle, because when someone commits something, they seem to commit to something. Autrijus&#39;s own contributions are falling off over time--currently, below 40% of commits. His main function is maintaining a pugs journal and praising contributors.&lt;br /&gt;&lt;br /&gt;The &quot;State of the Carrot&quot; speech claimed that pugs covers 80% of Perl 6 semantics, but that&#39;s wishful thinking. To a first-order approximation, some 30% of the semantics is covered. There are 7,000 automated tests today, with another 15,000 anticipated.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;Part II&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you&#39;re interested in contributing to pugs, the first rule is: to report a bug, write a test. &lt;span style=&quot;font-weight: bold;&quot;&gt;Test.pm&lt;/span&gt; is really simple to use, if Autrijus does say so himself. A pretty little graph created by &lt;span style=&quot;font-weight: bold;&quot;&gt;Test::TAP::HTMLMatrix&lt;/span&gt; that shows passed tests (green), failed tests (red), todos (dark green), etc. One cute aspect of this tool is that, if tests == bug reports, and tests are added to the end of a test script, then red marks at the end of the graph generally represent new bugs.&lt;br /&gt;&lt;br /&gt;One attendee asked about the problem of submitted tests that are wrong, or that don&#39;t test what they purport to test. Autrijus replied that it isn&#39;t common, but it isn&#39;t rare either--perhaps 10% of submitted tests have some kind of problem. In the course of maintaining his journal, Autrijus reviews every patch. Others perform code reviews in the case of their work.&lt;br /&gt;&lt;br /&gt;Current efforts in pugs concern OO. Introspection and roles are not underway yet. Once the OO features are working, work will focus on rules. Closures don&#39;t work yet.&lt;br /&gt;&lt;br /&gt;Some benefits of Perl 6:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Simplicity&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Clarity--different constructs look different, such as string eval and block eval (the latter being renamed &quot;try&quot;).&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Sub names are clearer--for example, several clear names replace multi-purpose &quot;length&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Brevity: the dot notation saves keystrokes over the arrow notation&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Implicit parameters are removed (such as $a and $b in sorts)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Operator overloading&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Method overloading via type-based dispatch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Some new operators like &quot;yada yada yada&quot; and &quot;defined or&quot; (&quot;$arg //= 3&quot; means &quot;$arg = 3 unless defined $arg&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Operator chaining (using transitivity)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &quot;Hyper&quot; operators that apply to an entire array&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Reduction operators that collapse a list by means of an operation&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Junctions are useful for situations in which complex conditionals are used&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Type globs are history&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Smart match (~~) replaces (=~) but has extra coolness like &quot;$a ~~ any(&amp;lt;1, 2, 3&amp;gt;)&quot; (not sure of exact syntax)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Exception handling is unified under $!&lt;br /&gt;&lt;br /&gt;Some people are distressed that dot as string concatenator is replaced with the tilda. But don&#39;t worry: interpolation is so darn good, that the operator is practically obsolete. One attendee complained because he uses &quot;.=&quot; all the time.&lt;br /&gt;&lt;br /&gt;Perl 6 has switch statements! They&#39;re coded using &quot;given / when&quot;.&lt;br /&gt;&lt;br /&gt;Problems with Pugs:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Can&#39;t emit compile-time errors&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* No support for warnings or strictness&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Slow -- dispatch is 100x slower than perl5&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &amp;lt;&amp;lt;missed the last one&amp;gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;There are also parsing problems due to the ambiguity of Perl and the difficulty of optimizing parrot assembly, so PIL, the Perl Intermediate Langauge, was invented. PIL has far fewer node types (namely 16 at the moment). The result is a sort of &quot;diet perl 6&quot;, perl6 like with no syntactic sugar left. PIL is still under development, so it isn&#39;t finalized, but it is stable. Other languages may or may not be translatable into PIL.&lt;br /&gt;&lt;br /&gt;Note that in the &quot;real&quot; perl 6, the compiler may well not be self-hosting. Among other reasons, proponents of other languages may not like haivng a compiler written in Perl. So Perl/Parot is not the same as C#/.Net. Pugs is entirely different. It wants to become self-hosting, because it&#39;s cool to be self-hosting, and it&#39;s also desirable to run perl 6 on the perl 5 vm, or to compile to C or some other backend. Self-hosting yields benefits:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Well-defined semantics (or it won&#39;t work)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Less chance of misfeatures like &quot;my $x if 0&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Eliminates the low-level black box (such as XS or parrot assembly)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Proves that Perl 6 can handle complex tasks like compiler writing--Perl 5 was weak in this area&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Status of the Perl 6 Compiler&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Patrick Michaud followed up Autrijus&#39;s report on pugs with the status of the &quot;official&quot; compiler. Perl 6 embraces more than the Perl six language itself. Interoperability with other languages is also a high priority, which involves a runtime environment compatible with multiple languages (Parrot), a suitable suite of development tools, and a platform for code development. As Larry said, we both should and should not implement Perl 6 in Perl 6.&lt;br /&gt;&lt;br /&gt;In short, Perl 6 isn&#39;t there yet. The specs are firming up, but still incomplete. Deficiencies in parrot are impacting the compiler now.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Parrot in Detail&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;What Parrot Is&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Parrot is a multi-language VM intended as the interpreter for Perl 6. It started as an April fool&#39;s joke that got out of hand. VMs get you several things: platform independence; impedance matching; high-level base platform; good target for a particular class of languages. The major components are the parser, compiler, optimizer, and interpreter. &lt;br /&gt;&lt;br /&gt;The Parser converts source code into an abstract symbol tree. The Perl 6 parser can be overridden: new tokens can be added; existing tokens can have their meaning changed; languages can be swapped out. All of this will be accomplished using Perl 6 grammars. Perl 6 grammars are immensely powerful. They&#39;re a combination of perl 5 regexes, lex and yacc.&lt;br /&gt;&lt;br /&gt;The Compiler turns AST into bytecode. Like the parser, it&#39;s overridable in perl 6. Conceptually, it&#39;s just a fancy regex. It doesn&#39;t perform any optimizations at all. These tools help in building compilers, which is a standard task but involves a lot of work. There isn&#39;t much in the way of complexity here. Even lisp programmers won&#39;t pretend to have invented it.&lt;br /&gt;&lt;br /&gt;The VM is a &quot;bytecode engine&quot; based on 32-bit words. Programs are (or at least can be) precompiled and then loaded from disk. USually no transformation at all is needed at runtime. Most opcodes can be overridden, and the bytecode loader can be overridden. Dynamic opcodes can be used for cool things like loading uncommon functions only on demand.&lt;br /&gt;&lt;br /&gt;The VM is register based, having four sets of 32 registers: Integer, String, Float and PMC. The registers are a fast set of temporary locations--all opcodes operate on registers. There are also six stacks: one for each set of registers; one generic stack and one call stack. Stacks are segmented, but have no size limit.&lt;br /&gt;&lt;br /&gt;The strings data type is a high-level data type, consisting of a buffer, a length field, and a set of flags. Flags cover things like character set, encoding and length in characters (rather than bytes).&lt;br /&gt;&lt;br /&gt;The PMC type wraps the equivalent of Perl 5&#39;s variables. Tying, overloading and magic are all swept under that rug, as are arrays, hashes and scalars. All operations on PMCs use the multi-method dispatch core (MMC). This is a recent change, and simplifies vtables and other things. It improves performance, because most interesting PMCs end up using MMC anyway. All PMCs can potentially be treated as aggregate structures: vtable entries have a _keyed variant, and the vtable must decide whether the key is valid.&lt;br /&gt;&lt;br /&gt;Objects divide into two types: reference objects and value objects. So objects may or may not be accessed by reference. This makes it possible to handle objects in the same way as low-level types.&lt;br /&gt;&lt;br /&gt;At this point the two speakers began flying through the slides, so it became impossible to keep up for a little while.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;Why Parrot?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The biggest deficiency of the JVM and the CLR is that they&#39;re designed around static code. Classes can&#39;t be changed at runtime in the JVM; existing things can&#39;t be fiddled with in the CLR; etc. The parrot runtime will support that sort of perlish flexibility. In addition, a VM permits interoperability between different scripting languages, which takes TMTOWTDI to a new level. Today there are lots of inter-compatibility shims, but they grow like n!, where a common runtime permits n^2 growth.&lt;br /&gt;&lt;br /&gt;On the other hand, why not parrot? Why hasn&#39;t it been adopted yet? Why is the community so small? The first question is, what constitutes a user  of parrot? People running parrot applications are not &quot;parrot users&quot;, and more than someone running an applet in a browser is a &quot;java user&quot;. The developers are the users. Current major users are Pugs, Tcl (ParTcl) and Perl 5 (Ponie). Folks that gave up on parrot often did so because their stress level was too high. They got tired of the moving target, and other things.&lt;br /&gt;&lt;br /&gt;Parrot is a platform, which means that it lives or dies on the apps that others write for it. The project&#39;s biggest need is developers. The most important of those contributions are pugs and PGE. Another critical need is to keep the specs and design documents up to date. Another is tests: the best way to record a missing feature is to create a test that checks for it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Parrot Grammar Engine&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Patrick Michaud opened with the remark that Perl regexes have been so successful that of course they&#39;re being thrown away. For the purposes of this talk, &quot;rules&quot; are perl 6 regexes, and &quot;regexes&quot; are perl 5 regexes.&lt;br /&gt;&lt;br /&gt;A brief overview of the rule syntax comes from &quot;Apocalypse 5&quot;, though that document is really out of date now.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Capturing is still done with parens&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Star, + and ? work the same&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Pipes represent alternatives&lt;br /&gt;&lt;br /&gt;On the other hand, modifiers go at the start of the expression rather than the end. The /e modifier has gone away: if you want a code block, stick one in there. The /x option is now the default. There are no more /s and /m modifiers; there are new metacharacters. The :w or :words modifier treats whitespace in the pattern as \s* or \s+. There are also new modifiers like :exhaustive, :keepall, :overlap and :perl5.&lt;br /&gt;&lt;br /&gt;Among metacharacters, the dot now matches newlines. The ^ and $ always anchor to the start and end of the string. Double ^^ and $$ match beginnings and ends of lines. The # always introduces a comment. Whitespace is metasyntactic depending on the :w setting. Now \n matches newline in a platform independent way, and \N matches anything but (like the perl 5 dot). Now &amp; is a conjunctive match.&lt;br /&gt;&lt;br /&gt;Asked for an example of &amp; in use, he replied, he couldn&#39;t give a very clear example. He did remark that ampersands can be changed as long as you like, and every item in the chain eats the same number of characters, or the match is a failure.&lt;br /&gt;&lt;br /&gt;Although parens capture, numbering is different.&lt;br /&gt;&lt;br /&gt;Now square brackets are non-capturing groups, instead of the ugly glyph. Enumerated character classes are &amp;lt;[...]&amp;gt; instead of [].&lt;br /&gt;&lt;br /&gt;Curly braces are now no longer a repetition quantifier--it&#39;s an embedded closure that is called at that point in the match.&lt;br /&gt;&lt;br /&gt;The repetition specifier is now **{...} for maximal matching and **{..}? for minimal matching.&lt;br /&gt;&lt;br /&gt;Scalar variables in a rule expression are matched as literally, not as a sub-pattern. I.e., /$var/ matches the content of $var exactly, not $var interpreted as a pattern.&lt;br /&gt;&lt;br /&gt;Array references match as the &quot;or&quot; of the elements in the list.&lt;br /&gt;&lt;br /&gt;A hash in a pattern causes a match on the longest matching key. The value can be a closure, a sub-rule, the value 1, or else indicates failure. That&#39;s useful for building lexers that match according to the &quot;longest matching token&quot; rule.&lt;br /&gt;&lt;br /&gt;Angle brackets are heavily overloaded. For starters, a pair of angle brackets whose first content character is alphabetic is interpreted as the name of a capturing subrule. Preceding that character with ? makes it a non-capturing version. A leading ! indicates a negative match. Enumerated character classes are enclosed by &amp;lt;[...]&amp;gt;. Unescaped hyphens are forbidden, because hyphens are not used to indicate a range--you should use .. instead. A negated character class is given by &amp;lt;-[..]&amp;gt;. Plus/minus characters are used to combine subrules and character classes.&lt;br /&gt;&lt;br /&gt;To interpolate a string into a rule, use $var. This eliminates escaping problems, among other things.&lt;br /&gt;&lt;br /&gt;Double quotes are used to interpolate into a literal match, whatever the heck that means exactly.&lt;br /&gt;&lt;br /&gt;Colons are used to control back-tracking behavior. A single colon forbids the rule engine to backtrack past the colon. Backtracking over a double colon causes the current set of alternations to fail. Backtracking over a triple colon causes the entire rule (or subrule) to fail. Backtracking over &amp;lt;commit&amp;gt; causes the entire match to fail (even if it&#39;s located within a rule). The &amp;lt;cut&amp;gt; assertion is like &amp;lt;commit&amp;gt;, but also deletes the matched portion of the string.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;Capturing and Subrules&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;None of this stuff is in synopsis 5, which wasn&#39;t clear about how capturing works. It&#39;s something like this:&lt;br /&gt;&lt;br /&gt;Every invocation of a rule returns a &quot;match&quot; object, which goes into a lexically scoped $/ (instead of perl 5&#39;s $0). The boolean value of $/ is true if the match was successful, otherwise false. The string value of $/ is the substring of the pattern matched. The array value of $/ contains the matches for subpatterns in parens. These can also be accessed as $0, $1, etc.&lt;br /&gt;&lt;br /&gt;When performing a match, any capturing subpattern generates its own match object, which is stuck in the appropriate place in the parent rule&#39;s match object. One consequence is that we can no longer count parens to determine the location of the match object, because the match objects are arranged in a tree. Non-capturing patterns don&#39;t impose a capturing scope, so they don&#39;t force branching in a tree. But what about quantifiers?&lt;br /&gt;&lt;br /&gt;When a pattern is quantified with + or * (but not ?), it produces an array of match objects--one for each match that took place. This is true regardless of the number of matches that occurred--the list can be empty or a singleton. This makes for all sorts of interesting weirdness when you factor non-capturing patterns into the mix:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/ [ \w+ (\s+) ]* / yields:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$/[0]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;An array of match objects&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$/[0][0]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Whitespace of first iteration&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$/[0][2]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Whitespace of second iteration, etc.&lt;br /&gt;&lt;br /&gt;Subrules look just like subpatterns, but they capture to a match object&#39;s hash with the name of the subrule as the key. So in the pattern /&amp;lt;digit&amp;gt;/, the match is stuck into $/&amp;lt;digit&amp;gt; or $/{digit}. So I gather that wedges can be used for subscripting a hash now. Interesting. (In response to my question, Pat stated that it&#39;s &quot;basically a qw&quot;.) If the same rule is used more than once, the matches are gathered into an array keyed by the rule name.  Sets of named rules can be combined easily to build parsers. Like that ain&#39;t bleedin&#39; obvious, since $/ is a bleedin&#39; &lt;span style=&quot;font-style: italic;&quot;&gt;parse tree&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;Each call to a rule generates a coroutine. A coroutine is a subroutine that returns control to the caller, but can be restarted where it left off with its state intact.&lt;br /&gt;&lt;br /&gt;Currently the PGE expression parser is a recursive descent parser with thirteen node types (at the moment). The most complicated part of the parser is the handling of groups and subrules.&lt;br /&gt;&lt;br /&gt;Using PGE&lt;br /&gt;&lt;br /&gt;PGE builids as part of parrot. To run it, you want to load the PGE module and use p6rule. He went past quickly with the screen, so I&#39;ll need to check the details online.&lt;br /&gt;&lt;br /&gt;A grammar is any class derived from PGE::Rule that contains rule methods. Thus one can create a new grammar in a straightforward way. Subrules, on the other hand, aren&#39;t &lt;span style=&quot;font-style: italic;&quot;&gt;necessarily&lt;/span&gt; rules. Any subroutine that returns a Match PMC with some appropriate attributes can be used as a subrule. This can be used as a path to creating parsers that don&#39;t operate by recursive descent, or at least don&#39;t use it for particular subsets of the language.</description><link>http://waystination.blogspot.com/2005/06/yapc-2005-day-2.html</link><author>noreply@blogger.com (Len Budney)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-13428507.post-111992971570455312</guid><pubDate>Tue, 28 Jun 2005 03:35:00 +0000</pubDate><atom:updated>2005-06-27T20:35:15.720-07:00</atom:updated><title>YAPC 2005 Day One</title><description>This week I&#39;m attending the North American YAPC (Yet Another Perl Conference) in Toronto. This is my first YAPC, since I didn&#39;t make it to Buffalo last year.&lt;br /&gt;&lt;br /&gt;It&#39;s an interesting display of organizational prowess, so far. Last night the schedule said we could register between 22:00 and 23:00, but when we arrived there were no registration personnel to be found. The conference organizers present had no keys to the room with the nametags and t-shirts. The next morning, when we returned to register, one of the staffers put out a call for a video camera to record the proceedings (or at least the keynote).&lt;br /&gt;&lt;br /&gt;We&#39;re now into the &quot;opening ceremonies&quot;, scheduled for 9:00 but beginning at 9:30. Glad it&#39;s not me trying to organize this thing--I&#39;d be frazzled silly.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Keynote: Larry Wall&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Larry opened his remarks with a picture of the Golden Gate Bridge, and described his talk as &quot;bridges and other things&quot;. His focus was on the idea of building communities, particularly of course the Perl community. He suggested that the right questions for OSS authors to ask are:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Who will naturally be interested in my project?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Who are we accidentally/purposely excluding from our project?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Who should lead/follow/contribute?&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* What is the goal of our community?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* What can people contribute?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* What are the community&#39;s rules and structure?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* What&#39;s in it for the volunteers?&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Where will the community meet in cyber/physical space?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Where can sub-communities form, either by design or spontaneously?&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* When is it too soon to form a community?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* When does the community reach a &quot;tipping point&quot;?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* When is it time to form sub-communities?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* When is the right time to fork?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* When are we done?&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Why do we &lt;span style=&quot;font-style: italic;&quot;&gt;really&lt;/span&gt; want a community?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Why do people join and leave the community?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Why do people fight and stop fighting?&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* How do we do it?&lt;br /&gt;&lt;br /&gt;On the question of when to form a community, Larry remarked that in the first days of Perl, users proposed that Larry start a Perl newsgroup. He resisted this request for about a year, because he wanted Perl users to infest the shell-users&#39; newsgroups. As a result, Perl users promoted Perl by injecting Perl-ish solutions in addition to shell-ish ones.&lt;br /&gt;&lt;br /&gt;Concerning the question of our &lt;span style=&quot;font-style: italic;&quot;&gt;real&lt;/span&gt; motivations for starting a community, Larry remarked that the desire for a large pool of free labor isn&#39;t a very good motivation for community building.&lt;br /&gt;&lt;br /&gt;Waxing philosophical, Larry invoked the idea of &quot;&lt;span style=&quot;font-weight: bold;&quot;&gt;tensegrity&lt;/span&gt;&quot;, or &quot;tensional integrity&quot;. The idea is that a stable structure results from balancing the forces that &quot;pull&quot; and the forces that &quot;push&quot;. He accompanied this with several pretty pictures involving rods and rubber bands. By contrast, he suggested that the &quot;geek&quot; community resembles a big pile of rocks (geeks)--disorganized, formless, and without opposing forces (each member autistic to one degree or other). The linux community might be represented as a few stone pillars (distributions) around a beach, with Linus at the top, and where of course the users are dirt. A militaristic model would be a single tall tower--stratified, in which pecking order is the foremost consideration.&lt;br /&gt;&lt;br /&gt;A more dynamic community exhibiting &quot;tensegrity&quot; involves both pushers and pullers, and requires us to grapple with seeming contradictions. The result of such a dynamic is &quot;larger structures that don&#39;t fall down&quot;. Among the &quot;contradictions&quot; that must be reconciled to build a community are:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1. People are naturally good / bad.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2. People love / hate new ideas.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3. People love / hate outsiders.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4. People should all be alike / different.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5. People should / shouldn&#39;t be in charge of others.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6. It should be easy / hard to break into the community.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7. We should / shouldn&#39;t try hard to keep people in.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8. Specialization is good / bad.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9. People volunteer for altruistic / selfish reasons.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10. We do / don&#39;t need a benevolent dictator.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;11. Larry Wall is important / unimportant. Or more to the point, he&#39;s a genius / idiot.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;12. Modernism is good / bad.&lt;br /&gt;&lt;br /&gt;From there he rambled off into a discussion of &quot;natural communities&quot; from a darwinian perspective, invoking notions like a &quot;large gene pool&quot;, &quot;speciation&quot;, &quot;range of variation&quot;, etc. He suggested that part of what&#39;s keeping Perl 6 is the effort to ensure that it&#39;s modeled on natural communities that thrive, rather than those that go extinct. For example, the Perl 5 community is seen by Larry as neither sufficiently unified nor sufficiently diverse.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-style: italic;&quot;&gt;A community needs to share a set of core values, but also to allow honest differences on the periphery.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A technological solution to these set of problems both is and isn&#39;t possible. On the positive side, Perl 6 will have a finer-grained extension mechanism. Among other things, scoping will be clarified and cleaned up. A CPAN-like repository can provide a gene pool. We can separate combatants, if we can convince them to join separate mailing lists. Technologically, we can at least provide enough mailing lists for hostile tribes to coexist peaceably.&lt;br /&gt;&lt;br /&gt;On the negative side, people are still basically irrational. One way to mitigate this is to look for cheerleading opportunities. We can try to tolerate differences within the community, but it ain&#39;t easy. We want to encourage and discourage cultism. We want to &quot;have fun&quot;, but we can&#39;t always. Sometimes building a community involves submitting to crucifixion.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Allison Randal: The State of the Carrot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A &quot;carrot&quot; is what you get when you cross a camel with a parrot. Allison read a parody based on &quot;The Hunting of the Snark&quot;.&lt;br /&gt;&lt;br /&gt;Over the past year Perl 5 has experienced a bunch of fixes and optimizations. More interestingly, &lt;span style=&quot;font-style: italic;&quot;&gt;reverse sort&lt;/span&gt; no longer uses an intermediate list, which improves performance. Some setuidperl exploits have been fixed. PLEASE stop using setuidperl. Another &lt;span style=&quot;font-style: italic;&quot;&gt;-Dusersitecustomize&lt;/span&gt; option permits customization of @INC using a site customization script.&lt;br /&gt;&lt;br /&gt;On the Perl 6 front, there are many pieces.&lt;br /&gt;&lt;br /&gt;At the bottom is &lt;span style=&quot;font-weight: bold;&quot;&gt;Parrot&lt;/span&gt;, the VM for Perl. There was the parrot 0.1.1 release last october, including incremental garbage collection and a &quot;make install&quot; target. Parrot has moved to subversion in version 0.2.0. Current version is 0.2.1.&lt;br /&gt;&lt;br /&gt;Next is &lt;span style=&quot;font-weight: bold;&quot;&gt;Ponie&lt;/span&gt;, the Perl 5 compatibility layer. Snapshot 4 was released today. Ponie work has benefited Perl 5 as well, because improvements made in Ponie are being back-ported to Perl 5.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Pugs&lt;/span&gt; is a Perl 6 prototype. Some 80-90% of the Perl 6 semantics have been implemented already. It&#39;s currently written in Haskell, but ultimately it should be written in Perl 6.&lt;br /&gt;&lt;br /&gt;Allison also reported some things about the funding of the Perl foundation, Perl Mongers and Perl Monks. There&#39;s a new Perl logo (a pearl onion) that can be used without legal encumbrance, because O&#39;Reilly owns the camel.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Session 1: The Tester&#39;s Toolkit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pete Krawczyk opened with the usual ra-ra in favor of automated regression testing: tests supplement documentation; they facilitate bug reports; reduce maintenance costs, etc.&lt;br /&gt;&lt;br /&gt;A &quot;test&quot; is a perl program with extra modules, that reports actual versus expected results. Tests are usually invoked via a &quot;test&quot; target in the makefile. Another useful command, as of Perl 5.8.3, is &quot;prove&quot;, which runs a directory of tests. A script named t/TEST is also sometimes used. But since a test is a Perl script, you can run it by hand (but without the summary features provided by the test harness). Example code for this talk is found in the Acme::PETEK::Testkit module.&lt;br /&gt;&lt;br /&gt;Considerations when writing tests:&lt;br /&gt;&lt;br /&gt;1. &lt;span style=&quot;font-style: italic;&quot;&gt;Make sure most important code is tested.&lt;/span&gt; People don&#39;t actually test every branch of code, and ROI diminishes as you jump through hoops trying to achieve complete coverage. Conversely, from zero tests, every added test is an improvement.&lt;br /&gt;2. &lt;span style=&quot;font-style: italic;&quot;&gt;Test scripts should have a &quot;plan&quot;.&lt;/span&gt;&lt;br /&gt;3. &lt;span style=&quot;font-style: italic;&quot;&gt;Don&#39;t print to STDOUT! Use diag() instead.&lt;/span&gt; Testing scripts that print to stdout may involve extra work to capture output.&lt;br /&gt;4. &lt;span style=&quot;font-style: italic;&quot;&gt;Test for failure as well as success.&lt;/span&gt; &lt;br /&gt;5. &lt;span style=&quot;font-style: italic;&quot;&gt;Give tests a description.&lt;/span&gt; If you don&#39;t you&#39;ll be stuck figuring out which one was &quot;test 50046&quot;.&lt;br /&gt;&lt;br /&gt;Moving on to testing specifics, Pete introduced &lt;span style=&quot;font-weight: bold;&quot;&gt;Test::More&lt;/span&gt; by showing some examples of the standard tests, use_ok(), is(), is_deeply(), cmp_ok(), can_ok(), etc. Tests can be put in a &quot;SKIP&quot; or a &quot;TODO&quot; block, and Test::More will handle them gracefully.&lt;br /&gt;&lt;br /&gt;The &lt;span style=&quot;font-weight: bold;&quot;&gt;prove&lt;/span&gt; script handles invocation of tests in a folder, using Test::Harness, simplifying the relevant Perl one-liner. It also has extra features such as &quot;verbose&quot; and &quot;shuffle&quot; modes. It is intended as a development tool, to run tests with some granularity during debug/test cycles.&lt;br /&gt;&lt;br /&gt;He went on to talk about &lt;span style=&quot;font-weight: bold;&quot;&gt;Test::Inline&lt;/span&gt;, and I didn&#39;t pay close attention to that section. Including tests within the script to be tested is a matter of taste, and my taste doesn&#39;t run that way. I also skipped the &lt;span style=&quot;font-weight: bold;&quot;&gt;Test::Legacy&lt;/span&gt; section. It&#39;s intended purely to migrate tests written with Test.pm to the new testing framework. Likewise, I already know about &lt;span style=&quot;font-weight: bold;&quot;&gt;Test::POD&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;For those who shy away from complex tests, you can use &lt;span style=&quot;font-weight: bold;&quot;&gt;Test::Simple&lt;/span&gt;. It&#39;s a subset of Test::More functionality, so you can retarget tests written with Test::Simple to Test::More when you need the additional features. Test::Simple has only one method: ok().&lt;br /&gt;&lt;br /&gt;Other test modules exist for things like performing web browsing or accessing a database. Most of these test modules combine nicely. &lt;span style=&quot;font-weight: bold;&quot;&gt;Apache::Test&lt;/span&gt; specifically is the topic of another talk at YAPC. It appears to provide a kind of &quot;sandbox&quot; for testing. In that vein, it handles issues of hosts and ports, so the test writer doesn&#39;t have to worry about it. It uses Test::Legacy syntax, so potentially offers interoperability issues with other testing modules. Test::More support is being added, but should be considered experimental today. Pete showed an example using Apache::Test, which I looked at cursorily, since I plan to attend the Apache::Test talks later today.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Test::WWW::Mechanize&lt;/span&gt; can be used to perform traversal of sites. It handles cookies and form values, etc. It can be used with Test::Apache, where Apache::TestRequest::module2url() is used to convert relative URLs to something usable against the &quot;sandbox&quot; Apache instance.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Test::DatabaseRow&lt;/span&gt; can be used to perform simple tests against the database. You assign it a database handle to run against, and it can generate some SQL for you.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Test::Expect&lt;/span&gt; can be used to test console apps, including tests of remote applications using ssh or telnet. It uses a syntax reminiscent of Expect, as you might expect.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Test::Differences&lt;/span&gt; puts test diffs in a table for viewing. This can be useful for determining which parts of a test suite did not behave as expected.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Test::SQL::Translator&lt;/span&gt; can be used to verify the correctness of a DB schema.&lt;br /&gt;&lt;br /&gt;To determine how much of your code is covered by your tests, you can use Devel::Cover from CPAN. It runs transparently with your tests, and compiles statistics on your code coverage. It can generate HTML output for viewing in a web browser, with color codes.&lt;br /&gt;&lt;br /&gt;General tips:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1. Write a test for each bug you fix.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2. Automate your automated tests.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3. Consider test-first development.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4. Help write tests for others&#39; modules that you use.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5. Encourage others to test their code.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;chromatic &amp; Ian Langworth: Solutions To Common Testing Problems&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;&lt;br /&gt;General Enhancements to Test::More&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;People usually start with Test::More, but soon end up wanting better diagnostics than it provides. For example, people commonly use is_deeply(). The benefit of using it is that it will highlight, on failure, where in the data structure a disagreement is found. You can use diff to get all differences, but is_deeply() gives only the first point of disagreement. &lt;span style=&quot;font-weight: bold;&quot;&gt;Test::Differences&lt;/span&gt; provides a similar functionality but shows all differences. It also shows per-line differences between multiline strings.&lt;br /&gt;&lt;br /&gt;When using is() to compare strings, both strings are printed in full. This can be useless for comparison, especially if the strings long. &lt;span style=&quot;font-weight: bold;&quot;&gt;Test::Longstring&lt;/span&gt; addresses this problem, via functions is_string(), contains_string(), lacks_string().&lt;br /&gt;&lt;br /&gt;Beyond strings, another target of testing is nested data structures. One approach to them is to focus on the composition of the structure, rather than its content. &lt;span style=&quot;font-weight: bold;&quot;&gt;Test::Deep&lt;/span&gt; offers cmp_deeply() for this purpose. You can tell is_deeply() what the structure should look like in general terms. One argument to cmp_deeply() is a template for the data structure to be tested. The template can specify an array, a subhash or superhash. Another supported concept is a &quot;bag&quot;, which batches bags (i.e., unordered sets possibly containing duplicates).&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;&lt;br /&gt;Testing with Databases&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One tricky part of testing is that more than Perl code needs to be tested. One trick you can use is mock objects to mock the DB, but that isn&#39;t always the best trick. You can use a different database instead, with test data. Or you can connect to the live system for testing.&lt;br /&gt;&lt;br /&gt;To mock the DB connection, you can use the &lt;span style=&quot;font-weight: bold;&quot;&gt;DBD::Mock&lt;/span&gt; module. One of the obvious candidates for testing with a mock DB is to test failure modes, such as login failure. In the mock object, you can set flags to simulate login failure, DB connection going away, success, etc.&lt;br /&gt;&lt;br /&gt;One candidate for a substitute database is &lt;span style=&quot;font-weight: bold;&quot;&gt;DBI::SQLLite&lt;/span&gt;, which accepts SQL commands but has no network connection, multi-user support, etc. This can be used for inserts and selects, without affecting the target DB.&lt;br /&gt;&lt;br /&gt;The final approach to DB testing is to use the same DB back-end as the production environment, with a test data set. In the build file, the installer can be prompted for a DB name, user, password, etc., to use in tests. To the end of putting this stuff in your build file, you can use &lt;span style=&quot;font-weight: bold;&quot;&gt;Module::Build&lt;/span&gt;. It&#39;s much easier than make-maker. Among other things, it provides facilities for prompting users for settings, along with logic to adopt the defaults when performing an automated build.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;&lt;br /&gt;Testing Web Sites&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;With &lt;span style=&quot;font-weight: bold;&quot;&gt;Test::WWW::Mechanize&lt;/span&gt; you can simulate a web browser to test web sites. It provides methods for submitting forms, clicking links, etc. It also provides test methods for examining titles and other page elements. Another utility, included with Test::WWW::Mechanize is &lt;span style=&quot;font-weight: bold;&quot;&gt;mech-dump&lt;/span&gt;, which can be used to examine the structure of a page, for example to learn the name of a form if you don&#39;t already know it. Instead of mech-dump, you can use &lt;span style=&quot;font-weight: bold;&quot;&gt;HTTP::Recorder&lt;/span&gt; to create a proxy and examine data as it flows back and forth. The proxy can be used to pop up an additional page displaying some information about the exchange. Note that HTTP::Recorder is new and limited: it doesn&#39;t handle SSL or Javascript.&lt;br /&gt;&lt;br /&gt;The HTML can be validated as a whole using &lt;span style=&quot;font-weight: bold;&quot;&gt;Test::HTML::Tidy&lt;/span&gt;. If you only want to check certain things in the HTML you can use &lt;span style=&quot;font-weight: bold;&quot;&gt;Test::HTML::Lint&lt;/span&gt;. In response to a question from the crowd: the speakers don&#39;t know if there&#39;s a handy module for testing XSS vulnerabilities.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;&lt;br /&gt;Testing with Mock Objects&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mock objects are handy when testing conditions that are difficult to produce for one reason or other: supplying a missing network connection; pretending to reformat the hard drive; simulating obscure failures; etc.&lt;br /&gt;&lt;br /&gt;For example, suppose you want to test a bit of code that makes a system call that may or may not succeed on the testing machine (for example, due to lack of speakers at the time of test). This can be done by overriding &quot;system&quot; as follows. Note that &quot;system&quot; must be overrided before the module to be tested is loaded.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;package TestModule;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;use subs &#39;system&#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*TestModule::system = sub {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[..]&lt;br /&gt;&lt;br /&gt;One word of advice: tests involving mocking like this should probably be run in their own files, so weird things like overridden functions don&#39;t have side effects that leak into other tests.&lt;br /&gt;&lt;br /&gt;Mock objects to be created for testing with the &lt;span style=&quot;font-weight: bold;&quot;&gt;Test::MockObject&lt;/span&gt;. The author has written some articles about Test::MockObject on Perl.com.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;Unit Testing with Test::Class&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Test scripts discussed so far in this session are procedural. &lt;span style=&quot;font-weight: bold;&quot;&gt;Test::Class&lt;/span&gt; treats tests as objects. A new test is created as a subclass of Test::Class. This class implements an analogue of Ruby &lt;span style=&quot;font-style: italic;&quot;&gt;fixtures&lt;/span&gt;, which are services such as the setup and tear-down surrounding execution of test cases. To use a test class based on Test::Class, simply use the module you&#39;ve created and execute the class method runtests().&lt;br /&gt;&lt;br /&gt;There are facilities for skipping tests in units of one class (possibly including all its subclasses).&lt;br /&gt;&lt;br /&gt;Another advantage of Test::Class is that you can ship the test classes with your package. Then users that subclass your objects can also subclass your tests and leverage your effort.&lt;br /&gt;&lt;br /&gt;Test::Class also facilitates creation of test plans by allowing you to specify test counts piecemeal, and then collecting them into a plan for you.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;A Few Cool Things about mod_perl 2.0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The list of mod_perl directives has grown some. The list of classes has grown tremendously.&lt;br /&gt;&lt;br /&gt;Writing a PerlTypeHandler didn&#39;t work before, because mod_mime has a stranglehold on the request. That has changed. You can now write PerlTypeHandlers easily. You probably won&#39;t, because nobody ever needs to, but you can.&lt;br /&gt;&lt;br /&gt;What about &lt;span style=&quot;font-weight: bold;&quot;&gt;Apache2::Const::OK&lt;/span&gt;? Big changes came right before mod_perl 2.0 because of the &quot;Great Namespace War&quot; of 2004. So now there&#39;s something you need to know to migrate mod_perl 2. What you need to know is that all Apache:: modules now live in the Apach2:: namespace. The only exception is Apache::Test. That includes Apache constants, because they are fully qualified by their package:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- Apache2::Const::OK&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- APR::Const::SUCCESS&lt;br /&gt;&lt;br /&gt;But no matter what the docs say, you don&#39;t need to use -compile. Just do a:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;use Apache2::Const qw(OK);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&lt;br /&gt;It isn&#39;t too hard to migrate to mod_perl 2--you can practically do it with a sed script, as long as you&#39;re on mod_perl 1.99. Going from 1 to 2, see last year&#39;s talk, &quot;Why mod_perl 2.0 Sucks&quot;. But back to what&#39;s cool about mod_perl 2.0...&lt;br /&gt;&lt;br /&gt;Apache 2.0 has over 340 directives, but only 90 are from &quot;core&quot; Apache. The rest are from extension modules. Those extension directives must be wrapped in IfModule directives in the Apache config. Both versions of mod_perl provide an API for defining new Apache directives, but the API in 1.0 was too intimidating. The 2.0 directive handler is in pure Perl.&lt;br /&gt;&lt;br /&gt;Total Access is another cool mod_perl 2.0 feature. Whereas version 1.0 was incomplete, 2.0 offers complete access to everything in the Apache API. There&#39;s even a method called assbackwards() (whatever that does).&lt;br /&gt;&lt;br /&gt;Output Filters are a new feature in Apache 2.0. Output filters are &quot;things&quot; that allow you to post-process content after the content phase has run. One example of an Apache filter is the one that processes SSI tags: the output of CGI scripts are not run through that mechanism, so CGI scripts can&#39;t use SSI tags. Although mod_perl has been able to filter content for years, it was previously only able to process mod_perl output itself. Now it&#39;s possible to filter output at a later stage. It&#39;s now possible to use mod_perl to filter output of PHP scripts, for example.&lt;br /&gt;&lt;br /&gt;Stacked Perl Handlers are an idea borrowed from Apache that mod_perl 1.0 didn&#39;t get right. In Apache, how the module list is traversed depends on the phase. In some phases, the handler list is exhausted. In other phases, the list is traversed until the first handler returns OK (authentication is one example of this). The mod_perl 1.0 version didn&#39;t allow for early termination on return of OK, but it&#39;s now been fixed. One effect of this fix is that PerlAuthenHandler was able to be re-written very nicely, without all the ridiculous workarounds.&lt;br /&gt;&lt;br /&gt;To finish with a plug: Apache::Test totally rocks, and you should use it for everything, every time.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-size: 18pt;&quot;&gt;Perl Black Magic: Obfuscation and Golfing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Jos&amp;#x00e9; Castro introduced himself by requesting that people stop calling him &quot;Hos&amp;#x00e9;&quot;: being Portuguese, the correct pronunciation is Joe-say. From this lighthearted beginning, Jos&amp;#x00e9; proceeded to give a hilarious presentation concerning obfuscated Perl. His pace was much too fast to keep up with, so I won&#39;t try to capture his talks in detail. Just remember to check out his slides when they become available at &lt;a href=&quot;http://www.jose-castro.org/talks/index.html&quot;&gt;http://www.jose-castro.org/talks/index.html&lt;/a&gt;. Here are a couple of teasers:&lt;br /&gt;&lt;br /&gt;To impress your friends with obfuscation, you have to give them something that they don&#39;t understand right away, but do understand eventually. If, when you explain what a script does, they still don&#39;t understand it, they won&#39;t be impressed with your cleverness. But if they find out that your incredibly convoluted script prints, &quot;Just another Perl hacker,&quot; they&#39;ll be impressed.&lt;br /&gt;&lt;br /&gt;Some clever ways to make your Perl incomprehensible include:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1. Gratuitous use of the ternary operator&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2. Adding distractors in the untaken branch of the ternary operator&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3. Using lots of semicolons you don&#39;t need&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4. Remove whitespace to enhance unreadability&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5. Never use /// in regexes: &quot;ss from s to s&quot; is much more confusing&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6. Use lots of pound signs, until people can&#39;t tell what&#39;s a comment and what ain&#39;t&lt;br /&gt;&lt;br /&gt;Definition: &quot;Golfing&quot; is the art of programming with as few characters as possible. You start, of course, by eliminating all whitespace. And you never use a variable name longer than one letter. Of course you leave off semicolons whenever it&#39;s allowed. Above all, you shouldn&#39;t forget to exploit the power of Perl&#39;s command-line options, of which &quot;-n&quot; is only the tip of the iceberg.&lt;br /&gt;&lt;br /&gt;Two clever operators:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The Eskimo operator: }{&lt;br /&gt;&lt;br /&gt;This cute little number looks very confusing, but think what it does at the start of a script invoked with &quot;perl -n&quot;! Check the manpage if you can&#39;t figure it out directly.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The shopping-cart operator: @{{}}&lt;br /&gt;&lt;br /&gt;This operator can be used to perform operations within strings, for example, as long as the innermost code block returns a (possible empty) array reference.&lt;br /&gt;&lt;br /&gt;</description><link>http://waystination.blogspot.com/2005/06/yapc-2005-day-one.html</link><author>noreply@blogger.com (Len Budney)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-13428507.post-111807791729240036</guid><pubDate>Mon, 06 Jun 2005 17:11:00 +0000</pubDate><atom:updated>2005-06-06T10:11:57.296-07:00</atom:updated><title>Church Politics and Patience</title><description>It&#39;s an enlightening experience, taking part in church committees. I&#39;ve been on several--though never as a volunteer. There always seem to be a few people engaging in political maneuvers that would seem more at home inside the beltway. You&#39;d think Christians would behave better, but if so you&#39;d be na&amp;#x00ef;ve: Christians are people too. On the other hand, Bible-bashers would use those bad apples as proof that Christianity is a farce, but that&#39;s intellectual dishonesty on par with arguing that the police force should be disbanded because some cops are crooked.&lt;br /&gt;&lt;br /&gt;Seeing these political games first-hand has taught me a lesson or two in patience. It&#39;s my nature to be outraged when people spread misinformation, conduct behind-the-scenes campaigns, and try to force issues in their preferred direction. But why? Because it&#39;s dishonest? Because it&#39;s not Christ-like? I&#39;d like to think that my motives are that pure--that I&#39;m really that driven by principle. Certainly that&#39;s part of it. But the main reason I&#39;m so outraged is that I fear these efforts might succeed: the misinformation might be believed; the bad counsel might be followed; wrong-doing may carry the day. In other words, my outrage is partly fear that wrong will triumph, and partly an impatient need to seize control immediately, and to personally make sure that wrong is put in its place.&lt;br /&gt;&lt;br /&gt;What I&#39;ve found, in being forced to handle these things patiently, has been very helpful. For one thing, there are plenty of other men of principle who will do their part, and when I wait I&#39;m often rewarded with such people stepping up to the plate. The world doesn&#39;t rest on one person&#39;s shoulders. On the other hand, I&#39;ve also seen that wrong does sometimes win, and there&#39;s nothing I can do about it. Sometimes misinformation is believed, slander is repeated, good deeds are punished and bad deeds rewarded. It&#39;s rather liberating to wake up to the reality that forcing the right outcome just can&#39;t be done by a mere mortal. Scripture says that &quot;evil men and seducers shall wax worse and worse, deceiving, and being deceived&quot; [2 Tim 3:13]. Christ himself said, &quot;when the son of man cometh, shall he find faith on the earth?&quot; [Luke 18:8]. The Bible (not to mention experience) assures us not only that evil exists, but that it often gets the upper hand in this world. It doesn&#39;t do any good to go crazy raging against that reality.&lt;br /&gt;&lt;br /&gt;Patience becomes possible when we accept that we aren&#39;t in control, accept that things will indeed come out wrong, and trust that God is in control and will ultimately put things right. Without trust in God, acceptance of reality makes us cynical and ultimately leads to despair. On the other hand if we don&#39;t accept the reality that evil often triumphs in the short term, we will constantly fight battles we can never win. That&#39;s a waste of energy at best, and it threatens to weaken our faith in God&#39;s ultimate fairness.</description><link>http://waystination.blogspot.com/2005/06/church-politics-and-patience.html</link><author>noreply@blogger.com (Len Budney)</author><thr:total>0</thr:total></item></channel></rss>