text:
Method chaining is the practice of consecutively calling methods on the return of a previous method. This comes in primarily two flavors. The first isn't as common in Perl, though it is used extensively in
Mojolicious, is when a method has nothing useful to return, it can return itself. This allows for say chaining setter methods
$self->set_foo("FOO")->set_bar("baz"), or chaining related test methods
my $t = Test::Mojo->new;
->text_like('#id' => qr/foo/);
While this is useful, it's not my topic today. I'm going to talk about the more simple form, calling a method that returns an object, then calling a method on it, and so on.]]> This type of chaining can be seen when doing a complicated download/extraction/transform using
Mojo::DOM and others. In a StackOverflow question, a user is asking a question about parsing HTML to find URLs and making them absolute. You might notice that the OP doesn't use chaining in places they can. This is understandable, it is not a common paradigm in Perl. You can see that the OP transforms his results into a list and processes them using a for-loop.
Sure you might stop me here ask, what does this question of style have to do with the OP's question? Nothing, on the surface, but looking deeper, he is using the URI library to parse out the results of a call via
Mojo::UserAgent. He then notes that though he is aware of
Mojo::URL but he doesn't see the benefit of using it.
Part of the utility itself is the chaining nature! Most Mojo classes implement an api that is compatible with a chaining style. You can see in my response, this is how I might implement a script to get absolute urls for all the stylesheets on the http://mojolicio.us homepage:
use Mojo::Base -strict;
use Mojo::UserAgent;
my $url = 'http://mojolicio.us';
my $ua = Mojo::UserAgent->new->max_redirects(10);
my $tx = $ua->get($url);
my $base = $tx->req->url;
Notice that my script handles the possibility that there might be redirects before receiving the response and thus causing the absolute links to be incorrect. The chaining seen works as follows: from the
Transaction I get a
Response, from that a
find returns a
Mojo::Collection object which is a blessed array reference; this one contains multiple
DOM objects.
map creates a new
Collection with the result of its callback applied to each item.
each then runs a callback on each item (much like
map though its intent is different).
The body of the
map gets the item itself as
$_, the base url is used as a shortcut to create a new URL object, created from the
href attribute and then getting a new URL object, made absolute by the
$base url itself.
There is a calm beauty in that style, but yet it could be better. See the way that I must use the URL constructor (
$base->new(...)) almost as a circumfix operator? Wouldn't it be nice if that could be chained too? But
$_->{href} returns a string, not a
URL object. It would be possible to put logic into
Mojo::DOM to extract certain attributes and return
URL objects, but that it getting into the realm of being overly specific in an api that is very general. Tabling that distasteful option, there is still one avenue remaining.
We can simply add a
url method to the Perl string type itself! In this way we could simply call
$_->{href}->url->to_abs($base), thus preserving the chain. Can this be done? Indeed, it is easier than you might think!
This article serves as a (rather longwinded!) announcement of
Mojo::AutoBox and it's companion for one-liners
use Mojo::Base -strict;
use Mojo::UserAgent;
use Mojo::Autobox;
my $url = 'http://mojolicio.us';
my $ua = Mojo::UserAgent->new->max_redirects(10);
my $tx = $ua->get($url);
my $base = $tx->req->url;
With this module, the above modifications are possible. Other handy methods are added for parsing and emitting JSON via
Mojo::JSON, string operations via
Mojo::ByteStream, and functional transforms using
Mojo::Collection. The most clever real-world case I could think of was extracting HTML from a JSON document, parsing it to find the first
 tag, extracting it's
href attribute, parse it as a
URL, extract its host, then via
ByteStream say the result, if only so that I don't have to go back to the top and put say at the beginning, when in reality, it is the final thing to be done.
use Mojo::Base -strict;
use Mojo::Autobox;
# "site.com\n"
'{"html": ""}'
I can do a similar operation on the command line, extracting all the
 tags from the Mojo homepage, and printing the hosts line by line:
$ perl -MojoBox -E 'g("http://mojolicio.us")->dom->find("a")->each(sub{$_->{href}->url->host->b->say})'
Where the
g function is provided by the
ojo module, which
ojoBox loads for you, and the
b "string method" is an alias for
byte_stream method seen above.
I hope this has whetted your appetite for chaining method calls, and now that methods that return strings and array references no longer bind you, your chains are more freeing than ever!
Happy Perling!]]>
In this article I will show you some of those extras, like accessing your generated pages and even app itself direcly from the command line. I will also show how testing can be easy, powerful, expressive and yet still readably beautiful.]]> Revisiting the WebSocket Example
A while back I demonstrated a simple Mojolicious WebSocket app. This app simply:
I am going to use this app for two reasons, first it will demonstrate the candy I want to show off and second it gives me a chance to brush the app up for recent (and even not so recent) Mojolicious updates. So lets take a look:
The app only requires Mojolicious and a few DBI modules to run it, so with cpanm run
cpanm Mojolicious DBI DBD::SQLite DBIx::Connector
And then to run the app (called
websocket.pl) run
perl websocket.pl daemon
From there you can open a browser to either
localhost:3000 or
127.0.0.1:3000 to use the app yourself.
Since you last saw this app, I have tweaked just a few things:
json pseudo-op
json websocket event
render_to_string method rather than the now-removed
partial stash key
Of course when you are developing your application, you often run some simple tests by hand as you go. To do so you find yourself switching between your editor and your browser, refreshing and scrolling to find out if your change worked.
Mojolicious provides you with another option. From a command line, just as you would start your application, you can instead use Mojo::UserAgent to get a page straight from your app itself. For example you can run
perl websocket.pl get /
to see what your landing page HTML looks like.
You can then use Mojo::DOM to inspect, say, the
head tag to make sure it looks ok,
perl websocket.pl get / head
After you use the app to add a few records, you might want to see the state of the table
perl websocket.pl get / '#table'
or even examine a certain row (say, the second one)
perl websocket.pl get / '#table tr' 1
get command is great for inspecting the output of your app.
Sometimes, though, you really want deeper access to your app.
For example, if you want to see the current state of the database, you can of course drop to the db shell to do the query yourself, but is that the way the app sees the data? How often do people forget to update hand-rolled administration scripts when schemas change or servers get moved? What happens when someone tries to insert data by hand and forgets that new piece of necessary info?
eval command will startup a local instance of the app, much like the
get command does, but then rather than getting a page, it lets you run a command or even series of commands against the running app.
This is really useful for interacting with the app in the same way that it would behave on its own.
In the example app, I can see what data the
select helper returns, just by running
perl -MData::Dumper websocket.pl eval 'print Dumper app->select'
Then again, since you often want to print output or even dumped structures, we have shortcuts for that too.
-v to print the last statement result or
-V to dump that same result via
In that way the previous example can be
perl websocket.pl eval -V 'app->select'
Eval can be handy for initialization too. The app does have a line that will self-initialize, but you could manually initialize the database by doing
perl websocket.pl eval 'app->create_table'
And then maybe inject some data
perl websocket.pl eval 'app->insert( Joel => 30 )'
Or clear it out again
perl websocket.pl eval 'app->empty_table'
Beyond just the convenience of these commands, you actually know that it is using the same mechanisms that your app actually uses, not just the way that you remember your schema/configuration/workflow from the last time you looked at it.
And if it turns out that you really like the
eval command and find yourself administering your app with it, you can even codify those into your own commands.
As an example, I provide a setup command for my Mojolicious-based Galileo CMS.
The other piece of candy that has attracted the eyes of onlookers at my recent events is the wonderful testing provided by Test::Mojo library.
Just like the
get command, testing with Test::Mojo is done by instantiating the app and then making requests of that app via Mojo::UserAgent.
Also like the
get command, returned responses can be inspected using CSS selectors, this time wrapped into Test::More-friendly chainable methods.
When testing apps that use WebSockets, Test::Mojo comes through for you too! It can send and receive WebSocket messages so you aren't tied to using browser-driven testing for the interaction with the WebSocket.
Check out how wonderfully readable the tests for our example app can be!
So if Mojolicious' non-blocking capabilities are more power than you need, or you just aren't interested in them, you just might want to use it for the other nice features that come along for free!
Then again, if non-blocking does appeal to you, you might want to see the fully non-blocking websocket-capable Golf Scoreboard App I recently put together for a company outing. It was built off the base code from the example app above, and it shows off some of the non-blocking candy too :-)]]>
We all know the reputation that Perl has to the outside world, and sadly these results would tend to reinforce it. The person or persons who added these apps seems to have long since forgotten about them. At least the Mojolicious app was a port of one of the others and did not exemplify either the style or power of the framework. The others likely share those traits.
But all is not lost! TechEmpower has recently made it much easier to contribute, and I have fixed the deployment and toolchain problems. I have also updated the Mojolicious app. Would you like to improve the submission of your favorite framework or add your own? Read on!]]> The Repository
To start, clone the GitHub repository. The individual apps live in
/frameworks/Perl/. In that directory you will find the files that install module dependencies, start the application, configure the tests and of course the application itself.
Each of the Perl submissions does this slightly differently. I recommend choosing one and copying it. It is fairly self explanatory. In bash scripts
$IROOT and
$TROOT represent the paths to the checkout, the installation path (for things like the perl interpreter) and the test app (ie
/frameworks/Perl/mojolicious). In python scripts
args.iroot and
args.troot do the same. I have tried to fix these and similar deployment problems with the existing perl apps (though some of the
args paths are very new and still need to be used in
setup.py for several apps).
The test itself is several challenges, testing different functionality common across most webapps. The tests are defined here. Since tests have been added over time, not all are required; your app should configure which tests are to be run in the
benchmark_config file. The Mojolicious app now implements all of these tests, so you can use it as a guide.
Most of the apps do not implement all the tests. Some that do, do not do so correctly. As I mention in the next section, some of the outputs show fail, even if the net result is pass, so please look carefully. I'm not sure why this is, but for now its what we have.
Another recent addition is that the tests are available through Travis-CI. This means that you don't have to deploy the tests on your own hardware, which is (or at least was) a rather challenging task. The test will (or should) detect which app you are improving and skip the others (though that still takes a few seconds per app), which speeds up your testing dramatically. Note that if you are adding a new submission, you should add it to the .travis.yml file.
Also if you fork the repository, be sure to enable it in your own (free) travis account. In this way when you push a changeset, you don't have to wait for anyone else's changes to complete their tests. Test this way before sending a pull request and you will get much more accomplished much more quickly.
For those of you improving an existing app, you might want to start by looking at the results of a recent build; tests of the order of double digit hours are complete runs and should contain all the information for each app. Tests that are more like 45 minutes are likely only a single app, which will just say skip for all the others. Some tests appear to pass, but in the logs you can still see failures. I'm not sure why that is, but please take a look. For most apps the error is simply slightly malformed results.
Most of the Perl apps use Starman as an app server and nginx as a reverse proxy. For the Mojolicious app, I removed nginx and use simply hypnotoad (essentially Mojolicious' Starman). I have debated the choice in my own mind. I removed it because before Travis integration, it made the app much easier to deploy locally. Now that isn't strictly necessary, but I do wonder if without the benefit of caching (which is against the rules) if removing the middleman is the better choice; Starman and hypnotoad are pretty impressive on their own.
Probably the right solution is to declare two runs, one with and one without it (this can be done in the
benchmark_config file). I hope to do that if I have time.
For a start I hope to see apps that pass their declared tests and do us proud. I really hope to see good example apps, well written, easy to understand, and fast. This is a great way to show off Perl outside of the echo chamber!
Happy CPAN Day everyone and happy hacking!]]>
Mojolicious is known for fast development and clean APIs. Mojo was that child with lots of excitement and energy, doing new and cool things, providing new and cool functionality, and yes, changing its mind on occasion. But Mojo is growing up and settling down a little bit. It recently went to its first conference and professional training. And it's starting a family too!
Mojo is starting to feel more grown up, and grown-ups have responsibilities. To borrow one of Perl's catch phrases, this more mature Mojo knows that it is not good enough anymore to just make things possible, it's time to make them easy.]]> A lot of this came in the lead-up to the 5.0 release. Mojolicious major releases often include many breaking changes as new features are added, or old ones are removed. For 5.0 almost no breaking changes were needed. If we didn't need to break anything, were there smaller changes that could help users?
One big problem in non-blocking applications is finding leaks. Perl uses reference counting to clean up memory. Non-blocking code uses callbacks and closures, which make it very easy to create reference cycles, which prevent memory from being cleaned up.
Consider the following example.
This script simply makes two sequential non-blocking calls to http://mojolicio.us, each time printing the return status. Not a very useful application, but straightforward right?
What you may not be able to notice is that this script has a bug; it leaks memory.
Writing good delay sequences can require an amount of
weaken-foo that most people,
certainly me included, do not possess.
I have included Devel::Cycle to demonstrate
the problem.
To do so make a cpanfile with the line
requires 'Mojolicious', '== 4.94';
Install the wonderful Carton and run
carton install && carton exec perl cycle.pl
cycle.pl is the name of the example script.
When you do so, (installing and using a local copy of Mojolicious 4.94 to do so),
you will get this.
Using this output, you could find the cycles and weaken your code back to being leak-free. Or … you could upgrade Mojolicious, because as of 4.95 the delay system has been reworked to use inside-out storage, mitigating essentially all leak scenarios! In fact, it has been so useful, that we now recommend using Mojo::IOLoop::Delay for all non-blocking calls, even the simple ones, for the leak protection it provides.
When using a delay to manage non-blocking callbacks, you need to be in a running ioloop.
But when you write a library that provides some non-blocking api, do you know if
the consuming user will have an ioloop running?
Simply calling
$delay->wait after setting up a delay will actually start an ioloop
and stop it again when the delay completes.
As I discuss here
there is a problem though; starting a delay if it is already running blows up.
This means that to write portable code you need to write
$delay->wait unless $delay->ioloop->is_running,
and in practice most people didn't do that: some authors omitted the check, opening
the libraries to exception and others omitted the whole thing, requiring that the
user ensure there is a running loop.
As of Mojolicious 5.0,
$delay->wait will check the ioloop running state for you!
Now there is no reason not to write more portable code!
So far I have been talking about concepts which were applicable in non-web contexts, but making a web-app out of these tools can be even harder. In the following example app, I highlight a few simple mistakes.
Mojolicious has a nice feature that if a controller doesn't render anything, it will try to automatically render a template with the same name as the route. This almost always is a benefit, but sometimes when prototyping, you forget about some old template you made, and now when you try to render, since the delay takes some time, the controller will automatically render it and not wait.
This can be prevented by using
$c->render_later as I paranoidly do in all my
non-blocking controllers, just in case.
This is seen in the
/pause route.
If I comment out the
$c->render_later line, you don't get what you mean.
This is why the portability argument from above is important.
To prevent this bug, you really want
Try commenting the
wait lines and try the app using say
In normal blocking control flow, if your controller dies, it implicitly calls
$c->render_exception which renders a 500 page.
When using a delay, the loop catches the error and the connection eventually times
That is unless you set your
error handler to call
render_exception for you.
Do you always attach one?
Did I in the
/pause route?
Try commenting out the
->on(error => ...) line, and request the
/error page to
see what I mean.
This one isn't really a bug, but it looks like one.
The controller does not keep a strong reference to the current transaction, in
order to prevent leaks internally.
Without being careful, say by checking
if $c->tx before rendering, or by holding
a strong reference yourself (carefully!), you might get this in your error log:
Mojo::Reactor::Poll: Timer 714689c4838d3cb6662d790aa5a6f751 failed: Mojo::IOLoop::Delay: Can't call method "res" on an undefined value at /home/joel/Programs/Test/cycle/local/lib/perl5/Mojolicious/Controller.pm line 218.
Try removing the
if $c->tx, request the page in a browser and then in less than four seconds, stop the browser.
You should see the error in the server log.
Where did that come from? That's an error in your app, right?
Yes it's hard to do this correctly! So what should the common web-app author do about it? Do they really need to learn to do all of these things? Every time?
Just upgrade to Mojolicious 5.11!
That version adds the handy
delay helper.
With it, the same code can be simple this.
The new delay helper does all the things above:
render_later to prevent automatic rendering
wait for portability
This makes writing non-blocking web-apps almost as easy as writing blocking ones! A big shout out to fellow Mojolicious core developer Marcus Ramberg for getting that idea rolling at MojoConf!
This cycle has been especially satisfying for me and I believe for the other core developers as well. Making Mojolicious useful is about more than just making it powerful, its about making it easy too. We hope you enjoy the recent improvements!]]>
I will admit now, that had wondered if the community was large enough to support an international conference. I am quite happy to say that my fears were unfounded. We had attendees from all over the world, including the USA, France, Greece, Israel, the UK, Germany and others I'm forgetting I'm sure.
Glen Hinkle (tempire) gave a professional training, which was sold-out! When companies (and even a few individuals) are willing to pay real money for training, it goes a long way to prove that Mojolicious is the world-class framework that we know it is.
I was also impressed (as Glen was) at the talk given by Richard Elberger (riche) in which he touts his company and the success it is having replacing an enterprise Java application with a Mojolicious one. He shared the success of the transition, detailing how everyone from the developers to the development managers to the stakeholders have been impressed at the ease and power of Mojolicious and Perl! That is so encouraging to hear! He even had all those enterprisey words that I try my best to ignore at my $dayjob, but what a feeling to hear them spoken about Mojolicious!
From a personal standpoint, it was so much fun to meet all these wonderful people and programmers who I have interacted with online for so long. I love that I can hear Sebastian's laugh when he writes "haha" on IRC now! I can see him and Marcus and Salve and Vincent and Nils and Jan Henning and Nicolas and Glen and Alexander and Dotan and Richard and all the others, as they were, sitting around their laptops at the hackathon, rather than just names scrolling along a chat window.
So now the conference is over, but my excitement for Mojolicious is still peaking. I got so many ideas and so much motivation last week that I'm almost not sure where to put my attention first. I can't wait for the next MojoConf, it can't come soon enough!
Exited edition: The people at Mojoconf 2014! #mojoconf2014 #mojolicious #perl #programming #oslo pic.twitter.com/Kxrt4tyH6N— Björn Pettersson (@bjoernfan) May 25, 2014
See the presentation videos on the MojoConf YouTube channel!]]>
That said, I feel that I have taken Alien::Base as far as I can on my own.
Several others have offered good and useful suggestions and even patches which have unfortunately languished as I attempted to find time to consider their utility or when my knowledge of the situation was lacking. I have therefore decided to expand the circle to include a few of these contributors. I will remain on the team, where I will attempt to guide (not dictate) the project to continue along the path that I still envision for this work.
Perl5-Alien is a development organization devoted to the continued development of Alien::Base and the Perl 5 Alien ecosystem as a whole.
I hope that this will be a step in the right direction for the Alien ecosystem.
If you would like to submit your name for consideration to join the team, please contact me either on this post, via irc, or email. Of course everyone is welcome to contribute via pull requests or by writing your own Alien module for your favorite external library.]]>
First, it forced me to take on a problem I hadn't tried before — one I wouldn't probably have found interesting outside of a competition — and give it a fun motivation. By doing so I learned a lot.
Second, I got shell access to a remote computer. Yes this seems trivial, but it kinda feels like borrowing someone else's car for the weekend, ya know? The reason this was done was that it was impractical for everyone to download a huge volume for testing, but I think being handed the keys was more fun than why we needed them.
Third, in no particular order, was getting to interact with a new group of Perlers. I regularly meet with Chicago.pm members and I spend a fair amount of time on #mojo and #pdl, but suddenly I was talking with a whole new group of people. I even got to participate in interactive testing and the wrap-up meeting both via Google Hangouts (which worked relatively well for multiple participants, sharing video and screens).
Once again, congrats to all of you organizers and participants, it was a great time.
Now about my code, which is available here: https://github.com/jberger/DeDuperizer/blob/master/deduperizer.pl
I will admit that though I had meant to create a full CPAN-able dist, I fell short of time and only wrote a script. Nope not one test :-( Still real-life happens.
I happened to win the competition in several categories. I was relatively sure that I wouldn't win for speed, because I didn't have the experience that some of my "opponents" had, nor the time to experiment with different algorithms. In fact I actually hit on some of the secret-sauce, but didn't organize it well (my monte-carlo method cannot be used with the hashing, its either-or).
Since I saw that limitation, I decided to shoot for lowest memory use. I did win that, and at the time I chalked it up to my use of File::Map for file access. At the time someone mentioned that it was likely that the OS was going to buffer the read even though I was using mapping, and now that I think about the memory that I won by, I would have expected to win by more if the memory mapped file access was the boon I had hoped. This left me with only one explaination: compile-time optimizations.
As you can see here, I parse the command line options in a
BEGIN block and build constants out of the results. Then later when I use those constants, the compiler can optimize away any "unreachable" code, any code masked by a false constant. This meant that my code did not have to build and load any code that wasn't needed for a given run.
A simple example is this code here:
perl -MO=Deparse -e 'use constant TEST => 1; print TEST ? "True" : "False"'
-MO=Deparse tells the compiler not to run the code, but to print out the code as it sees it AFTER compilation. The result reflects the state of the
TEST constant.
use constant ('TEST', 1);
print 'True';
-e syntax OK
The last line is just the diagnostic check. As you can see, the compiler optimized away the conditional and thus the program was (minutely) smaller and would not need to check that execution branch in later operation.
I suspect that these optimizations were the real reason I came in with the smallest memory footprint. Still, I liked the idea of File::Map, so check it out if you haven't already; it's cool stuff.
Cheers, and I'm looking forward to the next one!]]>
In each, I showed a blocking example, then a non-blocking example. I then gave the usual warning that you had to use a Mojolicious server for the nonblocking version. While its true that you need a Mojolicious server to get the benefits of the nonblocking architecture, in this post I will show how with a little care in construction, you can build your application so that it will run correctly on any supported server and the nonblocking benefits will be evident where possible.]]> For this example, I was inspired by a recent blog post by Charlie Harvey. In it he describes a web service, using Perl and CGI, he created which turns your twitter stream into an atom feed. His service got more attention than expected so the post continues by describing how he rewrote the service using FCGI to improve throughput (amongst other optimizations).
Naturally my thoughts went to Mojolicious. The non-blocking user agent could easily be leveraged to get the data, and the non-blocking server would support a much higher throughput, as my previous examples demonstrate. So, yesterday I sat down and ported the code to Mojolcious. This made for a good real-world example, so I decided to make it part of the series.
As usual when porting a piece of code to Mojo, I first ported more-or-less directly, in a standard blocking style. I moved some of the logic to helpers, I translated the xpath to css selectors, the xml template is now externalized, but pratically a straight port.
The import part of the code is this:
my $tx = $self->ua->get($url);
unless ($tx->success) {
return $self->render_exception(scalar $tx->error);
my $tweets = $tx->res->dom('li.js-stream-item .tweet .content');
my $items = $tweets->map(sub{$self->parse_tweet($_)});
$self->render( 'atom', format => 'rss', user => $user, items => $items );
The logic is easy enough to follow
@$items) using a helper
From there it is simple enough arrange for the rendering to be done in the callback for the user-agent request, like so:
my $tx = $self->ua->get($url, sub {
my ($ua, $tx) = @_;
unless ($tx->success) {
return $self->render_exception(scalar $tx->error);
my $tweets = $tx->res->dom('li.js-stream-item .tweet .content');
my $items = $tweets->map(sub{$self->parse_tweet($_)});
$self->render( 'atom', format => 'rss', user => $user, items => $items );
As I have shown before, it is important to call
render_later to prevent automatic rendering.
From there it is easy to see that most of the logic is simply moved into the callback.
When I pushed these scripts to my repo fork on github, the biggest problem I had was describing to the user, presumably one who did not have experience with Mojolicious, how to run the different examples. The non-blocking script requires the Mojolicious servers, the blocking script can run under others as well. Once I had it written I saw that the biggest issue here was deployment. But that doesn't have to be.
To restate the underlying problem: a non-blocking script, if run without an event loop, will simply start the first request and then never call the callback. If you know that the script will be run on a server without an appropriate event loop, the same code will work if you simply start such a loop after the request is made, then stop it again when done.
While this is indeed how we will solve the portability issue, it presents another problem. When this code would be run on a server with an event loop, you might get a problem when telling the loop to start (again), and you certainly will run into problems when you then tell it to stop.
We need some way to tell the code to start a loop if necessary, and if it was necessary, then stop it again when done. Challenge accepted!
In fact Mojo::IOLoop::Delay (seen previously in part 2 to manage parallel requests) has a mechanism to do just what we need, as seen here
my $delay = Mojo::IOLoop->delay(
sub {
my $delay = shift;
$self->ua->get($url, $delay->begin);
sub {
my ($delay, $tx) = @_;
return $self->render_exception(scalar $tx->error)
unless $tx->success;
my $tweets = $tx->res->dom('li.js-stream-item .tweet .content');
my $items = $tweets->map(sub{$self->parse_tweet($_)});
$self->render( 'atom', format => 'rss', user => $user, items => $items );
$delay->wait unless $delay->ioloop->is_running;
The delay constructor, if passed a list of subrefs, will use these as so-called "steps", each of which will be performed sequentially.
Any number of parallel non-blocking tasks may be started (using
$delay->begin) and only when all are finished will the next step be started.
The step itself will not block the main loop (assuming you don't block in the step).
Interestingly, as described in part 2, the call to the
begin method returns a special callback, one which will take the arguments passed to it and pass them forward to the next step.
In this way the second step gets the result of the
get request, namely the transaction object
From there the rendering proceeds as before.
The secret sauce is the last line,
$delay->wait unless $delay->ioloop->is_running;
(Remember that the steps are now queued up to be run using the event loop, but this line occurs before those steps begin.)
The conditional checks to see if the loop is already running (the case when using a Mojolicious server) and if it is, nothing special is done.
If the loop is not running, we are calling
Under the hood the
wait method does two things:
This is exactly the kind of logic we needed. When the steps are all completed, and thus the page is rendered, we will only stop the the loop if we had to start it.
While I didn't really use the power of steps to do multiple sequential non-blocking requests, and I hope to in a future post, you can get an idea of the process already. If more subrefs were used to create the steps, those would all be run, in order, when ready, before completing. Maybe you want to find data from several web services then process the data (map-reduce style), then insert it into a database, then render a confirmation message. You want to be sure to get and process all of the data before inserting it into the database, and you want to be sure it inserted before renedering. Using the steps concept, doing these sequential non-blocking steps is easier than ever! But like I said more about that in a future example.
Admittedly I haven't done any benchmarks on Charlie's code vs my nonblocking version. This is do mostly to the fact that I don't want to set up a CGI server (ever again!). I'm going to trust the metrics that I have laid out before on the benefits of nonblocking vs blocking and call it a day. What I am happy about is that Charlie can still deploy under CGI (with a couple path tweaks since I moved some files), or via PSGI/Plack or via a Mojolicious nonblocking server all using the same portable application script.
This post is the third in an on-going series, beginning with part 1]]>
I have been a Perl programmer for several years, but early this summer took a job writing Python. I'm glad I've learned it, there are several things that I would love to see added to Perl, most notably a
set type and a proper
in operator (
~~ got close). That said I will absolutely not concede that Python is easier to read than Perl, as all too often is taken as the axiom that many believe it is.
And I have examples.]]> Let me get out a few nits first. My biggest pet peeve, though it has never really bit me yet, is that there are two syntactic uses of a trailing comma! Meaning times when a trailing comma actually changes the meaning of the statement. When printing, a trailing comma prevents a newline from being printed (ick!) and worse when constructing a tuple (immutable list object, created by round parens), and specifically one with only one item, don't forget that trailing comma, or the parens are precedence delimiters and not a tuple constructor (yuck!). This just hurts me because I think that languages that don't allow a trailing comma are painful, and so I appreciate when a language does allow it. That said, it should never mean anything, its just to help keep your diffs nice!
Also, why rearrange the ternary from:
test ? 'value if true' : 'value if false'
'value if true' if test else 'value if false'
Yes its just style, but my beef is that it's no prettier, its just different for the sake of being different. Oh and no
++ operator. Why use one statement when you could have two (maybe three if there is a conditional involved (try writing a python version of:
say $i++ if $test)). Enough said.
On to the bad things. Lacking braces, code blocks are denoted by indentation, as you are likely aware. When writing lots of real world code though, you have to nest the blocks. Say class definition, with a method definition, which has an if statement and closure. Now say you have several of these, and maybe the outer section goes off the top of your screen. Can you tell, just by looking, how deeply indented you are? Are you sure? Be careful too, because variables aren't block scoped nor declared. Did that indentation level just torpedo your code? Well there is no compile-time checking, so let's hope for no runtime errors.
Let's pause for a minute and ponder the syntactic whitespace. Why do we like it? It seems to be cleaner without all those ugly braces, but, then again, you still need that
: and probably a newline, that's the same number of characters. And please, oh please, do not intermingle your whitespace types. The interpreter can't handle it, and you can't see it. Happy debugging. Did your editor do that? Did your collaborator with the funny IDE? Now back to your regularly scheduled rant.
Then there are … "List Comprehensions". Rather than some sane ordering of statements to build a list, like properly flowing
greps in Perl you might get something like this:
values = [ item.value for item in list if item.value > 4 and item.name != 'bob']
The iterator is in the middle, the map is in the front, the grep(s) are in the back … its not easy to find anything, and worse to try to lay out clearly. I would write the same thing in Perl as:
my @values =
map { $_->value }
grep { $_->value > 4 && $_->name ne 'bob' }
See how being able (indeed encouraged) to employ better line usage, and braces, helps here; your command is now a flow of distinct transforms, rather than jumbled statements. But now, what if we need, (gasp!), nested list comprehensions!
values = [ item.value for bucket in buckets for item in bucket ]
Why is the second iterator before the first? And please don't ask me where the conditionals for the filters go for each level in there! If you can figure that out, then you are better than I. Also where does exception handling, or special casing go? Outside in, generators of course. (Ever wonder why Python loves generators and they seem cool, but somehow you never need them in Perl? It's at least partially because we don't use this construct.).
The odd thing is, though, for a language that prides itself on clarity, you would think that the use of this horrible construct would be discouraged; yet I typically see it touted as a strength! Really?! This isn't something a nice
grep (and maybe even
sort to be cute) couldn't top nicely?
Finally my number one beef. Almost all the previous combine to form this cluster. Methods are just attributes that you can call. So please don't scroll too far, forget something, or miss a nesting level, or confuse a name, and assign to an attribute which is already a method. There goes your method. No warning, no help, no checking, no sigils. You just broke the system. That nice, maintainable, readable system.
Sure it looks pretty. But did you see that error get made, Mr. Maintainer. I bet you didn't.
Thanks, but I'll stick to my beautiful language Perl. It takes a little longer to appreciate, I'll grant you. But really take another look.]]>
It also has a few bugfixes that the nopaste author either hasn't tripped on, or had the time to fix (mostly in the Clipboard interaction on Linux) (sartak if you want to ping me I'd be happy to work with you on it). It has a slightly different list of services, including the very fun MathB.in but lacking Gist for now since the OAuth is something I don't want to deal with yet. Any other services that people are interested in may be contributed via a PR or even a decent api spec.
my $method = sub { ... };
Is there a name for this pattern? If not I propose to call the "method" an "ephemeral method". Does this work for everyone?
Note that you really can't call it a lexical method for several reasons.]]>
No! There's a better way! The next version of Mojolicious includes one tiny improvement that opens the world of testing as far as your imagination can take you. It just requires a little cleverness.]]> For example, let's say I have some route that will return some JSON response and I would like to see if a certain value inside that data structure matches some regex. Test::Mojo and Mojo::JSON have JSON pointers make the dive-in easy, see for example
json_is. Then there are test methods such as
text_like, but there is no such
json_like. There can never be every combination I suppose. So lets make our own!
Our first thought might be to monkey patch a
json_like into the
Test::Mojo namespace, but that is fragile! What if
json_like is added, perhaps with different semantics? Anyway another module's namespace is sacred, let's not touch it. For now let's use a clever dispatch hack, the same one used by Safe::Isa, that is to store a "method" in a scalar. In the following example (or linked) I do just that:
The method accepts the invocant as usual, then a JSON pointer, a regex and an optional description. The pointer is used to get the JSON data at that particular location from the response. Notice that I increase the
$Test::Builder::Level so that if the test fails, it reports the correct line number etc.
Finally the test is run and the response is stored in the new
success attribute. All Mojolicious setters return the invocant so the return value from
$json_like is the test object, which is how the chaining pattern works. The fact that the result is stored in the
success attribute allows the
or method to work correctly (which allows additional processing after a test fails in the way that
or diag(...) is commonly used for
You can see that the
$json_like variable is used in place of a bareword method name, the dispatch works as it should, and in this case the test passes. Now that "method" can be used throughout the test script. And no monkey patching was needed.
Another candidate for a fun hack (left as an exercise to the reader) is wrapping the functionality of Test::Deep to do even more in-depth data comparison.
A word of caution however: the
success attribute has not been released yet! It is expected in the next release if all goes well. Previously the same task was accomplished via private data. This change is being made to facilitate just this kind of hack! I'll try to remember to come back and remove these warnings when the change is released.
(P.S. this was my 100th blogs.perl.org post! Yipee!)]]>
function() rather than
&function() or
&function. I happened to see it right before heading to bed, but I wanted to respond, so who knows if this is a good example or not. Anyway here goes, look at this code (seen below if you have javascript), it prints 6 lines, do you know what they will be?
If you didn't that's ok, this is a bit of a toughie, and yes I threw in a gratuitous
$" for fun (which is the string used to join a quoted array). For those of you without a terminal handy, the output is:
hello world and good bye!
hello world and good bye!
hello world
hello world
good bye!
In my example
mysub enforces scalar context onto its argument. Now prototypes should not be used lightly, and I rarely recommend them, but when they are used, it is often for a good reason. In this case, the prototyped function is probably not what an author writing that function would have meant. (S)he probably meant, 'this function only takes one argument', and it kinda worked, but it didn't.
Anyway, the first lesson is that calling a function with
& works, but it defeats prototypes. In the example the author was probably wrong to use prototypes, but in most cases, as I said, when a prototype is used, it is for a good reason, and defeating them should come with even MORE reason.
I have actually almost used that once, I wanted to make a clever wrapper of List::Util::reduce and to do so I would have had to defeated its prototype. The endeavor failed and so that code did not see the light of day, but it got close. Other than that case, I have never needed to defeat a prototype, and so I have never used
&function() in anger.
&function is more clever and is used in some more common wrappings. It means call the
function() but with my current
@_. This isn't as useful as its 'twin'
goto &function which mean, 'stop this function and instead start doing
function() with my current @_ instead, and remove the current function call from the stack trace'. This is actually useful for function wrapping, say like in an
AUTOLOAD function. Again, though, you do this when you mean to, not all the time. I think I have perhaps used
goto &function a half-dozen times in anger.
The take-away message here is, in Perl 5 you should almost always be using
function() or
function (though the bareword is confusing in some cases, especially if you forget strict and warnings!). You should almost never need (and therefore not want to accidentally incur the potential side-effects) of using
&. They won't happen often, but when you get into the habit of using
& and you do accidentally defeat a useful prototype, or unintentionally pass forward your
@_, it will make for a terrible debugging session.
Anyway, as always, happy Perling!
P.S. I am happy to see that people still find Learn to Spot a Good Tutorial useful, and it reminds me that it will soon need another version and year bump!
P.P.S, the site that hosts that article also contains a list of good tutorials, and some "not so good ones" too, so you can use/recommend them.
The application I will be demonstrating can be seen in its entirety here, though I'm going to build it up slowly here. The purpose of the application will be to scrape the titles from a list of websites. A modest task to be sure, but one that can be illustrative of much more complex tasks.
#!/usr/bin/env perl
use Mojolicious::Lite;
my @urls = qw/mojolicio.us mojocasts.com/;
helper 'render_dumper' => sub {
my $self = shift;
$self->render( text => $self->dumper( \@_ ) );
# The routes will go here!
Of course we need to import Mojolicious::Lite,
which imports
utf8 and all
v5.10 features.
Every application has a default Mojo::UserAgent stashed away in the
ua helper.
We will use it later, so the following line I tell it to allow up to 10 redirects per request.
Then I define the list of
@urls that we will be scraping.
In the final example I will encourage you to add to that list, but for now, we will start here.
More interesting is the rendering helper I then build.
This application does't need a pretty web interface, so I am just going to have it render all the arguments as dumped via the built-in
Data::Dumper helper.
(If you would prefer, you may replace the calls to
render_dumper with
$self->render( json => [...] ) to render the items with the built-in Mojo::JSON renderer as easily.)
We will see the routes later, so I'll skip those. Then finally we start the app. We won't need any templates for this example.
If you save the file as
titles.pl, you can then run it as
perl titles.pl get [page]
You can also start it as a persistent app using the usual
perl titles.pl daemon
or while developing you might want
morbo titles.pl
which will automatically reload the app if you change the script.
Much as I showed in the previous post, we can make a simple route which makes a request of a high-latency service, here another website. Since we don't want to block the server while we wait for the response, we employ the non-blocking style that Mojolicious makes available.
any '/one' => sub {
my $self = shift;
$self->ua->get($urls[0] => sub {
my ($ua, $tx) = @_;
Here we can see that we use the useragent to request an external web resource.
We pass a callback to
get so that the server will move on to handle other requests for other clients while it waits on this response.
Once the response comes back from that server, the callback is invoked and the page is rendered and served to the client.
The careful observer will see that I employ Mojo::DOM to parse the response and extract the title text.
If I had wanted to do something even more clever, I could use the CSS3 selectors provided by Mojo::DOM::CSS, and its handy integration with the blessed arrayref container class Mojo::Collection to really dig through and transform the results. Frequent users of jQuery will feel at home using these classes. For now however, extracting titles will suffice.
Try it out by running
perl titles.pl get /one
One request was simple enough, but what would two such requests look like?
any '/two' => sub {
my $self = shift;
my @titles;
$self->ua->get($urls[0] => sub {
my ($ua, $tx) = @_;
push @titles, $tx->res->dom->at('title')->text;
$self->ua->get($urls[1] => sub {
my ($ua, $tx) = @_;
push @titles, $tx->res->dom->at('title')->text;
Yikes! I mean it runs, and it works, but … ick.
Three problems are immediately evident when I look at this code.
First, it's starting to suffer from arrow code or callback hell problems.
Second, it doesn't easily generalize from 2 items to
n items.
Sure you could write some recursive callback which might "help", but that still doesn't fix the biggest problem.
Although this code doesn't block the server, within the scope of rendering this request, each request does block the next one! This is easy to see, the callback is only invoked once the response is received. Since the next request is contained in the callback for the previous, you cannot kick off all the requests simultaneously and then collect the results when the each finish.
But this would be a bad tutorial if I left it there :-)
As I hinted in the introduction, the solution is contained in the remarkably useful module Mojo::IOLoop::Delay. An instance of this class can be used to manage the flow of both parallel and sequential non-blocking steps, and then take some action on completion. When written using a delay object, the above example looks like this:
any '/all' => sub {
my $self = shift;
my $delay = Mojo::IOLoop->delay;
$delay->on(finish => sub{
my $delay = shift;
my @titles = map { $_->res->dom->at('title')->text } @_;
$self->ua->get( $_ => $delay->begin ) for @urls;
The flow of this route handler is very different from the previous on first glance, so I will walk you through it.
As with all of the non-blocking handlers, we first call
render_later to prevent automatic rendering.
We then create a delay object and attach a callback to be used as the "on finish" handler.
The callback to the handler has the delay itself as the first argument, and possibly more arguments; we'll talk more about these in a minute.
As you can see,
@_ contains the transaction objects from before (
$tx) and we then extract the titles and render the result.
But how did they get there?
Remember this is the "on finish" handler, before we worry about how these arguments work, let's look at the meat of the process.
The bulk of the magic happens with the
begin method on the delay object.
This method does two things.
First, it increments an internal counter, which keeps track of the number of parallel tasks to wait on before advancing invoking the finish handler (or moving on to the next step, shoot, I shouldn't mention that yet :-) ).
Second, it returns a callback suitable to be used as the callback for some non-blocking call.
(Of course you may wrap that callback in your own subroutine reference if you want to do some other processing, but that is for another post).
That callback itself does two things when invoked.
First, it decrements that internal counter.
Second, it stores the arguments passed to it (though by default it strips the first argument since you usually don't need the callback invocant).
When the finish handler (or the next step) is called, what it gets is the list of these arguments.
The list is built up of all the arguments to the first
begin, then all the arguments to the second, etc, no matter in which order the processes complete.
Now that you know this, you can see how the finish handler works.
When we kick off the
ua->get calls, we know that the resulting transations will be passed to the finish handler via the
begin callbacks.
Actually now that you look at it, you can see that it doesn't matter how many
@urls you have, this will work exactly as expected for any number of parallel calls.
Try adding a few more sites and run:
perl titles.pl get /all
to see the results.
As I did last time, I do want to show a comparison of some metrics. I hope I have convinced you that writing non-blocking applications will help serve many clients, so this metric is only about the speed of serving one client who needs these two high-latency data sources to respond.
When I run
time perl titles.pl get /two
I see the expected results, and the amount of time taken
real 0m1.121s
user 0m0.222s
sys 0m0.012s
Versus running
time perl titles.pl get /all
which requests the same information, but only takes
real 0m0.670s
user 0m0.202s
sys 0m0.019s
The explanation for this time difference is easy to understand. From the data it appears that each website takes about 0.5-0.6s to respond. By performing these requests in parallel, the time it takes to respond to the client is only limited by the slowest response. Rather if the server makes these requests sequentially, the times add up.
If you can now serve more clients simultaneously by writing the application in a non-blocking style and their requests are each coming back faster because you manage the high-latency requests that your response depends on, you are making real progress in my book :-)
The example I presented revolved around web scraping, but in reality this technique will work for any high-latency dependencies in your rendering chain. This might include database reads and writes, file system reads and writes, or other long-running processes, though you need to have a non-blocking mechanism for making these requests.
In the last example I used Mango to do non-blocking database interaction. In this example I used Mojolicious built-in non-blocking user agent for making web requests. In a future post in this series I will present ideas for how to do blocking processes in a non-blocking framework.
I hope I have shown how you can use delays to make parallel non-blocking calls. For now, I leave it as an exercise to the reader to use multiple steps to perform sequential non-blocking calls, though I plan this as a topic of a future post as well.
In the meantime, happy Perling!
If you happen to be in Brazil in a few weeks for YAPC::Brazil I will be speaking about some of the design patterns I have used in my scientific modeling. However, I will also be happy to talk with anyone about Mojolicious or any other the other projects that I am involved in. Hope to see you there!
This post is the second in an on-going series, beginning with part 1 and continued in part 3]]>


text:
Discovery Learning Research Center Moves In
December 4, 2009
On Monday, Nov. 9 the staff of the Discovery Learning Research Center moved into its new facilities at: 207 South Martin Jischke Drive. Although not all of the building was ready for occupants, the second floor DLRC Suite was ready to go. As with any move and any new building, there were small glitches, but all in all the move was smooth. Other DLRC project groups and other Discovery Park programs will continue to move in during the coming months. The DLRC grand opening ceremonies will take place in April. Keep watch on the DLRC website for more details about the grand opening activities in the coming months.
Contact Details
- Wilella Burgess
- firstname.lastname@example.com
- 765-494-0668
Discover Park Poster Session and Reception
March 26, 2015
Discovery Park Student Poster Session and Reception. Highlighting undergraduates in DP-affiliated interdisciplinary internships. Organizer: Discovery Learning Research Center. 4:30-6 p.m. Hall for Discovery and Learning Research, Atrium (first floor). Remarks at 5:30 p.m. by Stephen Beaudoin, interim associate vice provost for academic affairs and professor of chemical engineering. Free but RSVP required by April 2; URL: www.purdue.edu/discoverypark/learningcenter/studentevent.phpRead Full Story

subset: commoncrawl


text:
Tel: (419)885-5334
Apostolic Christian Academy is Christ-centered and Biblically-based.
Kindergarten students learn to read using the phonics method.
Academic emphasis is on the basics of reading, writing and arithmetic.
Social emphasis is on courtesy, respect, obedience, kindness, sharing, order, and good work and play habits.
Curriculum: A Beka Book, ACE, Bob Jones and Switched On Schoolhouse.
Small class sizes and individualization are key components to our academic program.
Average achievement is one year ahead of the national norm on computer-scored, standardized national achievement tests.
Students have been accepted and have excelled at state universities, private colleges, and Bible colleges, earning scholarships and making the Dean's List.
School Overview
|School Membership(s)School Assoc.
|Accelerated Christian Education (ACE) or (School of Tomorrow)
Association of Christian Teachers and Schools (ACTS)
|Religious Affiliation
|Grades Offered
|Grades Kindergarten - 12
|Learning Difference Programs
|Learning Programs Supported
|Mild Learning Differences
|Year Founded
Student Body
|Total Students
|106 students
|Student Body Type
|% Students of Color
State avg.: 22%
|Students by Grade
Academics and Faculty
|Total Classroom Teachers
|8 teachers
|Student : Teacher Ratio
National avg.: 13:1
|% Faculty w/Advanced Degree
|Average Class Size
|15 students
Finances and Admission
|Admission Deadline
|None / Rolling
|Tuition Notes
|Costs vary between $3360 to $4320, but scholarships and discounts are available for those who qualify.
|% on Financial Aid
|Acceptance Rate
National avg.: 85%
|Admissions Director
|Mrs. Debbie Suter
|Total Sports Offered
|3 sports
|Basketball, Flag Football, VolleyballBasketball, Flag Football,
|Total ExtracurricularsTotal Extra-curric.
|10 extracurriculars
|Yearbook, Student Council, Drama, Fundraising, Musical Sign Language Group, Piano Lessons, Field Trips, Bible Quiz Team, Youth Week, Awards Service Yearbook, Drama, Fundraising, Piano Lessons, Field Trips, Youth Week, Student Council,
Musical Sign Language Group,
Bible Quiz Team,
Awards Service,
Nearby Schools:
All Schools | High Schools | Elementary Schools | Preschools | Public Schools
Show me:
- School Location Miles Students Grades
ToledoToledo Junior Academy
4909 W Sylvania Avenue
Toledo, OH 43623
(419)841-0082(Seventh-Day Adventist)0.7 mi | 31 students | Gr. K-8
SylvaniaDavid S Stone Hebrew Academy
6465 Sylvania Ave
Sylvania, OH 43560
(419)724-0385(Jewish)1.3 mi | 50 students | Gr. K-6
ToledoHolland-Sylvania KinderCare
2812 North Holland Sylvania Road
Toledo, OH 43615
(419)531-6450Daycare / Preschool1.4 mi | n/a students | Gr. NS-PK
ToledoEmmanuel Christian School
4607 W Laskey Road
Toledo, OH 43623
(419)885-3558(Baptist)1.5 mi | 347 students | Gr. K-12
SylvaniaToledo Islamic Academy
5225 Alexis Rd
Sylvania, OH 43560
(419)882-3339(Islamic)1.8 mi | 165 students | Gr. PK-12
School Reviews
Area Statistics
Recent Articles
Updated March 26, 2015
Small private schools often feel that they cannot afford to market their schools. Facebook is free. Here is how to use it effectively.
What are the attributes which make 21st century military schools so special? We find out in this article.
Getting into a private school is a time-consuming process. We look at the various deadlines involved.


text:
Forum - View topicCharacters you loathe.
Goto page Next
|View previous topic :: View next topic
Posts: 247
I often find there's a character who just gets my panties in a twist whenever they show up and figured others might like a place to come and vent about these awful fictional people you'd love to call up and bitch out but can't because they're not real. Come here to vent your illogical but very real frustration!
My hatred today is for Kaifun from SDF Macross, who sucks so much. SO much. He's the biggest priggishly idealistic naive reject I've ever come across. He can be found disgorging pacifist notions like how we should just stop fighting the race of giants who are attacking us unprovoked, or how we should have peace so long as the military has nothing to do with it because my name's Kaifun and the military is unequivocally bad. Intransigent. Puerile. Naive. Incestuous. Douche. These words describe this awful, awful character.
So vent, vent away. Maybe you'll find a kindred spirit or maybe someone who enlightens you as to why a character doesn't suck quite as much as you think. If a reasonably similar topic's already been posted please direct me there.
|Back to top
Posts: 5
One character really stands out as my least favorite: Sasuke Uchiha from the Naruto franchise. I haven't actually seen all of Shippuden or even the original. I've only seen the first half of both series. Maybe I haven't seen enough to make this judgement, but it seems he pretty much stays the same throughout the series.
|Back to top
Enjoying the time of EVE
Posts: 6999
Location: Minnesota, USA
|My most loathed anime character is probably Makoto Itou from School Days because he's a spoiler[cheating] scumbag who deserved everything he got spoiler[which was death. ]
|Back to top
Posts: 546
Is it just me or have the recent threads started going real negative?
Anyway, to answer your question, I don't have a character I loathe (actually I might have, I just can't remember at the moment), but there are characters I deeply dislike. Any useless male lead of a harem series - by useless I mean dependent on the women plus cannot pick out one of the women surrounding him - I definitely dislike. Case in point, Rosario + Vampire's Aono Tsukune.
|Back to top
Posts: 2421
Characters I absolutely despise
*Chibi-Usa from Sailormoon. Not only is she useless, but she's f**king annoying. I absolutely loathe precocious little brats like this who think they're so smart and mature....then they can't do shit to back it up. Lol, you suck.
*Yuuka from Elfen Lied. Complete Bitch. Wish Lucy had killed her. She was the ugliest one too.
*Sakuya from Tenchi in Tokyo. Bad fanfiction-originated self-insert Mary-Sue of epic proportions. Just die already.
There are male characters I hate too....but they're just manga ones, either because their anime counterparts weren't as bad or there isn't an anime of their series.
|Back to top
Collector Extraordinaire
Posts: 2658
Location: New York state.
Definitely a good opportunity to vent on some characters:
-Makoto Itou (School Days)- Someone already vented reasons for why I would hate this guy. The worst male lead for a romance anime I've come across.
-Dan'ichiro Sanka (Sankarea)- A recent character I detest. His disturbing and twisted mentality and treatment of Rea combined with spoiler[not getting any kind of repercussions for his actions by Rea and Chihiro] have me very irritated with the guy.
-Tsukasa Doumyoji (Hana Yori Dango)- Worst choice for a potential love interest I've come across in an anime. I never really understood what Tsukushi seen in the guy considering spoiler[he nearly raped her at one point from being jealous and attempted to get her expelled from the school because of Tsukushi falling for Rui, who isn't much better as a possible choice for love.]
-Saori Shikijou (Mahoromatic)- Biggest waste of a character in an anime I've come across. She contributed nothing in the series except for being a sleazebag trying to molest Suguru, freeloading at his house and butting heads with Mahoro.
|Back to top
Generic #757858
Posts: 1354
Albert from Gankutsuou. He nearly ruined the series for me. Incredibly stupid, naive, annoying and an absolutely horrible judge of character. He ignores all of his friends' advice and the suspicious goingons and instead just throws hissyfits because his massive mancrush on the Count completely blinds him to the obvious. It was so sweet that I nearly cheered when spoiler[the Count finally revealed that he'd been playing Albert all along and shot him in cold blood... except that he somehow managed to survive and came back to ruin the ending with more of his naive idealistic crap.] AAARGH!
Shu from Now and Then, Here and There. Another stupid, naive kid. What makes Shu incredibly irritating is that he has the gall to be constantly preaching his crap, even though the ONLY reason he manages to avoid all the horrible things that happen to other characters is his ludicrous amounts of sheer dumb luck.
|Back to top
Posts: 1587
Location: body in Ohio, heart in Sydney
My vote for most loathsome character (if you can call her a character) would go to Fuzzy from the Nadia movie.
I have nothing against moe in principle, but Fuzzy represents a complete betrayal of everything essential to the original series. For a series whose theme song contains the lyric "I don't like timid people" and which stars the inspiring character of Nadia to end up in a film starring a spoiler[dead robot girl] is disappointing.
And Jean falling in love with her? Come on.
|Back to top
Posts: 7322
Location: Earth
Having finished watching Aquarion Evol, recently, I'd say that Mikage.
Also, School Day's Mikoto, Shugo Chara's Tadase (for some reason, I just can't seem to stand his face) or his personality, Steins; Gate's Kurisu Makise's Father, Ali Al-Saachez from Gundam 00, and Dung Beetle "Koemushi" from Bokurano from the top of my head.
|Back to top
Posts: 2421
I'm not a fan either. Though he doesn't fill me with rage like the other characters I mentioned do.
|Back to top
Posts: 579
Kagami from Lucky Star, she annoys the crap out of me, I hate the way she treats Konata, I know she's a Tsundere but can't she be nicer to her friends. Also I hate Ash Ketchum in the Unova region, he acts like a total idiot loosing battles with a Pikachu that's supposed to be like a level trillion at this point and the fact that he doesn't evolve his Pokemon, also the fact that he claims that all his Pokemon are his "Buddies" when he doesn't even use half of them, also the fact he doesn't keep promises, he hasn't seen Pidgeoto since he got the GS ball and well, ten years later he still hasn't seen it. I also hate Arimi from Marmalade boy, every time I see her i just want to smack her. I also hate Patty from Lucky Star, her voice is annoying as heck and I just want to smack her, she's the perfect definition of what a weeaboo is.
Last edited by yotsubafanfan on Wed Jul 11, 2012 2:01 pm; edited 1 time in total
|Back to top
Posts: 2421
Holy crap, I love you. I thought I was the only one who thought she was a stuck-up bitch! But yeah....she acts like she's so much better than the other three and I hate how negative her attitude is towards anime and the like.
So many people worship her....and that doesn't help. She's a VERY overrated character.
|Back to top
Spastic Minnow
Bargain Hunter
Posts: 3141
Location: Central Florida
|I tend to loathe loathsome characters. Not because they are mean ol bad guys without a conscious, but because they are consistently the worst written characters in anime. Want a loathsome character? Have him be a meanie... kick puppies, take candy from babies, poison the water, laugh maniacally at the misfortune of others, wax philosophical at the awesomeness of evil... because someone has to be. through all of anime I think I've only ever seen one truly loathsome character that I think was written very well, Takumi from NANA. The Marquis from Gosick, about 90% of the characters in Deadman Wonderland, the villainess in Shangri-La.... sometimes some token explanation will be given for being utter bastards- but the standard practice is lazy writing.
|Back to top
Posts: 1413
I also have to say that I could not get very far into The Familiar of Zero because of Louise. I thought the story had a fun idea there, but she went beyond tsundere for me. She was so nasty, mean and cruel that I couldn't watch anymore. Maybe her attitude and actions were supposed to be funny in a sadistic way, but it was a giant turn off for me.
|Back to top
Posts: 344
i'll chip in Yamato Akitsuki from Suzuka, although in all honesty i'm not sure why, i kinda purged my memories of this after watching it cause for some reason he just really, really annoyed me, i truly hated his character for some reason
but its just him, i watch most high school romance shows that air and have watch plenty that have aired already and out of all the different character types, from the weak willed and spineless to the overconfident wannabe player he's the only one that i developed any hatred for
if i felt like going back over it i'd find out why i didn't like him, but i get the feeling the experience would be about as painful to me as plunging my hand into a jar of razorblades and salt, despite people telling me it was a great series, although that may have been the manga....
|Back to top
|Anime News Network Forum Index -> General -> Anime
All times are GMT - 5 Hours
Goto page Next
|Page 1 of 15
Powered by phpBB © 2001, 2005 phpBB Group
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
Food Wars: Shokugeki no Soma GN 5
Food Wars! continues being chock-a-block with cliffhangers and competitions guaranteed to make you reluctant to put the book down once you've started reading. ― KFC and IHOP are not going to cut it when you've finished reading this volume of Food Wars: Shokugeki no Soma. From breakfasts to tempt even the least enthusiastic morning eater to fried chicken that will make you wish you could pull it out o...
The List - 7 Manga for Monster Girl Lovers
First there were catgirls, then maids, then robot girls; presently, we live in the age of the monster girl. Here are seven shining examples of the genre. ― Supernatural romantic comedies have a strong, dedicated fanbase among both male and female readers. Commentary on its quality aside, Twilight was immensely popular and shone a light on a new sub-section of young adult novels. Vampire stories, inc...
ANNCast - Encyclopedia Brits-Ani-ca
Anime scholars extraordinaire Helen McCarthy and Jonathan Clements drop by the ANNCast clubhouse to discuss their new book, the monolithic behemoth known as The Anime Encyclopedia: Third Revised Edition. ― ANNCast Episode 221: Encyclopedia Brits-Ani-ca Get the Flash Player to see this player. Anime scholars extraordinaire Helen McCarthy and Jonathan Clements drop by the ANNCast clubhouse to discuss ...
Answerman - Endlessly Searching
Justin answers two questions about really long series: is longevity something the creators prefer? And why do they get licensed less? Plus, prospects for some re-releases, and why so much hentai got licensed back in the day. ― What happened? The questions dried up again! Once again this week, I was really desperate for questions. Is it because everybody is on spring break? Anyway, I need your help! ...
Your Lie in April Episodes 1-22 Streaming
Your Lie in April paints adolescent love and musical performance in exuberant colors, and almost gets away with it, too. ― Your Lie in April is a beautiful show. That should be stated first, both because it's true, and because that's where the show itself begins. The first episode opens with a gorgeous, nearly wordless sequence of a girl chasing a cat through blooming spring flowers. Light piano sets...
Log Horizon GN 1
Fans of the Log Horizon anime might find story questions answered more quickly in the first volume of this manga adaptation of the light novel. ― Log Horizon, like many a recent franchise, began its life as a series of light novels, in this case by Mamare Touno, before being adapted into both anime and manga. As might reasonably be expected, the difference in the adaptive mediums make each version a ...
Review: The Anime Encyclopedia Third Revised Edition
The Anime Encyclopedia's third revision is an impressive achievement, steadfastly chronicling anime shorts, films, and series from 1917 through 2014. ― There is one thing that we can all agree on, hands down – The Anime Encyclopedia is one impressive piece of work. Co-written by Jonathan Clements and Helen McCarthy, this tome attempts to chronicle and catalog a century's worth of Japanese animation w...
House of 1000 Manga - Bakuman.
Jason straps in for a series of columns focusing on manga about manga, and naturally, his first stop is writer Tsugumi Ohba and artist Takeshi Obata's Bakuman. Plus: Jason's new project! ― In honor of my new Kickstarter, Mangaka: The Fast & Furious Game of Drawing Comics, for the next two months I'm going to be writing about meta-manga: manga about manga artists! Please enjoy, and if you like, pleas...


text:
Fri, 27 Mar 2015 14:21:00 +0000
Thu, 29 Jan 2015 12:19:00 +0000
Thu, 27 Nov 2014 14:53:00 +0000
Fri, 24 Oct 2014 11:31:00 +0000
More from the Borthwick Institute blog »
We were accredited with the Customer Services Excellence (CSE) award in April 2014. Find out how we work to achieve and maintain our customer service standards:
NewsEaster and May Bank Holiday service
Wednesday 25 March 2015
The main searchroom will be closed across several days for the Easter break and May Bank holidays.
Work Experience placements
Thursday 26 February 2015
The Borthwick Institute for Archives has an opportunity for University of York students interested in buildings history to work in a stimulating and fast-paced environment.
Searchroom Closure
Friday 6 February 2015
During the morning on Monday 9 February the searchroom will be closed due to a general staff meeting.
You & the Borthwick
We are committed to providing an excellent service to our customers.
Find out more about our service standards, customer charter and responses to your feedback:
We support and expand the University of York's cultural endeavour and contribute to human understanding through collecting archives, preserving them and making them widely available for research to all people, now and in the future.


text:
They kept us on the edge of our seats and brought us to our feet.
KANSAS CITY, Mo. (AP) - At first glance, the Kansas City Chiefs appear poised to make a strong postseason run next season. They've solidified the quarterback spot, have several young stars under contract, and came within a hair of making the postseason this year.
NEW YORK (AP) - Lions defensive tackle Ndamukong Suh can play in Detroit's wild-card game after his one-game NFL suspension was reduced to a $70,000 fine.
KANSAS CITY, Mo. (AP) - In the hours after a four-sack performance gave Justin Houston the Chiefs' franchise record, all he could talk about was how close Kansas City came to making the playoffs.
SAN FRANCISCO (AP) - Madison Bumgarner sat in the outfield alongside Jake Peavy before Game 7 of the World Series and told his teammate exactly what needed to happen: Tim Hudson would work a few innings and get the ball to Bumgarner, who would hand it off to the bullpen to finish the championship.
Ending weeks of speculation, Michigan hired Jim Harbaugh as its coach Tuesday in hopes that its former star quarterback will lead the Wolverines back to national prominence.
NEW ORLEANS (AP) - A former head coach in both the pro and college ranks, Lane Kiffin said Monday he plans to return to Alabama next season as offensive coordinator.
MANHATTAN (AP) - Less than a second was all it took.
NEW YORK (AP) - The Tampa Bay Buccaneers "earned" the first pick in next spring's NFL draft with their 2-14 record.
NEW YORK (AP) Detroit defensive tackle Ndamukong Suh has been suspended for this Sunday's wild-card playoff game against Dallas for a violation of safety-related playing rules against Green Bay in the season finale.
PHILADELPHIA (AP) - No one in the sports world had heard of the 2014 Associated Press Female Athlete of the Year until August.
KANSAS CITY, Mo. (AP) - There was a moment early in the fourth quarter Sunday that all the stars were aligned for the Kansas City Chiefs. They were handling business against San Diego, and two other games transpiring elsewhere were going exactly as they needed.
SANTA CLARA, Calif. (AP) - Jim Harbaugh gathered his players and told them he is leaving, and they joined their voices for one final, familiar chant: "Who's got it better than us? No-body!"
ANNAPOLIS, Md. (AP) - J.C. Coleman ran for 157 yards and a touchdown, and Virginia Tech harassed and ultimately injured Cincinnati quarterback Gunner Kiel while rolling to a 33-17 victory Saturday in the Military Bowl.
WICHITA (AP) - Wichita State University fans hoping to watch the Shockers' NCAA tournament game Sunday at a Wichita arena should make other plans.
OMAHA, Neb. (AP) - Rarely is Kansas an afterthought.
DeleteKANSAS CITY, Mo. (AP) - Wichita State coach Gregg Marshall may finally get his wish.
GLENDALE, Ariz. (AP) - Pete Rose has submitted a new request to be reinstated to baseball.
March Madness can feel a bit like sensory overload. Games are happening at sites all over the country, often several at a time, and keeping track of everything can be nearly impossible.
In what many considered a referendum on the status quo, NFL player representatives voted to retain DeMaurice Smith as executive director of the union.
KANSAS CITY, Mo. (AP) - Defensive back Ron Parker proved his versatility for the Chiefs last season. On Saturday, he was rewarded for it.
When the field of 68 is finally revealed Sunday evening it means the phrase "bubble watch" goes on its trip to the land of jargon until next February when it again will be around as the regular season starts to come to a close.
KANSAS CITY, Mo. (AP) - Kansas coach Bill Self made sure to remind his team at halftime Saturday night that Iowa State has a penchant for putting together dramatic comebacks.
AVONDALE, Ariz. (AP) - Kevin Harvick has been nearly unstoppable since he charged to his first Sprint Cup championship last season.


text:
Szeroka 33
No availability found through our partners. Please contact the business directly or check some of our recommended alternatives.
Travelers also recommend:
TripAdvisor Reviews Szeroka 33 Krakow
Travel Blogs from Krakow
Deep Under Poland
... to transport the salt and about the horses and how well they were treated. (They lived their entire lives underground but were treated like kings. We then descended to the next level and saw some dwarfs. (They continue to mine when the miners go home). We then arrived at the first chapel. Apparently most of the miners were religious and thanked god every day for letting them live. Down another tunnels and we arrived the deepest church in all Europe. It was an impressive cavern ...
A relaxing day in Krakow
Recently we have been busy, so today (on Sunday) we decided to take it easy. We had a sleep in till 7.30am (that's when Zac got up). Then we took our time to get ready and have breaky. As mum and dad had a few things on today, we decided to catch the tram and make our own way into the city. The public transport system is pretty good here, but the Sunday schedule is not as regular as weekdays.
Never the less we made it into ...
Auschwitz and Birkenau
... I'll have to come back someday to check it out, because I've been told it's worth seeing.
I spent the rest of the day in the old town center trying to restore my faith in humanity. I sat in the main square and had a beer and just watched as thousands of people walked by without a care in the world. It was a nice reminder of the freedom we have in so many countries today. Especially with ...
What a fabulous surprise- KRAKOW! by Belinda Held
... will be in Rome for Blessed Pope John Paul II's Canonization so felt very privileged and lucky to be able to visit his birthplace. The day was gloomy, very cold and overcast. Upon arrival I was taken aback. The air seemed full of smoke. The problem was coal- the people were burning coal to keep warm. The smoke was emerging from their chimneys and lying low. I covered my mouth with my scarf. Then I entered the church were the Pope was Baptized, was an Altar ...
We arrived in Krakow late in the afternoon, after spending the day on the hottest train in history. I mean it was pumping heat up from under the seats at a temperature of about 35degrees. Gross. But we had to layer up again quickly when we stepped into Krakow air. We got a cab to the hostel because the walking directions made no sense, and found we had to climb 4 flights of stairs with our bags to the hostel. I was volunteered to go up and come back down with the key ...


text:
Tauerntreffen Austria Jan 2014
Ok first up i want to point out that it was a post on ABR which brought the Tauernrally to my attention.I saw a pic of a Tent buried in snow which sparked my interest.
So after a year of planning and general fluffing about we actually set of last week Tuesday.
My Mate Jason came over the night before from wales and we caught a early Train over to France on our way to Mainz,Germany for our first stop.
We met up with AndyB in the Youth hostel,dropped our gear in the room and went into the Altstadt for a meal
Us on the Train
Next day was only about 300 miles down to Passau which should have been boring but first we had a little traffic jam which i used to show of my filtering skills (5years commuting into London had to come in handy one day).Since i was hooked up to J via intercom all i heard was"Oh that was close,you nearly touched the truck Bojo" and some more drivvel like that.
Once we cleared the bit of traffic we resumed normal altitude and cruising speed till i noticed(at 80mph) that J's one panier was bouncing along the floor only held on by a Bungee strap.I screamed into the intercom"Stop,J,Stop now",AndyB was flashing his lights to scared to come closer in case the panier came off completly.
How that one Bungee held a fully loaded panier i will never understand.
That was all the damage,a bit of scuffed plastic
After we all calmed down a bit we went on to Passau.
I was getting worried cause so far we had not seen any snow and i didn't fancy travelling that far to camp in the mud.
What i didn't realize when i booked was that there was a brewery next door with a lovely pub and good food
I also made a beginners mistake by fitting new heated grips to my bike before a big ride.
Hmm that did smart a bit all the way
Next day of we went into Austria
With AnyB loosing his baffle he decided to hop onto the Motorway so as not to attract to much attention with the local police while we took a bit of the scenic route.
So J and I arrived in Trieben,Austria in the Valley and had some coffee and a bite to eat before we attempted the climb up to the Hut
Pretty place,this Austria
Once we reached the Ski lift it was time for the Snow chains.
AndyB borrowed a chain for his rear tyre,J had some home made snow claws and i managed to pick up some chains from various places.
Unfortunatly AndyB did not make it up the Hill and decided to go home.
J's snowclaws did one after the other snap right down the middle which meant he was struggling,A LOT.
Mine worked perfect but the ride up was still scary as the steepness of the hill and the tight hairpin bends where scary
J told me to go ahead as he was playing with his snowclaws,which i did
I got gopro footage of the ride up just need to play with it a bit first
A pic of the road
and the view on top
So i put up my tent and was waiting for J,asking every bike coming up the hill if they seen a ugly welshman.
Eventually i decided to go and rescue him and give him my spare claws and chains
The Sunset was stunning
Since J does not drink this was all mine
Temperatures where not too bad so i felt confident for the night
This is the bike of the 17 year old kid with one year riding experience
At night rescue missions where launched at regular intervalls when late comers where stuck on the hill. Ural sidecar units with a driven side wheel where used normally,when they got stuck a snowmobile was used
First night in the tent went ok,at the time i was still thinking it was cool
my Porch area
and my tent on the "Campsite"
Due to J using his clutch a bit too much and all the claws snapping we decided to stay on top and not risk the bikes too much.So we spent most of the time digging our tents out of the snow,the bikes,other bikes,other tents and just general enjoying the scenery
This is the only pic i have which sort of shows the steepness of the hill
Oh did i mentioned it snowed? A lot
It was mentioned we would expect about 40cm in the night,well it was more
I brought all my cooking gear but gave up after the first attempt at a curry nearly killed me with the cold
our kitchen
Did i mention it snowed?
I was not to sure about my bike as my batterie was not the best,J did start his bike twice and had it running for a while but i didnt dare.I thought i wait till departure day and just hope she would start from this
Oh and i mentioned the snow,have i?
The level of snow from the inside of my tent
I usually woke up about every 2 hours pushing the snow of my tent which was a bit of a pain.
So Sunday arrived and i am not ashamed to admit that i hardly slept and i was shitting myself with fear. The Snow plough got stuck the night before so nobody did know what the track was like
First up was starting the bike.After 4 days/nights in sub zero temp and snowed in like this i was a bit worried
I should never have doubted my "Little Panzer". Key in and the lights came on,press the button and she started.I could have cried with relief
The snow fall was still heavy on the way down which did not make things easier
J's bike started ok too but he had only a chain at the front with the 3 remaining claws at the back.Now J is a Man mountain with legs like tree trunks,several times i watched him stopping the fully packed GSA going down with sheer strenght.
Strenght i did not have
Now if you remember we put the chains on at the ski lift on the way up.
Thats on the same spot
was ok with paddling my bike 5k, down hill,what i did not expect was that the road all the way down into the valley was covered with snow and ice.We ended up doing about 16 km paddling,free wheeling our bikes down the hill.
Once back at the petrol station for a coffee and some food we thought we done it.
Wrong again
The ride over to Passau was scary to say the least.For some odd reason the Austrians didnt bother too much clearing the motorway.So we ended up doing 30mph on the motorway with the Hazards on. The 120 miles took us 7 1/2 hours of pain
The usual happened when you arrive in a hotel with wet gear
The rest was just a long slog through germany with another stop in mainz and than home
Would i do it again?
Not sure first the pain needs to go.One thing is sure never on my gsa again.Even the guys which do the Tauern rally every year said that conditions where unusually hard and that we where nuts coming up the Hill on big bikes without a sidecar.
But hey we managed,just
The end
Stella Artois, that Belgian beer :)
There's a Belgian word for what you did: bikkels!!!
could maybe be translated as tough guys,
I would for sure never do what you did,
I'm not afraid of a bit of snow, but that ? No Thanks :eek1
made a story worth telling though
thanks for that
Wow! Now that IS an adventure! That photo of all the bikes in front of the hut covered in snow could be front page material!
Filtering is illegal in Germany , you guys were lucky not being caught. Nice piccies ! Thank you for sharing!
-zie egret.
Bikes and snow don't mix, but you make it look like fun, thanks for sharing your adventure :thumb
Good job ! respect for doing this in a GSA :deal
That looks about as much fun as sliding down a 50-foot razor blade into a pool of alcohol:eek1
How could anyone not think this would be fun:
Excellent. :thumb
bravo guys
don´t know what you smoke but it works!!!:lol3
Nice one Pete , but you guys are nutters :clap
Great pictures! Now you're primed for the Primus meet in Norway next winter!
|Times are GMT -7. It's 01:59 PM.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2015, Jelsoft Enterprises Ltd.
Copyright ADVrider 2011-2015


text:
Not really good at self introduction but will still give a try. Spent most of my time studying for the past few years and during the meantime joined some interest groups which helped me know more people and new stuff.
Join OkCupid
Find better matches with our advanced
Find better matches with our advanced
matching system
—% Match
—% Enemy
29 • Singapore, Singapore • Man
I'm looking for
- Women
- Ages 18–32
- Near me
- Who are single
- For new friends, long-term dating, short-term dating
My details
- Last online
- Mar 22, 2014
- Orientation
- Straight
- Ethnicity
- Asian
- Height
- 5′ 7″ (1.71m)
- Body type
- Skinny
- Diet
- Mostly anything
- Smokes
- No
- Drinks
- Socially
- Drugs
- Never
- Religion
- Buddhism, but not too serious about it
- Sign
- Scorpio, and it's fun to think about
- Education
- Graduated from university
- Job
- Student
- Income
- Rather not say
- Status
- Single
- Type
- —
- Offspring
- Doesn't have kids
- Pets
- Likes dogs and likes cats
- Speaks
- English (Fluently), Chinese (Fluently), Japanese (Fluently)
Similar Users
My self-summary
Write a little about yourself. Just a paragraph will do.
What I'm doing with my life
Don't overthink this one; tell us what you're doing day-to-day.
Just started working and would like to broaden my social circle by knowing more people here to talk with. Also to share any common interests we may have.
I'm really good at
Go on, brag a little (or a lot). We won't judge.
Still trying to find my niche, probably investing.
The first things people usually notice about me
I'm an empty essay… fill me out!
My dorkiness LOL
Favorite books, movies, shows, music, and food
Help your potential matches find common interests.
John Grisham, Infernal affairs, hangover series
Investment related books, Chicken rice, Japanese food, other cuisines.
Investment related books, Chicken rice, Japanese food, other cuisines.
The six things I could never do without
Think outside the box. Sometimes the little things can say a lot.
My S4
Taiwanese dramas
And also self help books. :p
Taiwanese dramas
And also self help books. :p
I spend a lot of time thinking about
Global warming, lunch, or your next vacation… it's all fair game.
How my life would turn out in 10 years
On a typical Friday night I am
Netflix and takeout, or getting your party on — how do you let loose?
At home unless friends asks me out
The most private thing I'm willing to admit
I'm an empty essay… fill me out!
For you to find out :D
You should message me if
Offer a few tips to help matches win you over.
You want some fun, have someone to confide with or having the same interests or would like to share your interests with me.
Connect your existing OkCupid account
Sign in
Welcome Back!
Restore your account to continue meeting new people.
Reset your password
We'll email you a link to reset it.
Email sent!
An email is on its way to . If you don't see it, try checking your Spam folder.


text:
Cross post to bathrooms....glass mosaic floor anyone?
I posted over on bathrooms as well. Does anyone have glass tile mosaics on their bathroom floor? Tiny master bath and I thought that is I ran the same tile straight through the shower it would visually enlarge the space. I'm all over the place with tile choices. I saw pics on houzz of glass mosaics on the floor where they ran it through. I'm looking for any practical input if someone has this. Thanks!
It should be a no shoe environment, as heels or bits of gravel caught in the soles can chip the glass and make sharp edges. There are specialty glass tiles that have a textured surface that are designed for a bath area, because glass is slippery. If you use the small 3/4" size, that may not be necessary, but you also need to make sure that you use a sanded grout for traction. That can scratch the surface of the glass slightly, and that can hold a bit more dirt than installations with unsanded grout. If you have family members who will be using the bath who are mobility challenged, you may want to be sure that you only use it in some type of decorative "stripes" and combine it with a regular tile with good traction, plus prep the walls to install grab bars now or later.
The vast majority of the time this bathroom is used only by me. DH likes using our outdoor shower. I'm not mobility challenged yet....but we don't know what the future holds. I used epoxy grout on my glass kitchen backsplash and on a decorative strip in the other bath. Besides looks....I'm equally (if not more) motivated by long term durability and price. There were some higher end mosaics I just love but I'm having a hard time wrapping mt head around the cost


text:
Pour 1/4 cup melted butter or margarine in a 9 x 13 inch pan.
Spread 1 cup packed brown sugar evenly over the melted butter.
Position pineapple rings on top of brown sugar.
Place a maraschino cherry in the center of each ring.
Pour Golden Cake batter over all.
Bake in a 350°F.
Oven for 45 minutes.
Invert cake, and serve warm with whipped cream.


text: Dog Pushing Handicapped Person Through Flooded Streets – VIDEO By Steve Peloquin June 13, 2013 1:10 AM Share on Facebook Share on Twitter This is video of a loyal dog pushing it's handicapped owner through a flooded street. Any wonder why dogs are "man's best friend"? Category: Sports Buzz Share on Facebook Share on Twitter More Leave a comment Send to a friend! Print this page Pin it! Reddit This! Share on Tumblr! Best of ESPN 1420 Recommended For You Around the Web


text:
That is so good
gandle(4 NE)February 5, 2012
I brought a head of red cabbage home yesterday and asked George to make sweet and sour red cabbage. He doesn't use a recipe but how can you miss when you start out with 4 slices of bacon, the rest just has to be good. It is even better when it stands for a day or two. Knd of dyes everything purple-red but who cares.
this reminds me of what the husband/cook did the other night. Fried out some bacon, sauted onions in the grease and added fresh spinach.
It was supposed to be done when the spinach wilted. Alas! we forgot to turn off the fire. So the spinach cooked on. It was delicious!!! He plans on doing it again very soon.


text:
MARMOT Women's Laura Top, L/S, Atomic Blue
Item: 28705766 Product Description >
Regular Price: $70.00 SALE $49.98
Buy one outlet clothing or footwear item, get a second for 50% OFF! This item is Eligible - Get Details
MARMOT Women's Laura Top, L/S, Atomic BlueEasygoing with roll-up sleeve style, the Laura from Marmot offers moisture-wicking, quick-drying performance and stretch comfort.
- Soft, breathable, lightweight heathered knit fabric of nylon, polyester and elastane
- Moisture-wicking and quick-drying fabric to keep you dry and comfortable
- Nylon fabric provides durability
- Stretch elastane for increased mobility
- Ultraviolet Protection Factor (UPF) 20
- Forward shoulder seams
- Sleeve roll-up feature
- Attached hood
- Henley styling with 4-button placket
- Double chest pockets
- Shirt-tail hem
- Regular fit
Fiber Content: 53% nylon, 44% polyester, 3% elastane
Country of Origin: Imported
MARMOT Women's Laura Top, L/S, Atomic Blue
EMS_Sale Yes Fit Regular Weight 8.9 oz. (252.3 g) Fabric(s) Blend Sleeve Length Long sleeve


text:
Pickens Homes for Rent
BusinessWeek "Best of the Web" Winner 3 Years Running
Search Pickens Home Rental Market
We have so much room in our new rental property that we can barely fill up all the rooms with furniture. We can't wait to start decorating! - Pickens,SC
Popular Rental Properties in Pickens, South Carolina
105 Redcoat Court, Simpsonville
Simpsonville, South Carolina, 29680
3+ Bedrooms
101 W. Mountainview Avenue, Greenville
Greenville, South Carolina, 29609
3 Bedrooms
This 2,150 square foot single family home has 4 be
Travelers Rest, South Carolina, 29690
3+ Bedrooms
This 1,500 square foot single family home has 3 be
Easley, South Carolina, 29642
3 Bedrooms
Pickens Homes for Rent
Moving to Pickens and looking to rent a house? There is a good variety of possible choices and the most appropriate one is waiting for you - just start searching on MyNewPlace. Do you and your family need a garage? Home rentals are the easiest solution.
Want the inside scoop on Pickens? Check out our Pickens Local Talk for local tips and information about Pickens. You can also get answers to your Pickens questions from our local experts by using the "Ask a Question" feature.
Houses for Rent in Cities Near Pickens, SC
MyNewPlace can help you find the Pickens, SC home rental that will work best for you. Using our rental home search, you can view townhomes or condos for rent if you want to live downtown, or check out the rental listings for single family house rentals in the surrounding areas. Try one of these cities below for more rental houses near Pickens, SC.


text:
Median Salary by Years Experience
1403 N. Howard Avenue
Tampa, FL 33607
Argosy University
Private School, For Profit
Argosy University is a for-profit university owned by Education Management Corporation, with 19 locations in 13 US states and online. The university offers numerous programs at various levels, including certification; associates, bachelors, masters, specialist, and doctoral degrees, postdoctoral specialization, postgraduate concentrations, etc. Programs vary by campus.…
Read more from Wikipedia »
Hey, Managers: Stop Emailing Your Employees at Night
Mobile technology was supposed to set us free from the tyranny of the 9-to-5, allowing workers to escape the office and plug in wherever they happened...>
After 'Religious Freedom' Becomes Law in Indiana, Businesses Vote With Their Dollars
On Thursday, Indiana Governor Mike Pence signed the Religious Freedom Restoration Act, effectively allowing businesses to refuse to serve gay customer...>
Why You Should Socialize With Your Colleagues
Sometimes, workplace social events feel like a chore. Management may not want to "waste" time sponsoring fun during the workday, and not all employees...>
Tell us about your current job and your skillset, and we'll let you know how much employers are paying in your area.