diff --git a/CNAME b/CNAME index 94e98801a..eb0ad0eb0 100644 --- a/CNAME +++ b/CNAME @@ -1 +1 @@ -tom.preston-werner.com +botjes.github.io diff --git a/_layouts/default.html b/_layouts/default.html index 1d52b32a3..7e5ce1fe2 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -3,8 +3,8 @@ {{ page.title }} - - + + @@ -24,10 +24,10 @@ var WRInitTime=(new Date()).getTime(); - +
- Tom Preston-Werner + Bot.je home
@@ -36,52 +36,34 @@
-Fork me on GitHub - - - - - - - - - - + diff --git a/_posts/2008-10-18-how-i-turned-down-300k.md b/_posts/2008-10-18-how-i-turned-down-300k.md deleted file mode 100644 index 57f03cd62..000000000 --- a/_posts/2008-10-18-how-i-turned-down-300k.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -layout: post -title: How I Turned Down $300,000 from Microsoft to go Full-Time on GitHub ---- - -{{ page.title }} -================ - -

18 Oct 2008 - San Francisco

- -2008 is a leap year. That means that three hundred and sixty six days ago, -almost to the minute, I was sitting alone in a booth at Zeke's Sports Bar and -Grill on 3rd Street in San Francisco. I wouldn't normally hang out at a sports -bar, let alone a sports bar in SOMA, but back then Thursday was "I Can Has Ruby" -night. I guess back then "I can has _______" was also a reasonable moniker to -attach to pretty much anything. ICHR was a semi-private meeting of like minded -Ruby Hackers that generally and willingly devolved into late night drinking -sessions. Normally these nights would fade away like my hangover the next -morning, but this night was different. This was the night that -[GitHub](http://github.com/) was born. - -I think I was sitting at the booth alone because I'd just ordered a fresh Fat -Tire and needed a short break from the socializing that was happening over at -the long tables in the dimly lit aft portion of the bar. On the fifth or sixth -sip, Chris Wanstrath walked in. I have trouble remembering now if I'd even -classify Chris and I as "friends" at the time. We knew each other through Ruby -meetups and conferences, but only casually. Like a mutual "hey, I think your -code is awesome" kind of thing. I'm not sure what made me do it, but I gestured -him over to the booth and said "dude, check this out." About a week earlier I'd -started work on a project called [Grit](http://github.com/mojombo/grit) that -allowed me to access Git repositories in an object oriented manner via Ruby -code. Chris was one of only a handful of Rubyists at the time that was starting -to become serious about Git. He sat down and I started showing him what I had. -It wasn't much, but it was enough to see that it had sparked something in Chris. -Sensing this, I launched into my half-baked idea for some sort of website that -acted as hub for coders to share their Git repositories. I even had a name: -GitHub. I may be paraphrasing, but his response was along the lines of a very -emphatic "I'm in. Let's do it!" - -The next night, Friday, October 19, 2007 at 10:24pm Chris made the first commit -to the GitHub repository and sealed in digital stone the beginning of our joint -venture. There were, so far, no agreements of any kind regarding how things -would proceed. Just two guys that decided to hack together on something that -sounded cool. - -Remember those amazing few minutes in Karate Kid where Daniel is training to -become a martial arts expert? Remember the music? Well, you should probably go -buy and listen to [You're The -Best](http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?i=260417864&id=260417040&s=143441) -by Joe Esposito in iTunes because I'm about to hit you with a montage. - -For the next three months Chris and I spent ridiculous hours planning and coding -GitHub. I kept going with Grit and designed the UI. Chris built out the Rails -app. We met in person every Saturday to make design decisions and try to figure -out what the hell our pricing plan would look like. I remember one very rainy -day we talked for a good two hours about various pricing strategies over some of -the best Vietnamese egg rolls in the city. All of this we did while holding -other engagements. I, for one, was employed full time at Powerset as a tools -developer for the Ranking and Relevance team. - -In mid January, after three months of nights and weekends, we launched into -private beta mode, sending invites to our friends. In mid February PJ Hyett -joined in and made us three-strong. We publicly launched the site on April 10th. -TechCrunch was not invited. At this point it was still just three 20-somethings -without a single penny of outside investment. - -I was still working full time at Powerset on July 1, 2008 when we learned that -Powerset had just been acquired by Microsoft for around $100 million. This was -interesting timing. With the acquisition, I was going to be faced with a choice -sooner than I had anticipated. I could either sign on as a Microsoft employee or -quit and go GitHub full time. At 29 years old, I was the oldest of the three -GitHubbers, and had accumulated a proportionally larger amount of debt and -monthly expenditure. I was used to my six digit lifestyle. Further confounding -the issue was the imminent return of my wife, Theresa, from her PhD fieldwork in -Costa Rica. I would soon be transitioning from make-believe bachelor back to -married man. - -To muddy the waters of decision even more, the Microsoft employment offer was -juicy. Salary + $300k over three years juicy. That's enough money to make -anybody think twice about anything. So I was faced with this: a safe job with -lots of guaranteed money as a Microsoft man –or– a risky job with -unknown amounts of money as an entrepreneur. I knew things with the other GitHub -guys would become extremely strained if I stayed on at Powerset much longer. -Having saved up some money and become freelancers some time ago, they had both -started dedicating full time effort to GitHub. It was do or die time. Either -pick GitHub and go for it, or make the safe choice and quit GitHub to make -wheelbarrows full of cash at Microsoft. - -If you want a recipe for restless sleep, I can give you one. Add one part "what -will my wife think" with 3,000 parts Benjamin Franklin; stir in a "beer anytime -you damn well please" and top with a chance at financial independence. - -I've become pretty good at giving my employers the bad news that I'm leaving the -company to go do something cooler. I broke the news to my boss at Powerset on -the day the employment offer was due. I told him I was quitting to go work full -time on GitHub. Like any great boss, he was bummed, but understanding. He didn't -try to tempt me with a bigger bonus or anything. I think deep down he knew I was -going to leave. I may have even received a larger incentive to stay than others, -on account of my being a flight risk. Those Microsoft managers are crafty, I -tell you. They've got retention bonuses down to a science. Well, except when you -throw an entrepreneur, the singularity of the business world, into the mix. -Everything goes wacky when you've got one of those around. - -In the end, just as Indiana Jones could never turn down the opportunity to -search for the Holy Grail, I could no less turn down the chance to work for -myself on something I truly love, no matter how safe the alternative might be. -When I'm old and dying, I plan to look back on my life and say "wow, that was an -adventure," not "wow, I sure felt safe." diff --git a/_posts/2008-10-27-looking-back-on-selling-gravatar-to-automattic.md b/_posts/2008-10-27-looking-back-on-selling-gravatar-to-automattic.md deleted file mode 100644 index 240aad823..000000000 --- a/_posts/2008-10-27-looking-back-on-selling-gravatar-to-automattic.md +++ /dev/null @@ -1,173 +0,0 @@ ---- -layout: post -title: Looking back on Selling Gravatar to Automattic ---- - -{{ page.title }} -================ - -

23 Oct 2008 - San Francisco

- -For an entrepreneur, the line between horrible mistake and runaway success can -be so thin that even Kate Moss would be envious. I lived with -[Gravatar](http://gravatar.com/) for nearly four years before that line even -became thick enough to measure. - -As it's become one of my favorite parables, I'll save the details of how I came -up with the idea for Gravatar for a future post. What's important to know is -that the idea was spawned not from a business perspective, but from a desperate -desire to create something new in the world of blogging. - -Spin the clock back four years and you'll find me sitting at my Windows desktop -machine in my underwear with a box of Life cereal to my left and a day old Coke -to my right. Since I'd been laid off from my job as a Java developer some months -earlier, I'd decided to take the entrepreneurial plunge doing what I knew best: -web design. Working in a cone of isolation, I'd become accustomed to waking up -late, swinging my legs over the right side of the bed, and in one fluid movement -sliding over to the ratty chair I stole from my old college dorm room. I'd spend -most of the day working on client projects in ColdFusion or PHP. It was hard -work and could become a bit tiresome. I needed an outlet, something that didn't -have a suit on the other end of a telephone telling me how blue was the wrong -color and things would be so much better if only the photo had a slightly bigger -border. Gravatar would become that outlet for me. - -I was really big into web standards at the time, having recently read Zeldman's -seminal work, and became a true believer. Eric Meyers, Dan Cederholm, and Jon -Hicks became like gods to me. I worked very hard at making relevant and witty -comments around the right kinds of blogs. Being a part of that movement became a -significant goal for me. My Movable Type weblog rarely went more than two days -days without a post on design or standards. - -Two weeks after I had the idea for Gravatar the first version was written and -deployed. Every request hit the database and dynamically generated a properly -sized gravatar via PHP's gd2 api. Premature optimization and all that, right? -The first thing I did after getting the system to a workable state was email all -the bloggers I looked up to (and that had no idea who I was). Blog comments at -the time were a pretty dreary affair and I guess Cederholm was intrigued enough -by my idea that he linked to it in a sidebar micro-post on simplebits.com. - -That single mention kicked off a slow but steady trickle of interest in the -system. A few blogs here and there installed the plugin and the world started -seeing avatars that mysteriously followed them around. At the same time, just as -people must have thought Cheez Whiz was a stupid idea when it first came out, -some bloggers started railing against Gravatar, calling it frivolous, -inefficient, and "an abomination." This was my first nibble at the smorgasbord -of what was to become the "horrible mistake" aspect of Gravatar. - -Due to the inherently self-advertising nature of gravatars (the "what the hell -is that and how do I get one?" brand of advertising), Gravatar adoption -increased at a rapid rate. Having crafted the idea for Gravatar without any -semblance of business model or growth projection or build-out strategy, things -took a rather dramatic dive away from "runaway success" as my server (yes, -singular) buckled under the pressure of tens of requests per second! As it turns -out, regenerating a gravatar on every request is not very CPU efficient. -Gravatars worldwide suddenly turned into little red Xs. Then, in what has become -known as the Twitter Effect, a barrage of emails hit me complaining about how -the free service on which they had come to depend was down, and how this would -adversely impact my well-being. - -I fixed the code. Gravatar came back online with caching. All the while I'd had -the bright idea that gravatars would be rated for content, MPAA-style. Because -users clearly were not fit to rate their own images, I was manually rating 400 -or more avatars each day. If I missed a day, I'd have damn near a thousand -waiting for me the next day. In addition to the angry mob, I was very fortunate -to have an amazingly supportive group of users that volunteered to help me rate -images. I owe them my sanity, and it freed up enough time for me to work on the -next iteration of the site. - -G2, as I called it, would be written in Rails and use lighttpd plus a convoluted -directory structure of symlinks to enable me to pre-render every gravatar (1x1 -up to 80x80) and serve only static images. I did this to avoid having to rent or -buy the kind of hardware necessary to hook up a properly scaled system. Up until -the end I ran Gravatar on a maximum of two rented commodity servers that set me -back a mere $300/month, a pittance for the kind of traffic I was serving. I say -it was a pittance, but that's not really true. Donations didn't even come close -to covering that cost. - -At some point early in the development of G2, Toni Schneider, the CEO of -Automattic (the company behind WordPress.com and Akismet) contacted me after -hearing my [interview about the future of -Gravatar](http://blog.gravatar.com/2007/10/18/automattic-gravatar/) on the -WordPress podcast. This was exciting news! How perfect a fit would it be for -Gravatar to be bought by Automattic? I was already planning a trip up to San -Francisco to meet with the Powerset guys, so the timing worked out perfectly for -me to meet in person with Toni. I ended up having lunch with Toni and Matt -Mullenweg at 21st Ammendment on 2nd Street. It was a bit intimidating to come to -the mecca of tech startups to meet with such huge players in the blogging -community. Turned out that both Matt and Toni are great guys and so we had -drinks for about two hours, talking about my ideas for Gravatar and how we might -be able to work together. Everything seemed great—I was jazzed and they -seemed excited—but a few weeks later Toni let me know that the timing was -wrong and they couldn't make a play at that time. He suggested I proceed with G2 -and they'd proceed with their own avatar system. I was pretty bummed about the -outcome, but I took their advice and kept going. - -A few weeks before G2 was finished, the site imploded in a big way. One machine. -Hundreds of requests per second. That poor CPU must have thought it was the End -Times. Instead of wasting time on getting the existing system back up, I put on -my headphones, turned it up to eleven, and got back to work on G2. - -I'm not sure if you've ever had to work on a project while your users are -publicly skewering you on your blog for allowing the service to go down, but -it's as close to depression as I've ever come. If I'd had less pride, I would -have popped everyone a huge middle finger and let the service die, but instead I -waded through the hundreds of comments and deleted the ones with threats, -hatred, or my favorite, the words "fuck you" repeated 600 times. It wasn't fair, -I told myself, that I should be sitting here with high blood pressure trying to -raise Gravatar from the dead while the unappreciative masses do what they do -best on the internet. The only thing that kept me going was never being able to -tell which side of the mistake/success boundary I was sitting on. It was hard to -think of the situation as anything but a huge failure, but the shitstorm the -downtime was causing indicated that people found the service valuable. I want to -say that Twitter went through the same thing, but they suffered their downtime -with millions of dollars in the bank. The only thing I had was a full time job -unrelated to Gravatar and a credit card that reminded me every month of my bad -judgment. - -Finally G2 was done, deployed, and fully operational. I have no idea how many -users I lost due to the several weeks of downtime, but I don't think it was very -many. There seems to be a corollary to the Twitter Effect that I'd call the -Forgiveness Effect. It dictates that if a user enjoys a free service and that -service is currently up, all past atrocities will be easily and quickly -forgiven. With the site running again, things looked to be shifting back towards -a success. - -Things were not all rainbows and unicorns though. My Rube Goldbergian -architecture had a few quirks that needed to be dealt with. The site still had -some elusive bugs from the overly-rapid development cycle. And just like new -lanes on freeways always fill up immediately, the two new servers I was running -started causing expensive bandwidth overages. I had taken a job at Powerset at -this point and the combined pressures of these two commitments started to weigh -me down. Once again I started feeling like all the effort I put into Gravatar -was for nothing. Like I would never benefit from any of it. - -In a last ditch effort to save Gravatar from final doom, I emailed Toni and -pitched him again on Gravatar. I figured it was a long shot, but what the hell, -couldn't hurt. Things must have changed in the prior 6 months because Toni was -very receptive to the idea. We met again, at 21st Ammendment, and hashed out a -tentative deal over drinks. I'd never sold anything like this before, so my -technique was probably very amateurish. I'm almost certain I could have gotten a -better deal out of it, but I had the smell of desperation about me and I really -did want to see Gravatar end up in Automattic's hands. - -Four days later, Automattic made their official offer. On September 21st, 2007 -we inked the deal and Gravatar became both the first company that I ever sold -and the first company that Automattic ever acquired. - -I am quite satisfied with the sale to Automattic. Some will say that I should -have pursued VC funding. Indeed, I was contacted by several firms but never -travelled very far down that road. I always felt like Gravatar was a feature, -and I wasn't comfortable building a company on such a tiny foundation. -Reinforcing this decision, no viable business model ever coalesced during the -time I was building the site. It was also made clear by Toni that Automattic -would maintain Gravatar as a separate brand and continue its evolution (instead -of just absorbing it into WordPress). This appealed to my ego. Most companies -kill or maim everything they acquire, but here was a chance for Gravatar to -carry forward with all of Automattic's resources behind it (instead of two -measly servers). Part of me just wanted to see what Gravatar could become with -time, money, and man-power moving it forward. - -Things always seem so clear in retrospect. But it was pride and persistence that -kept me in the game long enough to have anything to look back on at all. While -the line between horrible mistake and runaway success may be difficult to see, -you can still find it if you look hard enough. diff --git a/_posts/2008-11-03-how-to-meet-your-next-cofounder.md b/_posts/2008-11-03-how-to-meet-your-next-cofounder.md deleted file mode 100644 index 9b3702672..000000000 --- a/_posts/2008-11-03-how-to-meet-your-next-cofounder.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -layout: post -title: How to Meet Your Next Cofounder ---- - -{{ page.title }} -================ - -

3 Nov 2008 - San Francisco

- -Over the last few months I've seen a number of people looking for cofounders on -Hacker News or via their own personal blogs. I think this is, at best, a highly -inefficient way to find a cofounder and, at worst, a way to fool yourself into -finding the *wrong* cofounder. In any case, it's a naive approach to finding the -person that will need to stand by your side in the coming storm that we call -"running a startup." - -Don't get me wrong, the internet is an amazing tool for meeting people. The -wider the net you cast, the more likely you are to find the perfect match. But -the internet has its limitations. I've had internet friends that were engaging, -witty, and brilliant online, but in person felt awkward and boring. Conversely, -I know people that are volatile and inflammatory online, but present an attitude -of friendliness and caring in person. This phenomenon makes it difficult to -gauge an individual's personality from online interaction alone. - -A far better use of the internet is to find groups of people that share your -interests. Track down the local users group for your language or technology of -choice. The simple fact that members of these groups take time out of their day -to show up means that they're more motivated and driven than the average person. -Even if it's a bit of a commute to get to the meetings, start showing up -regularly. Prepare a few presentations on topics that you're passionate about. -Bonus points if you present on ideas related to your potential startup. Don't -worry about revealing your game-changing secrets; stealth mode is bullshit. Talk -to everyone. Steer the conversation toward your interests and if someone there -is excited about the same things, it will be clear. - -It may take weeks or months, but in a good group you'll find a handful of people -that you really like. If at all possible, go out drinking with these people -after the meetups. This is one of the easiest ways to go from "acquaintance" to -"friend" and gives you free license to bring up your craziest of ideas without -sounding like too much of a nutjob. - -Of the people that you like, several may make excellent candidates for -cofounders. Do a little research on these individuals. What does their code look -like? Have they done much open source? Do they demonstrate an entrepreneurial -spirit? Can they stick with a single project for a long time? Have they been -loyal to their friends and companies in the past? A good cofounder should be -someone with whom you feel privileged to work. And they should feel privileged -to work with you. The two of you should be on very solid ground before you begin -your startup adventure, because once you do, the impact of every argument is -going to feel like it's been multiplied by a thousand. - -This all sounds like a lot of hard work. Maybe you're wondering if it would be -better to just go solo. I did that with Gravatar, and, in retrospect, it's -painfully obvious that I made a lot of stupid mistakes. When it's just you and -your thoughts it becomes too easy to pick the first thing that pops into your -head. We're programmed to think all of our ideas are good, but reality tells a -different story. Truly good decisions are forged from the furnace of argument, -not plucked like daisies from the pasture of a peaceful mind. A good cofounder -tells you when your ideas are half-baked and ensures that your good ideas -actually get implemented. - -The second biggest danger with going solo is the loss of motivation. Solipsism -might make you feel important at first, but the constant lack of feedback and -the absence of support during tough times can easily lead to a premature end to -your adventure. Cofounders are like workout buddies. Just when you think there's -no possible way you can do another rep, there they are, rooting you on toward an -achievement that wouldn't be possible without them. - -Your choice of cofounder will affect everything you do in your startup. They'll -share every defeat with you and celebrate every success. They'll help you -understand your own ideas better by offering a different perspective. They'll be -the single most important decision you make during the tenure of your startup, -so choose wisely and with extreme care. diff --git a/_posts/2008-11-17-blogging-like-a-hacker.md b/_posts/2008-11-17-blogging-like-a-hacker.md deleted file mode 100644 index 141a517d7..000000000 --- a/_posts/2008-11-17-blogging-like-a-hacker.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -layout: post -title: Blogging Like a Hacker ---- - -{{ page.title }} -================ - -

17 Nov 2008 - San Francisco

- -Back in 2000, when I thought I was going to be a professional writer, I spent -hours a day on LiveJournal doing writing practice with other aspiring poets and -authors. Since then I've blogged at three different domains about web standards, -print design, photography, Flash, illustration, information architecture, -ColdFusion, package management, PHP, CSS, advertising, Ruby, Rails, and Erlang. - -I love writing. I get a kick out of sharing my thoughts with others. The act of -transforming ideas into words is an amazingly efficient way to solidify and -refine your thoughts about a given topic. But as much as I enjoy blogging, I -seem to be stuck in a cycle of quitting and starting over. Before starting the -current iteration, I resolved to do some introspection to determine the factors -that were leading to this destructive pattern. - -I already knew a lot about what I *didn't* want. I was tired of complicated -blogging engines like WordPress and Mephisto. I wanted to write great posts, not -style a zillion template pages, moderate comments all day long, and constantly -lag behind the latest software release. Something like Posterous looked -attractive, but I wanted to style my blog, and it needed to be hosted at the -domain of my choosing. For the same reason, other hosted sites (wordpress.com, -blogger.com) were disqualified. There are a few people directly using GitHub as -a blog (which is very cool), but that's a bit too much of an impedance mismatch -for my tastes. - -On Sunday, October 19th, I sat down in my San Francisco apartment with a glass -of apple cider and a clear mind. After a period of reflection, I had an idea. -While I'm not specifically trained as an author of prose, I *am* trained as an -author of code. What would happen if I approached blogging from a software -development perspective? What would that look like? - -First, all my writing would be stored in a Git repository. This would ensure -that I could try out different ideas and explore a variety of posts all from the -comfort of my preferred editor and the command line. I'd be able to publish a -post via a simple deploy script or post-commit hook. Complexity would be kept to -an absolute minimum, so a static site would be preferable to a dynamic site that -required ongoing maintenance. My blog would need to be easily customizable; -coming from a graphic design background means I'll always be tweaking the site's -appearance and layout. - -Over the last month I've brought these concepts to fruition and I'm pleased to -announce [Jekyll](http://github.com/mojombo/jekyll). Jekyll is a simple, blog -aware, static site generator. It takes a template directory (representing the -raw form of a website), runs it through Textile and Liquid converters, and spits -out a complete, static website suitable for serving with Apache or your favorite -web server. If you're reading this on the website -(http://tom.preston-werner.com), you're seeing a Jekyll generated blog! - -To understand how this all works, open up my [TPW](http://github.com/mojombo/tpw) -repo in a new browser window. I'll be referencing the code there. - -Take a look at -[index.html](http://github.com/mojombo/tpw/tree/master/index.html). This file -represents the homepage of the site. At the top of the file is a chunk of YAML -that contains metadata about the file. This data tells Jekyll what layout to -give the file, what the page's title should be, etc. In this case, I specify -that the "default" template should be used. You can find the layout files in the -[_layouts](http://github.com/mojombo/tpw/tree/master/_layouts) directory. If you -open -[default.html](http://github.com/mojombo/tpw/tree/master/_layouts/default.html) -you can see that the homepage is constructed by wrapping index.html with this -layout. - -You'll also notice Liquid templating code in these files. -[Liquid](http://www.liquidmarkup.org/) is a simple, extensible templating -language that makes it easy to embed data in your templates. For my homepage I -wanted to have a list of all my blog posts. Jekyll hands me a Hash containing -various data about my site. A reverse chronological list of all my blog posts -can be found in site.posts. Each post, in turn, contains various -fields such as title and date. - -Jekyll gets the list of blog posts by parsing the files in the -[_posts](http://github.com/mojombo/tpw/tree/master/_posts) directory. Each post's -filename contains the publishing date and slug (what shows up in the URL) that -the final HTML file should have. Open up the file corresponding to this blog -post: -[2008-11-17-blogging-like-a-hacker.textile](http://github.com/mojombo/tpw/tree/master/_posts/2008-11-17-blogging-like-a-hacker.textile). -GitHub renders textile files by default, so to better understand the file, click -on the -[raw](http://github.com/mojombo/tpw/tree/master/_posts/2008-11-17-blogging-like-a-hacker.textile?raw=true) -view to see the original file. Here I've specified the post layout. -If you look at that file you'll see an example of a nested layout. Layouts can -contain other layouts allowing you a great deal of flexibility in how pages are -assembled. In my case I use a nested layout in order to show related posts for -each blog entry. The YAML also specifies the post's title which is then embedded -in the post's body via Liquid. - -Posts are handled in a special way by Jekyll. The date you specify in the -filename is used to construct the URL in the generated site. This post, for -instance, ends up at -http://tom.preston-werner.com/2008/11/17/blogging-like-a-hacker.html. - -Files that do not reside in directories prefixed with an underscore are mirrored -into a corresponding directory structure in the generated site. If a file does -not have a YAML preface, it is not run through the Liquid interpreter. Binary -files are copied over unmodified. - -In order to convert your raw site into the finished version, you simply run: - -
$ jekyll /path/to/raw/site
-/path/to/place/generated/site
- -Jekyll is still a very young project. I've only developed the exact -functionality that I've needed. As time goes on I'd like to see the project -mature and support additional features. If you end up using Jekyll for your own -blog, drop me a line and let me know what you'd like to see in future versions. -Better yet, fork the project over at GitHub and hack in the features yourself! - -I've been living with Jekyll for just over a month now. I love it. Driving the -development of Jekyll based on the needs of my blog has been very rewarding. I -can edit my posts in TextMate, giving me automatic and competent spell checking. -I have immediate and first class access to the CSS and page templates. -Everything is backed up on GitHub. I feel a lightness now when I'm writing a -post. The system is simple enough that I can keep the entire conversion process -in my head. The distance from my brain to my blog has shrunk, and, in the end, I -think that will make me a better author. diff --git a/_posts/2009-05-19-the-git-parable.md b/_posts/2009-05-19-the-git-parable.md deleted file mode 100644 index 1dddc4434..000000000 --- a/_posts/2009-05-19-the-git-parable.md +++ /dev/null @@ -1,453 +0,0 @@ ---- -layout: post -title: The Git Parable ---- - -{{ page.title }} -================ - -

19 May 2009 - San Francisco

- -Git is a simple, but extremely powerful system. Most people try to teach Git by -demonstrating a few dozen commands and then yelling "tadaaaaa." I believe this -method is flawed. Such a treatment may leave you with the ability to use Git to -perform simple tasks, but the Git commands will still feel like magical -incantations. Doing anything out of the ordinary will be terrifying. Until you -understand the concepts upon which Git is built, you'll feel like a stranger in -a foreign land. - -The following parable will take you on a journey through the creation of a -Git-like system from the ground up. Understanding the concepts presented here -will be the most valuable thing you can do to prepare yourself to harness the -full power of Git. The concepts themselves are quite simple, but allow for an -amazing wealth of functionality to spring into existence. Read this parable all -the way through and you should have very little trouble mastering the various -Git commands and wielding the awesome power that Git makes available to you. - -## The Parable - -Imagine that you have a computer that has nothing on it but a text editor and a -few file system commands. Now imagine that you have decided to write a large -software program on this system. Because you're a responsible software -developer, you decide that you need to invent some sort of method for keeping -track of versions of your software so that you can retrieve code that you -previously changed or deleted. What follows is a story about how you might -design one such version control system (VCS) and the reasoning behind those -design choices. - -## Snapshots - -Alfred is a friend of yours that works down at the mall as a photographer in one -of those "Special Moments" photo boutiques. All day long he takes photos of -little kids posing awkwardly in front of jungle or ocean backdrops. During one -of your frequent lunches at the pretzel stand, Alfred tells you a story about a -woman named Hazel who brings her daughter in for a portrait every year on the -same day. "She brings the photos from all the past years with her," Alfred tells -you. "She likes to remember what her daughter was like at each different stage, -as if the snapshots really let her move back and forth in time to those saved -memories." - -Like some sort of formulaic plot device, Alfred's innocent statement acts as a -catalyst for you to see the ideal solution to your version control dilemma. -Snapshots, like save points in a video game, are really what you care about when -you need to interact with a VCS. What if you could take snapshots of your -codebase at any time and resurrect that code on demand? Alfred reads the dawning -realization spreading across your face and knows you're about to leave him -without another word to go back and implement whatever genius idea he just -caused you to have. You do not disappoint him. - -You start your project in a directory named working. As you code, -you try to write one feature at a time. When you complete a self-contained -portion of a feature, you make sure that all your files are saved and then make -a copy of the entire working directory, giving it the name -snapshot-0. After you perform this copy operation, you make sure to -never again change the code files in the new directory. After the next chunk of -work, you perform another copy, only this time the new directory gets the name -snapshot-1, and so on. - -To make it easy to remember what changes you made in each snapshot, you add a -special file named message to each snapshot directory that contains -a summary of the work that you did and the date of completion. By printing the -contents of each message, it becomes easy to find a specific change that you -made in the past, in case you need to resurrect some old code. - -## Branches - -After a bit of time on the project, a candidate for release begins to emerge. -Late nights at the keyboard finally yield snapshot-99, the nascent -form of what will become Release Version 1.0. It comes to pass that this -snapshot is packaged and distributed to the eagerly awaiting masses. Stoked by -excellent response to your software, you push forward, determined to make the -next version an even bigger success. - -Your VCS has so far been a faithful companion. Old versions of your code are -there when you need them and can be accessed with ease. But not long after the -release, bug reports start to come in. Nobody's perfect, you reassure yourself, -and snapshot-99 is readily retrievable, glad to be brought back to -life for the purposes of applying bug fixes. - -Since the release, you've created 10 new snapshots. This new work must not be -included in the 1.0.1 bug fix version you now need to create. To solve this, you -copy snapshot-99 to working so that your working -directory is at exactly the point where Version 1.0 was released. A few swift -lines of code and the bug is fixed in the working directory. - -It is here that a problem becomes apparent. The VCS deals very well with linear -development, but for the first time ever, you need to create a new snapshot that -is not a direct descendent of the preceding snapshot. If you create a -snapshot-110 (remember that you created 10 snapshots since the -release), then you'll be interrupting the linear flow and will have no way of -determining the ancestry of any given snapshot. Clearly, you need something more -powerful than a linear system. - -Studies show that even short exposures to nature can help recharge the mind's -creative potential. You've been sitting behind the artificially polarized light -of your monitor for days on end. A walk through the woods in the brisk Autumn -air will do you some good and with any luck, will help you arrive at an ideal -solution to your problem. - -The great oaks that line the trail have always appealed to you. They seem to -stand stark and proud against the perfectly blue sky. Half the ruddy leaves have -departed from their branches, leaving an intricate pattern of branches in their -wake. Fixating on one of the thousands of branch tips you idly try to follow it -back to the solitary trunk. This organically produced structure allows for such -great complexity, but the rules for finding your way back to the trunk are so -simple, and perfect for keeping track of multiple lines of development! It turns -out that what they say about nature and creativity are true. - -By looking at your code history as a tree, solving the problem of ancestry -becomes trivial. All you need to do is include the name of the parent snapshot -in the message file you write for each snapshot. Adding just a -single upstream pointer will enable you to easily and accurately trace the -history of any given snapshot all the way back to the root. - -## Branch Names - -Your code history is now a tree. Instead of having a single latest snapshot, you -have two: one for each branch. With a linear system, your sequential numbering -system let you easily identify the latest snapshot. Now, that ability is lost. - -Creating new development branches has become so simple that you'll want to take -advantage of it all the time. You'll be creating branches for fixes to old -releases, for experiments that may not pan out; indeed it becomes possible to -create a new branch for every feature you begin! - -But like everything good in life, there is a price to be paid. Each time you -create a new snapshot, you must remember that the new snapshot becomes the -latest on its branch. Without this information, switching to a new branch would -become a laborious process indeed. - -Every time you create a new branch you probably give it a name in your head. -"This will be the Version 1.0 Maintenance Branch," you might say. Perhaps you -refer to the former linear branch as the "master" branch. - -Think about this a little further, though. From the perspective of a tree, what -does it mean to name a branch? Naming every snapshot that appears in the history -of a branch would do the trick, but requires the storage of a potentially large -amount of data. Additionally, it still wouldn't help you efficiently locate the -latest snapshot on a branch. - -The least amount of information necessary to identify a branch is the location -of the latest snapshot on that branch. If you need to know the list of snapshots -that are part of the branch you can easily trace the parentage. - -Storing the branch names is trivial. In a file named branches, -stored outside of any specific snapshot, you simply list the name/snapshot pairs -that represent the tips of branches. To switch to a named branch you need only -look up the snapshot for the corresponding name from this file. - -Because you're only storing the latest snapshot on each branch, creating a new -snapshot now contains an additional step. If the new snapshot is being created -as part of a branch, the branches file must be updated so that the -name of the branch becomes associated with the new snapshot. A small price to -pay for the benefit. - -## Tags - -After using branches for a while you notice that they can serve two purposes. -First, they can act as movable pointers to snapshots so that you can keep track -of the branch tips. Second, they can be pointed at a single snapshot and never -move. - -The first use case allows you to keep track of ongoing development, things like -"Release Maintenance". The second case is useful for labeling points of -interest, like "Version 1.0" and "Version 1.0.1". - -Mixing both of these uses into a single file feels messy. Both types are -pointers to snapshots, but one moves and one doesn't. For the sake of clarity -and elegance, you decide to create another file called tags to -contain pointers of the second type. - -Keeping these two inherently different pointers in separate files will help you -from accidentally treating a branch as a tag or vice versa. - -## Distributed - -Working on your own gets pretty lonely. Wouldn't it be nice if you could invite -a friend to work on your project with you? Well, you're in luck. Your friend Zoe -has a computer setup just like yours and wants to help with the project. Because -you've created such a great version control system, you tell her all about it -and send her a copy of all your snapshots, branches, and tags so she can enjoy -the same benefits of the code history. - -It's great to have Zoe on the team but she has a habit of taking long trips to -far away places without internet access. As soon as she has the source code, she -catches a flight to Patagonia and you don't hear from her for a week. In the -meantime you both code up a storm. When she finally gets back, you discover a -critical flaw in your VCS. Because you've both been using the same numbering -system, you each have directories named 'snapshot-114', 'snapshot-115', and so -on, but with different contents! - -To make matters worse, you don't even know who authored the changes in those new -snapshots. Together, you devise a plan for dealing with these problems. First, -snapshot messages will henceforth contain author name and email. Second, -snapshots will no longer be named with simple numbers. Instead, you'll use the -contents of the message file to produce a hash. This hash will be guaranteed to -be unique to the snapshot since no two messages will ever have the same date, -message, parent, and author. To make sure everything goes smoothly, you both -agree to use the SHA1 hash algorithm that takes the contents of a file and -produces a 40 character hexadecimal string. You both update your histories with -the new technique and instead of clashing 'snapshot-114' directories, you now -have distinct directories named '8ba3441b6b89cad23387ee875f2ae55069291f4b' and -'db9ecb5b5a6294a8733503ab57577db96ff2249e'. - -With the updated naming scheme, it becomes trivial for you to fetch all the new -snapshots from Zoe's computer and place them next to your existing snapshots. -Because every snapshot specifies its parent, and identical messages (and -therefor identical snapshots) have identical names no matter where they are -created, the history of the codebase can still be drawn as a tree. Only now, the -tree is comprised of snapshots authored by both Zoe and you. - -This point is important enough to warrant repeating. A snapshot is identified by -a SHA1 that uniquely identifies it (and its parent). These snapshots can be -created and moved around between computers without losing their identity or -where they belong in the history tree of a project. What's more, snapshots can -be shared or kept private as you see fit. If you have some experimental -snapshots that you want to keep to yourself, you can do so quite easily. Just -don't make them available to Zoe! - -## Offline - -Zoe's travel habits cause her to spend countless hours on airplanes and boats. -Most of the places she visits have no readily available internet access. At the -end of the day, she spends more time offline than online. - -It's no surprise, then, that Zoe raves about your VCS. All of the day to day -operations that she needs to do can be done locally. The only time she needs a -network connection is when she's ready to share her snapshots with you. - -## Merges - -Before Zoe left on her trip, you had asked her to start working off of the -branch named 'math' and to implement a function that generated prime numbers. -Meanwhile, you were also developing off of the 'math' branch, only you were -writing a function to generate magic numbers. Now that Zoe has returned, you are -faced with the task of merging these two separate branches of development into a -single snapshot. Since you both worked on separate tasks, the merge is simple. -While constructing the snapshot message for the merge, you realize that this -snapshot is special. Instead of just a single parent, this merge snapshot has -two parents! The first parent is your latest on the 'math' branch and the second -parent is Zoe's latest on her 'math' branch. The merge snapshot doesn't contain -any changes beyond those necessary to merge the two disparate parents into a -single codebase. - -Once you complete the merge, Zoe fetches all the snapshots that you have that -she does not, which include your development on the 'math' branch and your merge -snapshot. Once she does this, both of your histories match exactly! - -## Rewriting History - -Like many software developers you have a compulsion to keep your code clean and -very well organized. This carries over into a desire to keep your code history -well groomed. Last night you came home after having a few too many pints of -Guinness at the local brewpub and started coding, producing a handful of -snapshots along the way. This morning, a review of the code you wrote last night -makes you cringe a little bit. The code is good overall, but you made a lot of -mistakes early on that you corrected in later snapshots. - -Let's say the branch on which you did your drunken development is called 'drunk' -and you made three snapshots after you got home from the bar. If the name -'drunk' points at the latest snapshot on that branch, then you can use a useful -notation to refer to the parent of that snapshot. The notation 'drunk^' means -the parent of the snapshot pointed to by the branch name 'drunk'. Similarly -'drunk^^' means the grandparent of the 'drunk' snapshot. So the three snapshots -in chronological order are 'drunk^^', 'drunk^', and 'drunk'. - -You'd really like those three lousy snapshots to be two clean snapshots. One -that changes an existing function, and one that adds a new file. To accomplish -this revision of history you copy 'drunk' to 'working' and delete the file that -is new in the series. Now 'working' represents the correct modifications to the -existing function. You create a new snapshot from 'working' and write the -message to be appropriate to the changes. For the parent you specify the SHA1 of -the 'drunk^^^' snapshot, essentially creating a new branch off of the same -snapshot as last night. Now you can copy 'drunk' to 'working' and roll a -snapshot with the new file addition. As the parent you specify that snapshot you -created just before this one. - -As the last step, you change the branch name 'drunk' to point to the last -snapshot you just made. - -The history of the 'drunk' branch now represents a nicer version of what you did -last night. The other snapshots that you've replaced are no longer needed so you -can delete them or just leave them around for posterity. No branch names are -currently pointing at them so it will be hard to find them later on, but if you -don't delete them, they'll stick around. - -## Staging Area - -As much as you try to keep your new modifications related to a single feature or -logical chunk, you sometimes get sidetracked and start hacking on something -totally unrelated. Only half-way into this do you realize that your working -directory now contains what should really be separated as two discrete -snapshots. - -To help you with this annoying situation, the concept of a staging directory is -useful. This area acts as an intermediate step between your working directory -and a final snapshot. Each time you finish a snapshot, you also copy that to a -staging directory. Now, every time you finish an edit to a new -file, create a new file, or remove a file, you can decide whether that change -should be part of your next snapshot. If it belongs, you mimic the change inside -staging. If it doesn't, you can leave it in working -and make it part of a later snapshot. From now on, snapshots are created -directly from the staging directory. - -This separation of coding and preparing the stage makes it easy to specify what -is and is not included in the next snapshot. You no longer have to worry too -much about making an accidental, unrelated change in your working directory. - -You have to be a bit careful, though. Consider a file named README. -You make an edit to this file and then mimic that in staging. You -go on about your business, editing other files. After a bit, you make another -change to README. Now you have made two changes to that file, but -only one is in the staging area! Were you to create a snapshot now, your second -change would be absent. - -The lesson is this: every new edit must be added to the staging area if it is to -be part of the next snapshot. - -## Diffs - -With a working directory, a staging area, and loads of snapshots laying around, -it starts to get confusing as to what the specific code changes are between -these directories. A snapshot message only gives you a summary of what changed, -not exactly what lines were changed between two files. - -Using a diffing algorithm, you can implement a small program that shows you the -differences in two codebases. As you develop and copy things from your working -directory to the staging area, you'll want to easily see what is different -between the two, so that you can determine what else needs to be staged. It's -also important to see how the staging area is different from the last snapshot, -since these changes are what will become part of the next snapshot you produce. - -There are many other diffs you might want to see. The differences between a -specific snapshot and its parent would show you the "changeset" that was -introduced by that snapshot. The diff between two branches would be helpful for -making sure your development doesn't wander too far away from the mainline. - -## Eliminating Duplication - -After a few more trips to Namibia, Istanbul, and Galapagos, Zoe starts to -complain that her hard drive is filling up with hundreds of nearly identical -copies of the software. You too have been feeling like all the file duplication -is wasteful. After a bit of thinking, you come up with something very clever. - -You remember that the SHA1 hash produces a short string that is unique for a -given file contents. Starting with the very first snapshot in the project -history, you start a conversion process. First, you create a directory named -objects outside of the code history. Next, you find the most deeply -nested directory in the snapshot. Additionally, you open up a temporary file for -writing. For each file in this directory you perform three steps. Step 1: -Calculate the SHA1 of the contents. Step 2: Add an entry into the temp file that -contains the word 'blob' (binary large object), the SHA1 from the first step, -and the filename. Step 3: Copy the file to the objects directory and rename it -to the SHA1 from step 1. Once finished with all the files, find the SHA1 of the -temp file contents and use that to name the temp file, also placing it in the -objects directory. - -If at any time the objects directory already contains a file with a given name, -then you have already stored that file's contents and there is no need to do so -again. - -Now, move up one directory and start over. Only this time, when you get to the -entry for the directory that you just processed, enter the word 'tree', the SHA1 -of the temp file from last time, and the directory's name into the new temp -file. In this fashion you can build up a tree of directory object files that -contain the SHA1s and names of the files and directory objects that they -contain. - -Once this has been accomplished for every directory and file in the snapshot, -you have a single root directory object file and its corresponding SHA1. Since -nothing contains the root directory, you must record the root tree's SHA1 -somewhere. An ideal place to store it is in the snapshot message file. This way, -the uniqueness of the SHA1 of the message also depends on the entire contents of -the snapshot, and you can guarantee with absolute certainty that two identical -snapshot message SHA1s contain the same files! - -It's also convenient to create an object from the snapshot message in the same -way that you do for blobs and trees. Since you're maintaining a list of branch -and tag names that point to message SHA1s you don't have to worry about losing -track of which snapshots are important to you. - -With all of this information stored in the objects directory, you can safely -delete the snapshot directory that you used as the source of this operation. If -you want to reconstitute the snapshot at a later date it's simply a matter of -following the SHA1 of the root tree stored in the message file and extracting -each tree and blob into their corresponding directory and file. - -For a single snapshot, this transformation process doesn't get you much. You've -basically just converted one filesystem into another and created a lot of work -in the process. The real benefits of this system arise from reuse of trees and -blobs across snapshots. Imagine two sequential snapshots in which only a single -file in the root directory has changed. If the snapshots both contain 10 -directories and 100 files, the transformation process will create 10 trees and -100 blobs from the first snapshot but only one new blob and one new tree from -the second snapshot! - -By converting every snapshot directory in the old system to object files in the -new system, you can drastically reduce the number of files that are stored on -disk. Now, instead of storing perhaps 50 identical copies of a rarely changed -file, you only need to keep one. - -## Compressing Blobs - -Eliminating blob and tree duplication significantly reduces the total storage -size of your project history, but that's not the only thing you can do to save -space. Source code is just text. Text can be very efficiently compressed using -something like the LZW or DEFLATE compression algorithms. If you compress every -blob before computing its SHA1 and saving it to disk you can reduce the total -storage size of the project history by another very admirable quantity. - -## The True Git - -The VCS you have constructed is now a reasonable facsimile of Git. The main -difference is that Git gives you very nice command lines tools to handle such -things as creating new snapshots and switching to old ones (Git uses the term -"commit" instead of "snapshot"), tracing history, keeping branch tips -up-to-date, fetching changes from other people, merging and diffing branches, -and hundreds of other common (and not-so-common tasks). - -As you continue to learn Git, keep this parable in mind. Git is really very -simple underneath, and it is this simplicity that makes it so flexible and -powerful. One last thing before you run off to learn all the Git commands: -remember that it is almost impossible to lose work that has been committed. Even -when you delete a branch, all that's really happened is that the pointer to that -commit has been removed. All of the snapshots are still in the objects -directory, you just need to dig up the commit SHA. In these cases, look up -git reflog. It contains a history of what each branch pointed to -and in times of crisis, it will save the day. - -Here are some resources that you should follow as your next step. Now, go, and -become a Git master! - -* [Learn Git](http://learn.github.com/) -* [Git Community Book](http://book.git-scm.com/) -* [Git Magic](http://www-cs-students.stanford.edu/~blynn/gitmagic/) - --- - -[Discuss this post on Hacker News](http://news.ycombinator.com/item?id=615308) - -Creative
-Commons License diff --git a/_posts/2010-05-11-tomdoc-reasonable-ruby-documentation.md b/_posts/2010-05-11-tomdoc-reasonable-ruby-documentation.md deleted file mode 100644 index c28e3acc4..000000000 --- a/_posts/2010-05-11-tomdoc-reasonable-ruby-documentation.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -layout: post -title: TomDoc - Reasonable Ruby Documentation ---- - -{{ page.title }} -================ - -

11 May 2016 - San Francisco

- -[RDoc](http://rdoc.rubyforge.org) is an abomination. It's ugly to read in plain -text, requires the use of the inane :nodoc: tag to prevent private method -documentation from showing up in final rendering, and does nothing to encourage -complete or unambiguous documentation of classes, methods, or parameters. -[YARD](http://yardoc.org) is much better but goes too far in the other direction -(and still doesn't look good in plain text). Providing an explicit way to -specify parameters and types is great, but having to remember a bunch of strict -tag names in order to be compliant is not a good way to encourage coders to -write documentation. And again we see a `@private` tag that's necessary to hide -docs from the final render. - -Three years ago, after suffering with these existing documentation formats for -far too long, I started using my own documentation format. It looked a bit like -RDoc but had a set of conventions for specifying parameters, return values, and -the expected types. It used plain language and full sentences so that a human -could read and understand it without having to parse machine-oriented tags or -crufty markup. I called this format TomDoc, because if Linus can name stuff -after himself, then why can't I? - -After years in the making, TomDoc is finally a well specified documentation -format. You can find the full spec at [http://tomdoc.org](http://tomdoc.org). - -But enough talk. Here's a sample of what a TomDoc'd method might look like: - -``` ruby -# Public: Duplicate some text an abitrary number of times. -# -# text - The String to be duplicated. -# count - The Integer number of times to duplicate the text. -# -# Examples -# -# multiplex('Tom', 4) -# # => 'TomTomTomTom' -# -# Returns the duplicated String. -def multiplex(text, count) - text * count -end -``` - -At first glance you'll notice a few things. First, and most important, is that -the documentation looks nice in plain text. When I'm working on a project, I -need to be able to scan and read method documentation quickly. Littering the -docs with tags and markup (especially HTML markup) is not acceptable. Code -documentation should be optimized for human consumption. Second, all parameters -and return values, and their expected types are specified. Types are generally -denoted by class name. Because Ruby is so flexible, you are not constrained by a -rigid type declaration syntax and are free to explain precisely how the expected -types may vary under different circumstances. Finally, the basic layout is -designed to be easy to remember. Once you commit a few simple conventions to -memory, writing documentation becomes second nature, with all of the tricky -decision making already done for you. - -Today's Ruby libraries suffer deeply from haphazard versioning schemes. Even -RubyGems itself does not follow a sane or predictable versioning pattern. This -lack of discipline stems from the absence of well defined Public APIs. TomDoc -attempts to solve this problem by making it simple to define an unambiguous -Public API for your library. Instead of assuming that all classes and methods -are intended for public consumption, TomDoc makes the Public API opt-in. To -denote that something is public, all you have to do is preface the main -description with "Public:". By forcing you to explicitly state that a class or -method is intended for public consumption, a deliberate and thoughtful Public -API is automatically constructed that can inform disciplined version changes -according to the tenets of [Semantic Versioning](http://semver.org). In -addition, the prominent display of "Public" in a method description ensures that -developers are made aware of the sensitive nature of the method and do not -carelessly change the signature of something in the Public API. - -Once a Public API has been established, some very exciting things become -possible. We're currently working on a processing tool that will render TomDoc -into various forms (terminal, HTML, etc). If you run this tool on a library, -you'll get a printout of the Public API documentation. You can publish this -online so that others have easy access to it. When you roll a new version of the -library, you can run the tool again, giving it a prior version as a base, and -have it automatically display only the methods that have changed. This diff will -be extremely useful for users while they upgrade to the new version (or so they -can evaluate whether an upgrade is warranted)! - -While I've been using various nascent forms of TomDoc for several years, we're -just now starting to adopt it for everything we do at GitHub. Now that I've -formalized the spec it will be easy for the entire team to write compliant -TomDoc. The goal is to have every class, method, and accessor of every GitHub -library documented. In the future, once we have proper tooling, we'd even like -to create a unit test that will fail if anything is missing documentation. - -TomDoc is still a rough specification so I'm initially releasing it as 0.9.0. -Over the coming months I'll make any necessary changes to address user concerns -and release a 1.0.0 version once things have stabilized. If you'd like to -suggest changes, please open an issue on the [TomDoc GitHub -repository](http://github.com/mojombo/tomdoc). diff --git a/_posts/2010-08-23-readme-driven-development.md b/_posts/2010-08-23-readme-driven-development.md deleted file mode 100644 index 702192532..000000000 --- a/_posts/2010-08-23-readme-driven-development.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -layout: post -title: Readme Driven Development ---- - -{{ page.title }} -================ - -

23 August 2010 - San Francisco

- -I hear a lot of talk these days about TDD and BDD and Extreme Programming and SCRUM and stand up meetings and all kinds of methodologies and techniques for developing better software, but it's all irrelevant unless the software we're building meets the needs of those that are using it. Let me put that another way. A perfect implementation of the wrong specification is worthless. By the same principle a beautifully crafted library with no documentation is also damn near worthless. If your software solves the wrong problem or nobody can figure out how to use it, there's something very bad going on. - -Fine. So how do we solve this problem? It's easier than you think, and it's important enough to warrant its very own paragraph. - -Write your Readme first. - -First. As in, before you write any code or tests or behaviors or stories or ANYTHING. I know, I know, we're programmers, dammit, not tech writers! But that's where you're wrong. Writing a Readme is absolutely essential to writing good software. Until you've written about your software, you have no idea what you'll be coding. Between The Great Backlash Against Waterfall Design and The Supreme Acceptance of Agile Development, something was lost. Don't get me wrong, waterfall design takes things way too far. Huge systems specified in minute detail end up being the WRONG systems specified in minute detail. We were right to strike it down. But what took its place is too far in the other direction. Now we have projects with short, badly written, or entirely missing documentation. Some projects don't even have a Readme! - -This is not acceptable. There must be some middle ground between reams of technical specifications and no specifications at all. And in fact there is. That middle ground is the humble Readme. - -It's important to distinguish Readme Driven Development from Documentation Driven Development. RDD could be considered a subset or limited version of DDD. By restricting your design documentation to a single file that is intended to be read as an introduction to your software, RDD keeps you safe from DDD-turned-waterfall syndrome by punishing you for lengthy or overprecise specification. At the same time, it rewards you for keeping libraries small and modularized. These simple reinforcements go a long way towards driving your project in the right direction without a lot of process to ensure you do the right thing. - -By writing your Readme first you give yourself some pretty significant advantages: - -* Most importantly, you're giving yourself a chance to think through the project without the overhead of having to change code every time you change your mind about how something should be organized or what should be included in the Public API. Remember that feeling when you first started writing automated code tests and realized that you caught all kinds of errors that would have otherwise snuck into your codebase? That's the exact same feeling you'll have if you write the Readme for your project before you write the actual code. - -* As a byproduct of writing a Readme in order to know what you need to implement, you'll have a very nice piece of documentation sitting in front of you. You'll also find that it's much easier to write this document at the beginning of the project when your excitement and motivation are at their highest. Retroactively writing a Readme is an absolute drag, and you're sure to miss all kinds of important details when you do so. - -* If you're working with a team of developers you get even more mileage out of your Readme. If everyone else on the team has access to this information before you've completed the project, then they can confidently start work on other projects that will interface with your code. Without any sort of defined interface, you have to code in serial or face reimplementing large portions of code. - -* It's a lot simpler to have a discussion based on something written down. It's easy to talk endlessly and in circles about a problem if nothing is ever put to text. The simple act of writing down a proposed solution means everyone has a concrete idea that can be argued about and iterated upon. - -Consider the process of writing the Readme for your project as the true act of creation. This is where all your brilliant ideas should be expressed. This document should stand on its own as a testament to your creativity and expressiveness. The Readme should be the single most important document in your codebase; writing it first is the proper thing to do. - --- - -[Discuss this post on Hacker News](http://news.ycombinator.com/item?id=1627246) \ No newline at end of file diff --git a/_posts/2010-10-18-optimize-for-happiness.md b/_posts/2010-10-18-optimize-for-happiness.md deleted file mode 100644 index 95ebec7e2..000000000 --- a/_posts/2010-10-18-optimize-for-happiness.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -layout: post -title: Optimize for Happiness ---- - -{{ page.title }} -================ - -

18 October 2010 - San Francisco

- -Two days ago I had the pleasure of speaking at Startup School, a yearly conference on entrepreneurism put on by the great folks at Y Combinator. Never before have I see such a high concentration of smart ambitious people in one place. - -You can watch the recording of my thirty minute slot on Youtube: - -
- -Since I only had about 25 minutes for the talk and 5 minutes for questions, I wanted to expand upon and clarify some of the ideas I introduced during the talk and then make myself available for additional questions. So today (Monday, 18 October 2010) I'll be answering any questions you have via Hacker News: - -
Ask me a question on HN!
- -The very first commit to GitHub was made exactly three years ago tomorrow. In that time our team of thirteen has signed up over 420,000 developers and now hosts 1.3 million Git repositories, making us the largest code host on the planet. And we've done all of this without ever taking a dime of funding from outside the company. In fact, even within the company we only invested a few thousand dollars out of our own pockets during the first months to cover legal fees. - -During the presentation I talk about a choice between optimizing for happiness and optimizing for money. When I say "optimizing for money" I mean following the traditional venture capital route of raising a ton of money to stash in your bank account and going for a huge exit. The unfortunate reality of this approach is that for aspiring entrepreneurs that are not well connected to the VC world, it can take an extraordinary amount of time and effort to raise that money. Even if you are able to raise capital, you are suddenly responsible to your investors and will need to align your interests with theirs. - -In a world dominated by news about Facebook, Apple, Google, YouTube, Zappos, and other companies heavily funded by venture capital, it's easy to forget that you can still build a highly profitable business with significant impact on a global market without having to first spend three months on Sand Hill Road asking for permission to build your product. - -The infrastructure components necessary to run an internet business are finally cheap enough that you can get started without a huge up-front investment. In the months that you would traditionally spend in glass-walled conference rooms you can now build a sophisticated prototype of your product and start getting users signed up and engaging you with useful feedback. - -This is what I mean by optimizing for happiness: I'm a hacker; I'm happy when I'm building things of value, not when I'm writing a business plan filled with make believe numbers. - -When Chris and I started GitHub, I was working full time at Powerset and Chris was doing consulting work and plugging away on a product of his own. GitHub became the leisure activity that I worked on when I got home from the office. I could craft it however I pleased, and there was nobody telling me what to do. This feeling of control and ownership of something you own is intoxicating. - -Within three months we had a simple product and moved into private beta. In six months we launched to the public and started charging for private plans. We've been profitable every month since public launch except for one (in which we hired two new employees at once). We did this by making a paycheck via other means until GitHub was generating enough revenue to support us full time at about 2/3 of what we were accustomed to making. We then raised our salaries over the next months when we hit specific revenue goals that allowed us to remain profitable. This happened about one year after inception. - -A side effect of bootstrapping a sustainable company is what I like to call infinite runway. This is another element of optimizing for happiness. With venture backed endeavors you generally find that during the first several years the numbers in your bank account are perpetually decreasing, giving your company an expiration date. Your VCs have encouraged you to grow fast and spend hard, which makes perfect sense for them, but not necessary for you. Not if you're trying to optimize for happiness. - -VCs want to see quick success or quick failure. They are optimizing for money. There's nothing wrong with that as long as you want the same things they do. But if you're like me, then you care more about building a kickass product than you do about having a ten figure exit. If that's true, then maybe you should be optimizing for happiness. One way to do this is by bootstrapping a sustainable business with infinite runway. When there are fewer potentially catastrophic events on the horizon, you'll find yourself smiling a lot more often. - -The ironic thing about bootstrapping and venture capital is that once you demonstrate some success, investors will come to YOU. When this happens you will be in a much better place to make a more reasoned choice about taking on additional capital and all the complexities that come with it. Talking to VCs with some leverage in your back pocket is an entirely different game from throwing yourself in front of a conference table full of general partners and trying to persuade them that you're worth their time and money. Power is happiness. - -There are other really great things you can do when you optimize for happiness. You can throw away things like financial projections, hard deadlines, ineffective executives that make investors feel safe, and everything that hinders your employees from building amazing products. - -At GitHub we don't have meetings. We don't have set work hours or even work days. We don't keep track of vacation or sick days. We don't have managers or an org chart. We don't have a dress code. We don't have expense account audits or an HR department. - -We pay our employees well and give them the tools they need to do their jobs as efficiently as possible. We let them decide what they want to work on and what features are best for the customers. We pay for them to attend any conference at which they've gotten a speaking slot. If it's in a foreign country, we pay for another employee to accompany them because traveling alone sucks. We show them the profit and loss statements every month. We expect them to be responsible. - -We make decisions based on the merits of the arguments, not on who is making them. We strive every day to be better than we were the day before. - -We hold our board meetings in bars. - -We do all this because we're optimizing for happiness, and because there's nobody to tell us that we can't. - -
Ask me a question on HN!
diff --git a/_posts/2010-12-11-designer-architect-developer.md b/_posts/2010-12-11-designer-architect-developer.md deleted file mode 100644 index e5a943729..000000000 --- a/_posts/2010-12-11-designer-architect-developer.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -layout: post -title: Designer, Architect, Developer ---- - -{{ page.title }} -================ - -

11 Dec 2010 - San Francisco

- -Over the last six years I’ve bootstrapped three successful enterprises (Cube6 Media, Gravatar, and GitHub) and failed to gain traction with a handful of others. After a lot of thought and reflections on these experiences, I’ve identified three major skills that should be present in order to best build a successful web application. These roles can be loosely defined as the Designer, the Architect, and the Developer. - -In college I spent a lot of time in the campus dark room dipping rolls of film and sheets of paper into various chemical baths beneath a dim red light. The most interesting part, though, was mounting the negative into the projector and exposing the photo paper. Every time I turned on the bright light of the projector I was reminded of a saying that has stuck with me ever since: “A photograph is nothing more than an image created by light.” Think about that for a second. The only way the photograph, and hence, the viewer, interact with the original subject is via the light that was captured. None of the fancy flashes, soft boxes, bounces, umbrellas, or backdrops mean a thing if the light they produce or redirect is in the wrong place. If the light is bad, the photograph is bad. - -I think the same concept holds true for web applications. Adapting the saying for our own situation, I would say: “A web application is nothing more than an experience created by design.” Users can’t see what technology you use or whether you follow an agile development process or not. All they experience is what’s on the screen. It can’t be confusing, it can’t look amateur, and it can’t have spelling errors. If the UX is bad, the web application is bad. It’s that simple. - -The way you get good UX is by having a good designer. Someone on the team must be skilled not only in making things pretty, but in making them usable as well. Without a good UX/visual design, you may as well not even bother. It’s impossible to stress how important this is. - -Design comes first. It defines what you will build. Once you have an idea of what you’re creating, you need to figure out how to make it happen. That’s where the Architect comes in. - -With the recent explosion of open source solutions to common problems like databases, web frameworks, job processors, messaging systems, etc, you need a team member that has a broad understanding of the technology landscape. The choices you make early on will impact your company for many years, and the wrong choices can spell disaster. The role of the Architect is to choose the best tools for the job, and to decide when new tools need to be created. - -The Architect must also be ready to scale any piece of the site when you start attracting users. There’s a fine line between premature optimization and crumbling under the wave of thousands of new signups. A good architect will always be one step ahead of the curve, laying the groundwork for future scaling needs just before they are needed. - -Design and architecture dictate what you build and how you build it, but without someone to do the construction, you’re dead in the water. The role of the Developer is to turn the wishes of the Designer into reality while staying within the constraints that the Architect has put forth. In addition, the Developer has to ensure that the codebase remains healthy and protect against technical debt. Sloppy development up front means a huge amount of wasted effort later on. - -The three roles of the Designer, the Architect, and the Developer may reside in a single person, but it’s much more common to see groups of two or three people satisfy all these skills. In fact, the best founding teams are those where everyone fills some combination of roles. This fosters an environment of friendly argument that leads to better decisions. - -But whatever you do, make sure your team fills all of these roles. Once you do, executing on your idea should come easily! diff --git a/_posts/2011-03-29-ten-lessons-from-githubs-first-year.md b/_posts/2011-03-29-ten-lessons-from-githubs-first-year.md deleted file mode 100644 index e61a34d83..000000000 --- a/_posts/2011-03-29-ten-lessons-from-githubs-first-year.md +++ /dev/null @@ -1,250 +0,0 @@ ---- -layout: post -title: Ten Lessons from GitHub's First Year ---- - -{{ page.title }} -================ - -

29 Mar 2011 / 29 Dec 2008 - San Francisco

- -**NOTE: This post was written in late December of 2008, more than two years -ago. It has stayed in my drafts folder since then, waiting for the last 2% to be -written. Why I never published it is beyond my reckoning, but it serves as a -great reminder of how I perceived the world back then. In the time since I wrote -this we've grown from four people to twenty-six, settled into an office, -installed a kegerator, and still never taken outside funding. In some ways, -things have changed a great deal, but in the most important ways, things are -still exactly the same. Realizing this puts a big smile on my face.** - -The end of the year is a great time to sit down with a glass of your favorite -beverage, dim the lights, snuggle up next to the fire and think about what -you've learned over the past twelve months. - -For me, 2008 was the year that I helped design, develop, and launch GitHub. -Creating a new startup is an intense learning experience. Through screwups and -triumphs, I have learned some valuable lessons this year. Here's a few of them. - -## Start Early - -When Chris and I started working on GitHub in late 2007, Git was largely unknown -as a version control system. Sure, Linux kernel hackers had been using it since -day one, but outside of that small microcosm, it was rare to come across a -developer that was using it on a day-to-day basis. I was first introduced to Git -by Dave Fayram, a good friend and former coworker during my days at Powerset. -Dave is the quintessential early adopter and, as far as I can calculate, patient -zero for the spread of Git adoption in the Ruby community and beyond. - -Back then, the Git landscape was pretty barren. Git had only recently become -usable by normal people with the 1.5 release. As for Git hosting, there was -really only [repo.or.cz](http://repo.or.cz/), which felt to me very limited, -clumsy, and poorly designed. There were no commercial Git hosting options -whatsoever. Despite this, people were starting to talk about Git at the Ruby -meetups. About how awesome it was. But something was amiss. Git was supposed to -be this amazing way to work on code in a distributed way, but what was the -mechanism to securely share private code? Your only option was to setup user -accounts on Unix machines and use that as an ad-hoc solution. Not ideal. - -And so GitHub was born. But it was born into a world where there was no existing -market for paid Git hosting. We would be _creating_ the market. I vividly -remember telling people, "I don't expect GitHub to succeed right away. Git -adoption will take a while, but we'll be ready when it happens." Neither Chris -nor I were in any particular hurry for this to happen. I was working full time -at Powerset, and he was making good money as a Rails consultant. By choosing to -build early on top of a nascent technology, we were able to construct a startup -with basically no overhead, no competition, and in our free time. - -## Adapt to Your Customers - -Here's a seemingly paradoxical piece of advice for you: Listen to your -customers, but don't let them tell you what to do. Let me explain. Consider a -feature request such as "GitHub should let me FTP up a documentation site for my -project." What this customer is really trying to say is "I want a simple way to -publish content related to my project," but they're used to what's already out -there, and so they pose the request in terms that are familiar to them. We could -have implemented some horrible FTP based solution as requested, but we looked -deeper into the underlying question and now we allow you to publish content by -simply pushing a Git repository to your account. This meets requirements of both -functionality _and_ elegance. - -Another company that understands this concept at a fundamental level is Apple. -I'm sure plenty of people asked Apple to make a phone but Steve Jobs and his -posse looked beneath the request and figured out what people really wanted: a -nice looking, simple to use, and easy to sync mobile device that kicked some -serious ass. And that's the secret. Don't give your customers what they ask for; -give them what they _want_. - -## Have Fun - -I went to college at a little school in California called Harvey Mudd. Yeah, I -know you haven't heard of it, but if you remember those US News & World Report -"Best Colleges" books that you obsessed over in highschool (ok, maybe you -didn't, but I did), Harvey Mudd was generally ranked as the engineering school -with the greatest number of hours of homework per night. Yes, more than MIT, and -yes, more than Caltech. It turned out to be true, as far as I can tell. I have -fond memories of freaking out about ridiculously complex spring/mass/damper -systems and figuring the magnetic flux of a wire wrapped around a cylinder in a -double helix. We studied hard--very hard. But we played hard too. It was the -only thing that could possibly keep us sane. - -Working on a startup is like that. It feels a bit like college. You're working -on insanely hard projects, but you're doing it with your best friends in the -world and you're having a great time (usually). In both environments, you have -to goof off a lot in order to balance things out. Burnout is a real and -dangerous phenomenon. Fostering a playful and creative environment is critical -to maintaining both your personal health, and the health (and idea output) of -the company. - -## Pay attention to Twitter - -I've found Twitter to be an extremely valuable resource for instant feedback. If -the site is slow for some reason, Twitter will tell me so. If the site is -unreachable for people in a certain country (I'm looking at you China), I'll -find out via Twitter. If that new feature we just released is really awesome, -I'll get a nice ego boost by scanning the Twitter search. - -People have a tendency to turn to Twitter to bitch about all the little bugs -they see on your website, usually appended with the very tiresome "FAIL". These -are irksome to read, but added together are worth noticing. Often times these -innocent tweets will inform a decision about whether an esoteric bug is worth -adding to the short list. We also created a GitHub account on Twitter that our -support guy uses to respond to negative tweets. Offering this level of customer -service almost always turns a disgruntled customer into a happy one. - -If you have an iPhone, I heartily recommend the -[Summizer](http://fanzter.com/products/download/summizer) app from Fanzter, Inc. -It makes searching, viewing, and responding to tweets a cinch. - -## Deploy at Will! - -At the first RailsConf I had the pleasure of hearing Martin Fowler deliver an -amazing keynote. He made some apt metaphors regarding agile development that I -will now paraphrase and mangle. - -Imagine you're tasked with building a computer controlled gun that can -accurately hit a target about 50 meters distant. That is the only requirement. -One way to do this is to build a complex machine that measures every possible -variable (wind, elevation, temperature, etc.) before the shot and then takes aim -and shoots. Another approach is to build a simple machine that fires rapidly and -can detect where each shot hits. It then uses this information to adjust the aim -of the next shot, quickly homing in on the target a little at a time. - -The difference between these two approaches is to realize that bullets are -cheap. By the time the former group has perfected their wind detection -instrument, you'll have finished your simple weapon and already hit the target. - -In the world of web development, the target is your ideal offering, the bullets -are your site deploys, and your customers provide the feedback mechanism. The -first year of a web offering is a magical one. Your customers are most likely -early adopters and love to see new features roll out every few weeks. If this -results in a little bit of downtime, they'll easily forgive you, as long as -those features are sweet. In the early days of GitHub, we'd deploy up to ten -times in one afternoon, always inching closer to that target. - -Make good use of that first year, because once the big important customers start -rolling in, you have to be a lot more careful about hitting one of them with a -stray bullet. Later in the game, downtime and botched deploys are money lost and -you have to rely more on building instruments to predict where you should aim. - -## You Don't Need an Office - -All four fulltime GitHub employees work in the San Francisco area, and yet we -have no office. But we're not totally virtual either. In fact, a couple times a -week you'll find us at a cafe in North Beach, huddled around a square table that -was made by nailing 2x4s to an ancient fold-out bulletin board. It's no Google -campus, but the rent is a hell of a lot cheaper and the drinks are just as good! - -This is not to say that we haven't looked at a few places to call home. Hell, we -almost leased an old bar. But in the end there's no hurry to settle down. We're -going to wait until we find the perfect office. Until then, we can invest the -savings back into the company, or into our pockets. For now, I like my couch and -the cafe just fine. - -Of course, none of this would be possible without 37signals' -[Campfire](http://www.campfirenow.com/) web-based chat and the -very-difficult-to-find-but-totally-amazing -[Propane](http://productblog.37signals.com/products/2008/10/propane-takes-c.html) -OSX desktop app container that doubles the awesome. Both highly recommended. - -## Hire Through Open Source - -Beyond the three cofounders of GitHub, we've hired one full time developer -(Scott Chacon) and one part time support specialist (Tekkub). - -We hired Tekkub because he was one of the earliest GitHub users and actively -maintains more than 75 projects (WoW addons mostly) on GitHub and was very -active in sending us feedback in the early days. He would even help people out -in the IRC channel, simply because he enjoyed doing so. - -I met Scott at one of the San Francisco Ruby meetups where he was presenting on -one of his myriad Git-centric projects. Scott had been working with Git long -before anyone else in the room. He was also working on a pure Ruby -implementation of Git at the same time I was working on my fork/exec based Git -bindings. It was clear to me then that depending on how things went down, he -could become either a powerful ally or a dangerous foe. Luckily, we all went -drinking afterwards and we became friends. Not long after, Scott started -consulting for us and wrote the entire backend for what you now know of as -[Gist](http://gist.github.com/). We knew then that we would do whatever it took -to hire Scott full time. There would be no need for an interview or references. -We already knew everything we needed to know in order to make him an offer -without the slightest reservation. - -The lesson here is that it's far easier and less risky to hire based on relevant -past performance than it is to hire based on projected future performance. -There's a corollary that also comes into play: if you're looking to work for a -startup (or anyone for that matter), contribute to the community that surrounds -it. Use your time and your code to prove that you're the best one for the job. - -## Trust your Team - -There's nothing I hate more than micromanagers. When I was doing graphic design -consulting 5 years ago I had a client that was very near the Platonic form of a -micromanager. He insisted that I travel to his office where I would sit in the -back room at an old Mac and design labels and catalogs and touch up photographs -of swimwear models (that part was not so bad!). While I did these tasks he would -hover over me and bark instructions. "Too red! Can you make that text smaller? -Get rid of those blemishes right there!" It drove me absolutely batty. - -This client could have just as easily given me the task at the beginning of the -day, gone and run the business, and come back in 6 hours whereupon I would have -created better designs twice as fast as if he were treating me like a robot that -converted his speech into Photoshop manipulations. By treating me this way, he -was marginalizing my design skills and wasting both money and talent. - -Micromanagement is symptomatic of a lack of trust. The remedy for this ailment -is to hire experts and then trust their judgment. In a startup, you can -drastically reduce momentum by applying micromanagement, or you can boost -momentum by giving trust. It's pretty amazing what can happen when a group of -talented people who trust each other get together and decide to make something -awesome. - -## You Don't Need Venture Capital - -A lot has been written recently about how the venture capital world is changing. -I don't pretend to be an expert on the subject, but I've learned enough to say -that a web startup like ours doesn't need any outside money to succeed. I know -this because we haven't taken a single dime from investors. We bootstrapped the -company on a few thousand dollars and became profitable the day we opened to the -public and started charging for subscriptions. - -In the end, every startup is different, and the only person that can decide if -outside money makes sense is you. There are a million things that could drive -you to seek and accept investment, but you should make sure that doing so is in -your best interest, because it's quite possible that you don't _need_ to do so. -One of the reasons I left my last job was so that I could say "the buck stops -here." If we'd taken money, I would no longer be able to say that. - -## Open Source Whatever You Can - -In order for GitHub to talk to Git repositories, I created the first ever Ruby -Git bindings. Eventually, this library become quite complete and we were faced -with a choice: Do we open source it or keep it to ourselves? Both approaches -have benefits and drawbacks. Keeping it private means that the hurdle for -competing Ruby-based Git hosting sites would be higher, giving us an advantage. -But open sourcing it would mean that - -NOTE: This is where the post ended and remained frozen in carbonite until -today. I intend to write a follow up post on our open source philosophy at -GitHub in the near future. I'm sure the suspense is killing you! - -[Discuss this post on Hacker News](http://news.ycombinator.com/item?id=2384320) diff --git a/_posts/2011-05-03-rejected-bio-from-the-setup.md b/_posts/2011-05-03-rejected-bio-from-the-setup.md deleted file mode 100644 index aff74795c..000000000 --- a/_posts/2011-05-03-rejected-bio-from-the-setup.md +++ /dev/null @@ -1,110 +0,0 @@ ---- -layout: post -title: Rejected Bio from The Setup ---- - -{{ page.title }} -================ - -

03 May 2011 - San Francisco

- -Yesterday, [the autobiographical post I wrote for The -Setup](http://tom.preston-werner.usesthis.com/) went live. I wrote that post -over a year ago and then entered into an epic battle with -[@waferbaby](http://twitter.com/#!/waferbaby) about the length of my "Who are -you, and what do you do?" section. He said it was too long. I said it could -not be shortened. And so the post sat for a year, collecting dust, neither of -us prepared to back down. - -About a month ago I decided that it was foolish to let the words I had written rot on my hard drive and so I did the only thing I knew how to do: overreact. So I cut the original nine-hundred words of my bio down to fourteen words and resubmitted it to Daniel. Those are the words you see in the post now. - -For your pleasure, here is the original bio in its full, unabridged glory. - -
- -My name is Tom Preston-Werner. I find that the hyphenated last name -makes me sound distinguished and worth listening to. I grew up three -decades ago in a small city in Iowa along the Mississippi, which means -I shucked a lot of corn and know exactly how many mosquitos will land -on your arm should you hold it still for ten minutes at dusk on the -muggiest day of the summer. As an aspiring theoretical particle -physicist, I worked my way through entire shelves of scientific -literature from the public library, desperately wanting to understand -the bewildering mathematics that littered the pages like so many -leaves on the bottom of that morning's cup of green tea. I searched in -vain for instructors or classmates that could provide me with the -insight necessary to comprehend the true meaning of Heisenberg's -Uncertainty Principle, but all I found were underpaid math teachers -and disillusioned "students" in search of their next smoke break. -After obsessing over US News' Best Colleges reports for months I -finally chose and was accepted to Harvey Mudd, a tiny engineering -school in California famous for assigning the greatest number of hours -of homework per night. This sounded just perfect to me. Finally a -place I could bring up the EPR Paradox and not be immediately -stigmatized as "that science weirdo with the hilariously thick glasses -and unfortunate hairdo." - -Mudd did not disappoint. But now I had the opposite problem. In order -to properly understand particle physics, you must have a deep and -profound love of math. You have to be so comfortable with abstract -concepts that even Picasso would be jealous. Ironically, in order to -grasp the fundamental reality of our universe, you must forget about -the "reality" of everyday life and start living in a world comprised -of eigenvectors, Hilbert spaces, and Planck's constant. This was a -leap I could not make. I like math, but I'm too easily distracted by -macroscopic reality to make it my profession. - -Once I accepted that I would never spend late nights poring over -bubble chamber printouts at Fermilab, it became obvious that I was -destined to enter computer science. I started programming in BASIC on -a TRS-80 that my dad bought from Radio Shack when I was 8 years old. -Since then, I'd learned to love the discipline and creativity involved -in making a machine do my bidding. It was like having a super-obedient -but annoyingly logical little brother. He'll do anything you want as -long as you tell him in precise and unambiguous language. The best -thing is, the feedback is immediate. In physics, it can take twenty -years to prove that a single esoteric particle even exists. When -you're writing a program that displays the number of electrons in each -of the shells around the nucleus of every element, the feedback is -immediate and intoxicating. With just a few keystrokes, the world is -changed forever. Try to get that kind of rush even once in a lifetime -as a theoretical particle physicist. I dare you. - -In 1999, after two years of college, I dropped out of Harvey Mudd to -join a startup with some friends that were graduating. It was the end -of the first dot-com bubble and I thought I could strike it rich, -right then and there. Sadly, like so many startups of the day, we -never accomplished what we envisioned and I ended up bouncing between -jobs and consulting gigs for six years until I found myself in San -Francisco. If Harvey Mudd was my mecca for physicists, then San -Francisco was my mecca for programmers. Where else can you be grabbing -lunch at a taqueria and overhear a group at the next table discussing -the finer points of optimizing C code to run on an embedded processor? - -I moved to San Francisco to take a job as a Ruby developer with a -Wikipedia search engine called Powerset. I also began attending Ruby -meetups and drinking with local software developers. There are a lot -of talented people in the Bay Area and I wanted to meet them all. -Within the Ruby community, a distributed version control system called -Git was starting to get some attention. It was a really cool way of -working with other people on code, but there wasn't an easy way to get -up and running with a group of developers. Along with cofounders Chris -Wanstrath and PJ Hyett (who I met at the Ruby meetups) I started a -company called GitHub that would address this problem and make it dead -simple to share Git repositories and collaborate on code with other -developers. - -At first, we worked on GitHub on the side, putting in time on evenings -and weekends. After six months we launched the site to the public and -started charging. Not long after that, Powerset was acquired by -Microsoft and I was faced with a choice: stay on as a Microsoft -employee with a big retention bonus and give up GitHub or turn down -the Microsoft money and quit Powerset to work on GitHub full-time. You -can read more about this saga in my blog post entitled [How I Turned -Down $300,000 from Microsoft to go Full-Time on -GitHub](http://tom.preston-werner.com/2008/10/18/how-i-turned-down-300k.html). -I think I made the right decision. - -Today GitHub has twenty-nine employees and more than 730,000 users with over -2,000,000 repositories. We're growing fast, and I'm having the time of -my life! \ No newline at end of file diff --git a/_posts/2011-11-22-open-source-everything.md b/_posts/2011-11-22-open-source-everything.md deleted file mode 100644 index 373c40cf3..000000000 --- a/_posts/2011-11-22-open-source-everything.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -layout: post -title: Open Source (Almost) Everything ---- - -{{ page.title }} -================ - -

22 Nov 2011 - San Francisco

- -When Chris and I first started working on GitHub in late 2007, we split the work into two parts. Chris worked on the Rails app and I worked on Grit, the first ever Git bindings for Ruby. After six months of development, Grit had become complete enough to power GitHub during our public launch of the site and we were faced with an interesting question: - -Should we open source Grit or keep it proprietary? - -Keeping it private would provide a higher hurdle for competing Ruby-based Git hosting sites, giving us an advantage. Open sourcing it would mean thousands of people worldwide could use it to build interesting Git tools, creating an even more vibrant Git ecosystem. - -After a small amount of debate we decided to open source Grit. I don't recall the specifics of the conversation but that decision nearly four years ago has led to what I think is one of our most important core values: open source (almost) everything. - -Why is it awesome to open source (almost) everything? ------------------------------------------------------ - -If you do it right, open sourcing code is **great advertising** for you and your company. At GitHub we like to talk publicly about libraries and systems we've written that are still closed but destined to become open source. This technique has several advantages. It helps determine what to open source and how much care we should put into a launch. We recently open sourced Hubot, our chat bot, to widespread delight. Within two days it had 500 watchers on GitHub and 409 upvotes on Hacker News. This translates into goodwill for GitHub and more superfans than ever before. - -If your code is popular enough to attract outside contributions, you will have created a **force multiplier** that helps you get more work done faster and cheaper. More users means more use cases being explored which means more robust code. Our very own [resque](https://github.com/defunkt/resque) has been improved by 115 different individuals outside the company, with hundreds more providing 3rd-party plugins that extend resque's functionality. Every bug fix and feature that you merge is time saved and customer frustration avoided. - -Smart people like to hang out with other smart people. Smart developers like to hang out with smart code. When you open source useful code, you **attract talent**. Every time a talented developer cracks open the code to one of your projects, you win. I've had many great conversations at tech conferences about my open source code. Some of these encounters have led to ideas that directly resulted in better solutions to problems I was having with my projects. In an industry with such a huge range of creativity and productivity between developers, the right eyeballs on your code can make a big difference. - -If you're hiring, **the best technical interview possible** is the one you don't have to do because the candidate is already kicking ass on one of your open source projects. Once technical excellence has been established in this way, all that remains is to verify cultural fit and convince that person to come work for you. If they're passionate about the open source code they've been writing, and you're the kind of company that cares about well-crafted code (which clearly you are), that should be simple! We hired [Vicent Martí](https://github.com/tanoku) after we saw him doing stellar work on [libgit2](https://github.com/libgit2/libgit2), a project we're spearheading at GitHub to extract core Git functionality into a standalone C library. No technical interview was necessary, Vicent had already proven his skills via open source. - -Once you've hired all those great people through their contributions, dedication to open source code is an amazingly effective way to **retain that talent**. Let's face it, great developers can take their pick of jobs right now. These same developers know the value of coding in the open and will want to build up a portfolio of projects they can show off to their friends and potential future employers. That's right, a paradox! In order to keep a killer developer happy, you have to help them become more attractive to other employers. But that's ok, because that's exactly the kind of developer you want to have working for you. So relax and let them work on open source or they'll go somewhere else where they can. - -When I start a new project, I assume it will eventually be open sourced (even if it's unlikely). This mindset leads to **effortless modularization**. If you think about how other people outside your company might use your code, you become much less likely to bake in proprietary configuration details or tightly coupled interfaces. This, in turn, leads to cleaner, more maintainable code. Even internal code should pretend to be open source code. - -Have you ever written an amazing library or tool at one job and then left to join another company only to rewrite that code or remain miserable in its absence? I have, and it sucks. By getting code out in the public we can drastically **reduce duplication of effort**. Less duplication means more work towards things that matter. - -Lastly, **it's the right thing to do**. It's almost impossible to do anything these days without directly or indirectly executing huge amounts of open source code. If you use the internet, you're using open source. That code represents millions of man-hours of time that has been spent and then given away so that everyone may benefit. We all enjoy the benefits of open source software, and I believe we are all morally obligated to give back to that community. If software is an ocean, then open source is the rising tide that raises all ships. - -Ok, then what shouldn't I open source? --------------------------------------- - -That's easy. Don't open source anything that represents core business value. - -Here are some examples of what we don't open source and why: - -* Core GitHub Rails app (easier to sell when closed) -* The Jobs Sinatra app (specially crafted integration with github.com) - -Here are some examples of things we do open source and why: - -* Grit (general purpose Git bindings, useful for building many tools) -* Ernie (general purpose BERT-RPC server) -* Resque (general purpose job processing) -* Jekyll (general purpose static site generator) -* Gollum (general purpose wiki app) -* Hubot (general purpose chat bot) -* Charlock_Holmes (general purpose character encoding detection) -* Albino (general purpose syntax highlighting) -* Linguist (general purpose filetype detection) - -Notice that everything we keep closed has specific business value that could be compromised by giving it away to our competitors. Everything we open is a general purpose tool that can be used by all kinds of people and companies to build all kinds of things. - -What is the One True License? ------------------------------ - -I prefer the MIT license and almost everything we open source at GitHub carries this license. I love this license for several reasons: - -* It's short. Anyone can read this license and understand exactly what it means without wasting a bunch of money consulting high-octane lawyers. - -* Enough protection is offered to be relatively sure you won't sue me if something goes wrong when you use my code. - -* Everyone understands the legal implications of the MIT license. Weird licenses like the WTFPL and the Beer license pretend to be the "ultimate in free licenses" but utterly fail at this goal. These fringe licenses are too vague and unenforceable to be acceptable for use in some companies. On the other side, the GPL is too restrictive and dogmatic to be usable in many cases. I want everyone to benefit from my code. Everyone. That's what Open should mean, and that's what Free should mean. - -Rad, how do I get started? --------------------------- - -Easy, just flip that switch on your GitHub repository from private to public and tell the world about your software via your blog, Twitter, Hacker News, and over beers at your local pub. Then sit back, relax, and enjoy being part of something big. - -[Discuss this post on Hacker News](http://news.ycombinator.com/item?id=3267432) diff --git a/_posts/2014-04-21-farewell-github-hello-immersive-computing.md b/_posts/2014-04-21-farewell-github-hello-immersive-computing.md deleted file mode 100644 index 678abc38a..000000000 --- a/_posts/2014-04-21-farewell-github-hello-immersive-computing.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -layout: post -title: Farewell GitHub, Hello Immersive Computing ---- - -{{ page.title }} -================ - -

21 Apr 2014 - New York City

- -Today is my last day at GitHub. Recent events have given me a lot of time to -reflect on what's important to me, and I've decided to switch gears and focus on -building something from scratch again. Since visiting the Oculus VR team at -their office three months ago, I've come to believe that immersive computing -(aka virtual reality) is poised to rival the personal computer, the web, social -networking, and mobile devices in its impact. While the timing is more abrupt -than I had intended, with everything that's happened, I think now is the right -time to do this, and I'd like to explain why. - -First, I want to address the serious accusations that were made against me and -my family over the past month. With every decision I made at GitHub and in every -interaction I had with employees, I tried to treat people better than they -expected and to resolve conflict with empathy. Despite that, I've made mistakes, -and I am deeply sorry to anyone who was hurt by those mistakes. It devastates me -to know that I missed the mark, and I will strive to do better, every day. - -That said, I want to be very clear about one thing: neither my wife, Theresa, -nor I have ever engaged in gender-based harassment or discrimination. The -results of GitHub's independent investigation unequivocally confirm this and we -are prepared to fight any further false claims on this matter to the full extent -of the law. I believe in diversity and equality for all people in all -professions, especially the tech sector. It's immensely important to me and I -will continue to do my very best to further that belief. - -Unfortunately, the investigation and all the attention surrounding it have me -concerned that remaining at GitHub would be a distraction for both me and the -company. I'm incredibly proud of what I've helped build at GitHub and I don't -want the events of the past month to jeopardize that. I care too much about the -company and the people here to let that happen. The GitHub team is incredibly -strong, with fierce vision, and I have no doubt they will continue to -revolutionize software development for decades to come. Founding and building -GitHub has been the greatest adventure of my life. I've been so lucky to be on -this journey with such amazing, helpful, talented, and real people. I'm going to -miss working with such a great team, but I'm also insanely excited about the -future. - -Since the early days of GitHub, I've wanted to create a different kind of -business. One that was [Optimized for -Happiness](http://tom.preston-werner.com/2010/10/18/optimize-for-happiness.html) -and built atop a [Framework of -Happiness](https://www.youtube.com/watch?v=i0FzgvYxdvk). One where great people -could work on hard problems together to create unbelievably good products. I -believe I was able to achieve a great deal of success with that model at GitHub, -even if things didn't always go perfectly according to plan. All of this has -been a tremendous learning experience for me. - -Last January I stepped down as CEO and handed that role over to cofounder Chris -Wanstrath so I could focus on future-facing R&D projects with small teams. This -kind of rapid, team-based innovation is what I live for. During my time away -from GitHub I started experimenting with Go, OpenGL, and Unity with an eye -towards the software side of immersive computing. It felt really good to get -back into a code editor and challenge the deeply logical and analytical part of -my brain. I've enjoyed the challenges of learning how to lead a company with -hundreds of people, but it's very hard for me to deny the allure of coding a -system that could once again change the course of history. - -I'm telling you this because I think stealth mode is bullshit and if you feel -the same way I do about immersive computing then I want to talk with you about -it. For the next few months I'm going to be living in Manhattan. My wife, -Theresa, is currently participating in Techstars NYC as their very first -nonprofit. Her startup, [The Omakase Charity](https://omakasecharity.org/), -helps donors learn about and support nonprofits that are changing the world with -technology. She's one of the strongest and most thoughtful women I know, and I'm -hoping to help her succeed with her mission while I'm here. - -Thank you to everyone that reached out to me over the last month, including the -generous team at Andreessen Horowitz. Your support has made a huge difference -and I'm truly excited for what's next. diff --git a/_posts/2015-06-19-replicated.md b/_posts/2015-06-19-replicated.md deleted file mode 100644 index 43b941adb..000000000 --- a/_posts/2015-06-19-replicated.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -layout: post -title: Replicated - An Easier Path from SaaS to Enterprise ---- - -{{ page.title }} -================ - -

19 Jun 2015 - San Francisco

- -Over the last year I've had a chance to learn a lot more about early stage -funding and made angel investments in a handful of startups. So far I've -restricted my involvement to companies with ideas in which I have significant -domain knowledge. I also insist on founders with relentless product focus, a -fierce desire to help their customers be more awesome, and excellent -communication skills. I recently met just such a company, with just such -founders, tackling a problem that has personally caused me much pain. - -The company is [Replicated](http://replicated.com), and founders Grant Miller -and Marc Campbell are making it easier to roll out an on-prem Enterprise -offering based on an existing cloud-based SaaS product. - -At GitHub, we burned through **a lot** of developer cycles building our own -installer (several times), securing the installation environment, coding an -automated licensing management system, integrating single sign-on services -(LDAP, Active Directory, CAS, etc, etc), building out a searchable audit system, -supporting customer-reviewable support bundles (logs and other diagnostic -output), allowing numerous backup strategies, and countless other -Enterprise-specific features that were killing our Enterprise deals. All of this -on top of hiring and building out the necessary sales, support, and accounting -teams to create a smooth Enterprise experience for our customers. - -Replicated provides common Enterprise functionality (much of what I mentioned -above, and all of it eventually) that you can wrap around your SaaS product, -resulting in a first-class on-prem product in a fraction of the time. Beyond -just technology, Replicated will help you understand your Enterprise customers -through documentation on best practices and insight into the requirements and -reasons that large companies desire the features they do. Until you can -empathise with your customer (which is very hard to do as a fast-moving SaaS -startup), you'll never build the best product possible. - -Getting into the Enterprise market will always be hard. But by reducing the -technology burden, Replicated plans to erase much of the pain so you can focus -on the other human-centric tasks. Not only am I an investor in Replicated, I -believe in their mission and their founders so much that I've joined as an -advisor. I understand what the uphill slog of the SaaS to Enterprise climb feels -like, and I'm going to do my best to ensure you don't have to suffer it as much -as I did. - -I'm also pleased to announce that Travis CI is now shipping their Enterprise -product using Replicated. To see what the installation process is like, [watch -Grant install Travis CI -Enterprise](https://www.youtube.com/watch?v=ViN-qkcovL0&feature=youtu.be) on a -fresh server in about seven minutes. For a deeper dive, Travis CI has also -published a blog post covering some of their process in [getting their -Enterprise installer ready using -Replicated](http://blog.travis-ci.com/2015-06-19-how-we-improved-travis-ci-installation/). - -In the coming weeks, you'll start to see other well-known startups launching (or -re-launching) Enterprise versions of their SaaS software on top of Replicated. -If you're looking to do the same, and want to save yourself a lot of heartache, -email [contact@replicated.com](mailto:contact@replicated.com), and start -focusing on what matters the most: your unique and kickass product. diff --git a/_posts/2016-11-10-snyk.md b/_posts/2016-11-10-snyk.md deleted file mode 100644 index df9852634..000000000 --- a/_posts/2016-11-10-snyk.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -layout: post -title: Snyk - Automatically Scan and Fix Ruby and Nodejs Vulnerabilities ---- - -{{ page.title }} -================ - -

10 Nov 2016 - San Francisco

- -This is a story about a company called -[Snyk](https://snyk.io/blog/welcome-ruby-users/) (pronounced "sneak"), their -founder Guy Podjarny, my decision to become one of their advisors, and how they -are going to help save you from malevolent agents trying to steal your digital -stuff. - -If you're anything like me, you're simultaneously terrified and in awe of the -increasing commonality of large corporate security breaches. Even big names like -Ebay, Home Depot, Anthem, JP Morgan Chase, Target, LinkedIn, Dropbox, and Yahoo -are falling victim to sophisticated attacks. If you spend even a few minutes -looking into it, you'll be shocked at how frequently these breaches are -happening now. The fine folks at Information is Beautiful have an excellent -interactive visualization of the [World's Biggest Data -Breaches](http://www.informationisbeautiful.net/visualizations/worlds-biggest-data-breaches-hacks/) -over the last twelve years, in case you want to read all the gory details and -never get a restful night of sleep ever again: - - - - - -I've used a fair number of emotionally charged words above that might be -triggering your FUD detectors right about now. But be advised: it's not paranoia -when they really are out to get you. If recent, extremely high profile (and -subsequently weaponized) breaches like those of the Clinton Campaign and the DNC -aren't enough to make you want to air gap your entire life, then I envy your -steely-eyed mettle and implore you to teach me your meditation techniques. - -The fact is, security is hard. And it's getting harder every day. To win, you -have to get it right every single time. To lose (and lose big), you only have to -screw it up once. - -During my years at GitHub, I spent a lot of time assembling a dedicated security -team, managing security audits and penetration tests, and working to establish a -culture of security awareness amongst our development team. All of this is -challenging and expensive, especially for a young company. Even worse, it's the -kind of investment that's totally invisible when it's working, making it hard to -sustain until that crucial and terrible moment you end up on the front page of -Hacker News as the latest victim. - -A year ago I was contemplating this, especially the difficult proposition of -having developers, furious at work on new features, constantly maintain -awareness of security vulnerabilities they might be inadvertently weaving into -the product. Web application developers are generally not security experts, and -though I would love to live in a world where that wasn't true, it's just not a -realistic expectation. Meanwhile, modern development means an increasing -reliance on 3rd party code. Even a small Rails app will probably have 300 or -more gem dependencies after a few months of development. It's even more in the -nodejs world. This level of modularization and code reuse, driven by the -explosion of high quality open source over the last decade, is amazing and I -absolutely love it, but it comes at a security expense. - -Open source projects are not known for their excellent security records. -Vulnerabilities like [Heartbleed](http://heartbleed.com/) and -[Shellshock](https://blog.cloudflare.com/inside-shellshock/) painfully -demonstrate the idea that "given enough eyeballs, all bugs are shallow" is -completely false. In fact, due to a flaw in YAML, Rails had a [pretty extreme -remote code execution -vulnerability](http://blog.codeclimate.com/blog/2013/01/10/rails-remote-code-execution-vulnerability-explained/) -for years. If you were running any version of Rails prior to the fix, you were -vulnerable. This stuff is real, and as responsible developers, we need to be -more proactive about it. - -Luckily, at the time I was pondering these matters, I ran into Guy Podjarny. As -a former cofounder of Blaze.io and then CTO of Web Experience at Akamai (which -acquired Blaze.io), Guy intimately understands the impact of security on today's -web developers. He was working on an automated tool to scan and fix security -vulnerabilities in 3rd party dependencies. I was intrigued. They already had a -way to scan nodejs projects and look for known security vulnerabilities in the -dependency tree and automatically upgrade or patch affected libraries. I thought -this was pretty cool, but it was his vision for what automated security tooling -could be that sold me on him and his company. I can't talk much about that -now, but just know that what Snyk is today is just the tip of what will -become an intelligent and proactive bodyguard for your entire codebase. - -A few months ago, Snyk released GitHub integration to make it fantastically -simple to hook up your repos to Snyk and, my favorite feature: the ability to -monitor your repo for future vulnerabilities and then **automatically submit a -pull request** with the suggested package upgrade or hotfix patch (nodejs only for -now). - -Today, [Snyk announced support for -Ruby](https://snyk.io/blog/welcome-ruby-users/). Take a look at that blog post, -it does an awesome job of explaining how simple it is to set up and what the -generated pull requests look like. It's totally free for open source projects, -and extremely cheap insurance for your important projects. - -Make no mistake, 3rd party code is a clear and present danger to your business. -If you don't know if you're vulnerable, then you must assume that you are and -take steps to protect yourself. Snyk makes it easy. diff --git a/_posts/2017-12-10-wat-ik-vandaag-nou-weer.md b/_posts/2017-12-10-wat-ik-vandaag-nou-weer.md new file mode 100644 index 000000000..3f35ae6ea --- /dev/null +++ b/_posts/2017-12-10-wat-ik-vandaag-nou-weer.md @@ -0,0 +1,8 @@ + + + +**Wat ik vandaag nou weer heb meegemaakt** +Het was helemaal raar! + diff --git a/_posts/2017-12-15-posted.md b/_posts/2017-12-15-posted.md new file mode 100644 index 000000000..8a54c56e2 --- /dev/null +++ b/_posts/2017-12-15-posted.md @@ -0,0 +1,6 @@ + + +Zo, dit lijkt er al meer op! + \ No newline at end of file diff --git a/_posts/2017-12-20-iets-op-de-twintigste.md b/_posts/2017-12-20-iets-op-de-twintigste.md new file mode 100644 index 000000000..360b4a931 --- /dev/null +++ b/_posts/2017-12-20-iets-op-de-twintigste.md @@ -0,0 +1,14 @@ +--- +layout: post +title: iets op de twintigste +--- + +{{ page.title }} +================ + +

20 dec 2017 - Amsterdam

+ + +# iets op de twintigste + +De Conversational Interface (Chat Interface, Voice User Interface) is een opkomende technologie in het CMD vakgebied. Er bestaat nog geen (les)methode voor het ontwerpen van een Conversational Interface. Ik ontwikkel daarom een overdraagbare (leer)methode voor het ontwerpen en maken van CI. De methode biedt studenten, docenten en professionals een praktische vorm om een CI te ontwerpen en prototypen, en toont de mogelijkheden en uitdagingen van CI in de toekomstige beroepspraktijk. De methode draagt bij aan de kennis over CI binnen en buiten de HvA, en versterkt zo de positie van CMD als innovatieve opleiding. diff --git a/_posts/2017-12-29-first-today.md b/_posts/2017-12-29-first-today.md new file mode 100644 index 000000000..b4b7100b3 --- /dev/null +++ b/_posts/2017-12-29-first-today.md @@ -0,0 +1,15 @@ +--- +layout: post +title: what should it be about +--- + +{{ page.title }} +================ + +

20 dec 2017 - Amsterdam

+ + +# iets op de twintigste + + +# what should it be about diff --git a/_posts/2017-12-29-test.md b/_posts/2017-12-29-test.md new file mode 100644 index 000000000..f14f0b8e9 --- /dev/null +++ b/_posts/2017-12-29-test.md @@ -0,0 +1,15 @@ +--- +layout: post +title: wat ik de 29e deed +--- + +{{ page.title }} +================ + +

20 dec 2017 - Amsterdam

+ + + +# wat ik de 29e deed + +Iets mer informatie diff --git a/_posts/2017-12-30-what-i-did.md b/_posts/2017-12-30-what-i-did.md new file mode 100644 index 000000000..98c997cde --- /dev/null +++ b/_posts/2017-12-30-what-i-did.md @@ -0,0 +1,11 @@ +--- +layout: post +title: What I did today +--- + +{{ page.title }} +================ + +

30 dec 2017 - Amsterdam

+ +Some notes on the project I am doing diff --git a/_posts/2017-30-10-wat-ik-vandaag-nou-weer.md b/_posts/2017-30-10-wat-ik-vandaag-nou-weer.md new file mode 100644 index 000000000..ef60eaf65 --- /dev/null +++ b/_posts/2017-30-10-wat-ik-vandaag-nou-weer.md @@ -0,0 +1,8 @@ + + + +**Wat ik vandaag nou weer heb meegemaakt zeg** +Het was helemaal raar! + \ No newline at end of file diff --git a/_posts/Welcome file.md b/_posts/Welcome file.md new file mode 100644 index 000000000..d809d7d22 --- /dev/null +++ b/_posts/Welcome file.md @@ -0,0 +1,152 @@ +# Welcome to StackEdit! + +Hi! I'm your first Markdown file in **StackEdit**. If you want to learn about StackEdit, you can read me. If you want to play with Markdown, you can edit me. If you have finished with me, you can just create new files by opening the **file explorer** on left corner of the navigation bar. + + +# Files + +StackEdit stores your files in your browser, which means all your files are automatically saved locally and are accessible **offline!** + +> **Note:** +> +> - StackEdit can be used offline thanks to the application cache. +> - Your local files are not shared between different browsers or computers unless you use the [synchronization mechanism](#synchronization). +> - Clearing your browser's data may **delete all your files!** Make sure you sign in with Google to have all your files and settings backed up and synced. + +## Create files and folders + +The file explorer is accessible using the button in left corner of the navigation bar. You can create a new file by clicking the **New file** button in the file explorer. You can also create folders by clicking the **New folder** button. + +## Switch to another file + +All your files are listed in the file explorer. You can switch from one to another by clicking a file in the list. + +## Rename a file + +You can rename the current file by clicking the file name in the navigation bar or by clicking the **Rename** button in the file explorer. + +## Delete a file + +You can delete the current file by clicking the **Remove** button in the file explorer. The file will be moved into the **Trash** folder and automatically deleted after 7 days of inactivity. + +## Export a file + +You can export the current file by clicking **Export to disk** in the menu. You can choose to export the file as plain Markdown, as HTML using a Handlebars template or as a PDF. + + +# Synchronization + +Synchronization is one of the biggest features of StackEdit. It enables you to synchronize any file in your workspace with other files stored in your **Google Drive**, your **Dropbox** and your **GitHub** accounts. This allows you to keep writing on other devices, collaborate with people you share the file with, integrate easily into your workflow... The synchronization mechanism takes place every minute in the background, downloading, merging, and uploading file modifications. + +There are two types of synchronization and they can complement each other: + +- The workspace synchronization will sync all your files, folders and settings automatically. This will allow you to fetch your workspace on any other device. + > To start syncing your workspace, just sign in with Google in the menu. + +- The file synchronization will keep one file of the workspace synced with one or multiple files in **Google Drive**, **Dropbox** or **GitHub**. + > Before starting to sync files, you must link an account in the **Synchronize** sub-menu. + +## Open a file + +You can open a file from **Google Drive**, **Dropbox** or **GitHub** by opening the **Synchronize** sub-menu and clicking **Open from**. Once opened in the workspace, any modification in the file will be automatically synced. + +## Save a file + +You can save any file of the workspace to **Google Drive**, **Dropbox** or **GitHub** by opening the **Synchronize** sub-menu and clicking **Save on**. Even if a file in the workspace is already synced, you can save it to another location. StackEdit can sync one file with multiple locations and accounts. + +## Synchronize a file + +Once your file is linked to a synchronized location, StackEdit will periodically synchronize it by downloading/uploading any modification. A merge will be performed if necessary and conflicts will be resolved. + +If you just have modified your file and you want to force syncing, click the **Synchronize now** button in the navigation bar. + +> **Note:** The **Synchronize now** button is disabled if you have no file to synchronize. + +## Manage file synchronization + +Since one file can be synced with multiple locations, you can list and manage synchronized locations by clicking **File synchronization** in the **Synchronize** sub-menu. This allows you to list and remove synchronized locations that are linked to your file. + + +# Publication + +Publishing in StackEdit makes it simple for you to publish online your files. Once you're happy with a file, you can publish it to different hosting platforms like **Blogger**, **Dropbox**, **Gist**, **GitHub**, **Google Drive**, **WordPress** and **Zendesk**. With [Handlebars templates](http://handlebarsjs.com/), you have full control over what you export. + +> Before starting to publish, you must link an account in the **Publish** sub-menu. + +## Publish a File + +You can publish your file by opening the **Publish** sub-menu and by clicking **Publish to**. For some locations, you can choose between the following formats: + +- Markdown: publish the Markdown text on a website that can interpret it (**GitHub** for instance), +- HTML: publish the file converted to HTML via a Handlebars template (on a blog for example). + +## Update a publication + +After publishing, StackEdit keeps your file linked to that publication which makes it easy for you to re-publish it. Once you have modified your file and you want to update your publication, click on the **Publish now** button in the navigation bar. + +> **Note:** The **Publish now** button is disabled if your file has not been published yet. + +## Manage file publication + +Since one file can be published to multiple locations, you can list and manage publish locations by clicking **File publication** in the **Publish** sub-menu. This allows you to list and remove publication locations that are linked to your file. + + +# Markdown extensions + +StackEdit extends the standard Markdown syntax by adding extra **Markdown extensions**, providing you with some nice features. + +> **ProTip:** You can disable any **Markdown extension** in the **File properties** dialog. + + +## SmartyPants + +SmartyPants converts ASCII punctuation characters into "smart" typographic punctuation HTML entities. For example: + +| |ASCII |HTML | +|----------------|-------------------------------|-----------------------------| +|Single backticks|`'Isn't this fun?'` |'Isn't this fun?' | +|Quotes |`"Isn't this fun?"` |"Isn't this fun?" | +|Dashes |`-- is en-dash, --- is em-dash`|-- is en-dash, --- is em-dash| + + +## KaTeX + +You can render LaTeX mathematical expressions using [KaTeX](https://khan.github.io/KaTeX/): + +The *Gamma function* satisfying $\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N$ is via the Euler integral + +$$ +\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. +$$ + +> You can find more information about **LaTeX** mathematical expressions [here](http://meta.math.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference). + + +## UML diagrams + +You can render UML diagrams using [Mermaid](https://mermaidjs.github.io/). For example, this will produce a sequence diagram: + +```mermaid +sequenceDiagram +Alice ->> Bob: Hello Bob, how are you? +Bob-->>John: How about you John? +Bob--x Alice: I am good thanks! +Bob-x John: I am good thanks! +Note right of John: Bob thinks a long
long time, so long
that the text does
not fit on a row. + +Bob-->Alice: Checking with John... +Alice->John: Yes... John, how are you? +``` + +And this will produce a flow chart: + +```mermaid +graph LR +A[Square Rect] -- Link text --> B((Circle)) +A --> C(Round Rect) +B --> D{Rhombus} +C --> D +``` + \ No newline at end of file diff --git a/_posts/testje.md b/_posts/testje.md new file mode 100644 index 000000000..d809d7d22 --- /dev/null +++ b/_posts/testje.md @@ -0,0 +1,152 @@ +# Welcome to StackEdit! + +Hi! I'm your first Markdown file in **StackEdit**. If you want to learn about StackEdit, you can read me. If you want to play with Markdown, you can edit me. If you have finished with me, you can just create new files by opening the **file explorer** on left corner of the navigation bar. + + +# Files + +StackEdit stores your files in your browser, which means all your files are automatically saved locally and are accessible **offline!** + +> **Note:** +> +> - StackEdit can be used offline thanks to the application cache. +> - Your local files are not shared between different browsers or computers unless you use the [synchronization mechanism](#synchronization). +> - Clearing your browser's data may **delete all your files!** Make sure you sign in with Google to have all your files and settings backed up and synced. + +## Create files and folders + +The file explorer is accessible using the button in left corner of the navigation bar. You can create a new file by clicking the **New file** button in the file explorer. You can also create folders by clicking the **New folder** button. + +## Switch to another file + +All your files are listed in the file explorer. You can switch from one to another by clicking a file in the list. + +## Rename a file + +You can rename the current file by clicking the file name in the navigation bar or by clicking the **Rename** button in the file explorer. + +## Delete a file + +You can delete the current file by clicking the **Remove** button in the file explorer. The file will be moved into the **Trash** folder and automatically deleted after 7 days of inactivity. + +## Export a file + +You can export the current file by clicking **Export to disk** in the menu. You can choose to export the file as plain Markdown, as HTML using a Handlebars template or as a PDF. + + +# Synchronization + +Synchronization is one of the biggest features of StackEdit. It enables you to synchronize any file in your workspace with other files stored in your **Google Drive**, your **Dropbox** and your **GitHub** accounts. This allows you to keep writing on other devices, collaborate with people you share the file with, integrate easily into your workflow... The synchronization mechanism takes place every minute in the background, downloading, merging, and uploading file modifications. + +There are two types of synchronization and they can complement each other: + +- The workspace synchronization will sync all your files, folders and settings automatically. This will allow you to fetch your workspace on any other device. + > To start syncing your workspace, just sign in with Google in the menu. + +- The file synchronization will keep one file of the workspace synced with one or multiple files in **Google Drive**, **Dropbox** or **GitHub**. + > Before starting to sync files, you must link an account in the **Synchronize** sub-menu. + +## Open a file + +You can open a file from **Google Drive**, **Dropbox** or **GitHub** by opening the **Synchronize** sub-menu and clicking **Open from**. Once opened in the workspace, any modification in the file will be automatically synced. + +## Save a file + +You can save any file of the workspace to **Google Drive**, **Dropbox** or **GitHub** by opening the **Synchronize** sub-menu and clicking **Save on**. Even if a file in the workspace is already synced, you can save it to another location. StackEdit can sync one file with multiple locations and accounts. + +## Synchronize a file + +Once your file is linked to a synchronized location, StackEdit will periodically synchronize it by downloading/uploading any modification. A merge will be performed if necessary and conflicts will be resolved. + +If you just have modified your file and you want to force syncing, click the **Synchronize now** button in the navigation bar. + +> **Note:** The **Synchronize now** button is disabled if you have no file to synchronize. + +## Manage file synchronization + +Since one file can be synced with multiple locations, you can list and manage synchronized locations by clicking **File synchronization** in the **Synchronize** sub-menu. This allows you to list and remove synchronized locations that are linked to your file. + + +# Publication + +Publishing in StackEdit makes it simple for you to publish online your files. Once you're happy with a file, you can publish it to different hosting platforms like **Blogger**, **Dropbox**, **Gist**, **GitHub**, **Google Drive**, **WordPress** and **Zendesk**. With [Handlebars templates](http://handlebarsjs.com/), you have full control over what you export. + +> Before starting to publish, you must link an account in the **Publish** sub-menu. + +## Publish a File + +You can publish your file by opening the **Publish** sub-menu and by clicking **Publish to**. For some locations, you can choose between the following formats: + +- Markdown: publish the Markdown text on a website that can interpret it (**GitHub** for instance), +- HTML: publish the file converted to HTML via a Handlebars template (on a blog for example). + +## Update a publication + +After publishing, StackEdit keeps your file linked to that publication which makes it easy for you to re-publish it. Once you have modified your file and you want to update your publication, click on the **Publish now** button in the navigation bar. + +> **Note:** The **Publish now** button is disabled if your file has not been published yet. + +## Manage file publication + +Since one file can be published to multiple locations, you can list and manage publish locations by clicking **File publication** in the **Publish** sub-menu. This allows you to list and remove publication locations that are linked to your file. + + +# Markdown extensions + +StackEdit extends the standard Markdown syntax by adding extra **Markdown extensions**, providing you with some nice features. + +> **ProTip:** You can disable any **Markdown extension** in the **File properties** dialog. + + +## SmartyPants + +SmartyPants converts ASCII punctuation characters into "smart" typographic punctuation HTML entities. For example: + +| |ASCII |HTML | +|----------------|-------------------------------|-----------------------------| +|Single backticks|`'Isn't this fun?'` |'Isn't this fun?' | +|Quotes |`"Isn't this fun?"` |"Isn't this fun?" | +|Dashes |`-- is en-dash, --- is em-dash`|-- is en-dash, --- is em-dash| + + +## KaTeX + +You can render LaTeX mathematical expressions using [KaTeX](https://khan.github.io/KaTeX/): + +The *Gamma function* satisfying $\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N$ is via the Euler integral + +$$ +\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. +$$ + +> You can find more information about **LaTeX** mathematical expressions [here](http://meta.math.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference). + + +## UML diagrams + +You can render UML diagrams using [Mermaid](https://mermaidjs.github.io/). For example, this will produce a sequence diagram: + +```mermaid +sequenceDiagram +Alice ->> Bob: Hello Bob, how are you? +Bob-->>John: How about you John? +Bob--x Alice: I am good thanks! +Bob-x John: I am good thanks! +Note right of John: Bob thinks a long
long time, so long
that the text does
not fit on a row. + +Bob-->Alice: Checking with John... +Alice->John: Yes... John, how are you? +``` + +And this will produce a flow chart: + +```mermaid +graph LR +A[Square Rect] -- Link text --> B((Circle)) +A --> C(Round Rect) +B --> D{Rhombus} +C --> D +``` + \ No newline at end of file diff --git a/css/het-ontwerpproces.css b/css/het-ontwerpproces.css new file mode 100644 index 000000000..b743cb67e --- /dev/null +++ b/css/het-ontwerpproces.css @@ -0,0 +1 @@ +.version.het_ontwerpproces{color:#0000F9;background-color:#EF0699;}#page{z-index:1;min-height:0px;background-image:none;border-width:0px;border-color:#000000;background-color:transparent;padding-bottom:500px;width:100%;max-width:960px;margin-left:auto;margin-right:auto;}.css_verticalspacer .verticalspacer{height:calc(100vh - 500px);}#muse_css_mq,.html{background-color:#FFFFFF;}body{position:relative;min-width:320px;} \ No newline at end of file diff --git a/css/index.css b/css/index.css new file mode 100644 index 000000000..0ef84e433 --- /dev/null +++ b/css/index.css @@ -0,0 +1 @@ +.version.index{color:#000000;background-color:#ABAE16;}#page{z-index:1;min-height:417px;background-image:none;border-width:0px;border-color:#000000;background-color:transparent;padding-top:21px;padding-bottom:62px;width:100%;max-width:960px;margin-left:auto;margin-right:auto;}#pu1076{z-index:2;width:84.48%;margin-left:2.4%;}#u1076{z-index:2;background-color:#7F7F7F;border-radius:0px 12px 12px 0px ;padding-bottom:3px;position:relative;margin-right:-10000px;margin-top:3px;width:18.38%;}#u1076:hover{background-color:#F15A24;min-height:0px;width:18.38%;margin:3px -10000px 0px 0%;}#u1070{z-index:25;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:100px;position:relative;margin-right:-10000px;margin-top:-3px;width:100%;left:-2.02%;}#u1070:hover{background-color:#F15A24;min-height:0px;width:100%;margin:-3px -10000px 0px 0%;}#u1071-4{z-index:26;min-height:30px;background-color:transparent;color:#FFFFFF;text-transform:uppercase;text-align:center;font-size:14px;font-family:abel, sans-serif;font-weight:400;position:relative;margin-right:-10000px;margin-top:70px;width:100.68%;left:2.02%;}#u319{z-index:3;background-color:#D4145A;border-radius:0px 12px 12px 0px ;padding-bottom:95px;position:relative;margin-right:-10000px;width:18.5%;left:20.6%;}#u319:hover{background-color:#F15A24;min-height:0px;width:18.5%;margin:0px -10000px 0px 0%;}#u1033-6{z-index:6;min-height:30px;background-color:transparent;color:#FFFFFF;text-transform:uppercase;text-align:center;font-size:14px;font-family:abel, sans-serif;font-weight:400;position:relative;margin-right:-10000px;margin-top:71px;width:100%;}#u346{z-index:4;background-color:#D4145A;border-radius:0px 12px 12px 0px ;padding-bottom:100px;position:relative;margin-right:-10000px;width:18.38%;left:40.94%;}#u1041-4{z-index:12;min-height:30px;background-color:transparent;color:#FFFFFF;text-transform:uppercase;text-align:center;font-size:14px;font-family:abel, sans-serif;font-weight:400;position:relative;margin-right:-10000px;margin-top:70px;width:100.68%;left:-0.68%;}#u349{z-index:5;background-color:#D4145A;border-radius:0px 12px 12px 0px ;padding-bottom:100px;position:relative;margin-right:-10000px;width:18.38%;left:61.29%;}#u1044-4{z-index:16;min-height:30px;background-color:transparent;color:#FFFFFF;text-transform:uppercase;text-align:center;font-size:14px;font-family:abel, sans-serif;font-weight:400;position:relative;margin-right:-10000px;margin-top:70px;width:100.68%;left:2.02%;}#u1064{z-index:20;background-color:#D4145A;border-radius:0px 12px 12px 0px ;padding-bottom:100px;position:relative;margin-right:-10000px;width:18.38%;left:81.63%;}#u346:hover,#u349:hover,#u1064:hover{background-color:#F15A24;min-height:0px;width:18.38%;margin:0px -10000px 0px 0%;}#u1065-4{z-index:21;min-height:30px;background-color:transparent;color:#FFFFFF;text-transform:uppercase;text-align:center;font-size:14px;font-family:abel, sans-serif;font-weight:400;position:relative;margin-right:-10000px;margin-top:70px;width:100.68%;left:2.02%;}#pu1175{z-index:84;margin-top:19px;width:88.96%;margin-left:2.19%;}#u1175{z-index:84;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:2px;position:relative;margin-right:-10000px;width:10.54%;}#u1176{z-index:85;background-color:#009245;border-radius:0px 12px 12px 0px ;padding-bottom:0px;position:relative;margin-right:-10000px;margin-top:-2px;width:100%;left:-2.23%;}#u1178-4{z-index:90;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;margin-left:2.23%;}#u1177-4{z-index:86;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;margin-top:34px;position:relative;width:100%;}#u1163{z-index:74;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:2px;position:relative;margin-right:-10000px;width:10.54%;left:12.53%;}#u1164{z-index:75;background-color:#009245;border-radius:0px 12px 12px 0px ;padding-bottom:0px;position:relative;margin-right:-10000px;margin-top:-2px;width:100%;left:-2.23%;}#u1166-4{z-index:80;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;margin-left:2.23%;}#u1165-4{z-index:76;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;margin-top:34px;position:relative;width:100%;}#u1109{z-index:30;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:2px;position:relative;margin-right:-10000px;width:10.54%;left:25.3%;}#u1175:hover,#u1163:hover,#u1109:hover{background-color:#F15A24;min-height:0px;width:10.54%;margin:0px -10000px 0px 0%;}#u1110{z-index:31;background-color:#009245;border-radius:0px 12px 12px 0px ;padding-bottom:0px;position:relative;margin-right:-10000px;margin-top:-2px;width:100%;left:-2.23%;}#u1176_position_content,#u1164_position_content,#u1110_position_content{padding-top:14px;padding-bottom:14px;width:100%;}#u1136-4{z-index:50;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;margin-left:2.23%;}#u1111-4{z-index:32;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;margin-top:34px;position:relative;width:100%;}#u1112{z-index:36;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:2px;position:relative;margin-right:-10000px;margin-top:2px;width:10.54%;left:37.36%;}#u1113{z-index:37;background-color:#009245;border-radius:0px 12px 12px 0px ;padding-bottom:0px;position:relative;margin-right:-10000px;margin-top:-2px;width:100%;left:-2.23%;}#u1113_position_content{padding-top:11px;padding-bottom:15px;width:100%;}#u1139-4{z-index:54;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;margin-left:3.34%;}#u1114-6{z-index:38;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;margin-top:37px;position:relative;width:100%;}#u1115{z-index:44;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:2px;position:relative;margin-right:-10000px;margin-top:2px;width:10.54%;left:49.89%;}#u1116{z-index:45;background-color:#009245;border-radius:0px 12px 12px 0px ;padding-bottom:0px;position:relative;margin-right:-10000px;margin-top:-2px;width:100%;left:-2.23%;}#u1116_position_content{padding-top:11px;padding-bottom:12px;width:100%;}#u1142-4{z-index:58;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;}#u1117-4{z-index:46;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;margin-top:40px;position:relative;width:100%;}#u1145{z-index:62;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:2px;position:relative;margin-right:-10000px;margin-top:2px;width:10.54%;left:62.89%;}#u1112:hover,#u1115:hover,#u1145:hover{background-color:#F15A24;min-height:0px;width:10.54%;margin:2px -10000px 0px 0%;}#u1146{z-index:63;background-color:#009245;border-radius:0px 12px 12px 0px ;padding-bottom:0px;position:relative;margin-right:-10000px;margin-top:-2px;width:100%;left:-2.23%;}#u1148-4{z-index:68;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;}#u1147-4{z-index:64;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;margin-top:20px;position:relative;width:100%;}#u1157{z-index:72;height:123px;border-style:solid;border-width:1px;border-color:#009245;background-color:#FFFFFF;border-radius:0px 12px 12px 0px ;position:relative;margin-right:-10000px;width:10.54%;left:76%;}#u1160{z-index:73;height:123px;border-style:solid;border-width:1px;border-color:#009245;background-color:#FFFFFF;border-radius:0px 12px 12px 0px ;position:relative;margin-right:-10000px;width:10.54%;left:89.35%;}#u1157:hover,#u1160:hover{background-color:#F15A24;height:123px;min-height:0px;width:10.54%;margin:0px -10000px 0px 0%;}#pu1187{z-index:94;margin-top:20px;width:31.25%;margin-left:2.19%;}#u1187{z-index:94;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:2px;position:relative;margin-right:-10000px;width:30%;}#u1187:hover{background-color:#F15A24;min-height:0px;width:30%;margin:0px -10000px 0px 0%;}#u1188{z-index:95;background-color:#534741;border-radius:0px 12px 12px 0px ;padding-bottom:0px;position:relative;margin-right:-10000px;margin-top:-2px;width:100%;left:-2.23%;}#u1188_position_content{padding-top:13px;padding-bottom:32px;width:100%;}#u1214-4{z-index:112;min-height:30px;background-color:transparent;line-height:10px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:8px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;margin-left:2.23%;}#u1189-4{z-index:96;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;margin-top:18px;position:relative;width:100%;}#u1190{z-index:100;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:2px;position:relative;margin-right:-10000px;margin-top:2px;width:30%;left:34.34%;}#u1191{z-index:101;background-color:#736357;border-radius:0px 12px 12px 0px ;padding-bottom:0px;position:relative;margin-right:-10000px;margin-top:-2px;width:100%;left:-2.23%;}#u1217-4{z-index:116;min-height:30px;background-color:transparent;line-height:10px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:8px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;}#u1192-4{z-index:102;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;margin-top:20px;position:relative;width:100%;}#u1193{z-index:106;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:2px;position:relative;margin-right:-10000px;margin-top:2px;width:30%;left:70%;}#u1190:hover,#u1193:hover{background-color:#F15A24;min-height:0px;width:30%;margin:2px -10000px 0px 0%;}#u1194{z-index:107;background-color:#736357;border-radius:0px 12px 12px 0px ;padding-bottom:0px;position:relative;margin-right:-10000px;margin-top:-2px;width:100%;left:-2.23%;}#u1176:hover,#u1164:hover,#u1110:hover,#u1113:hover,#u1116:hover,#u1146:hover,#u1188:hover,#u1191:hover,#u1194:hover{background-color:#F15A24;min-height:0px;width:100%;margin:-2px -10000px 0px 0%;}#u1146_position_content,#u1191_position_content,#u1194_position_content{padding-top:11px;padding-bottom:32px;width:100%;}#u1220-4{z-index:120;min-height:30px;background-color:transparent;line-height:10px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:8px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;}#u1195-4{z-index:108;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;margin-top:20px;position:relative;width:100%;}.css_verticalspacer .verticalspacer{height:calc(100vh - 577px);}#muse_css_mq,.html{background-color:#FFFFFF;}body{position:relative;min-width:320px;} \ No newline at end of file diff --git a/css/master_stappen-met-submenu.css b/css/master_stappen-met-submenu.css new file mode 100644 index 000000000..0ac046dfe --- /dev/null +++ b/css/master_stappen-met-submenu.css @@ -0,0 +1 @@ +#u1256{background-color:#C7B299;opacity:0.24;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=24)";filter:alpha(opacity=24);} \ No newline at end of file diff --git a/css/naamloos-15.css b/css/naamloos-15.css new file mode 100644 index 000000000..9a5992f0c --- /dev/null +++ b/css/naamloos-15.css @@ -0,0 +1 @@ +.version.naamloos_15{color:#0000F9;background-color:#EF0699;}#page{z-index:1;min-height:0px;background-image:none;border-width:0px;border-color:#000000;background-color:transparent;padding-bottom:500px;width:100%;max-width:960px;margin-left:auto;margin-right:auto;}.css_verticalspacer .verticalspacer{height:calc(100vh - 500px);}#muse_css_mq,.html{background-color:#FFFFFF;}body{position:relative;min-width:320px;} \ No newline at end of file diff --git a/css/naamloos-16.css b/css/naamloos-16.css new file mode 100644 index 000000000..cb9ada393 --- /dev/null +++ b/css/naamloos-16.css @@ -0,0 +1 @@ +.version.naamloos_16{color:#0000F9;background-color:#EF0699;}#page{z-index:1;min-height:0px;background-image:none;border-width:0px;border-color:#000000;background-color:transparent;padding-bottom:500px;width:100%;max-width:960px;margin-left:auto;margin-right:auto;}.css_verticalspacer .verticalspacer{height:calc(100vh - 500px);}#muse_css_mq,.html{background-color:#FFFFFF;}body{position:relative;min-width:320px;} \ No newline at end of file diff --git a/css/naamloos-17.css b/css/naamloos-17.css new file mode 100644 index 000000000..0df75ac00 --- /dev/null +++ b/css/naamloos-17.css @@ -0,0 +1 @@ +.version.naamloos_17{color:#0000F9;background-color:#EF0699;}#page{z-index:1;min-height:0px;background-image:none;border-width:0px;border-color:#000000;background-color:transparent;padding-bottom:500px;width:100%;max-width:960px;margin-left:auto;margin-right:auto;}.css_verticalspacer .verticalspacer{height:calc(100vh - 500px);}#muse_css_mq,.html{background-color:#FFFFFF;}body{position:relative;min-width:320px;} \ No newline at end of file diff --git a/css/ontwerpproces.css b/css/ontwerpproces.css new file mode 100644 index 000000000..1913e5c67 --- /dev/null +++ b/css/ontwerpproces.css @@ -0,0 +1 @@ +.version.ontwerpproces{color:#00001C;background-color:#1645D1;}#page{z-index:1;min-height:438px;background-image:none;border-width:0px;border-color:#000000;background-color:transparent;padding-bottom:62px;width:100%;max-width:960px;margin-left:auto;margin-right:auto;}#u1888-62{z-index:2;min-height:376px;background-color:transparent;position:relative;margin-right:-10000px;margin-top:63px;width:50.73%;left:2.09%;}#u1888-2{font-size:24px;line-height:38px;color:#FF0000;font-family:varela-round, sans-serif;font-weight:400;}#u1888-8{font-size:24px;line-height:29px;color:#000000;font-family:varela-round, sans-serif;font-weight:400;}#u1888-3,#u1888-5,#u1888-6,#u1888-9,#u1888-14,#u1888-15,#u1888-17,#u1888-19,#u1888-20,#u1888-22,#u1888-24,#u1888-25,#u1888-27,#u1888-29,#u1888-30,#u1888-32,#u1888-34,#u1888-35,#u1888-37,#u1888-39,#u1888-40,#u1888-42,#u1888-44,#u1888-45,#u1888-47,#u1888-49,#u1888-50,#u1888-52,#u1888-53,#u1888-55,#u1888-57,#u1888-59,#u1888-60{line-height:22px;color:#000000;font-family:Helvetica, Helvetica Neue, Arial, sans-serif;}#pu1953{z-index:64;margin-right:-10000px;margin-top:77px;width:10.42%;margin-left:56.15%;}#u1953{z-index:64;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:2px;position:relative;width:90%;margin-left:2%;}#u1954{z-index:65;background-color:#009245;border-radius:0px 12px 12px 0px ;position:relative;margin-right:-10000px;margin-top:-2px;width:100%;left:-2.23%;}#u1954:hover{background-color:#F15A24;min-height:0px;width:100%;margin:-2px -10000px 0px 0%;}#u1954_position_content{padding-top:14px;padding-bottom:49px;width:100%;}#u1956-4{z-index:70;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:varela-round, sans-serif;font-weight:400;position:relative;width:100%;margin-left:2.23%;}#u1955-4{z-index:66;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;left:-4.45%;}#u1969-4{z-index:104;min-height:42px;background-color:transparent;line-height:14px;color:#000000;font-size:12px;font-family:Trebuchet, Trebuchet MS, Tahoma, Arial, sans-serif;font-style:italic;margin-top:14px;position:relative;width:100%;}#u1961{z-index:84;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:2px;margin-top:72px;position:relative;width:90%;margin-left:2%;}#u1962{z-index:85;background-color:#534741;border-radius:0px 12px 12px 0px ;padding-bottom:0px;position:relative;margin-right:-10000px;margin-top:-2px;width:100%;left:-2.23%;}#u1964-4{z-index:90;min-height:30px;background-color:transparent;line-height:10px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:8px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;margin-left:2.23%;}#u1963-4{z-index:86;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;margin-top:18px;position:relative;width:100%;}#pu1957{z-index:74;padding-bottom:0px;margin-right:-10000px;margin-top:75px;width:10.21%;margin-left:67.5%;}#u1957{z-index:74;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:2px;position:relative;width:91.84%;margin-left:6.13%;}#u1958{z-index:75;background-color:#009245;border-radius:0px 12px 12px 0px ;position:relative;margin-right:-10000px;margin-top:-2px;width:100%;left:-2.23%;}#u1958_position_content{padding-top:11px;padding-bottom:50px;width:100%;}#u1960-4{z-index:80;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;}#u1959-4{z-index:76;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;margin-top:3px;position:relative;width:100%;margin-left:4.45%;}#u1970-4{z-index:108;min-height:42px;background-color:transparent;line-height:14px;color:#000000;font-size:12px;font-family:Trebuchet, Trebuchet MS, Tahoma, Arial, sans-serif;font-style:italic;margin-top:16px;position:relative;width:95.92%;margin-left:4.09%;}#u1965{z-index:94;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:2px;margin-top:57px;position:relative;width:91.84%;}#u1966{z-index:95;background-color:#534741;border-radius:0px 12px 12px 0px ;padding-bottom:0px;position:relative;margin-right:-10000px;margin-top:-2px;width:100%;left:-2.23%;}#u1962_position_content,#u1966_position_content{padding-top:13px;padding-bottom:32px;width:100%;}#u1968-4{z-index:100;min-height:30px;background-color:transparent;line-height:10px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:8px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;margin-left:2.23%;}#u1967-4{z-index:96;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;margin-top:18px;position:relative;width:100%;}.css_verticalspacer .verticalspacer{height:calc(100vh - 1752px);}#muse_css_mq,.html{background-color:#FFFFFF;}body{position:relative;min-width:320px;} \ No newline at end of file diff --git a/css/resultaat.css b/css/resultaat.css new file mode 100644 index 000000000..34adf534a --- /dev/null +++ b/css/resultaat.css @@ -0,0 +1 @@ +.version.resultaat{color:#000013;background-color:#ACEB61;}#page{z-index:1;min-height:438px;background-image:none;border-width:0px;border-color:#000000;background-color:transparent;padding-bottom:62px;width:100%;max-width:960px;margin-left:auto;margin-right:auto;}#pu1567{z-index:104;padding-bottom:0px;margin-right:-10000px;margin-top:19px;width:21.78%;margin-left:1.57%;}#u1567{z-index:104;background-color:#D4145A;border-radius:0px 12px 12px 0px ;padding-bottom:95px;position:relative;width:71.78%;}#u1567:hover{background-color:#F15A24;min-height:0px;width:71.78%;margin:0px 0px 0px 0%;}#u1568-6{z-index:105;min-height:30px;background-color:transparent;color:#FFFFFF;text-transform:uppercase;text-align:center;font-size:14px;font-family:abel, sans-serif;font-weight:400;position:relative;margin-right:-10000px;margin-top:71px;width:100%;}#pu1516{z-index:60;margin-top:53px;width:99.05%;margin-left:0.96%;}#u1516{z-index:60;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:2px;position:relative;margin-right:-10000px;width:43.48%;}#u1516:hover{background-color:#F15A24;min-height:0px;width:43.48%;margin:0px -10000px 0px 0%;}#u1517{z-index:61;background-color:#009245;border-radius:0px 12px 12px 0px ;position:relative;margin-right:-10000px;margin-top:-2px;width:100%;left:-2.23%;}#u1517_position_content{padding-top:14px;padding-bottom:49px;width:100%;}#u1519-4{z-index:66;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;margin-left:2.23%;}#u1518-4{z-index:62;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;left:-4.45%;}#u1520{z-index:70;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:2px;position:relative;margin-right:-10000px;margin-top:1px;width:43.48%;left:56.53%;}#u1520:hover{background-color:#F15A24;min-height:0px;width:43.48%;margin:1px -10000px 0px 0%;}#u1521{z-index:71;background-color:#009245;border-radius:0px 12px 12px 0px ;position:relative;margin-right:-10000px;margin-top:-2px;width:100%;left:-2.23%;}#u1521_position_content{padding-top:11px;padding-bottom:50px;width:100%;}#u1523-4{z-index:76;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;}#u1522-4{z-index:72;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;margin-top:3px;position:relative;width:100%;margin-left:4.45%;}#u1524-4{z-index:80;min-height:29px;background-color:transparent;line-height:20px;color:#C1272D;font-family:abel, sans-serif;font-weight:400;margin-top:28px;position:relative;width:95.7%;}#u1524-2{line-height:0px;}#pu1525{z-index:84;margin-top:12px;width:94.26%;margin-left:0.96%;}#u1525{z-index:84;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:2px;position:relative;margin-right:-10000px;margin-top:1px;width:45.69%;}#u1525:hover{background-color:#F15A24;min-height:0px;width:45.69%;margin:1px -10000px 0px 0%;}#u1526{z-index:85;background-color:#534741;border-radius:0px 12px 12px 0px ;padding-bottom:0px;position:relative;margin-right:-10000px;margin-top:-2px;width:100%;left:-2.23%;}#u1528-4{z-index:90;min-height:30px;background-color:transparent;line-height:10px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:8px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;margin-left:2.23%;}#u1527-4{z-index:86;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;margin-top:18px;position:relative;width:100%;}#u1529{z-index:94;background-color:#000000;border-radius:0px 12px 12px 0px ;padding-bottom:2px;position:relative;margin-right:-10000px;width:45.69%;left:54.32%;}#u1529:hover{background-color:#F15A24;min-height:0px;width:45.69%;margin:0px -10000px 0px 0%;}#u1530{z-index:95;background-color:#534741;border-radius:0px 12px 12px 0px ;padding-bottom:0px;position:relative;margin-right:-10000px;margin-top:-2px;width:100%;left:-2.23%;}#u1517:hover,#u1521:hover,#u1526:hover,#u1530:hover{background-color:#F15A24;min-height:0px;width:100%;margin:-2px -10000px 0px 0%;}#u1526_position_content,#u1530_position_content{padding-top:13px;padding-bottom:32px;width:100%;}#u1532-4{z-index:100;min-height:30px;background-color:transparent;line-height:10px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:8px;font-family:abel, sans-serif;font-weight:400;position:relative;width:100%;margin-left:2.23%;}#u1531-4{z-index:96;min-height:30px;background-color:transparent;line-height:13px;text-align:center;text-transform:uppercase;color:#FFFFFF;font-size:11px;font-family:abel, sans-serif;font-weight:400;margin-top:18px;position:relative;width:100%;}#u1513-58{z-index:2;min-height:376px;background-color:transparent;color:#000000;font-family:Georgia, Palatino, Palatino Linotype, Times, Times New Roman, serif;position:relative;margin-right:-10000px;margin-top:20px;width:50.73%;left:24.69%;}#u1524,#u1513-5{font-size:24px;line-height:35px;}#u1513-2,#u1513-3,#u1513-10,#u1513-11,#u1513-13,#u1513-15,#u1513-16,#u1513-18,#u1513-20,#u1513-21,#u1513-23,#u1513-25,#u1513-26,#u1513-28,#u1513-30,#u1513-31,#u1513-33,#u1513-35,#u1513-36,#u1513-38,#u1513-40,#u1513-41,#u1513-43,#u1513-45,#u1513-46,#u1513-48,#u1513-49,#u1513-51,#u1513-53,#u1513-55,#u1513-56{line-height:20px;}.css_verticalspacer .verticalspacer{height:calc(100vh - 1475px);}#muse_css_mq,.html{background-color:#FFFFFF;}body{position:relative;min-width:320px;} \ No newline at end of file diff --git a/css/screen.css b/css/screen.css index 6e516c11f..48b5d7661 100644 --- a/css/screen.css +++ b/css/screen.css @@ -87,8 +87,9 @@ ul.posts { } .title { - color: #a00; + color: #ff0000; font-weight: bold; + font-size: 40px; margin-bottom: 2em; } diff --git a/css/site_global.css b/css/site_global.css new file mode 100644 index 000000000..7b31c5374 --- /dev/null +++ b/css/site_global.css @@ -0,0 +1 @@ +html{min-height:100%;min-width:100%;-ms-text-size-adjust:none;}body,div,dl,dt,dd,ul,ol,li,nav,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td,a{margin:0px;padding:0px;border-width:0px;border-style:solid;border-color:transparent;-webkit-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;transform-origin:left top;background-repeat:no-repeat;}button.submit-btn{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;}.transition{-webkit-transition-property:background-image,background-position,background-color,border-color,border-radius,color,font-size,font-style,font-weight,letter-spacing,line-height,text-align,box-shadow,text-shadow,opacity;transition-property:background-image,background-position,background-color,border-color,border-radius,color,font-size,font-style,font-weight,letter-spacing,line-height,text-align,box-shadow,text-shadow,opacity;}.transition *{-webkit-transition:inherit;transition:inherit;}table{border-collapse:collapse;border-spacing:0px;}fieldset,img{border:0px;border-style:solid;-webkit-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;transform-origin:left top;}address,caption,cite,code,dfn,em,strong,th,var,optgroup{font-style:inherit;font-weight:inherit;}del,ins{text-decoration:none;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:inherit;}input,button,textarea,select,optgroup,option{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;}.form-grp input,.form-grp textarea{-webkit-appearance:none;-webkit-border-radius:0;}body{font-family:Arial, Helvetica Neue, Helvetica, sans-serif;text-align:left;font-size:14px;line-height:17px;word-wrap:break-word;text-rendering:optimizeLegibility;-moz-font-feature-settings:'liga';-ms-font-feature-settings:'liga';-webkit-font-feature-settings:'liga';font-feature-settings:'liga';}a:link{color:#0000FF;text-decoration:underline;}a:visited{color:#800080;text-decoration:underline;}a:hover{color:#0000FF;text-decoration:underline;}a:active{color:#EE0000;text-decoration:underline;}a.nontext{color:black;text-decoration:none;font-style:normal;font-weight:normal;}.normal_text{color:#000000;direction:ltr;font-family:Arial, Helvetica Neue, Helvetica, sans-serif;font-size:14px;font-style:normal;font-weight:normal;letter-spacing:0px;line-height:17px;text-align:left;text-decoration:none;text-indent:0px;text-transform:none;vertical-align:0px;padding:0px;}.list0 li:before{position:absolute;right:100%;letter-spacing:0px;text-decoration:none;font-weight:normal;font-style:normal;}.rtl-list li:before{right:auto;left:100%;}.nls-None > li:before,.nls-None .list3 > li:before,.nls-None .list6 > li:before{margin-right:6px;content:'•';}.nls-None .list1 > li:before,.nls-None .list4 > li:before,.nls-None .list7 > li:before{margin-right:6px;content:'○';}.nls-None,.nls-None .list1,.nls-None .list2,.nls-None .list3,.nls-None .list4,.nls-None .list5,.nls-None .list6,.nls-None .list7,.nls-None .list8{padding-left:34px;}.nls-None.rtl-list,.nls-None .list1.rtl-list,.nls-None .list2.rtl-list,.nls-None .list3.rtl-list,.nls-None .list4.rtl-list,.nls-None .list5.rtl-list,.nls-None .list6.rtl-list,.nls-None .list7.rtl-list,.nls-None .list8.rtl-list{padding-left:0px;padding-right:34px;}.nls-None .list2 > li:before,.nls-None .list5 > li:before,.nls-None .list8 > li:before{margin-right:6px;content:'-';}.nls-None.rtl-list > li:before,.nls-None .list1.rtl-list > li:before,.nls-None .list2.rtl-list > li:before,.nls-None .list3.rtl-list > li:before,.nls-None .list4.rtl-list > li:before,.nls-None .list5.rtl-list > li:before,.nls-None .list6.rtl-list > li:before,.nls-None .list7.rtl-list > li:before,.nls-None .list8.rtl-list > li:before{margin-right:0px;margin-left:6px;}.TabbedPanelsTab{white-space:nowrap;}.MenuBar .MenuBarView,.MenuBar .SubMenuView{display:block;list-style:none;}.MenuBar .SubMenu{display:none;position:absolute;}.NoWrap{white-space:nowrap;word-wrap:normal;}.rootelem{margin-left:auto;margin-right:auto;}.colelem{display:inline;float:left;clear:both;}.clearfix:after{content:"\0020";visibility:hidden;display:block;height:0px;clear:both;}*:first-child+html .clearfix{zoom:1;}.clip_frame{overflow:hidden;}.popup_anchor{position:relative;width:0px;height:0px;}.allow_click_through *{pointer-events:auto;}.popup_element{z-index:100000;}.svg{display:block;vertical-align:top;}span.wrap{content:'';clear:left;display:block;}span.actAsInlineDiv{display:inline-block;}.position_content,.excludeFromNormalFlow{float:left;}.preload_images{position:absolute;overflow:hidden;left:-9999px;top:-9999px;height:1px;width:1px;}.preload{height:1px;width:1px;}.animateStates{-webkit-transition:0.3s ease-in-out;-moz-transition:0.3s ease-in-out;-o-transition:0.3s ease-in-out;transition:0.3s ease-in-out;}[data-whatinput="mouse"] *:focus,[data-whatinput="touch"] *:focus,input:focus,textarea:focus{outline:none;}textarea{resize:none;overflow:auto;}.allow_click_through,.fld-prompt{pointer-events:none;}.wrapped-input{position:absolute;top:0px;left:0px;background:transparent;border:none;}.submit-btn{z-index:50000;cursor:pointer;}.anchor_item{width:22px;height:18px;}.MenuBar .SubMenuVisible,.MenuBarVertical .SubMenuVisible,.MenuBar .SubMenu .SubMenuVisible,.popup_element.Active,span.actAsPara,.actAsDiv,a.nonblock.nontext,img.block{display:block;}.widget_invisible,.js .invi,.js .mse_pre_init{visibility:hidden;}.ose_ei{visibility:hidden;z-index:0;}.no_vert_scroll{overflow-y:hidden;}.always_vert_scroll{overflow-y:scroll;}.always_horz_scroll{overflow-x:scroll;}.fullscreen{overflow:hidden;left:0px;top:0px;position:fixed;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;}.fullwidth{position:absolute;}.borderbox{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;}.scroll_wrapper{position:absolute;overflow:auto;left:0px;right:0px;top:0px;bottom:0px;padding-top:0px;padding-bottom:0px;margin-top:0px;margin-bottom:0px;}.browser_width > *{position:absolute;left:0px;right:0px;}.grpelem,.accordion_wrapper{display:inline;float:left;}.fld-checkbox input[type=checkbox],.fld-radiobutton input[type=radio]{position:absolute;overflow:hidden;clip:rect(0px, 0px, 0px, 0px);height:1px;width:1px;margin:-1px;padding:0px;border:0px;}.fld-checkbox input[type=checkbox] + label,.fld-radiobutton input[type=radio] + label{display:inline-block;background-repeat:no-repeat;cursor:pointer;float:left;width:100%;height:100%;}.pointer_cursor,.fld-recaptcha-mode,.fld-recaptcha-refresh,.fld-recaptcha-help{cursor:pointer;}p,h1,h2,h3,h4,h5,h6,ol,ul,span.actAsPara{max-height:1000000px;}.superscript{vertical-align:super;font-size:66%;line-height:0px;}.subscript{vertical-align:sub;font-size:66%;line-height:0px;}.horizontalSlideShow{-ms-touch-action:pan-y;touch-action:pan-y;}.verticalSlideShow{-ms-touch-action:pan-x;touch-action:pan-x;}.colelem100,.verticalspacer{clear:both;}.list0 li,.MenuBar .MenuItemContainer,.SlideShowContentPanel .fullscreen img,.css_verticalspacer .verticalspacer{position:relative;}.popup_element.Inactive,.js .disn,.js .an_invi,.hidden,.breakpoint{display:none;}#muse_css_mq{position:absolute;display:none;background-color:#FFFFFE;}.fluid_height_spacer{width:0.01px;}.muse_check_css{display:none;position:fixed;}@media screen and (-webkit-min-device-pixel-ratio:0){body{text-rendering:auto;}} \ No newline at end of file diff --git a/css/stap-1.css b/css/stap-1.css new file mode 100644 index 000000000..ea45ac26b --- /dev/null +++ b/css/stap-1.css @@ -0,0 +1 @@ +.version.stap_1{color:#000006;background-color:#C8DB65;}#page{z-index:1;min-height:438px;background-image:none;border-width:0px;border-color:#000000;background-color:transparent;padding-bottom:62px;width:100%;max-width:960px;margin-left:auto;margin-right:auto;}#pu1256{z-index:2;margin-right:-10000px;margin-top:20px;width:31.36%;margin-left:2.09%;}#u1256{z-index:2;position:relative;margin-right:-10000px;width:100%;}#u1256 .fluid_height_spacer{padding-bottom:152.82392026578074%;}#menuu1327{z-index:61;border-width:0px;border-color:transparent;background-color:transparent;position:relative;margin-right:-10000px;margin-top:62px;width:59.81%;left:3.33%;}#u1335{background-color:transparent;position:relative;width:100%;}#u1338{min-height:14px;background-color:transparent;padding-bottom:9px;position:relative;margin-right:-10000px;width:100%;}#u1338:hover{background-color:#999999;min-height:14px;width:100%;margin:0px -10000px 0px 0%;}#u1338:active{background-color:#6B6B6B;min-height:14px;width:100%;margin:0px -10000px 0px 0%;}#u1338.MuseMenuActive{background-color:#666666;min-height:14px;width:100%;margin:0px -10000px 0px 0%;}#u1341-4{min-height:14px;border-width:0px;border-color:transparent;background-color:transparent;color:#534741;line-height:14px;text-transform:lowercase;text-align:left;font-size:12px;font-family:Georgia, Palatino, Palatino Linotype, Times, Times New Roman, serif;position:relative;width:100%;}#u1338:hover #u1341-4{padding-top:0px;padding-bottom:0px;min-height:14px;width:100%;margin:0px 0px 0px 0%;}#u1338:active #u1341-4{padding-top:0px;padding-bottom:0px;min-height:14px;width:100%;margin:0px 0px 0px 0%;}#u1338.MuseMenuActive #u1341-4{padding-top:0px;padding-bottom:0px;min-height:14px;width:100%;margin:0px 0px 0px 0%;}#u1436{min-height:17px;background-color:transparent;padding-bottom:6px;position:relative;margin-right:-10000px;width:100%;}#u1436:hover{background-color:#999999;min-height:17px;width:100%;margin:0px -10000px 0px 0%;}#u1436:active{background-color:#6B6B6B;min-height:17px;width:100%;margin:0px -10000px 0px 0%;}#u1439-4{min-height:17px;border-width:0px;border-color:transparent;background-color:transparent;color:#000000;line-height:17px;text-transform:lowercase;text-align:left;font-size:12px;font-family:Georgia, Palatino, Palatino Linotype, Times, Times New Roman, serif;position:relative;width:100%;}#u1436:hover #u1439-4{padding-top:0px;padding-bottom:0px;min-height:17px;width:100%;margin:0px 0px 0px 0%;}#u1436:active #u1439-4{padding-top:0px;padding-bottom:0px;min-height:17px;width:100%;margin:0px 0px 0px 0%;}#u1415{min-height:17px;background-color:transparent;padding-bottom:7px;position:relative;margin-right:-10000px;width:100%;}#u1415:hover{background-color:#999999;min-height:17px;width:100%;margin:0px -10000px 0px 0%;}#u1415:active{background-color:#6B6B6B;min-height:17px;width:100%;margin:0px -10000px 0px 0%;}#u1418-4{min-height:17px;border-width:0px;border-color:transparent;background-color:transparent;color:#000000;line-height:17px;text-transform:lowercase;text-align:left;font-size:12px;font-family:Georgia, Palatino, Palatino Linotype, Times, Times New Roman, serif;position:relative;width:100%;}#u1436.MuseMenuActive #u1439-4,#u1415:hover #u1418-4{padding-top:0px;padding-bottom:0px;min-height:17px;width:100%;margin:0px 0px 0px 0%;}#u1415:active #u1418-4{padding-top:0px;padding-bottom:0px;min-height:17px;width:100%;margin:0px 0px 0px 0%;}#u1394{min-height:17px;background-color:transparent;padding-bottom:7px;position:relative;margin-right:-10000px;width:100%;}#u1394:hover{background-color:#999999;min-height:17px;width:100%;margin:0px -10000px 0px 0%;}#u1394:active{background-color:#6B6B6B;min-height:17px;width:100%;margin:0px -10000px 0px 0%;}#u1397-4{min-height:17px;border-width:0px;border-color:transparent;background-color:transparent;color:#000000;line-height:17px;text-transform:lowercase;text-align:left;font-size:12px;font-family:Georgia, Palatino, Palatino Linotype, Times, Times New Roman, serif;position:relative;width:100%;}#u1415.MuseMenuActive #u1418-4,#u1394:hover #u1397-4{padding-top:0px;padding-bottom:0px;min-height:17px;width:100%;margin:0px 0px 0px 0%;}#u1394:active #u1397-4{padding-top:0px;padding-bottom:0px;min-height:17px;width:100%;margin:0px 0px 0px 0%;}#u1373{min-height:17px;background-color:transparent;padding-bottom:7px;position:relative;margin-right:-10000px;width:100%;}#u1373:hover{background-color:#999999;min-height:17px;width:100%;margin:0px -10000px 0px 0%;}#u1373:active{background-color:#6B6B6B;min-height:17px;width:100%;margin:0px -10000px 0px 0%;}#u1376-4{min-height:17px;border-width:0px;border-color:transparent;background-color:transparent;color:#000000;line-height:17px;text-transform:lowercase;text-align:left;font-size:12px;font-family:Georgia, Palatino, Palatino Linotype, Times, Times New Roman, serif;position:relative;width:100%;}#u1394.MuseMenuActive #u1397-4,#u1373:hover #u1376-4{padding-top:0px;padding-bottom:0px;min-height:17px;width:100%;margin:0px 0px 0px 0%;}#u1373:active #u1376-4{padding-top:0px;padding-bottom:0px;min-height:17px;width:100%;margin:0px 0px 0px 0%;}#u1459{min-height:17px;background-color:transparent;padding-bottom:7px;position:relative;margin-right:-10000px;width:100%;}#u1459:hover{background-color:#999999;min-height:17px;width:100%;margin:0px -10000px 0px 0%;}#u1459:active{background-color:#6B6B6B;min-height:17px;width:100%;margin:0px -10000px 0px 0%;}#u1461-4{min-height:17px;border-width:0px;border-color:transparent;background-color:transparent;color:#000000;line-height:17px;text-transform:lowercase;text-align:left;font-size:12px;font-family:Georgia, Palatino, Palatino Linotype, Times, Times New Roman, serif;position:relative;width:100%;}#u1373.MuseMenuActive #u1376-4,#u1459:hover #u1461-4{padding-top:0px;padding-bottom:0px;min-height:17px;width:100%;margin:0px 0px 0px 0%;}#u1459:active #u1461-4{padding-top:0px;padding-bottom:0px;min-height:17px;width:100%;margin:0px 0px 0px 0%;}#u1435,#u1414,#u1393,#u1372,#u1456,#u1477{background-color:transparent;margin-top:2px;position:relative;width:100%;}#u1480{min-height:17px;background-color:transparent;padding-bottom:7px;position:relative;margin-right:-10000px;width:100%;}#u1480:hover{background-color:#999999;min-height:17px;width:100%;margin:0px -10000px 0px 0%;}#u1480:active{background-color:#6B6B6B;min-height:17px;width:100%;margin:0px -10000px 0px 0%;}#u1436.MuseMenuActive,#u1415.MuseMenuActive,#u1394.MuseMenuActive,#u1373.MuseMenuActive,#u1459.MuseMenuActive,#u1480.MuseMenuActive{background-color:#666666;min-height:17px;width:100%;margin:0px -10000px 0px 0%;}#u1482-4{min-height:17px;border-width:0px;border-color:transparent;background-color:transparent;color:#000000;line-height:17px;text-transform:lowercase;text-align:left;font-size:12px;font-family:Georgia, Palatino, Palatino Linotype, Times, Times New Roman, serif;position:relative;width:100%;}#u1459.MuseMenuActive #u1461-4,#u1480:hover #u1482-4{padding-top:0px;padding-bottom:0px;min-height:17px;width:100%;margin:0px 0px 0px 0%;}#u1480:active #u1482-4{padding-top:0px;padding-bottom:0px;min-height:17px;width:100%;margin:0px 0px 0px 0%;}#u1480.MuseMenuActive #u1482-4{padding-top:0px;padding-bottom:0px;min-height:17px;width:100%;margin:0px 0px 0px 0%;}.MenuItem{cursor:pointer;}#u1262-58{z-index:3;min-height:376px;background-color:transparent;color:#000000;font-family:Georgia, Palatino, Palatino Linotype, Times, Times New Roman, serif;position:relative;margin-right:-10000px;margin-top:62px;width:50.73%;left:35.11%;}#u1262-5{font-size:24px;line-height:35px;}#u1262-2,#u1262-3,#u1262-10,#u1262-11,#u1262-13,#u1262-15,#u1262-16,#u1262-18,#u1262-20,#u1262-21,#u1262-23,#u1262-25,#u1262-26,#u1262-28,#u1262-30,#u1262-31,#u1262-33,#u1262-35,#u1262-36,#u1262-38,#u1262-40,#u1262-41,#u1262-43,#u1262-45,#u1262-46,#u1262-48,#u1262-49,#u1262-51,#u1262-53,#u1262-55,#u1262-56{line-height:20px;}.css_verticalspacer .verticalspacer{height:calc(100vh - 1517px);}#muse_css_mq,.html{background-color:#FFFFFF;}body{position:relative;min-width:320px;} \ No newline at end of file diff --git a/css/stap-2.css b/css/stap-2.css new file mode 100644 index 000000000..705cfbcef --- /dev/null +++ b/css/stap-2.css @@ -0,0 +1 @@ +.version.stap_2{color:#000011;background-color:#20D29E;}#page{z-index:1;min-height:460px;background-image:none;border-width:0px;border-color:#000000;background-color:transparent;padding-top:20px;padding-bottom:20px;width:100%;max-width:960px;margin-left:auto;margin-right:auto;}#u1256{z-index:2;position:relative;width:31.36%;margin-left:2.09%;}#u1256 .fluid_height_spacer{padding-bottom:152.82392026578074%;}.css_verticalspacer .verticalspacer{height:calc(100vh - 499px);}#muse_css_mq,.html{background-color:#FFFFFF;}body{position:relative;min-width:320px;} \ No newline at end of file diff --git a/css/stappen.css b/css/stappen.css new file mode 100644 index 000000000..97dbe7c58 --- /dev/null +++ b/css/stappen.css @@ -0,0 +1 @@ +.version.stappen{color:#000011;background-color:#20D29E;}#page{z-index:1;min-height:460px;background-image:none;border-width:0px;border-color:#000000;background-color:transparent;padding-top:20px;padding-bottom:20px;width:100%;max-width:960px;margin-left:auto;margin-right:auto;}#u1256{z-index:2;position:relative;width:31.36%;margin-left:2.09%;}#u1256 .fluid_height_spacer{padding-bottom:152.82392026578074%;}.css_verticalspacer .verticalspacer{height:calc(100vh - 499px);}#muse_css_mq,.html{background-color:#FFFFFF;}body{position:relative;min-width:320px;} \ No newline at end of file diff --git a/het-ontwerpproces.html b/het-ontwerpproces.html new file mode 100644 index 000000000..53653ac82 --- /dev/null +++ b/het-ontwerpproces.html @@ -0,0 +1,52 @@ + + + + + + + + + + + het ontwerpproces + + + + + + +
+
+
+ + + + + + + diff --git a/index.html b/index.html index 7a0cbeaa5..a44cb0f12 100644 --- a/index.html +++ b/index.html @@ -1,83 +1,144 @@ ---- -layout: default -title: Tom Preston-Werner ---- + + + -
-

Blog Posts

- + + + + + + + Home + + + + + + + + + -

Other Interviews, Talks, Etc

- +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + +
+
+
+ + + + + + + diff --git a/muse_manifest.xml b/muse_manifest.xml new file mode 100644 index 000000000..d5cbd82ed --- /dev/null +++ b/muse_manifest.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/naamloos-15.html b/naamloos-15.html new file mode 100644 index 000000000..b2eb1d115 --- /dev/null +++ b/naamloos-15.html @@ -0,0 +1,52 @@ + + + + + + + + + + + Naamloos 15 + + + + + + +
+
+
+ + + + + + + diff --git a/naamloos-16.html b/naamloos-16.html new file mode 100644 index 000000000..bba33ff23 --- /dev/null +++ b/naamloos-16.html @@ -0,0 +1,52 @@ + + + + + + + + + + + Naamloos 16 + + + + + + +
+
+
+ + + + + + + diff --git a/naamloos-17.html b/naamloos-17.html new file mode 100644 index 000000000..04b525985 --- /dev/null +++ b/naamloos-17.html @@ -0,0 +1,52 @@ + + + + + + + + + + + Naamloos 17 + + + + + + +
+
+
+ + + + + + + diff --git a/ontwerpproces.html b/ontwerpproces.html new file mode 100644 index 000000000..4e2b14bf1 --- /dev/null +++ b/ontwerpproces.html @@ -0,0 +1,138 @@ + + + + + + + + + + + ontwerpproces + + + + + + + + + + + +
+ +
+

Het Ontwerpproces

+

 

+

Met een Conversational Interface kan een computer een eenvoudig gesprek voeren met een mens. De computer interpeteert woorden en woordpatronen en kan reageren volgens vooraf ingestelde regels. Het ontwerpproces definieert deze interactie-regels en structureert het gesprek.

+

 

+

Strategie

+

 

+

De eerste ontwerp-stappen verschillen niet van het ontwerp van een GUI. Een beschrijving van de strategische doelen van het project, de problemen van de stakeholders  en de geschiktheid van voice interface als oplossing.  De denkbare oplossingen zijn beschreven in een use case.

+

 

+

2.Scenario

+

Met behulp van scenario’s ontwerpen we de informatie-uitwisseling tussen een systeem en de gebruikers. In deze case is dat het gesprek tussen een smart agent (wilbur), een floor manager (gebruiker) en een leidinggevende (regisseur).

+

 

+

3.User Intents

+

Met behulp van de scenario’s worden in User Intents de doelen van de gebruiker en de bijbehorende woorden en zinnen beschreven. Key User Inputs of Utterances zijn woorden of woordpatronen die een User Intent triggeren. System Outputs zijn de antwoorden aan de gebruiker én triggers van server-side processen die horen bij een User Intent.

+

 

+

4.Gedetailleerde Flow

+

Na een snelle gebruikerstest en feedback van stakeholders worden de scenario’s uitgewerkt in een Gedetailleerde Flow van alle interactie tussen het smart systeem en de gebruikers, inclusief edge cases en default intents. Hierbij wordt vastgelegd met welke api’s en databronnen wordt gecommuniceerd, en welke data wordt bewaard en (her)gebruikt voor de AI. Naast een interactie-model geeft dit een functionele beschrijving voor het technisch proces [6].

+

 

+

5.Dialoog Script, Persoonlijkheid van de Agent

+

Alle teksten en alle mogelijke variaties van utterances worden uitgeschreven in een Dialoog Script. Een gedetailleerd ontworpen persoonlijkheid van Wilbur bepaalt taalgebruik en de tone-of-voice. Na het testen van het script in een prototype is het gesprek klaar voor productie.

+

 

+

6.Productie

+

Met een web-tool “bouw” wordt de volledige conversatie in een WYSYWIG interface gemaakt, en kan de dialoog met een interactief prototype worden getest. Na prototyping moet de applicatie gekoppeld aan de back-end en de interface van de eindgebruikers. [zie Stack en Impediments]

+

 

+

Stack, techniek, vaardigheden [B].

+

De stack bestaat uit verschillende componenten met web-interfaces:  een online NLP Engine om het gesprek in te “bouwen” (intents, utterances, language processing, AI). Export van dit gesprek als JSON naar een fulfillment-/webserver (API calls, webhooks), die op zijn beurt communiceert met de eigen back-end systemen. De eindgebruikers communiceren met dit systeem via een Delivery interface: smart speakers, embedded devices, chatbots, dedicated apps of HTML/CSS. Op mobiel moet de microfoon en de speaker van het device worden aangesproken. Ik zou ik kiezen voor een kleine native test app. [zie Impediments]

+

 

+

Impediments

+

Taal Voice User Interface werkt op dit moment nog niet in het Nederlands. Naar verwachting zal dit in 2019 wel het geval zijn; tot die tijd zijn we beperkt tot Engels en de grote Europese talen.

+

 

+

Delivery interface De delivery interface op een mobiele telefoon gebruikt de microfoon en de speaker van het device. De beste oplossing hiervoor is een custom native app die communicatie. Het is ook mogelijk om dit in HTML/CSS te doen, maar in mijn ervaring is dit nog niet erg stabiel.

+

 

+

Werkzaamheden

+

1-6 Designer

+

6 Back-End, Front-End

+

 

+
+ +
+ + + + +
+

De stappen in het ontwerpproces

+
+ + + + +
+
+ + + + +
+

Het ontwikkelen van de ontwerp-methode in het onderwijs

+
+ + + + +
+
+
+ + + + + + + diff --git a/resultaat.html b/resultaat.html new file mode 100644 index 000000000..a80eba573 --- /dev/null +++ b/resultaat.html @@ -0,0 +1,132 @@ + + + + + + + + + + + resultaat + + + + + + + + + + +
+
+ +

Ontwerpen

van gesprekken

+ + + +
+

zie ook

+
+ +
+ + + + + + +
+
+ +
+

 Met een Conversational Interface kan een computer een eenvoudig gesprek voeren met een mens. De computer interpeteert woorden en woordpatronen en kan reageren volgens vooraf ingestelde regels. Het ontwerpproces definieert deze interactie-regels en structureert het gesprek.

+

 

+

Probleem en oplossing

+

De eerste ontwerp-stappen verschillen niet van het ontwerp van een GUI. Een beschrijving van de strategische doelen van het project, de problemen van de stakeholders  en de geschiktheid van voice interface als oplossing.  De denkbare oplossingen zijn beschreven in een use case.

+

 

+

2.Scenario

+

Met behulp van scenario’s ontwerpen we de informatie-uitwisseling tussen een systeem en de gebruikers. In deze case is dat het gesprek tussen een smart agent (wilbur), een floor manager (gebruiker) en een leidinggevende (regisseur).

+

 

+

3.User Intents

+

Met behulp van de scenario’s worden in User Intents de doelen van de gebruiker en de bijbehorende woorden en zinnen beschreven. Key User Inputs of Utterances zijn woorden of woordpatronen die een User Intent triggeren. System Outputs zijn de antwoorden aan de gebruiker én triggers van server-side processen die horen bij een User Intent.

+

 

+

4.Gedetailleerde Flow

+

Na een snelle gebruikerstest en feedback van stakeholders worden de scenario’s uitgewerkt in een Gedetailleerde Flow van alle interactie tussen het smart systeem en de gebruikers, inclusief edge cases en default intents. Hierbij wordt vastgelegd met welke api’s en databronnen wordt gecommuniceerd, en welke data wordt bewaard en (her)gebruikt voor de AI. Naast een interactie-model geeft dit een functionele beschrijving voor het technisch proces [6].

+

 

+

5.Dialoog Script, Persoonlijkheid van de Agent

+

Alle teksten en alle mogelijke variaties van utterances worden uitgeschreven in een Dialoog Script. Een gedetailleerd ontworpen persoonlijkheid van Wilbur bepaalt taalgebruik en de tone-of-voice. Na het testen van het script in een prototype is het gesprek klaar voor productie.

+

 

+

6.Productie

+

Met een web-tool “bouw” wordt de volledige conversatie in een WYSYWIG interface gemaakt, en kan de dialoog met een interactief prototype worden getest. Na prototyping moet de applicatie gekoppeld aan de back-end en de interface van de eindgebruikers. [zie Stack en Impediments]

+

 

+

Stack, techniek, vaardigheden [B].

+

De stack bestaat uit verschillende componenten met web-interfaces:  een online NLP Engine om het gesprek in te “bouwen” (intents, utterances, language processing, AI). Export van dit gesprek als JSON naar een fulfillment-/webserver (API calls, webhooks), die op zijn beurt communiceert met de eigen back-end systemen. De eindgebruikers communiceren met dit systeem via een Delivery interface: smart speakers, embedded devices, chatbots, dedicated apps of HTML/CSS. Op mobiel moet de microfoon en de speaker van het device worden aangesproken. Ik zou ik kiezen voor een kleine native test app. [zie Impediments]

+

 

+

Impediments

+

Taal Voice User Interface werkt op dit moment nog niet in het Nederlands. Naar verwachting zal dit in 2019 wel het geval zijn; tot die tijd zijn we beperkt tot Engels en de grote Europese talen.

+

 

+

Delivery interface De delivery interface op een mobiele telefoon gebruikt de microfoon en de speaker van het device. De beste oplossing hiervoor is een custom native app die communicatie. Het is ook mogelijk om dit in HTML/CSS te doen, maar in mijn ervaring is dit nog niet erg stabiel.

+

 

+

Werkzaamheden

+

1-6 Designer

+

6 Back-End, Front-End

+

 

+
+ +
+
+ + + + + + + diff --git a/scripts/html5shiv.js b/scripts/html5shiv.js new file mode 100644 index 000000000..a0ca59a47 --- /dev/null +++ b/scripts/html5shiv.js @@ -0,0 +1,8 @@ +/* + HTML5 Shiv v3.6.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); +a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; +c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| +"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary time video",version:"3.6.2",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment(); +for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write(""),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t
a",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="
t
",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="
",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;ti.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="
",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="

",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t0)for(i=r;i=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*\s*$/g,Nt={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X
","
"]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1>");try{for(;r1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]===""&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("
").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window); \ No newline at end of file diff --git a/scripts/jquery.musemenu.js b/scripts/jquery.musemenu.js new file mode 100644 index 000000000..b23ae0af9 --- /dev/null +++ b/scripts/jquery.musemenu.js @@ -0,0 +1,15 @@ +/* + Copyright 2011-2016 Adobe Systems Incorporated. All Rights Reserved. +*/ +(function(d){"function"===typeof define&&define.amd&&define.amd.jQuery?define(["jquery","museutils"],d):d(jQuery)})(function(d){d.fn.museMenu=function(){return this.each(function(){var b=this.id,c=d(this),a=c.closest(".breakpoint"),g="absolute",j,f,h,i,l,k;if(!c.data("initialized")){c.data("initialized",!0);var m=function(a){return a.hasClass("scroll_effect")===!0},n=function(){if(c.css("position")=="fixed"){g="fixed";k=c;var a=Muse.Utils.getStyleSheetRulesById(Muse.Utils.getPageStyleSheets(),b); +j=a?Muse.Utils.getRuleProperty(a,"top"):c.css("top");f=a?Muse.Utils.getRuleProperty(a,"left"):c.css("left");h=a?Muse.Utils.getRuleProperty(a,"right"):c.css("right");i=a?Muse.Utils.getRuleProperty(a,"bottom"):c.css("bottom");l=parseInt(c.css("margin-left"))}else for(a=c.parent();!a.is(document)&&a.length>0&&a.attr("id")!="page";){if(a.css("position")=="fixed"){g="fixed";k=a;var d=a.offset(),m=c.offset(),n=Muse.Utils.getStyleSheetRulesById(Muse.Utils.getPageStyleSheets(),a.attr("id")),o=n?Muse.Utils.getRuleProperty(n, +"top"):a.css("top"),p=n?Muse.Utils.getRuleProperty(n,"left"):a.css("left"),q=n?Muse.Utils.getRuleProperty(n,"right"):a.css("right"),n=n?Muse.Utils.getRuleProperty(n,"bottom"):a.css("bottom");j=o&&o!="auto"?parseInt(o)+(m.top-d.top):o;f=p&&p!="auto"&&p.indexOf("%")==-1?parseInt(p)+(m.left-d.left):p;h=q&&q!="auto"&&q.indexOf("%")==-1?parseInt(q)+(d.left+a.width())-(m.left+c.width()):q;i=n&&n!="auto"?parseInt(n)+(d.top+a.height())-(m.top+c.height()):n;l=parseInt(a.css("margin-left"))+(p&&p.indexOf("%")!= +-1?m.left-d.left:0);break}a=a.parent()}},p=function(b,c){a.is(b)&&s.each(function(){var a=d(this).data("offsetContainerRaw");a&&(c.swapPlaceholderNodesRecursively(a),c.activateIDs(a))})};d("body").on("muse_bp_activate",function(a,b,c,d){p(c,d);n()});n();var o=d(),q=!1,r=c.find(".MenuItemContainer"),s=c.find(".MenuItem"),w=c.find(".SubMenu").add(s),x;w.on("mouseover",function(){q=!0});w.on("mouseleave",function(){q=!1;setTimeout(function(){q===!1&&(r.each(function(){d(this).data("hideSubmenu")()}), +o=d())},300)});r.on("mouseleave",function(a){var b=d(a.target),c=b.closest(".SubMenu");x&&clearTimeout(x);c.length>0&&(x=setTimeout(function(){c.find(".MenuItemContainer").each(function(){d(this).data("hideSubmenu")()});o=b.closest(".MenuItemContainer").data("$parentMenuItemContainer")},300))});r.on("mouseenter",function(){clearTimeout(x)});s.each(function(){var a=d(this),b=a.siblings(".SubMenu"),n=a.closest(".MenuItemContainer"),p=n.parentsUntil(".MenuBar").filter(".MenuItemContainer").length=== +0,q;if(p&&b.length>0)a.data("offsetContainerRaw",d("").hide().appendTo("body")),b.show(),q=b.position().top,b.hide();var s=function(a){a=d(a.target);d(".MenuItem",a.closest(".MenuItemContainer")).length>1||r.each(function(){d(this).data("hideSubmenu")()})};n.data("$parentMenuItemContainer",n.parent().closest(".MenuItemContainer")).data("showSubmenuOnly",function(){if(p&&b.length>0){var o=a.data("offsetContainer"),o=o||a.data("offsetContainerRaw"); +if(!m(o))if(g!="fixed"){var r=n.offset();o.css({left:r.left,top:r.top,width:a.width()})}else{var r=n.position(),w=0,x=0;h&&h!="auto"&&(w=c.outerWidth()-r.left-a.width());i&&i!="auto"&&(x=q);l=parseInt(k.css("margin-left"));if(k!=c){var D=Muse.Utils.getStyleSheetRulesById(Muse.Utils.getPageStyleSheets(),k.attr("id"));(D=D?Muse.Utils.getRuleProperty(D,"left"):k.css("left"))&&D.indexOf("%")!=-1&&(l+=c.offset().left-k.offset().left)}o.css({left:f,top:j,right:h,bottom:i,marginLeft:l+r.left,marginRight:w, +marginTop:r.top,marginBottom:x,width:a.width()})}o.append(b).show();d(".MenuItem",o).on("click",s);a.data("offsetContainer",o);k&&m(k)&&o&&!m(o)&&o.cloneScrollEffectsFrom(k)}b.show();b.find(".SubMenu").hide()}).data("hideSubmenu",function(){var c=a.data("offsetContainer");c&&m(c)&&c.clearScrollEffects();b.hide();c&&d(".MenuItem",c).off("click",s)}).data("isDescendentOf",function(a){for(var b=n.data("$parentMenuItemContainer");b.length>0;){if(a.index(b)>=0)return!0;b=b.data("$parentMenuItemContainer")}return!1}); +var w=function(){var a=o;a.length==0?n.data("showSubmenuOnly")():n.data("$parentMenuItemContainer").index(a)>=0?n.data("showSubmenuOnly")():n.siblings().index(a)>=0?(a.data("hideSubmenu")(),n.data("showSubmenuOnly")()):a.data("isDescendentOf")(n)?n.data("showSubmenuOnly")():a.data("isDescendentOf")(n.siblings(".MenuItemContainer"))?(n.siblings(".MenuItemContainer").each(function(){d(this).data("hideSubmenu")()}),n.data("showSubmenuOnly")()):a.get(0)==n.get(0)&&n.data("showSubmenuOnly")();o=n},x=null; +a.on("mouseenter",function(){a.data("mouseEntered",!0);x=setTimeout(function(){w()},200);a.one("mouseleave",function(){clearTimeout(x);a.data("mouseEntered",!1)})});b.length&&(a.attr("aria-haspopup",!0),Muse.Browser.Features.Touch&&(a.click(function(){return b.is(":visible")}),d(document.documentElement).on(Muse.Browser.Features.Touch.End,Muse.Browser.Features.Touch.Listener(function(c){!b.is(":visible")&&d(c.target).closest(n).length>0?(c.stopPropagation(),Muse.Utils.redirectCancelled=!0,setTimeout(function(){Muse.Utils.redirectCancelled= +!1},16),a.data("mouseEntered")&&setTimeout(function(){n.data("showSubmenuOnly")()},200)):b.is(":visible")&&d(c.target).closest(b).length==0&&d(c.target).closest(n).length==0&&n.data("hideSubmenu")()}))))});s.filter(".MuseMenuActive").each(function(){for(var a=d(this).closest(".MenuItemContainer").data("$parentMenuItemContainer");a&&a.length>0;)a.children(".MenuItem").addClass("MuseMenuActive"),a=a.data("$parentMenuItemContainer")})}})}}); +;(function(){if(!("undefined"==typeof Muse||"undefined"==typeof Muse.assets)){var a=function(a,b){for(var c=0,d=a.length;c=9&&(c=!1);return c};typeof c=="function"&&(a=c,c={});typeof a!="function"&&(a=function(){});c=d.extend({},{throttle:10},c);return this.each(function(){var g= +d(this),i=function(){for(var a=g.data(),b=!1,c,f=0;f0;)b.appendChild(a.childNodes[0])};Muse.Utils.copyChildren=function(a,b){for(var c=0;c=0;c--){var d=Muse.Utils.getRuleProperty(a[c],b);if(d)return d}return""}if(a.style.getPropertyValue)return a.style.getPropertyValue(b);return a.style.getAttribute(b)};Muse.Utils.toCamelCase=function(a){for(var b=Muse.Utils.toCamelCase.exp;b.test(a);a=a.replace(b,RegExp.$1.toUpperCase()));return a};Muse.Utils.toCamelCase.exp= +/-([a-z])/;Muse.Utils.getStyleValue=function(a,b){var c=a.style[Muse.Utils.toCamelCase(b)];c||(document.defaultView?c=document.defaultView.getComputedStyle(a,"").getPropertyValue(b):a.currentStyle&&(c=a.currentStyle[Muse.Utils.toCamelCase(b)]));c&&c.match(/(\d+)px/)&&(c=parseInt(c.substring(0,c.length-2)));return c};Muse.Utils.getCanvasDirection=function(a,b){var c=a.closest("*[data-rotate]"),c=c.length>0?parseFloat(c.data("rotate"))%360:0;return{dir:c>=0&&c<=45||c>=135&&c<=225||c>=315&&c<360?b:b=== +"horizontal"?"vertical":"horizontal",reverse:b==="horizontal"?c>=135&&c<=315:c>=45&&c<=225}};Muse.Utils.updateSlideshow_fstpOffsetSize=function(a){var b=c(window),d=c(document.body),g=a.options,l=a.$clip?a.$clip:a._findWidgetElements("."+g.clipClassName);Muse.Utils.moveElementsOutsideViewport(l.parents());a._fstpOffsetSize=g.transitionStyle==="horizontal"?g.elastic==="fullWidth"?Math.max(b.width(),parseInt(d.css("min-width"))):l.width():l.height();Muse.Utils.moveElementsInsideViewport(l.parents())}; +Muse.Utils.urlParam=function(a,b){var c=RegExp("[\\?&]"+b+"=([^&#]*)").exec(a);return c?c[1]:null};Muse.Utils.processHyperlink=function(a){var f=a.href,d=c(window),a=c(a),g=a.attr("target");if(!g||g=="_self"){var l=f.lastIndexOf("/"),g=f.lastIndexOf("#"),j=a.attr("class").match(/anim_(\w+)/);if(j&&g>l){var a=d.data("scrollWrapper"),k=f.substring(g),i=Muse.Utils.getAnchorWithDestination(k);if(i.length==0)return!1;var g=i.offset(),f=j[1],m=a||window,l=document.documentElement||document.body,j=(a?a.scrollHeight(): +l.scrollHeight)-d.height(),l=(a?a.scrollWidth():l.scrollWidth)-d.width(),n=Math.min(j,g.top+(a&&!a.isStandard()?a.scrollTop():0)),q=Math.min(l,g.left+(a&&!a.isStandard()?a.scrollLeft():0)),p=c(i).parents(".AccordionPanelContentClip").length,o=function(){var a=c(i).closest(".AccordionPanelContent").prev();a&&a.length&&!a.hasClass("AccordionPanelTabOpen")&&(a.trigger("mousedown"),a.trigger("mouseup"))};if(p){var l=c(i).closest(".AccordionPanelContent"),j=d.scrollTop(),r=d.scrollTop()+d.height(),s=d.scrollLeft()+ +d.width(),d=d.scrollLeft(),r=g.top>=j&&g.top+l.height()<=r,g=g.left>=d&&g.left+l.width()<=s;if(r&&g)return o(),!1;n=r?j:Math.min(n,c(i).parents(".AccordionWidget").offset().top);q=g?d:Math.min(q,c(i).parents(".AccordionWidget").offset().left)}d=function(){m.scrollTo(q,n);p&&o();try{history.replaceState({})}catch(a){if(!b.browser.msie||b.browser.version>7)window.location.hash=k}};try{history.pushState({},null,k)}catch(v){}if(window.scrollTo||void 0!==a){var a=a||c(document),x=a.scrollLeft(),w=a.scrollTop(), +t=x,y=w;c({scrollDistance:0}).animate({scrollDistance:1},{duration:1E3,easing:f,step:function(a){a!=0&&(y=a*(n-w),t=a*(q-x),m.scrollTo(x+t,w+y))},complete:d})}else c("html,body").animate({scrollTop:n,scrollLeft:q},1E3,f,d);return!1}}(d=Muse.Utils.urlParam(f,"devicelock"))&&Muse.Utils.createCookie("devicelock",d,0);return!0};Muse.Utils.navigateToAnchor=function(a){var b=function(){var b=Muse.Utils.getAnchorWithDestination(a);if(b.length!==0){var f=b.offset(),d=c(window),j=d.data("scrollWrapper"),b= +j||window,k=document.documentElement||document.body,i=(j?j.scrollHeight():k.scrollHeight)-d.height(),d=(j?j.scrollWidth():k.scrollWidth)-d.width(),i=Math.min(i,f.top+(j&&!j.isStandard()?j.scrollTop():0)),f=Math.min(d,f.left+(j&&!j.isStandard()?j.scrollLeft():0));b.scrollTo(f,i)}};if(c("body").hasClass("awaiting_bp_activate_scroll"))$window.one("scroll",function(){b()});else b()};var d=[];Muse.Utils.redirectCancelled=!1;Muse.Utils.redirectHyperlink=function(a){if(Muse.Utils.redirectCancelled)setTimeout(function(){Muse.Utils.redirectCancelled= +!1},0);else if(d=[],Muse.Utils.processHyperlink(a)&&!Muse.Utils.isIBE()){var b=c(a).attr("target");b||(b="_self");window.open(a.href,b)}};Muse.Utils.redirectHyperlinkInNewTab=function(a,b){if(Muse.Utils.redirectCancelled)setTimeout(function(){Muse.Utils.redirectCancelled=!1},0);else{d=[];thisWindow=window.self;var c=window.open(a);b?c.focus():thisWindow.focus()}};Muse.Utils.isMouseLeftClick=function(a){return a.which==1};Muse.Utils.isMouseMiddleClick=function(a){return a.which==2};Muse.Utils.isRedirectLinkKeyboardAction= +function(a){return a.which==13};Muse.Utils.addHyperlinkAnchor=function(a){a=c(a);a.bind("mousedown",function(a){(Muse.Utils.isMouseLeftClick(a)||Muse.Utils.isMouseMiddleClick(a))&&d.push(this)});a.bind("mouseup keyup",function(a){if(Muse.Utils.isMouseLeftClick(a)&&d.indexOf(this)!=-1)a.ctrlKey||a.metaKey?Muse.Utils.redirectHyperlinkInNewTab(this.href,a.shiftKey):Muse.Utils.redirectHyperlink(this);else if(Muse.Utils.isMouseMiddleClick(a)&&d.indexOf(this)!=-1)if(b.browser.webkit||!a.target.href&&b.browser.msie)Muse.Utils.redirectHyperlinkInNewTab(this.href, +a.shiftKey);else return d=[],!0;else Muse.Utils.isRedirectLinkKeyboardAction(a)&&Muse.Utils.redirectHyperlink(this);return!1});Muse.Utils.isIBE()||a.bind("click",function(){return!1})};Muse.Utils.addHyperlinkBlock=function(a){var b=c(a.parentNode);b.bind("mousedown",function(a){(Muse.Utils.isMouseLeftClick(a)||Muse.Utils.isMouseMiddleClick(a))&&d.push(this);return!1});b.bind("mouseup keyup",function(b){Muse.Utils.isMouseLeftClick(b)&&d.indexOf(this)!=-1?b.ctrlKey||b.metaKey?Muse.Utils.redirectHyperlinkInNewTab(a.href, +b.shiftKey):Muse.Utils.redirectHyperlink(a):Muse.Utils.isMouseMiddleClick(b)&&d.indexOf(this)!=-1?Muse.Utils.redirectHyperlinkInNewTab(a.href,b.shiftKey):Muse.Utils.isRedirectLinkKeyboardAction(b)&&Muse.Utils.redirectHyperlink(a);return!1});Muse.Utils.isIBE()||b.bind("click",function(){return!1})};Muse.Utils.prepHyperlinks=function(a){c("a.block").each(function(){var a=c(this.parentNode);Muse.Utils.addHyperlinkBlock(this);a.find("a.nonblock").each(function(){var a=c(this);if(a.data("registeredNonBlockLink")=== +!0)return!1;Muse.Utils.addHyperlinkAnchor(this);a.data("registeredNonBlockLink",!0)})});c("a.nonblock").each(function(){var a=c(this);a.data("registeredNonBlockLink")!==!0&&(a.parent('[class~="sbg"]').length>0?Muse.Utils.addHyperlinkAnchor(this):(a.attr("class").match(/anim_(\w+)/)||this.href.indexOf("devicelock=")!=-1)&&c(this).bind("click",function(){return Muse.Utils.processHyperlink(this)}))});a&&Muse.Utils.enableAnchorLinksActiveState()};Muse.Utils.pathOnly=function(a){if(!a)return a;return a.replace(/#(?:[^#]+)$/, +"").replace(/\?(?:[^\?]+)$/,"")};Muse.Utils.enableAnchorLinksActiveState=function(){var a=!1,b=[],d=c(window),g=Muse.Utils.getPageStyleSheets(),l=function(a){var b=a.parent('[class~="sbg"]');if(a.hasClass("MenuItem")||b.hasClass("MenuItem"))return"MuseMenuActive";if(a.hasClass("Button")||b.hasClass("Button"))return"ButtonSelected";return"MuseLinkActive"},j=!1,k=function(d){b.splice(0,b.length);c("a.nonblock,a.block",d).each(function(){Muse.Utils.saveHyperlinkInfo(c(this),l(c(this)),g,a,b)});b.sort(function(a, +b){if(a.fromb.from)return 1;return 0});j=!0},i=!1,m=d.data("scrollWrapper"),n=m||d,q=null,p=function(){i=!1;if(!j){var d=c("#page");a=d.outerWidth()/d.outerHeight()>2;k(q)}var d=a?n.scrollLeft():n.scrollTop(),g;a:{var h=0;g=b.length;for(var o;h0||a.hasClass("block")?a.parent():a,p="#"+a.attr("id"),b="."+b;if(null!==Muse.Utils.allStyleSheetRules(d,function(a){return 0<=a.indexOf(p+b)||0<=a.indexOf(b+p)})){m=0;for(n=l.length;m").insertAfter(c(this))})}; +Muse.Utils.addGradientFill=function(){c(".gradient").each(function(){var a=this;Muse.Utils.needPIE(function(){PIE.attach(a)})})};Muse.Utils.addShadows=function(){c(".shadow").each(function(){var a=this,b=c(a);Muse.Utils.needPIE(function(){b.data("mu-ie-matrix")||PIE.attach(a)})})};Muse.Utils.fixImageFramesWithRoundedCorners=function(){Muse.Browser.Features.checkCSSFeature("border-radius")&&Muse.Browser.Features.checkCSSFeature("-webkit-border-radius")&&c(".rounded-corners").each(function(){if(c(this).hasClass("clip_frame")){var a= +Muse.Utils.firstDescendant(this,Muse.Utils.Match.byNodeName("img"));a&&c(a).wrap('
')}})};Muse.Utils.addRoundedCorners=function(){c(".rounded-corners").each(function(){var a=this;Muse.Utils.needPIE(function(){var b=c(a);if(!b.data("mu-ie-matrix")){var d=b.css("filter");if(!d||!(d.toLowerCase().indexOf("opacity")>0&&d.indexOf("=100")<0)){if(a.childNodes.length&&!Muse.Browser.Features.checkCSSFeature("border-radius")&&(d=Muse.Utils.firstChild(a,Muse.Utils.Match.byNodeName("img")))&& +d.nodeName.toLowerCase()=="img"){var d=c(d),g=d.attr("src"),l=b.css("background-color")+" ",j=d.css("margin-left");if(j=="0px"||j=="auto")j=d.css("padding-left");var k=d.css("margin-top");if(k=="0px"||k=="auto")k=d.css("padding-top");if((j=="0px"||j=="auto")&&(k=="0px"||k=="auto"))b.addClass("museBGSize"),b.css("background-size","cover");d.css("visibility","hidden");b.css("background",l+"url("+g+") no-repeat "+j+" "+k)}PIE.attach(a)}}})})};Muse.Utils.addRGBA=function(){c(".rgba-background").each(function(){var a= +this;Muse.Utils.needPIE(function(){PIE.attach(a)})})};Muse.Utils.resizeHeight=function(a){var b={},d=function(d){var h=d.parent().hasClass("sbg")?d.parent():d,d=c(d.children()[0]);h.attr("data-lightbox")!="true"&&"fixed"!=d.css("position")&&h.height(d.outerHeight());h=d.attr("id")||"always_watch";b[h]||(b[h]=!0,d.watch("height",function(){var b=c(this);"fixed"!=b.css("position")&&!b.hasClass("fullscreen")&&b.closest(a).children().length&&b.closest(a).height(c(b.closest(a).children()[0]).outerHeight())}))}; +if(0-1};Muse.Utils.removeEdgeAnimationBorderForIE78= +function(){c(".animationContainer").each(function(){c(this).parent().html(function(a,b){return b.replace(/><\/iframe>$/gi,' frameBorder="0">')})})};Muse.Utils.initializeAnimations=function(a){var b=function(b){if(!Muse.Utils.isIBE()&&!0===a){var d=b.contents();c("#report-abuse",d).remove();c("#report-abuse-spacer",d).remove()}b.removeClass("an_invi")};c(".animationContainer").each(function(){var a=c(this);Muse.Utils.isIBE()||this.contentDocument&&"complete"==this.contentDocument.readyState? +b(a):a.load(function(){b(a)})})};Muse.Utils.fixTransformRotations=function(){Muse.Browser.Features.checkCSSFeature("transform")||c("*[data-mu-ie-matrix]").each(function(){var a=c(this),b=a.parent(),d=Math.round(a.data("mu-ie-matrix-dx")),g=Math.round(a.data("mu-ie-matrix-dy")),l=b.innerHeight(),j=b.innerWidth();a.css({filter:function(b,c){if(c)return c+" "+a.data("mu-ie-matrix");return a.data("mu-ie-matrix")},"margin-bottom":"-="+g}).removeClass("shadow");b.css({"margin-bottom":"-="+(b.innerHeight()- +l),"margin-right":"-="+(b.innerWidth()-j)});a.hasClass("actAsDiv")?(a.wrap(''),a.parent().css("float",a.css("float"))):a.hasClass("actAsInlineDiv")?a.wrap(''):a.wrap('
');a.parent().css({top:g,left:d,position:"relative","margin-bottom":g})})};Muse.Utils.fullPage=function(a){var b=c(window).data("stickyFooter");if(0==c(a).closest(".breakpoint").length)Muse.Assert.assert(0== +c(".breakpoint").length,"Page is outside a breakpoint node."),b.init(c(a));else{var d=function(d){Muse.Assert.assert(1==d.length,"Cannot initialize sticky footer - invalid breakpoint node.");b.init(c(a,d))};d(c(".breakpoint.active"));c("body").on("muse_bp_activate",function(a,b,c){Muse.Utils.requestAnimationFrame(function(){d(c)})})}};Muse.Utils.widgetInsideLightbox=function(a){for(var b=0;b");b.addClass(a.attr("class"));b.attr("id",a.attr("id"));b.append(a.contents());a.replaceWith(b)};c("ul").each(function(){c(this).find("li").each(a)});c("ul").each(a)};Muse.Utils._initWidgetQueue=null;Muse.Utils._hasBPListener=!1;Muse.Utils.initWidget=function(a,b,d){if(0==c(".breakpoint").length)c(a).each(function(){d(c(this))}); +else{for(var g=0;g').parent().html(),a.remove(),l.$parent.children("div #deleteMeWrapper").remove()):(l.$node=a.clone(),a.remove());d.push(l)}});d.length&&a.data("detached",d);h.length&&a.data("paused",h);c("video",a).each(function(){if(b.browser.msie&&b.browser.version==9&&this.pause&&this.getAttribute("autoplay")&&this.readyState!=4)c(this).one("play",function(){this.pause()});else this.pause&&!this.paused&&this.pause()})};Muse.Utils.setPageToMaxWidth= +function(){var a=c("#page");a!==void 0&&a.css("max-width")!=="none"&&(a.css("width",a.css("max-width")),c(window).trigger("pageWidthChanged"))};Muse.Utils.resetPageWidth=function(){var a=c("#page");a!==void 0&&(a.css("width",""),c(window).trigger("pageWidthChanged"))};Muse.Utils.getMinWidthOfElem=function(a){var b=parseFloat(a.css("min-width")?a.css("min-width"):0);b===0&&(b=parseFloat(a.attr("data-min-width")?a.attr("data-min-width"):0));return b};Muse.Utils.dropInOneBucketOfSizeAndPinPolicy=function(a, +b,d,g){if(a!==void 0&&b!==void 0){var l={};if(b==="fixed")l=d.fixed;else if(b==="fluidWidth"||b==="fluidWidthHeight")l=d.responsive;if(!c.isEmptyObject(l))switch(a){case "page_fluidx":l.ChildFluidPin.push(g);break;case "page_fixedLeft":l.ChildFixedLeft.push(g);break;case "page_fixedRight":l.ChildFixedRight.push(g);break;case "page_fixedCenter":l.ChildFixedCenter.push(g)}}};Muse.Utils.removeSizeAndPiningAttributes=function(){};Muse.Utils.getMarginLeft=function(a){if(a&&!c.isEmptyObject(a))return a.attr("data-margin-left")&& +a.attr("data-display-attr-change")===!0?a.attr("data-margin-left"):window.getComputedStyle(a[0])["margin-left"]};Muse.Utils.classifyChildrens=function(a,b,d){function g(a){var c=a.attr("data-pintopage"),d=a.attr("data-sizePolicy"),g=parseFloat(a.css("min-width")),h=parseFloat(a.attr("data-min-width")),n=!0;Muse.Utils.isTopLevelWidget(a)||a.is("form")||Muse.Utils.isMenuWidget(a)||Muse.Utils.isParameterizedHtmlWidget(a)?b.ChildWidgets.push(a):(g>0||h>0)&&!Muse.Utils.isParameterizedHtmlWidget(a)?b.ChildWithMinWidth.push(a): +c!==void 0&&d!==void 0?(Muse.Utils.dropInOneBucketOfSizeAndPinPolicy(c,d,b,a),Muse.Utils.removeSizeAndPiningAttributes(a)):n=!1;return n}d?a&&b&&g(a):a.children().each(function(){var a=c(this);g(a)||Muse.Utils.classifyChildrens(a,b,d)})};Muse.Utils.isElementFixedSize=function(a){return a&&a.attr("data-sizePolicy")==="fixed"};Muse.Utils.isInPercentage=function(a){return a&&a.indexOf("%")===a.length-1};Muse.Utils.isInPixel=function(a){return a&&a.indexOf("px")===a.length-2};Muse.Utils.getPropInPixel= +function(a,b){var c;a&&b&&a.css("display")!=="none"&&(c=b==="margin-left"?Muse.Utils.getMarginLeft(a):window.getComputedStyle(a[0]).getPropertyValue(b),Muse.Utils.isInPercentage(c)&&(b==="left"?(c=a.offsetParent().width()*parseFloat(c)/100,c=c.toString()+"px"):b==="margin-left"?(c=a.parent().width()*parseFloat(c)/100,c=c.toString()+"px"):c=a.css(b)));return c};Muse.Utils.getWidths=function(a){var b={};Muse.Utils.moveElementsOutsideViewport(a);Muse.Utils.moveElementsOutsideViewport(a.parents());b.offsetWidth= +0;b.elemWidth=0;b.offsetWidth=a[0].offsetWidth;b.elemWidth=parseFloat(Muse.Utils.getPropInPixel(a,"width"));Muse.Utils.moveElementsInsideViewport(a);Muse.Utils.moveElementsInsideViewport(a.parents());return b};Muse.Utils.getOffsetWidth=function(a){var b=a[0].offsetWidth;if(b===0)b=Muse.Utils.getWidths(a).offsetWidth;return b};Muse.Utils.getChildWidth=function(a,b,c){return b===!0?(b=parseFloat(a.css("min-width"))?parseFloat(a.css("min-width")):parseFloat(a.attr("data-min-width")),a.css("box-sizing")!== +"border-box"&&(b+=Math.round(a.outerWidth()-a.innerWidth())),b):c?window.getComputedStyle(a[0]).width:Muse.Utils.getOffsetWidth(a)};Muse.Utils.setMinWidthInformation=function(a,b,d){if(!c.isEmptyObject(a)&&a.chosenMinWidth&&a.$element&&d>0&&a.chosenMinWidth0)switch(b){case "page_fixedLeft":a.forEach(function(a){var b=Muse.Utils.getChildWidth(a,c,!0),f=a[0].offsetWidth,i=0,m=window.getComputedStyle(a[0]).left,m=m?parseFloat(m):0,n=0,q=0;Muse.Utils.isInPercentage(b)?(i=parseFloat(b)/100,b=Muse.Utils.getWidths(a),q=b.elemWidth,f=b.offsetWidth):Muse.Utils.isInPixel(b)&&(i=a.offsetParent().width(),q=parseFloat(b),i=i>0?q/i:0);i>0&&(f>Math.round(q)&&(n=f-Math.round(q)),b=Math.abs(Muse.Utils.isValueWithinTolerance(i, +1,1.0E-4)?a.outerWidth():(m+n)/(1-i)),Muse.Utils.setMinWidthInformation(d,a,b))});break;case "page_fixedRight":a.forEach(function(a){var b=Muse.Utils.getChildWidth(a,c,!0),f=0,i=window.getComputedStyle(a[0]).left,i=Math.abs(i?parseFloat(i):0);Muse.Utils.isInPercentage(b)?f=parseFloat(b)/100:Muse.Utils.isInPixel(b)&&(f=a.offsetParent().width(),b=parseFloat(b),f=f>0?b/f:0);if(f>0&&f<1&&!Muse.Utils.isValueWithinTolerance(f,1,1.0E-4))var m=Math.abs(i/(1-f));Muse.Utils.setMinWidthInformation(d,a,m)}); +break;case "page_fixedCenter":a.forEach(function(a){var b=window.getComputedStyle(a[0]).left,b=b?parseFloat(b):0,f=Math.abs(b),i=Muse.Utils.getMarginLeft(a),m=0,n=Muse.Utils.getChildWidth(a,c,!0),q=a[0].offsetWidth,p=0,o=0;if(b!==0)Muse.Utils.isInPercentage(i)?m=parseFloat(i)/100:Muse.Utils.isInPixel(i)&&(m=a.parent().width(),i=parseFloat(i),m=m>0?i/m:0),Muse.Utils.isInPercentage(n)?(n=Muse.Utils.getWidths(a),o=n.elemWidth,q=n.offsetWidth):Muse.Utils.isInPixel(n)&&(o=parseFloat(n)),m>0&&(b>0&&q>Math.round(o)&& +(p=q-Math.round(o)),Muse.Utils.setMinWidthInformation(d,a,Math.abs((f+p)/m)))})}return d};Muse.Utils.computeMinWidthForFixedChilds=function(a,b,d,g){function l(a,b){var d=0,f=0,f=Muse.Utils.getLeft(a),h=f.$element,j=f.left,l=Muse.Utils.isInPixel(j),f=Muse.Utils.isInPercentage(j)||j==="auto";Muse.Utils.moveElementsOutsideViewport(a);Muse.Utils.moveElementsOutsideViewport(a.parents());if(f)f=Muse.Utils.getLeft(a,!0),h=f.$element,j=f.left,l=Muse.Utils.isInPixel(j);var r=h.is(g)||g.closest(h).length, +f=parseFloat(g.width());l&&(d=parseFloat(j),r||(j=h.parents(),c.each(j,function(a,b){var f=c(b);if(f.is(g))return!1;f=Muse.Utils.getMarginLeft(f);Muse.Utils.isInPixel(f)&&f!==Muse.Utils.marginLeftForMovingElementsOutSideViewPort&&(d+=parseFloat(f));return!0})));b&&r&&(f=parseFloat(h.parent().width()));Muse.Utils.moveElementsInsideViewport(a);Muse.Utils.moveElementsInsideViewport(a.parents());return{containerWidth:f,left:d}}var j={$element:{},chosenMinWidth:-1};if(a&&a.length>0)switch(b){case "page_fluidx":a.forEach(function(a){var b= +Muse.Utils.getChildWidth(a,d,!1),c=l(a,!0),f=c.left,c=c.containerWidth,g=0,p=-1;c0?f/c:0;g<1&&!Muse.Utils.isValueWithinTolerance(g,1,1.0E-4)&&(p=Math.abs(b/(1-g)));Muse.Utils.setMinWidthInformation(j,a,p>b?p:b)});break;case "page_fixedLeft":a.forEach(function(a){var b=Muse.Utils.getChildWidth(a,d,!1),c=l(a).left,c=Math.abs(c+b);Muse.Utils.setMinWidthInformation(j,a,c>b?c:b)});break;case "page_fixedRight":a.forEach(function(a){var b=Muse.Utils.getChildWidth(a,d,!1),c=window.getComputedStyle(a[0]).left, +c=Math.abs(c?parseFloat(c):0),f=-1,l=Muse.Utils.getLeftAdjustmentAmountDoneByParents(a,g);l>=0&&(c-=l);c>0&&(f=Muse.Utils.isElementFixedSize(a)?c:c+b);Muse.Utils.setMinWidthInformation(j,a,f>b?f:b)});break;case "page_fixedCenter":a.forEach(function(a){var b=Muse.Utils.getChildWidth(a,d,!1),c=parseFloat(window.getComputedStyle(a[0]).left),f=0,l=0,f=Muse.Utils.getMarginLeft(a),p=0,o=-1;Muse.Utils.isInPercentage(f)?p=parseFloat(f)/100:Muse.Utils.isInPixel(f)&&(p=a.parent().width(),f=parseFloat(f),p= +p>0?f/p:0);p>0&&(o=Muse.Utils.getLeftAdjustmentAmountDoneByParents(a,g),o=o<0?0:o,f=(Math.abs(c)-o)/p,c<0?c+=o:c>0&&(c-=o),Muse.Utils.isValueWithinTolerance(p,1,1.0E-4)||(l=(b+c)/(1-p)),o=Math.max(f,l,b),Muse.Utils.setMinWidthInformation(j,a,o>b?o:b))})}return j};Muse.Utils.computeMinWidthForChildsWithMinWidth=function(a,b){var c={$element:{},chosenMinWidth:-1};a.forEach(function(a){var d=a.attr("data-pintopage")||"page_fluidx",j=-1;Muse.Utils.removeSizeAndPiningAttributes(a);d!==void 0&&(j=Muse.Utils.computeMinWidthForFixedChilds([a], +d,!0,b),Muse.Utils.setMinWidthInformation(c,a,j.chosenMinWidth))});return c};Muse.Utils.isTopLevelWidget=function(a){return a&&(a.hasClass("SlideShowWidget")||a.hasClass("PamphletWidget")||a.hasClass("TabbedPanelsWidget")||a.hasClass("AccordionWidget")||a.hasClass("Button"))};Muse.Utils.isMenuWidget=function(a){return a.is("nav")&&(a.hasClass("MenuBar")||a.hasClass("MenuBarVertical"))};Muse.Utils.computeMinWidthForForms=function(a){function b(a){a.children().each(function(){var a=c(this);if(a.attr("data-sizePolicy")=== +"fixed"){d.push(a);var g=a.innerWidth();a.attr("data-min-width",g)}else b(a)})}var d=[],g={$element:{},chosenMinWidth:-1};b(a);d.forEach(function(b){var d=b.parents(),f=b;c.each(d,function(b,d){var h=c(d),k=f.attr("data-pintopage")||"page_fluidx",j={};Muse.Utils.removeSizeAndPiningAttributes(f);if(f.is(a))return!1;j=Muse.Utils.computeMinWidthForFixedChilds([f],k,!0,h);Muse.Utils.setMinWidthInformation(g,j.$element,j.chosenMinWidth);f.attr("data-min-width")&&f.removeAttr("data-min-width");if(k=parseFloat(h.attr("data-min-width")))j.chosenMinWidth= +Math.max(j.chosenMinWidth,k);h.attr("data-min-width",j.chosenMinWidth);f=h;if(h.is(a))return!1})});var l=parseFloat(a.attr("data-min-width"));l>0&&(a.css("min-width",l),a.removeAttr("data-min-width"))};Muse.Utils.computeMinWidthForWidgetChilds=function(a,b){var d=[],g={$element:{},chosenMinWidth:-1};a.forEach(function(a){var b=Muse.Utils.getMinWidthOfElem(a);if(!a.hasClass("SlideShowWidget")&&!a.hasClass("PamphletWidget")&&Muse.Utils.isElementFixedSize(a))b=(b=window.getComputedStyle(a[0]).width)? +parseFloat(b):0,a.attr("data-min-width",b);else if(a.is("form"))Muse.Utils.computeMinWidthForForms(a);else{var c;a.hasClass("SlideShowWidget")||a.hasClass("PamphletWidget")?c=WebPro.Widget.ContentSlideShow.prototype.defaultPlugins[0]:a.hasClass("TabbedPanelsWidget")?c=WebPro.Widget.TabbedPanels.prototype.defaultPlugins[0]:a.hasClass("AccordionWidget")&&(c=WebPro.Widget.Accordion.prototype.defaultPlugins[0]);c&&c._setMinWidth&&(c._setMinWidth(a,!0),b=Muse.Utils.getMinWidthOfElem(a))}(b>0||a.is("form"))&& +d.push(a)});d.forEach(function(a){var d=a.attr("data-pintopage")||"page_fluidx",h={},h=Muse.Utils.computeMinWidthForFixedChilds([a],d,!0,b);Muse.Utils.setMinWidthInformation(g,h.$element,h.chosenMinWidth);h.$element&&!c.isEmptyObject(h.$element)&&h.$element.attr("data-min-width")&&(h.$element.removeAttr("data-min-width"),Muse.Utils.removeSizeAndPiningAttributes(h.$element))});return g};Muse.Utils.adjustMinWidthRespectToAllParents=function(a,b){var d=[];b.forEach(function(b){if(b&&!c.isEmptyObject(b)&& +b.$element&&!c.isEmptyObject(b.$element)&&b.chosenMinWidth>0){if(!a.is(b.$element)){var f=b.$element.parents();Muse.Utils.moveElementsOutsideViewport(b.$element);Muse.Utils.moveElementsOutsideViewport(f);c.each(f,function(d,f){var h=c(f);if(h.is(a))return!1;h=Math.round(h.outerWidth()-h.innerWidth());h>0&&(b.chosenMinWidth+=h);return!0});Muse.Utils.moveElementsInsideViewport(b.$element);Muse.Utils.moveElementsInsideViewport(f)}d.push(b.chosenMinWidth)}});return d};Muse.Utils.changeElementsDisplay= +function(a){var b;a.each(function(){b=c(this);b.css("display")==="none"&&(b.css("display","block"),b.attr("data-display-attr-change","true"))})};Muse.Utils.resetElementsDisplay=function(a){var b;a.each(function(){b=c(this);b.attr("data-display-attr-change")==="true"&&(b.css("display",""),b.css("display")!=="none"&&b.css("display","none"),b.removeAttr("data-display-attr-change"))})};Muse.Utils.isValueWithinTolerance=function(a,b,c){return a===b?!0:!isNaN(a)&&!isNaN(b)&&Math.abs(a-b)<=c?!0:!1};Muse.Utils.getMinWidthOfParts= +function(a,b,d){function g(a){var b=a.outerWidth()-a.innerWidth(),c=a.innerWidth();b>0&&(c+=parseFloat(a.css("border-left-width")));return c}function l(c){var g=c[0].getBoundingClientRect(),c={left:g.left,right:g.right};if(d&&b.attr("data-contentlayout")==="stack"&&b.attr("data-transitionStyle")==="horizontal"){var i=parseFloat(a.css("left"));if(i>0){var n=g.left-i,g=g.right-i;if(n>0)c.left=n;if(g>0)c.right=g}}return c}function j(a){if(b.attr("data-contentlayout")==="stack"&&(b.attr("data-transitionStyle")=== +"horizontal"||b.attr("data-transitionStyle")==="vertical"))return a=a.attr("data-pintopage"),a==="page_fixedRight"||a==="page_fixedCenter";return!1}var k=-1;if(a&&b&&!c.isEmptyObject(a)&&!c.isEmptyObject(b)&&b[0]&&a[0]){Muse.Utils.changeElementsDisplay(a);Muse.Utils.changeElementsDisplay(a.parents());var i=a.attr("data-sizePolicy"),m=a.attr("data-pintopage"),n=parseFloat(a.css("min-width"));parseFloat(a.attr("data-min-width"));var q=!1,p=b.width(),o=b[0].getBoundingClientRect(),r=g(a),s=l(a),v=a.outerWidth()- +a.innerWidth();if(j(a))return k;n>0&&(i="fixed",r=n+v,q=!0,m===void 0&&(m="page_fluidx"));if(i==="fixed")switch(m){case "page_fluidx":i=-1;o.left<=s.left?(o=s.left-o.left,o>=0&&(i=o/p)):s.left-o.left<2&&(i=0);i>=0&&(Muse.Utils.isValueWithinTolerance(i,1,1.0E-4)?k=0:i<1&&(k=r/(1-i)));break;case "page_fixedLeft":q||(p=-1,o.left<=s.left?p=s.left-o.left:s.left-o.left<2&&(p=0),p>=0&&(k=r+p));break;case "page_fixedRight":q||(p=-1,o.right>=s.right?p=o.right-s.right:o.right-s.right<2&&(p=0),p>=0&&(k=r+p)); +break;case "page_fixedCenter":q||(p<=r?k=r:s.left<=o.left||s.right>=o.right?(p=o.left-s.left,i=s.right-o.right,p>=0&&i<=0?k=r+(o.right-s.right):i>=0&&p<=0&&(k=r+(s.left-o.left))):(s=s.left+r/2,o=o.left+p/2,p=-1,p=s===o?0:s=0&&(k=2*(r/2+p))))}Muse.Utils.resetElementsDisplay(a);Muse.Utils.resetElementsDisplay(a.parents())}return k};Muse.Utils.getMinWidthForElement=function(a,b){var c=a&&a.length>0&&a[0].style.minWidth!==""?parseFloat(a[0].style.minWidth):0,b=b||!1;if(a&&a.length>0&&a[0].style.minWidth=== +""||b){if(Muse.Utils.isElementFixedSize(a)&&!b)return c;var d={responsive:{},fixed:{}};d.responsive.ChildFluidPin=[];d.responsive.ChildFixedLeft=[];d.responsive.ChildFixedRight=[];d.responsive.ChildFixedCenter=[];d.fixed.ChildFluidPin=[];d.fixed.ChildFixedLeft=[];d.fixed.ChildFixedRight=[];d.fixed.ChildFixedCenter=[];d.ChildWithMinWidth=[];d.ChildWidgets=[];var l=[];Muse.Utils.classifyChildrens(a,d,b);l.push(Muse.Utils.computeMinWidthForFixedChilds(d.fixed.ChildFluidPin,"page_fluidx",!1,a));l.push(Muse.Utils.computeMinWidthForFixedChilds(d.fixed.ChildFixedLeft, +"page_fixedLeft",!1,a));l.push(Muse.Utils.computeMinWidthForFixedChilds(d.fixed.ChildFixedRight,"page_fixedRight",!1,a));l.push(Muse.Utils.computeMinWidthForFixedChilds(d.fixed.ChildFixedCenter,"page_fixedCenter",!1,a));l.push(Muse.Utils.computeMinWidthForChildsWithMinWidth(d.ChildWithMinWidth,a));l.push(Muse.Utils.computeMinWidthForWidgetChilds(d.ChildWidgets,a));(d=Muse.Utils.adjustMinWidthRespectToAllParents(a,l))&&d.length>0&&(c=Math.max.apply(null,d))}return c};Muse.Utils.buttonsMinWidthHelper= +function(){Muse.Utils.setPageToMaxWidth();c(".Button").each(function(){var a=c(this),b=0;!Muse.Utils.isElementFixedSize(a)&&b===0&&(b=Muse.Utils.getMinWidthForElement(a,!1),b>0&&a.css("min-width",b));a.attr("data-visibility")==="changed"?(a.css("visibility",""),a.removeAttr("data-visibility")):a.children()&&a.children().attr("data-visibility")==="changed"&&(a.children().css("visibility",""),a.children().removeAttr("data-visibility"))});Muse.Utils.resetPageWidth()};Muse.Utils.makeButtonsVisibleAfterSettingMinWidth= +function(){if(0==c(".breakpoint").length)Muse.Utils.buttonsMinWidthHelper();else c("body").on("muse_bp_activate",function(){Muse.Utils.buttonsMinWidthHelper()})};Muse.Utils.attachIframesAndObjectsToResumeMedia=function(a){var b=a.data("detached");if(b){for(var d=b.length-1;d>=0;d--){var g=b[d];!g.$next||g.$next.length==0?g.$parent.append(g.$node?g.$node:g.html):g.$next.before(g.$node?g.$node:g.html);g.$next=g.$parent=g.$node=g.html=void 0}a.data("detached",null)}if(b=a.data("paused"))for(d=0;d0||window.matchMedia&&window.matchMedia("(-moz-touch-enabled)").matches)return{Start:"pointerDown",End:"pointerUp",Move:"pointerMove",Listener:function(a){return function(b){var c= +b.originalEvent||b;if(c.pointerType!=c.POINTER_TYPE_MOUSE)return a.apply(this,arguments)}}};else for(var a=0,b=Muse.Browser.domPrefixes.length;a").css({border:"1px solid #000000;",width:100,height:100,position:"absolute",top:-99999,left:-99999,padding:0,margin:0,overflow:"auto"}).appendTo(document.body)[0];b.scrollHeight!==b.clientHeight&&(a=!0);c(b).remove();return a}();(function(a){var b=a(window),c=a("body"),d=function(){this.$verticalSpacer=null;this.enabled=!1;this.contentBelowSpacer= +this.contentAboveSpacer=this.minHeight=0};d.prototype.init=function(d){this.$verticalSpacer=a(".verticalspacer",d);if(0!=this.$verticalSpacer.length){this.enabled=!0;var g=Muse.Utils.getCSSIntValue(this.$verticalSpacer,"min-height");this.$verticalSpacer.css("min-height","");this.minHeight=Muse.Utils.getCSSIntValue(this.$verticalSpacer,"min-height");this.$verticalSpacer.css("min-height",g);this.pageMinHeight=Muse.Utils.getCSSIntValue(d,"padding-top")+Muse.Utils.getCSSIntValue(d,"min-height")+Muse.Utils.getCSSIntValue(d, +"padding-bottom");this.contentAboveSpacer=parseInt(this.$verticalSpacer.data("content-above-spacer"));this.contentBelowSpacer=parseInt(this.$verticalSpacer.data("content-below-spacer"));var i=this,k=!0,j=[],l=!0;b.resize(function(){if(k){var a=b.width();l?(j.splice(0,j.length),j.push(a),l=!1,setTimeout(function(){l=!0},200)):j[j.length-1]!=a&&(j.push(a),3
');var j=null,j=a(".muse_check_css"), +k=j.css("height","100vh").height(),i=j.css("height","calc(100vh + 300px)").height();0this.depCount&&!this.defined){if(K(k)){if(this.events.error&&this.map.isDefine||g.onError!== +ha)try{h=l.execCb(c,k,b,h)}catch(d){a=d}else h=l.execCb(c,k,b,h);this.map.isDefine&&void 0===h&&((b=this.module)?h=b.exports:this.usingExports&&(h=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",A(this.error=a)}else h=k;this.exports=h;if(this.map.isDefine&&!this.ignore&&(v[c]=h,g.onResourceLoad)){var f=[];y(this.depMaps,function(a){f.push(a.normalizedMap||a)});g.onResourceLoad(l,this.map,f)}C(c); +this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}},callPlugin:function(){var a=this.map,b=a.id,d=q(a.prefix);this.depMaps.push(d);w(d,"defined",z(this,function(h){var k,f,d=e(fa,this.map.id),M=this.map.name,r=this.map.parentMap?this.map.parentMap.name:null,m=l.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(h.normalize&&(M=h.normalize(M,function(a){return c(a,r,!0)})|| +""),f=q(a.prefix+"!"+M,this.map.parentMap),w(f,"defined",z(this,function(a){this.map.normalizedMap=f;this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),h=e(t,f.id)){this.depMaps.push(f);if(this.events.error)h.on("error",z(this,function(a){this.emit("error",a)}));h.enable()}}else d?(this.map.url=l.nameToUrl(d),this.load()):(k=z(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),k.error=z(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];D(t,function(a){0=== +a.map.id.indexOf(b+"_unnormalized")&&C(a.map.id)});A(a)}),k.fromText=z(this,function(h,c){var d=a.name,f=q(d),M=S;c&&(h=c);M&&(S=!1);u(f);x(p.config,b)&&(p.config[d]=p.config[b]);try{g.exec(h)}catch(e){return A(F("fromtexteval","fromText eval for "+b+" failed: "+e,e,[b]))}M&&(S=!0);this.depMaps.push(f);l.completeLoad(d);m([d],k)}),h.load(a.name,m,k,p))}));l.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){Z[this.map.id]=this;this.enabling=this.enabled=!0;y(this.depMaps,z(this,function(a, +b){var c,h;if("string"===typeof a){a=q(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=e(R,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;w(a,"defined",z(this,function(a){this.undefed||(this.defineDep(b,a),this.check())}));this.errback?w(a,"error",z(this,this.errback)):this.events.error&&w(a,"error",z(this,function(a){this.emit("error",a)}))}c=a.id;h=t[c];x(R,c)||!h||h.enabled||l.enable(a,this)}));D(this.pluginMaps,z(this,function(a){var b=e(t,a.id); +b&&!b.enabled&&l.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){y(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};l={config:p,contextName:b,registry:t,defined:v,urlFetched:W,defQueue:G,defQueueMap:{},Module:da,makeModuleMap:q,nextTick:g.nextTick,onError:A,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");if("string"===typeof a.urlArgs){var b= +a.urlArgs;a.urlArgs=function(a,c){return(-1===c.indexOf("?")?"?":"&")+b}}var c=p.shim,h={paths:!0,bundles:!0,config:!0,map:!0};D(a,function(a,b){h[b]?(p[b]||(p[b]={}),Y(p[b],a,!0,!0)):p[b]=a});a.bundles&&D(a.bundles,function(a,b){y(a,function(a){a!==b&&(fa[a]=b)})});a.shim&&(D(a.shim,function(a,b){L(a)&&(a={deps:a});!a.exports&&!a.init||a.exportsFn||(a.exportsFn=l.makeShimExports(a));c[b]=a}),p.shim=c);a.packages&&y(a.packages,function(a){var b;a="string"===typeof a?{name:a}:a;b=a.name;a.location&& +(p.paths[b]=a.location);p.pkgs[b]=a.name+"/"+(a.main||"main").replace(na,"").replace(U,"")});D(t,function(a,b){a.inited||a.map.unnormalized||(a.map=q(b,null,!0))});(a.deps||a.callback)&&l.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(ga,arguments));return b||a.exports&&ia(a.exports)}},makeRequire:function(a,n){function m(c,d,f){var e,r;n.enableBuildCallback&&d&&K(d)&&(d.__requireJsBuild=!0);if("string"===typeof c){if(K(d))return A(F("requireargs", +"Invalid require call"),f);if(a&&x(R,c))return R[c](t[a.id]);if(g.get)return g.get(l,c,a,m);e=q(c,a,!1,!0);e=e.id;return x(v,e)?v[e]:A(F("notloaded",'Module name "'+e+'" has not been loaded yet for context: '+b+(a?"":". Use require([])")))}P();l.nextTick(function(){P();r=u(q(null,a));r.skipMap=n.skipMap;r.init(c,d,f,{enabled:!0});H()});return m}n=n||{};Y(m,{isBrowser:E,toUrl:function(b){var d,f=b.lastIndexOf("."),g=b.split("/")[0];-1!==f&&("."!==g&&".."!==g||1e.attachEvent.toString().indexOf("[native code")||ca?(e.addEventListener("load",b.onScriptLoad,!1),e.addEventListener("error",b.onScriptError,!1)):(S=!0,e.attachEvent("onreadystatechange",b.onScriptLoad));e.src=d;if(m.onNodeCreated)m.onNodeCreated(e,m,c,d);P=e;H?C.insertBefore(e,H):C.appendChild(e);P=null;return e}if(ja)try{setTimeout(function(){}, +0),importScripts(d),b.completeLoad(c)}catch(q){b.onError(F("importscripts","importScripts failed for "+c+" at "+d,q,[c]))}};E&&!w.skipDataMain&&X(document.getElementsByTagName("script"),function(b){C||(C=b.parentNode);if(O=b.getAttribute("data-main"))return u=O,w.baseUrl||-1!==u.indexOf("!")||(I=u.split("/"),u=I.pop(),T=I.length?I.join("/")+"/":"./",w.baseUrl=T),u=u.replace(U,""),g.jsExtRegExp.test(u)&&(u=O),w.deps=w.deps?w.deps.concat(u):[u],!0});define=function(b,c,d){var e,g;"string"!==typeof b&& +(d=c,c=b,b=null);L(c)||(d=c,c=null);!c&&K(d)&&(c=[],d.length&&(d.toString().replace(qa,ka).replace(ra,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c)));S&&(e=P||pa())&&(b||(b=e.getAttribute("data-requiremodule")),g=J[e.getAttribute("data-requirecontext")]);g?(g.defQueue.push([b,c,d]),g.defQueueMap[b]=!0):V.push([b,c,d])};define.amd={jQuery:!0};g.exec=function(b){return eval(b)};g(w)}})(this); +;(function(){if(!("undefined"==typeof Muse||"undefined"==typeof Muse.assets)){var a=function(a,b){for(var c=0,d=a.length;c= +0)))h=d,f.setAttribute("data-whatinput",h),m.indexOf(h)===-1&&m.push(h);d==="keyboard"&&g.indexOf(o[c])===-1&&o[c]&&g.push(o[c])}function d(a){a=g.indexOf(o[a.keyCode?a.keyCode:a.which]);a!==-1&&g.splice(a,1)}var g=[],f=document.body,i=!1,h=null,j=["input","select","textarea"],k=f.hasAttribute("data-whatinput-formtyping"),l={keydown:"keyboard",mousedown:"mouse",mouseenter:"mouse",touchstart:"touch",pointerdown:"pointer",MSPointerDown:"pointer"},m=[],o={9:"tab",13:"enter",16:"shift",27:"esc",32:"space", +37:"left",38:"up",39:"right",40:"down"},q={2:"touch",3:"touch",4:"mouse"},p;(function(){var c="mousedown";window.PointerEvent?c="pointerdown":window.MSPointerEvent&&(c="MSPointerDown");f.addEventListener?(f.addEventListener(c,b),f.addEventListener("mouseenter",b),"ontouchstart"in document.documentElement&&f.addEventListener("touchstart",a),f.addEventListener("keydown",b),f.addEventListener("keyup",d)):(f.attachEvent(c,b),f.attachEvent("mouseenter",b),"ontouchstart"in document.documentElement&&f.attachEvent("touchstart", +a),f.attachEvent("keydown",b),f.attachEvent("keyup",d))})();return{ask:function(){return h},keys:function(){return g},types:function(){return m},set:c}}); diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 000000000..e859ea0e4 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,63 @@ + + + + http://yuriwestplat.com/research/index.html + 2018-01-27 + weekly + 0.5 + + + http://yuriwestplat.com/research/het-ontwerpproces.html + 2018-01-27 + weekly + 0.5 + + + http://yuriwestplat.com/research/stappen.html + 2018-01-27 + weekly + 0.5 + + + http://yuriwestplat.com/research/resultaat.html + 2018-01-27 + weekly + 0.5 + + + http://yuriwestplat.com/research/stap-1.html + 2018-01-27 + weekly + 0.5 + + + http://yuriwestplat.com/research/stap-2.html + 2018-01-27 + weekly + 0.5 + + + http://yuriwestplat.com/research/naamloos-15.html + 2018-01-27 + weekly + 0.5 + + + http://yuriwestplat.com/research/naamloos-16.html + 2018-01-27 + weekly + 0.5 + + + http://yuriwestplat.com/research/naamloos-17.html + 2018-01-27 + weekly + 0.5 + + + http://yuriwestplat.com/research/ontwerpproces.html + 2018-01-27 + weekly + 0.5 + + \ No newline at end of file diff --git a/stap-1.html b/stap-1.html new file mode 100644 index 000000000..dd4cb58e4 --- /dev/null +++ b/stap-1.html @@ -0,0 +1,164 @@ + + + + + + + + + + + stap 1 + + + + + + + + + +
+
+
+
+
+ +
+ +
+

 Met een Conversational Interface kan een computer een eenvoudig gesprek voeren met een mens. De computer interpeteert woorden en woordpatronen en kan reageren volgens vooraf ingestelde regels. Het ontwerpproces definieert deze interactie-regels en structureert het gesprek.

+

 

+

Probleem en oplossing

+

De eerste ontwerp-stappen verschillen niet van het ontwerp van een GUI. Een beschrijving van de strategische doelen van het project, de problemen van de stakeholders  en de geschiktheid van voice interface als oplossing.  De denkbare oplossingen zijn beschreven in een use case.

+

 

+

2.Scenario

+

Met behulp van scenario’s ontwerpen we de informatie-uitwisseling tussen een systeem en de gebruikers. In deze case is dat het gesprek tussen een smart agent (wilbur), een floor manager (gebruiker) en een leidinggevende (regisseur).

+

 

+

3.User Intents

+

Met behulp van de scenario’s worden in User Intents de doelen van de gebruiker en de bijbehorende woorden en zinnen beschreven. Key User Inputs of Utterances zijn woorden of woordpatronen die een User Intent triggeren. System Outputs zijn de antwoorden aan de gebruiker én triggers van server-side processen die horen bij een User Intent.

+

 

+

4.Gedetailleerde Flow

+

Na een snelle gebruikerstest en feedback van stakeholders worden de scenario’s uitgewerkt in een Gedetailleerde Flow van alle interactie tussen het smart systeem en de gebruikers, inclusief edge cases en default intents. Hierbij wordt vastgelegd met welke api’s en databronnen wordt gecommuniceerd, en welke data wordt bewaard en (her)gebruikt voor de AI. Naast een interactie-model geeft dit een functionele beschrijving voor het technisch proces [6].

+

 

+

5.Dialoog Script, Persoonlijkheid van de Agent

+

Alle teksten en alle mogelijke variaties van utterances worden uitgeschreven in een Dialoog Script. Een gedetailleerd ontworpen persoonlijkheid van Wilbur bepaalt taalgebruik en de tone-of-voice. Na het testen van het script in een prototype is het gesprek klaar voor productie.

+

 

+

6.Productie

+

Met een web-tool “bouw” wordt de volledige conversatie in een WYSYWIG interface gemaakt, en kan de dialoog met een interactief prototype worden getest. Na prototyping moet de applicatie gekoppeld aan de back-end en de interface van de eindgebruikers. [zie Stack en Impediments]

+

 

+

Stack, techniek, vaardigheden [B].

+

De stack bestaat uit verschillende componenten met web-interfaces:  een online NLP Engine om het gesprek in te “bouwen” (intents, utterances, language processing, AI). Export van dit gesprek als JSON naar een fulfillment-/webserver (API calls, webhooks), die op zijn beurt communiceert met de eigen back-end systemen. De eindgebruikers communiceren met dit systeem via een Delivery interface: smart speakers, embedded devices, chatbots, dedicated apps of HTML/CSS. Op mobiel moet de microfoon en de speaker van het device worden aangesproken. Ik zou ik kiezen voor een kleine native test app. [zie Impediments]

+

 

+

Impediments

+

Taal Voice User Interface werkt op dit moment nog niet in het Nederlands. Naar verwachting zal dit in 2019 wel het geval zijn; tot die tijd zijn we beperkt tot Engels en de grote Europese talen.

+

 

+

Delivery interface De delivery interface op een mobiele telefoon gebruikt de microfoon en de speaker van het device. De beste oplossing hiervoor is een custom native app die communicatie. Het is ook mogelijk om dit in HTML/CSS te doen, maar in mijn ervaring is dit nog niet erg stabiel.

+

 

+

Werkzaamheden

+

1-6 Designer

+

6 Back-End, Front-End

+

 

+
+ +
+
+ + + + + + + diff --git a/stap-2.html b/stap-2.html new file mode 100644 index 000000000..cf1764522 --- /dev/null +++ b/stap-2.html @@ -0,0 +1,60 @@ + + + + + + + + + + + stap 2 + + + + + + + + + +
+
+
+
+
+
+ + + + + + + diff --git a/stappen.html b/stappen.html new file mode 100644 index 000000000..1b8e93083 --- /dev/null +++ b/stappen.html @@ -0,0 +1,56 @@ + + + + + + + + + + + stappen + + + + + + + +
+
+
+
+
+
+ + + + + + +