text:
Weavers of the colorful patadyong from Antique will show how the age-old art is done in a two-day demonstration at the National Museum, said Senator Loren Legarda.
Legarda, patron of the country's first permanent textile gallery, Hibla ng Lahing Filipino, said that weavers from Bagtason Loom Weavers Association in Bugasong, Antique are the featured craftsmen at the gallery on October 25-26, from 1:00-5:00 p.m.
"Antique is famous for its handwoven patadyong, which we usually see as a traditional costume paired with a kimona. Many might be curious how this brightly hued fabric is made. The weaving demonstration at the National Museum will show us how," Legarda, a daughter of Antique, said.
Patadyongs can be plain or designed with embroidery. These are usually worn as skirts, but they can also be made into shawls, handkerchiefs, scarves, table runners and many others.
"I invite Filipinos to see how our patadyong weavers from Bugasong do their craft so we can better appreciate not only the effort and skill of the weavers but also our culture and heritage," said Legarda.
The National Museum has organized weekly weaving demonstrations at the Hibla gallery, from September to November 2014, as part of efforts to raise awareness on the culture of weaving and to ensure its continuity.
Weavers from the Cordillera Region showcased their craft last September, while weavers from Panay Island are featured in the weekends of October. Mindanao weavers will demonstrate their weaving traditions in November.
The weaving demonstrations can be viewed from 1:00-5:00 p.m., Saturdays and Sundays, at the Hibla gallery, located at the 4th Floor of the Museum of the Filipino People, Finance Road, Manila.
"These weaving demonstrations reveal a part of our culture and we have many other weaving traditions as we see the various kinds of weaving patterns and designs in the textiles and items at the Hibla gallery. We hope that these efforts will contribute in heightening the awareness and renewing the interest of Filipinos about our culture so that we can all work together to preserve our heritage," said Legarda.


NEW YORK, Aug 31 (Reuters) - U.S. Open tennis fans were gearing up for the most anticipated match of the tournament so far on Friday with Serena and Venus Williams set to meet for the 30th time and extend a sibling rivalry that has endured for two decades.
The pair will face each other for the sixth time at their home Grand Slam, but will be spared the searing heat that has marked the opening days of the tournament when they step onto the Arthur Ashe Stadium court.
Tournament officials said there was no heat rule in effect on Friday for the first time in three days, with cloud cover expected to bring cooler temperatures.
Serena leads 16th seed Venus 17-12 in their head to head record, but most recently lost to her older sister at Indian Wells in March.
Seventeenth seed Serena, however, defeated Venus in straight sets in the 2017 Australian Open final, their last Grand Slam encounter.
With 23 Grand Slam singles titles to her name, Serena came to this year's tournament in search of a seventh U.S. Open title.
Third-seeded Sloane Stephens will continue the defence of her U.S. Open title against twice Australian Open champion Victoria Azarenka of Belarus, who leads her American opponent 3-2 head to head.
On the men's side, world number one and defending champion Rafael Nadal faces Russian 27th-seed Karen Khachanov in Arthur Ashe Stadium, while Argentina's Juan Martin Del Potro will be favourite in his third-round match against Spain's Fernando Verdasco having won four of their five previous encounters.
John Isner will continue his bid to end a 15-year title drought for American men when he plays un-seeded Serb Dusan Lajovic, after surviving a brutal five-set second-round match against Chilean Nicolas Jarry.
Fans and players can expect much-welcomed cloud cover and cooler temperatures, with a high of just 76 Fahrenheit (24.4 Celsius) according to the National Weather Service.
Tournament officials had imposed a heat rule on Tuesday, Wednesday and Thursday in an effort to relieve players from the sweltering temperatures, but had not implemented the measure on Friday morning.


SecurEcom has successfully contributed to the efficient and organized implementation of operations security for numerous technological environments. Reduce your risks!
Our security experts support you in sound infrastructure management, applying the best practices and highest standards in the industry (ITIL, ISO 27002, NIST, CERT).
To date, they have contributed to the implementation of several monitoring and security operations centres (SOC) as well as multiple projects related to incident, vulnerability and threat management.
SecurEcom is ideally suited to help you build a team in charge of operations security, define security processes, and choose and implement the most appropriate technologies.


text:
Home » News » Games Inbox: What was the best trailer at The Game Awards?
Games Inbox: What was the best trailer at The Game Awards?
2021-12-10 News Comments Off on Games Inbox: What was the best trailer at The Game Awards?
The Friday Inbox tries to imagine gaming history without Nintendo and the NES, as readers agree that NFT should stay out of gaming.
PLEASE NOTE: As we get our own Christmas and New Year content ready for the end of the year, please consider sending in your own festive Reader's Feature to run over the Christmas break. It can be on any subject but if there's something you've been meaning to write in about, but never got around to, now would be a good time for it.
To join in with the discussions yourself email [email protected]
Message from the past
So I'm sitting here at Thursday lunchtime and it's 12 hours to go until The Game Awards. I guess by the time you see this, if GC uses it, it will be over and we'll know whether there were a bunch of cool new games being shown off or just a lot of hype and nothing much of interest.
Right now, there's no way of telling. There don't seem to have been any leaks, except the Sonic the Hedgehog announcements, and I don't remember there being any in previous years either. So, all you guys in the future, how was it? Was Zelda: Breath Of The Wild 2 there? Any other new games from Nintendo? Did Sony announce anything? Maybe their PlayStation Game Pass?
What was the best trailer and was there anything that was more than just a bit of CGI and a logo? Not that I mind that if the game sounds exciting but after your tenth pre-rendered trailer you do begin to realise just how shallow the whole experience is.
I'm a sucker for hype though so I'll be watching at least part of it. Although they usually save the best for last so I guess I'll only find out about that on Friday morning. I hope it's a good one!
Alternative reality
Sad to hear about the death of the inventor of the NES and SNES, although he had a good run and… what a legacy! Just imagine the changes he's seen and all thanks to his work. Who knows what would've happened to the games industry if Nintendo hadn't stepped in and saved it back in the 80s. If it was solely down to Sega does anyone think that the Japanese games business would have had the huge impact it did? Maybe Sony would never have become involved, since they wouldn't have had Nintendo to see as a rival (or double-cross them at the last minute).
Maybe the PC would come to dominate as the only gaming format anyone ever used. I know some people that might think that would be a good idea but not me. PCs get all console games now but they didn't used to and as many classics as there were back in the 90s golden era there were whole genres that just never appeared on the format.
So thanks be to Mr Uemura and my condolences to his family.
Devlin
Master Chief doesn't drink
I would've written yesterday but was too busy playing. Halo Infinite is amazing. As a card carrying Halo fan (I was dressed as Master Chief for my stag) I'm probably the ultimate target audience but from getting the hang of new guns in the opening missions to the reveal of the open world I've been transfixed.
I destroyed a vehicle maintenance site before bed and was grinning from ear to ear. I've gone off the beaten track a few times and have found a couple of areas not marked on the map. I've been playing on Heroic and seeming to be enjoying it far more than my friends on Normal. Did you get a chance to try legendary difficulty?
For me Halo is the best multiplayer of the 2020 and the most entertaining AAA campaign I've played in years.
DarKerR (gamertag)
GC: We agree in terms of the multiplayer but not at all when it comes to the campaign.
E-mail your comments to: [email protected]
Unknown source
My son convinced me to watch Arcane on Netflix (animation based on League Of Legends).
Now I have never played League Of Legends, so I don't know if the show follows plotlines from the game or if it is just loosely based on some characters, but, damn, it is actually genuinely excellent.
It's the best game to show/movie crossover I've seen (granted that's a fairly low bar).
Stay dead
Much as I would love a new Splinter Cell in theory, I really don't want to see it turned into some bland identikit open world game, like what happened to the Ghost Recon games. Breakpoint and Wildlands have almost nothing in common with the old games and I don't want to see that happen to Splinter Cell.
I much better idea would be to do a remake of Chaos Theory, since that's the best one, and see how that goes down. If it's not a big hit then maybe Splinter Cell's time has been and gone and it should just be left to rest in peace. Much better that then resurrect it as something that's Splinter Cell in name only.
More, please
Sat watching GamesMaster, it's suitably old school and quite funny. The presenter, Rab, seems to know his stuff being a reviewer and all.
Sir Trevor also seems aware he's a giant floating head with some good one liners. So overall quite impressed. I'd take a full-on series.
big boy bent
Regarding TommyFatFingers' letter in Thursday's Inbox, the problem with NFTs goes beyond poor implementation, they are simply a hugely inefficient way of doing things that can be done much better with traditional databases.
Tommy repeats the NFT evangelist claim that blockchain allows you to prove you own digital goods, but the truth is we've been doing that for decades. Every time you buy a game or in-game item on a digital store, a record is added to the database showing that this user owns this item. If the store owners want you to be able to give something to someone else this is as simple as changing the user ID to point to the new owner – many games already do this, just generally without a real money transaction.
As for going the full way and letting players sell in-game items to each other, that's been tried too with things such as the Diablo auction house but it's an awful idea that breaks the game and has a bunch of potential legal problems if players think they've been ripped off. And selling digital games second-hand would mean the publisher and store make less money, so that's not going to happen.
TGN Professor
Expensive numbers
It was pretty disheartening to see a letter in Thursday's Inbox not only defending some sort of idealised version of NFT but asking GC, and I assume the Inbox and comments section, to 'Lay off the NFT, eh?'. I took that to mean that TommyFatFingers does not want to see anyone criticise or complain about any aspect of NFT, which I'm assuming includes the potential impact on our environment.
I don't know if I'm missing something obvious here but I've never in my life heard anyone say they were just desperate to own a costly serial number that belonged to them and no one else, to do with as they pleased.
I've never heard of anyone aspiring to own a string of unique numbers that is stamped on their in-game helmet but probably won't be readable to anyone even if it's noticed in the first place. So, they can sell an item that is identical in every way to every other item apart from having its own number, so what? I see this as something bad to be opposed and despised not encouraged and financially supported.
I was happy to see GC refuse any attempt at censorship from TommyFatFingers' request to not criticise Ubisoft or any other publisher that goes all-in on the NFT action.
As a side note, I don't know if it's true – I haven't had a chance to look for myself – but there was at least one story in my news feed this morning saying Ubisoft have taken down the video announcing their NFT experiment from YouTube because of all the dislikes it got. So that is a little encouraging.
GC: Yes, that seems to be a tacit admission that they've got the message. Although something tells us it won't be long till they try again.
Inbox also-rans
I don't like to be a party pooper but why was Halo Infinite eligible for The Game Awards public vote if they knew for a fact nobody would've played it beforehand, only the multiplayer beta? Seems very sus to me.
I would also like to stick up for Guardians Of The Galaxy and says it's one of my favourite games of the year. Normally you'd say that for a little indie game but even though it's a giant AAA game it seems to be being completely ignored.
Louis3
This week's Hot Topic
The subject for this weekend's Inbox was suggested by reader Korbie, who asks what game have you thought about the most while not actually playing it?
While stuck at work or school it's common to daydream about what you'll play when you get home, but what game has filled your thoughts the most and why? Were you planning out new strategies and tactics or just imagining what it'd be like to get further?
Have you ever literally dreamt about a game and how did that go? Did the dream place you in the game world or was it something related to the reality of playing it?
New Inbox updates appear every weekday morning, with special Hot Topic Inboxes at the weekend. Readers' letters are used on merit and may be edited for length and content.
You can also submit your own 500 to 600-word Reader's Feature at any time, which if used will be shown in the next available weekend slot.
You can also leave your comments below and don't forget to follow us on Twitter.
Previous Post:Babylon's Fall Coming To PlayStations And PCs Near You In March
Next Post:Sonic Movie 2 Trailer Revealed At The Game Awards, And Knuckles Sounds Kinda Sexy
Power On: The Story of Xbox Six-Part Documentary Announced, Releasing Next Month
Dynatrace and New Relic battle for dominance in the enterprise observability market
Why Is Everyone So Mean To Apex Legends' Revenant?

redpajama_set_name: RedPajamaCommonCrawl


text:
<?php

namespace OPNsense\Diagnostics\Api;

use OPNsense\Base\ApiMutableModelControllerBase;
use OPNsense\Core\Backend;
use OPNsense\Core\Config;

class PacketCaptureController extends ApiMutableModelControllerBase
{
    protected static $internalModelName = 'packetcapture';
    protected static $internalModelClass = 'OPNsense\Diagnostics\PacketCapture';
    private static $capture_dir = '/tmp/captures';

    /**
     * set / create capture job
     */
    public function setAction()
    {
        $result = parent::setAction();
        if (empty($result['validations'])) {
            $mdl = $this->getModel();
            $result['result'] = 'ok';
            $result['uuid'] = $mdl->settings->generateUUID();
            @mkdir(self::$capture_dir);
            $nodes = $mdl->settings->getNodes();
            foreach ($nodes as $key => $value) {
                if (is_array($value)) {
                    $items = [];
                    foreach ($value as $itemkey => $itemval) {
                        if (!empty($itemval['selected'])) {
                            $items[] = $itemkey;
                        }
                    }
                    $nodes[$key] = implode(',', $items);
                }
            }
            file_put_contents(
                sprintf('%s/%s.json', self::$capture_dir, $result['uuid']),
                json_encode($nodes)
            );
        }
        return $result;
    }

    /**
     * start capture job
     */
    public function startAction($jobid)
    {
        $result = ['status' => 'failed'];
        if ($this->request->isPost()) {
            $this->sessionClose();
            $payload = json_decode((new Backend())->configdpRun('interface capture start', [$jobid]), true);
            if (!empty($payload)) {
                $result = $payload;
            }
        }
        return $result;
    }

    /**
     * stop capture job
     */
    public function stopAction($jobid)
    {
        $result = ['status' => 'failed'];
        if ($this->request->isPost()) {
            $this->sessionClose();
            $payload = json_decode((new Backend())->configdpRun('interface capture stop', [$jobid]), true);
            if (!empty($payload)) {
                $result = $payload;
            }
        }
        return $result;
    }

    /**
     * remove capture job
     */
    public function removeAction($jobid)
    {
        $result = ['status' => 'failed'];
        if ($this->request->isPost()) {
            $this->sessionClose();
            $payload = json_decode((new Backend())->configdpRun('interface capture remove', [$jobid]), true);
            if (!empty($payload)) {
                $result = $payload;
            }
        }
        return $result;
    }

    /**
     * view capture
     */
    public function viewAction($jobid, $detail = 'normal')
    {
        $result = ['status' => 'failed'];
        $this->sessionClose();
        $payload = json_decode((new Backend())->configdpRun('interface capture view', [$jobid, $detail]), true);
        if (!empty($payload)) {
            $result = $payload;
            if (!empty($result['interfaces'])) {
                $ifnames = [];
                foreach (Config::getInstance()->object()->interfaces->children() as $ifname => $node) {
                    if (!empty((string)$node->descr)) {
                        $ifnames[(string)$node->if] = (string)$node->descr;
                    } else {
                        $ifnames[(string)$node->if] = strtoupper($ifname);
                    }
                }
                foreach ($result['interfaces'] as $key => $data) {
                    $result['interfaces'][$key]['name'] = !empty($ifnames[$key]) ? $ifnames[$key] : "";
                }
            }
        }
        return $result;
    }

    /**
     * download pcap(s)
     */
    public function downloadAction($jobid)
    {
        $this->sessionClose();
        $payload = json_decode((new Backend())->configdpRun('interface capture archive', [$jobid]), true);
        if (!empty($payload) && !empty($payload['filename'])) {
            $this->response->setContentType('application/octet-stream');
            $this->response->setRawHeader("Content-Disposition: attachment; filename=" . basename($payload['filename']));
            readfile($payload['filename']);
        }
    }

    /**
     * fetch mac info
     */
    public function macInfoAction($macaddr)
    {
        $result = ['status' => 'failed'];
        $this->sessionClose();
        $payload = json_decode((new Backend())->configdpRun('interface capture macinfo', [$macaddr]), true);
        if (!empty($payload)) {
            return $payload;
        }
        return $result;
    }

    /**
     * search current capture jobs
     */
    public function searchJobsAction()
    {
        $this->sessionClose();
        $data = json_decode((new Backend())->configdRun('interface capture list'), true);
        $records = (!empty($data) && !empty($data['jobs'])) ? $data['jobs'] : [];
        return $this->searchRecordsetBase($records);
    }
}

redpajama_set_name: RedPajamaGithub


Photographers looking for a way to show support for families affected by breast cancer get ready to bid! The Pink Plus III will add a bit of color to your photography gear while showing support for the Carey Foundation for families affected by breast cancer! All proceeds from the auction will go directly to the Carey Foundation for women with breast cancer.
These limited edition of the popular PocketWizard Plus® III radio trigger made specifically for Bob Carey and the Tutu Project. These fully-functional Plus III radios feature "Tutu Pink" plastic and even have a pink LED backlight. Limited to only 20 radios, these will be signed and numbered by Bob Carey, and auctioned off to support the Carey Foundation, a 501(c)(3) charitable organization.
Bob Carey has been using these to take the world-renowned self-portraits seen in The Tutu Project.
Click here and bid to help families battling breast cancer!
The Plus lll Transceiver is the most reliable, feature-packed, easy-to-use solution for remote flash and camera triggering available. The Plus lll is an Auto-Sensing Transceiver which means it will automatically switch between transmit and receive as needed and is reverse-compatible with all PocketWizard radios, making it the perfect addition to existing gear. Whether new to remote triggering of camera's and flashes or a top professional pushing gear to the limits, the Plus lll's reliability, simplicity and performance make it the perfect tool for the job. Visit us for more information on the PocketWizard Plus III.
The first Pink PocketWizard Plus® III auctioned live at our anniversary event raised $750 for the Carey Foundation!


Enjoy Skiing and Snowboarding at Mount Southington Ski Area - Just FIVE MINUTES from the hotel!
Check out all that Lake Compounce Amusement Park has to offer - Just FIVE MINUTES away!
See Connecticut's natural beauty at Hubbard Park - While you're there, hike up to Castle Craig.
Timberlin offers various memberships including Junior, Women, Senior and one of the largest Men's Club organizations in the state.
Ranked as one of the "Best Places to Play" by Golf Digest, North Ridge Golf Club, formerly Pine Valley Golf, of Southington, CT is an 18 hole golf course.
Hawks Landing CC is located in the lush central CT river valley in Southington.
Southington Country Club is Connecticut's premiere golf course with beautiful views of the river valley.
Farmingbury Hills G.C. is a beautiful 9 hole municipal golf course located in Wolcott Ct. overlooking the scenic Apple Valley.


text:
#ifndef __CLI_H
#define __CLI_H

/**
 * Go into the command loop
 *
 * This will return if we get a timeout waiting for a command. See
 * CONFIG_BOOT_RETRY_TIME.
 */
void cli_simple_loop(void);

/**
 * cli_simple_run_command() - Execute a command with the simple CLI
 *
 * @cmd:	String containing the command to execute
 * @flag	Flag value - see CMD_FLAG_...
 * @return 1  - command executed, repeatable
 *	0  - command executed but not repeatable, interrupted commands are
 *	     always considered not repeatable
 *	-1 - not executed (unrecognized, bootd recursion or too many args)
 *           (If cmd is NULL or "" or longer than CONFIG_SYS_CBSIZE-1 it is
 *           considered unrecognized)
 */
int cli_simple_run_command(const char *cmd, int flag);

/**
 * cli_simple_process_macros() - Expand $() and ${} format env. variables
 *
 * @param input		Input string possible containing $() / ${} vars
 * @param output	Output string with $() / ${} vars expanded
 */
void cli_simple_process_macros(const char *input, char *output);

/**
 * cli_simple_run_command_list() - Execute a list of command
 *
 * The commands should be separated by ; or \n and will be executed
 * by the built-in parser.
 *
 * This function cannot take a const char * for the command, since if it
 * finds newlines in the string, it replaces them with \0.
 *
 * @param cmd	String containing list of commands
 * @param flag	Execution flags (CMD_FLAG_...)
 * @return 0 on success, or != 0 on error.
 */
int cli_simple_run_command_list(char *cmd, int flag);

/**
 * cli_readline() - read a line into the console_buffer
 *
 * This is a convenience function which calls cli_readline_into_buffer().
 *
 * @prompt: Prompt to display
 * @return command line length excluding terminator, or -ve on error
 */
int cli_readline(const char *const prompt);

/**
 * readline_into_buffer() - read a line into a buffer
 *
 * Display the prompt, then read a command line into @buffer. The
 * maximum line length is CONFIG_SYS_CBSIZE including a \0 terminator, which
 * will always be added.
 *
 * The command is echoed as it is typed. Command editing is supported if
 * CONFIG_CMDLINE_EDITING is defined. Tab auto-complete is supported if
 * CONFIG_AUTO_COMPLETE is defined. If CONFIG_BOOT_RETRY_TIME is defined,
 * then a timeout will be applied.
 *
 * If CONFIG_BOOT_RETRY_TIME is defined and retry_time >= 0,
 * time out when time goes past endtime (timebase time in ticks).
 *
 * @prompt:	Prompt to display
 * @buffer:	Place to put the line that is entered
 * @timeout:	Timeout in milliseconds, 0 if none
 * @return command line length excluding terminator, or -ve on error: of the
 * timeout is exceeded (either CONFIG_BOOT_RETRY_TIME or the timeout
 * parameter), then -2 is returned. If a break is detected (Ctrl-C) then
 * -1 is returned.
 */
int cli_readline_into_buffer(const char *const prompt, char *buffer,
				int timeout);

/**
 * parse_line() - split a command line down into separate arguments
 *
 * The argv[] array is filled with pointers into @line, and each argument
 * is terminated by \0 (i.e. @line is changed in the process unless there
 * is only one argument).
 *
 * #argv is terminated by a NULL after the last argument pointer.
 *
 * At most CONFIG_SYS_MAXARGS arguments are permited - if there are more
 * than that then an error is printed, and this function returns
 * CONFIG_SYS_MAXARGS, with argv[] set up to that point.
 *
 * @line:	Command line to parse
 * @args:	Array to hold arguments
 * @return number of arguments
 */
int cli_simple_parse_line(char *line, char *argv[]);

#if CONFIG_IS_ENABLED(OF_CONTROL)
/**
 * cli_process_fdt() - process the boot command from the FDT
 *
 * If bootcmmd is defined in the /config node of the FDT, we use that
 * as the boot command. Further, if bootsecure is set to 1 (in the same
 * node) then we return true, indicating that the command should be executed
 * as securely as possible, avoiding the CLI parser.
 *
 * @cmdp:	On entry, the command that will be executed if the FDT does
 *		not have a command. Returns the command to execute after
 *		checking the FDT.
 * @return true to execute securely, else false
 */
bool cli_process_fdt(const char **cmdp);

/** cli_secure_boot_cmd() - execute a command as securely as possible
 *
 * This avoids using the parser, thus executing the command with the
 * smallest amount of code. Parameters are not supported.
 */
void cli_secure_boot_cmd(const char *cmd);
#else
static inline bool cli_process_fdt(const char **cmdp)
{
	return false;
}

static inline void cli_secure_boot_cmd(const char *cmd)
{
}
#endif /* CONFIG_OF_CONTROL */

/**
 * Go into the command loop
 *
 * This will return if we get a timeout waiting for a command, but only for
 * the simple parser (not hush). See CONFIG_BOOT_RETRY_TIME.
 */
void cli_loop(void);

/** Set up the command line interpreter ready for action */
void cli_init(void);

#define endtick(seconds) (get_ticks() + (uint64_t)(seconds) * get_tbclk())

#endif


There are so many amazing wedding venues Melbourne can offer you, and you'll find that we live in one of Australia's best cities in which to get married. With beautiful venues like the Myer Mural Hall, The Langham, and the Park Hyatt, there are so many elegant venues to choose from.
But, you may not know about some of Melbourne's hidden gems. They're not the classic wedding venues, but they're amazing and elegant all the same!
The Yarra Valley is a bit of a drive from Melbourne, but it will be totally worth it once you see the gorgeous background offered by the Stones of the Yarra Valley venue. You'll love the simplicity of the location, and yet there's an elegance about it that you just can't help but fall in love with. It's one of the Yarra Valley's best wedding venues, but few that live in the bustling city of Melbourne know about it.
How about getting married on Mount Dandenong, where the views are spectacular and the photo opportunities abound? You'll find that Tatra's Receptions is a simple venue, but the simplicity and natural feel of the location makes it work. With both indoor and outdoor options, it's a place where you can get married in a small ceremony while still feeling like royalty.
This is a massive event hall, one that many Melbourne citizens have passed by without even knowing what's inside the huge building. When you enter, you'll see the towering cathedral ceilings, massive windows, and a gorgeous décor. If you're planning an event with 1000+ guests, this is a place you should definitely look into.
A country club is a wonderful, expensive place to get married. This is a club like no other, situated in the center of Yarra's wine region. It makes for a gorgeous wedding, and you'll love the fairytale feel of the place as you and your partner wander through the expansive club. It's definitely a venue to remember.
Want to get married in an old-timey mansion, where you can feel like lords and ladies? The Rippon Lea estates provide you with one of the best venues for those that want to experience the rich history of long ago. This mansion is one of the oldest in the region, and the sprawling estate and gardens will take your breath away.
Award-winning venue Red Scooter offers you an experience to remember. The New York style venue is known for its unique décor, and the professionals planning the wedding have earned a reputation as being the best that Melbourne has to offer. The venue is as flexible as it gets, and you'll love the uniqueness of the place. Just the massive TV screens on the walls of the venue are enough to have you goggling with wonder, and its location just a few kilometers from Melbourne's CBD puts it in a tip top location for your wedding.


text:
The principal consequences of corruption
Corruption qoute from the financial life:
"Corruption is a cancer that steals from the poor, eats away at governance and moral fibre and destroys trust."
Robert Zoellick, ex-president of the World Bank – https://en.wikipedia.org/wiki/Robert_Zoellick
Corruption qoute from a writer
"A fish rots from the head"
Joseph Wambaugh, American writer – police work in the United States
https://en.wikipedia.org/wiki/Joseph_Wambaugh
Corruption qoute from the political life
"The accomplice to the crime of corruption is frequently our own indifference."
Bess Myerson – American politician and model https://en.wikipedia.org/wiki/Bess_Myerson
Corruption qoute from Ireland
"Among a people generally corrupt liberty cannot long exist."
Edmund Burke – Irish statesman and philosopher https://en.wikipedia.org/wiki/Edmund_Burke
Corruption qoute from an author
"Politics, it seems to me, for years, or all too long, has been concerned with right or left instead of right or wrong."
Richard Armour – American poet and author – https://en.wikipedia.org/wiki/Richard_Armour
Practical consequences of corruption
Corruption qoute from the USA
"There can be no effective control of corporations while their political activity remains. To put an end to it will be neither a short nor an easy task, but it can be done… Corporate expenditures for political purposes, and especially such expenditures by public-service corporations, have supplied one of the principal sources of corruption in our political affairs."
Theodore Roosevelt, president of the USA – https://en.wikipedia.org/wiki/Theodore_Roosevelt
Corruption qoute from Germany
"Corruption is a major cause of poverty as well as a barrier to overcoming it. The two scourges feed off each other, locking their populations in a cycle of misery. Corruption must be vigorously addressed if aid is to make a real difference in freeing people from poverty."
Peter Eigen – German head of the Transparency International
https://en.wikipedia.org/wiki/Peter_Eigen
Corruption qoute from Africa
"But when you have bad governance, of course, these resources are destroyed: The forests are deforested, there is illegal logging, there is soil erosion. I got pulled deeper and deeper and saw how these issues become linked to governance, to corruption, to dictatorship."
Wangari Maathai – Kenyan social, environmental and political activist; first African woman to win the Nobel Prize https://en.wikipedia.org/wiki/Wangari_Maathai
"If the Nuremberg laws were applied, then every post-war American president would have been hanged."
Noam Chomsky – American linguist, philosopher, cognitive scientist, historian, social critic and political activist https://en.wikipedia.org/wiki/Noam_Chomsky
Corruption qoute from the Balkans
"Democracy must be built through open societies that share information. When there is information, there is enlightenment. When there is debate, there are solutions. When there is no sharing of power, no rule of law, no accountability, there is abuse, corruption, subjugation and indignation."
Atifete Jahjaga – Kosovar politician and stateswoman https://en.wikipedia.org/wiki/Atifete_Jahjaga
Historical Overview about the Corruption
Corruption qoute from the antiquity
"The abuse of buying and selling votes crept in and money began to play an important part in determining elections. Later on, this process of corruption spread to the law courts. And then to the army, and finally the Republic was subjected to the rule of emperors."
Plutarch – Greek philosopher (Lived from 46 to 119) https://en.wikipedia.org/wiki/Plutarch
Corruption qoute from the begginning of the modern age
"I see in the near future a crisis approaching that unnerves me and causes me to tremble for the safety of my country… corporations have been enthroned and an era of corruption in high places will follow, and the money power of the country will endeavor to prolong its reign by working upon the prejudices of the people until all wealth is aggregated in a few hands and the Republic is destroyed."
Abraham Lincoln – president of the USA (Lived from 1809 to 1865)
https://en.wikipedia.org/wiki/Abraham_Lincoln
"Power tends to corrupt, and absolute power corrupts absolutely."
Lord Acton – English historian, politician and writer (Lived from 1834 to 1902)
https://en.wikipedia.org/wiki/John_Dalberg-Acton,_1st_Baron_Acton
Corruption qoute from the modern age
"A man who has never gone to school may steal a freight car; but if he has a university education, he may steal the whole railroad."
Theodore Roosevelt – president of the USA (Lived from 1858 to 1919)
https://en.wikipedia.org/wiki/Theodore_Roosevelt
BUY THE E-BOOK NOW IN PDF VERSION
BUY THE E-BOOK NOW KINDLE VERSION


I'm back this morning with a new Styled in Ireland post and we're going to take a stab at how to prepare for Ireland's rainy weather. First, a little disclaimer. I'm only going to attempt to help you out when it comes to regular rain. In Ireland, we also have what I like to call sideways rain, when the rain combines with wind to sneak under your umbrella and soak you from head to toe. For that kind of rain, all bets are off. Wrap yourself in a few ponchos and hope for the best!
When it's just normal rain, you can usually stay relatively dry with a few (still stylish!) tricks. First, a cute, waterproof rain jacket. I don't think there's any reason rainy days should be made more depressing with dreary black rain coats. This bright patterned one from Avoca's Anthology line has a nice cut and a cute hood.
Second, boots, not wellies. If you are on a farm, mucking around in the mud, wear wellies. I just don't believe wellies are city wear. In fact, I don't even own a pair!
The final element, a sturdy umbrella. You don't want one that'll flip inside out with the slightest breeze. I've had my orange United Colors of Benetton umbrella for four years and it's still going strong, but I do like the ruffle on this creamy umbrella. I might need an upgrade!
Some of the clothing you'll see in Avoca is sourced from around Europe, but their Anthology line of women's clothing is designed at the Avoca headquarters south of Dublin in Kilmacanogue. You can visit the headquarters to shop and enjoy their cafe, but can you imagine working there as a designer every day? How fun!
The Avoca Anthology line is very sweet and feminine, and usually follows Avoca's traditional colors – lilacs, Irish greens, dusty pinks – but they throw in a few modern patterns which are surprisingly fun to mix with stripes and black and white!
And when all else fails, find a pub, order a pot of tea or a pint of Guinness, and wait out the rain. It's bound to end eventually!
Last year when we visited Dublin we felt very touristy with our bright purple and bright blue rain jackets. Everyone seemed to be in black or dark colors. Glad to see some colors coming in. One of my favorite memories is having a hearty beef stew and cup of tea in the under croft of Christ Church. They had a tiny little place to eat. We lounged on a comfy sofa among the tombs, dry and toasty on a cold wet rainy day.
I agree – it's overall much too dreary! I bet the purple was cheery! I've never eaten down there in Christ Church but I must try it out – on a wet day!
Your photos always make me so wistful for Ireland! And I love the umbrella!
Of all your fashion posts, Emily, this one may be the most useful! (given Irish weather).


text:
<?php

/**
 * Handles user information throughout a session. This class is a singleton.
 */
class Gdn_Session {

    /** @var int Unique user identifier. */
    public $UserID;

    /** @var object A User object containing properties relevant to session */
    public $User;

    /** @var object Attributes of the current user. */
    protected $_Attributes;

    /** @var object Permissions of the current user. */
    protected $_Permissions;

    /** @var object Preferences of the current user. */
    protected $_Preferences;

    /** @var object The current user's transient key. */
    protected $_TransientKey;

    /**
     * Private constructor prevents direct instantiation of object
     */
    public function __construct() {
        $this->UserID = 0;
        $this->User = false;
        $this->_Attributes = array();
        $this->_Permissions = array();
        $this->_Preferences = array();
        $this->_TransientKey = false;
    }

    /**
     * Add the permissions from a permissions array to this session's permissions.
     *
     * @param array $perms The permissions to add.
     */
    public function addPermissions($perms) {
        $this->_Permissions = PermissionModel::addPermissions($this->_Permissions, $perms);
    }

    /**
     * Check the given permission, but also return true if the user has a higher permission.
     *
     * @param bool|string $permission The permission to check.  Bool to force true/false.
     * @return boolean True on valid authorization, false on failure to authorize
     */
    public function checkRankedPermission($permission) {
        $permissionsRanked = array(
            'Garden.Settings.Manage',
            'Garden.Community.Manage',
            'Garden.Moderation.Manage',
            'Garden.SignIn.Allow'
        );

        if ($permission === true) {
            return true;
        } elseif ($permission === false) {
            return false;
        } elseif (in_array($permission, $permissionsRanked)) {
            // Ordered rank of some permissions, highest to lowest
            $currentPermissionRank = array_search($permission, $permissionsRanked);

            /**
             * If the current permission is in our ranked list, iterate through the list, starting from the highest
             * ranked permission down to our target permission, and determine if any are applicable to the current
             * user.  This is done so that a user with a permission like Garden.Settings.Manage can still validate
             * permissions against a Garden.Moderation.Manage permission check, without explicitly having it
             * assigned to their role.
             */
            for ($i = 0; $i <= $currentPermissionRank; $i++) {
                if ($this->checkPermission($permissionsRanked[$i])) {
                    return true;
                }
            }
            return false;
        }

        // Check to see if the user has at least the given permission.
        return $this->checkPermission($permission);
    }

    /**
     * Checks the currently authenticated user's permissions for the specified
     * permission. Returns a boolean value indicating if the action is
     * permitted.
     *
     * @param mixed $Permission The permission (or array of permissions) to check.
     * @param int $JunctionID The JunctionID associated with $Permission (ie. A discussion category identifier).
     * @param bool $FullMatch If $Permission is an array, $FullMatch indicates if all permissions specified are required. If false, the user only needs one of the specified permissions.
     * @param string $JunctionTable The name of the junction table for a junction permission.
     * @param in $JunctionID The ID of the junction permission.
     * * @return boolean
     */
    public function checkPermission($Permission, $FullMatch = true, $JunctionTable = '', $JunctionID = '') {
        if (is_object($this->User)) {
            if ($this->User->Banned || GetValue('Deleted', $this->User)) {
                return false;
            } elseif ($this->User->Admin) {
                return true;
            }
        }

        // Allow wildcard permission checks (e.g. 'any' Category)
        if ($JunctionID == 'any') {
            $JunctionID = '';
        }

        $Permissions = $this->getPermissions();
        if ($JunctionTable && !c('Garden.Permissions.Disabled.'.$JunctionTable)) {
            // Junction permission ($Permissions[PermissionName] = array(JunctionIDs))
            if (is_array($Permission)) {
                $Pass = false;
                foreach ($Permission as $PermissionName) {
                    if ($this->checkPermission($PermissionName, false, $JunctionTable, $JunctionID)) {
                        if (!$FullMatch) {
                            return true;
                        }
                        $Pass = true;
                    } else {
                        if ($FullMatch) {
                            return false;
                        }
                    }
                }
                return $Pass;
            } else {
                if ($JunctionID !== '') {
                    $Result = array_key_exists($Permission, $Permissions)
                        && is_array($Permissions[$Permission])
                        && in_array($JunctionID, $Permissions[$Permission]);
                } else {
                    $Result = array_key_exists($Permission, $Permissions)
                        && is_array($Permissions[$Permission])
                        && count($Permissions[$Permission]);
                }
                return $Result;
            }
        } else {
            // Non-junction permission ($Permissions = array(PermissionNames))
            if (is_array($Permission)) {
                return arrayInArray($Permission, $Permissions, $FullMatch);
            } else {
                return in_array($Permission, $Permissions) || array_key_exists($Permission, $Permissions);
            }
        }
    }

    /**
     * End a session
     *
     * @param Gdn_Authenticator $Authenticator
     */
    public function end($Authenticator = null) {
        if ($Authenticator == null) {
            $Authenticator = Gdn::authenticator();
        }

        if ($this->UserID) {
            Logger::event('session_end', Logger::INFO, 'Session ended for {username}.');
        }

        $Authenticator->authenticateWith()->deauthenticate();
        $this->setCookie('-Vv', null, -3600);
        $this->setCookie('-sid', null, -3600);
        $this->setCookie('-tk', null, -3600);

        Gdn::PluginManager()->CallEventHandlers($this, 'Gdn_Session', 'End');

        $this->UserID = 0;
        $this->User = false;
        $this->_Attributes = array();
        $this->_Permissions = array();
        $this->_Preferences = array();
        $this->_TransientKey = false;
    }

    /**
     * Returns all "allowed" permissions for the authenticated user in a
     * one-dimensional array of permission names.
     *
     * @return array
     */
    public function getPermissions() {
        return is_array($this->_Permissions) ? $this->_Permissions : array();
    }

    /**
     *
     *
     * @param $Suffix
     * @param null $Default
     * @return mixed
     */
    public function getCookie($Suffix, $Default = null) {
        return GetValue(c('Garden.Cookie.Name').$Suffix, $_COOKIE, $Default);
    }

    /**
     * Return the timezone hour difference between the user and utc.
     * @return int The hour offset.
     */
    public function hourOffset() {
        static $GuestHourOffset;

        if ($this->UserID > 0) {
            return $this->User->HourOffset;
        } else {
            if (!isset($GuestHourOffset)) {
                $GuestTimeZone = c('Garden.GuestTimeZone');
                if ($GuestTimeZone) {
                    try {
                        $TimeZone = new DateTimeZone($GuestTimeZone);
                        $Offset = $TimeZone->getOffset(new DateTime('now', new DateTimeZone('UTC')));
                        $GuestHourOffset = floor($Offset / 3600);
                    } catch (Exception $Ex) {
                        $GuestHourOffset = 0;
                        LogException($Ex);
                    }
                }
            }

            return $GuestHourOffset;
        }
    }

    /**
     *
     *
     * @param $Suffix
     * @param $Value
     * @param $Expires
     */
    public function setCookie($Suffix, $Value, $Expires) {
        $Name = c('Garden.Cookie.Name').$Suffix;
        $Path = c('Garden.Cookie.Path');
        $Domain = c('Garden.Cookie.Domain');

        // If the domain being set is completely incompatible with the current domain then make the domain work.
        $CurrentHost = Gdn::request()->host();
        if (!StringEndsWith($CurrentHost, trim($Domain, '.'))) {
            $Domain = '';
        }

        // Allow people to specify up to a year of expiry.
        if (abs($Expires) < 31556926) {
            $Expires = time() + $Expires;
        }

        safeCookie($Name, $Value, $Expires, $Path, $Domain);
        $_COOKIE[$Name] = $Value;
    }

    /**
     *
     *
     * @return bool
     */
    public function newVisit() {
        static $NewVisit = null;

        if ($NewVisit !== null) {
            return $NewVisit;
        }

        if (!$this->User) {
            return false;
        }

        $Current = $this->getCookie('-Vv');
        $Now = time();
        $TimeToExpire = 1200; // 20 minutes
        $Expires = $Now + $TimeToExpire;

        // Figure out if this is a new visit.
        if ($Current) {
            $NewVisit = false; // user has cookie, not a new visit.
        } elseif (Gdn_Format::toTimeStamp($this->User->DateLastActive) + $TimeToExpire > $Now)
            $NewVisit = false; // user was last active less than 20 minutes ago, not a new visit.
        else {
            $NewVisit = true;
        }

        $this->setCookie('-Vv', $Now, $Expires);

        return $NewVisit;
    }

    /**
     * Set a permission for the current runtime.
     *
     * @param string|array $PermissionName
     * @param null|bool $Value
     *
     * @return NULL
     */
    public function setPermission($PermissionName, $Value = null) {
        if (is_string($PermissionName)) {
            if ($Value === null || $Value === true) {
                $this->_Permissions[] = $PermissionName;
            } elseif ($Value === false) {
                $Index = array_search($PermissionName, $this->_Permissions);
                if ($Index !== false) {
                    unset($this->_Permissions[$Index]);
                }
            } elseif (is_array($Value)) {
                $this->_Permissions[$PermissionName] = $Value;
            }
        } elseif (is_array($PermissionName)) {
            if (array_key_exists(0, $PermissionName)) {
                foreach ($PermissionName as $Name) {
                    $this->setPermission($Name);
                }
            } else {
                foreach ($PermissionName as $Name => $Value) {
                    $this->setPermission($Name, $Value);
                }
            }
        }
    }

    /**
     * Gets the currently authenticated user's preference for the specified
     * $PreferenceName.
     *
     * @param string $PreferenceName The name of the preference to get.
     * @param mixed $DefaultValue The default value to return if the preference does not exist.
     * @return mixed
     */
    public function getPreference($PreferenceName, $DefaultValue = false) {
        // WARNING: THIS DOES NOT CHECK THE DEFAULT CONFIG-DEFINED SETTINGS.
        // IF A USER HAS NEVER SAVED THEIR PREFERENCES, THIS WILL RETURN
        // INCORRECT VALUES.
        return val($PreferenceName, $this->_Preferences, $DefaultValue);
    }

    /**
     * Gets the currently authenticated user's attribute for the specified
     * $AttributeName.
     *
     * @param unknown_type $AttributeName The name of the attribute to get.
     * @param string $DefaultValue The default value to return if the attribute does not exist.
     * @return mixed
     */
    public function getAttribute($AttributeName, $DefaultValue = false) {
        if (is_array($this->_Attributes)) {
            return val($AttributeName, $this->_Attributes, $DefaultValue);
        }
        return $DefaultValue;
    }

    /**
     *
     *
     * @return array
     */
    public function getAttributes() {
        return is_array($this->_Attributes) ? $this->_Attributes : array();
    }

    /**
     * This is the singleton method that return the static
     * Configuration::Instance.
     *
     * @return Session
     */
    public static function getInstance() {
        if (!isset(self::$_Instance)) {
            $c = __CLASS__;
            self::$_Instance = new $c();
        }
        return self::$_Instance;
    }

    /**
     * Ensure that there is an active session.
     *
     * If there isn't an active session, send the user to the SignIn Url
     *
     * @return boolean
     */
    public function isValid() {
        return $this->UserID > 0;
    }

    /**
     * Authenticates the user with the provided Authenticator class.
     *
     * @param int $UserID The UserID to start the session with.
     * @param bool $SetIdentity Whether or not to set the identity (cookie) or make this a one request session.
     * @param bool $Persist If setting an identity, should we persist it beyond browser restart?
     */
    public function start($UserID = false, $SetIdentity = true, $Persist = false) {
        if (!c('Garden.Installed', false)) {
            return;
        }
        // Retrieve the authenticated UserID from the Authenticator module.
        $UserModel = Gdn::authenticator()->getUserModel();
        $this->UserID = $UserID !== false ? $UserID : Gdn::authenticator()->getIdentity();
        $this->User = false;

        // Now retrieve user information
        if ($this->UserID > 0) {
            // Instantiate a UserModel to get session info
            $this->User = $UserModel->getSession($this->UserID);

            if ($this->User) {
                if ($SetIdentity) {
                    Gdn::authenticator()->setIdentity($this->UserID, $Persist);
                    Logger::event('session_start', Logger::INFO, 'Session started for {username}.');
                    Gdn::pluginManager()->callEventHandlers($this, 'Gdn_Session', 'Start');
                }

                $UserModel->EventArguments['User'] =& $this->User;
                $UserModel->fireEvent('AfterGetSession');

                $this->_Permissions = Gdn_Format::unserialize($this->User->Permissions);
                $this->_Preferences = Gdn_Format::unserialize($this->User->Preferences);
                $this->_Attributes = Gdn_Format::unserialize($this->User->Attributes);
                $this->_TransientKey = is_array($this->_Attributes) ? val('TransientKey', $this->_Attributes) : false;

                if ($this->_TransientKey === false) {
                    $this->_TransientKey = $UserModel->setTransientKey($this->UserID);
                }

                // Save any visit-level information.
                if ($SetIdentity) {
                    $UserModel->updateVisit($this->UserID);
                }

            } else {
                $this->UserID = 0;
                $this->User = false;
                $this->_TransientKey = getAppCookie('tk');

                if ($SetIdentity) {
                    Gdn::authenticator()->setIdentity(null);
                }
            }
        } else {
            // Grab the transient key from the cookie. This doesn't always get set but we'll try it here anyway.
            $this->_TransientKey = getAppCookie('tk');
        }
        // Load guest permissions if necessary
        if ($this->UserID == 0) {
            $this->_Permissions = Gdn_Format::unserialize($UserModel->definePermissions(0));
        }
    }

    /**
     * Sets a value in the $this->_Attributes array. This setting will persist
     * only to the end of the page load. It is not intended for making permanent
     * changes to user attributes.
     *
     * @param string|array $Name
     * @param mixed $Value
     */
    public function setAttribute($Name, $Value = '') {
        if (!is_array($Name)) {
            $Name = array($Name => $Value);
        }

        foreach ($Name as $Key => $Val) {
            if ($Val === null) {
                unset($this->_Attributes[$Key]);
            }
            $this->_Attributes[$Key] = $Val;
        }
    }

    /**
     * Sets a value in the $this->_Preferences array. This setting will persist
     * changes to user prefs.
     *
     * @param string|array $Name
     * @param mixed $Value
     */
    public function setPreference($Name, $Value = '', $SaveToDatabase = true) {
        if (!is_array($Name)) {
            $Name = array($Name => $Value);
        }

        foreach ($Name as $Key => $Val) {
            $this->_Preferences[$Key] = $Val;
        }

        if ($SaveToDatabase && $this->UserID > 0) {
            $UserModel = Gdn::userModel();
            $UserModel->savePreference($this->UserID, $Name);
        }
    }

    /**
     *
     *
     * @return bool|object|string
     */
    public function ensureTransientKey() {
        if (!$this->_TransientKey) {
            // Generate a transient key in the browser.
            $tk = betterRandomString(16, 'Aa0');
            setAppCookie('tk', $tk);
            $this->_TransientKey = $tk;
        }
        return $this->_TransientKey;
    }

    /**
     * Returns the transient key for the authenticated user.
     *
     * @return string
     */
    public function transientKey($NewKey = null) {
        if (!is_null($NewKey)) {
            $this->_TransientKey = Gdn::authenticator()->getUserModel()->setTransientKey($this->UserID, $NewKey);
        }

//      if ($this->_TransientKey)
        return $this->_TransientKey;
//      else
//         return RandomString(12); // Postbacks will never be authenticated if transientkey is not defined.
    }

    /**
     * Validates that $ForeignKey was generated by the current user.
     *
     * @param string $ForeignKey The key to validate.
     * @return bool
     */
    public function validateTransientKey($ForeignKey, $ValidateUser = true) {
        static $ForceValid = false;

        if ($ForeignKey === true) {
            $ForceValid = true;
        }

        if (!$ForceValid && $ValidateUser && $this->UserID <= 0) {
            $Return = false;
        }

        if (!isset($Return)) {
            // Checking the postback here is a kludge, but is absolutely necessary until we can test the ValidatePostBack more.
            $Return = ($ForceValid && Gdn::request()->isPostBack()) || ($ForeignKey === $this->_TransientKey && $this->_TransientKey !== false);
        }
        if (!$Return && $ForceValid !== true) {
            if (Gdn::session()->User) {
                Logger::event(
                    'csrf_failure',
                    Logger::ERROR,
                    'Invalid transient key for {username}.'
                );
            } else {
                Logger::event(
                    'csrf_failure',
                    Logger::ERROR,
                    'Invalid transient key.'
                );
            }
        }
        return $Return;
    }

    /**
     * Get a public stash value.
     *
     * @param string $name The key of the stash.
     * @param bool $unset Whether or not to unset the stash.
     * @return mixed Returns the value of the stash.
     */
    public function getPublicStash($name, $unset = false) {
        return $this->stash('@public_'.$name, '', $unset);
    }

    /**
     * Sets a public stash value.
     *
     * @param string $name The key of the stash value.
     * @param mixed $value The value of the stash to set. Pass null to clear the key.
     * @return Gdn_Session $this Returns $this for chaining.
     */
    public function setPublicStash($name, $value) {
        if ($value === null) {
            $this->stash('@public_'.$name, '', true);
        } else {
            $this->stash('@public_'.$name, $value, false);
        }

        return $this;
    }

    /**
     * Place a name/value pair into the user's session stash.
     *
     * @param string $Name            The key of the stash value.
     * @param mixed  $Value           The value of the stash to set. Pass null to retrieve the key.
     * @param bool   $UnsetOnRetrieve Whether or not to unset the key from stash.
     *
     * @return mixed Returns the value of the stash or null on failure.
     */
    public function stash($Name = '', $Value = '', $UnsetOnRetrieve = true) {
        if ($Name == '') {
            return;
        }

        // Create a fresh copy of the Sql object to avoid pollution.
        $Sql = clone Gdn::sql();
        $Sql->reset();

        // Grab the user's session.
        $Session = $this->getStashSession($Sql, $Value);
        if (!$Session) {
            return;
        }

        // Stash or unstash the value depending on inputs
        if ($Name != '' && $Value != '') {
            $Session->Attributes[$Name] = $Value;
        } elseif ($Name != '') {
            $Value = val($Name, $Session->Attributes);
            if ($UnsetOnRetrieve) {
                unset($Session->Attributes[$Name]);
            }
        }
        // Update the attributes
        if ($Name != '') {
            $Sql->put(
                'Session',
                array(
                    'DateUpdated' => Gdn_Format::toDateTime(),
                    'Attributes' => serialize($Session->Attributes)
                ),
                array(
                    'SessionID' => $Session->SessionID
                )
            );
        }
        return $Value;
    }

    /**
     * Used by $this->stash() to create & manage sessions for users & guests.
     *
     * This is a stop-gap solution until full session management for users &
     * guests can be implemented.
     *
     * @param Gdn_SQLDriver $Sql          Local clone of the sql driver.
     * @param string        $ValueToStash The value of the stash to set.
     *
     * @return bool|Gdn_DataSet Current session.
     */
    private function getStashSession($Sql, $ValueToStash) {
        $CookieName = c('Garden.Cookie.Name', 'Vanilla');
        $Name = $CookieName.'-sid';

        // Grab the entire session record
        $SessionID = val($Name, $_COOKIE, '');

        // If there is no session, and no value for saving, return;
        if ($SessionID == '' && $ValueToStash == '') {
            return false;
        }

        $Session = $Sql
            ->select()
            ->from('Session')
            ->where('SessionID', $SessionID)
            ->get()
            ->firstRow();

        if (!$Session) {
            $SessionID = betterRandomString(32);
            $TransientKey = substr(md5(mt_rand()), 0, 11).'!';
            // Save the session information to the database.
            $Sql->insert(
                'Session',
                array(
                    'SessionID' => $SessionID,
                    'UserID' => Gdn::session()->UserID,
                    'TransientKey' => $TransientKey,
                    'DateInserted' => Gdn_Format::toDateTime(),
                    'DateUpdated' => Gdn_Format::toDateTime()
                )
            );
            Trace("Inserting session stash $SessionID");

            $Session = $Sql
                ->select()
                ->from('Session')
                ->where('SessionID', $SessionID)
                ->get()
                ->firstRow();

            // Save a session cookie
            $Path = c('Garden.Cookie.Path', '/');
            $Domain = c('Garden.Cookie.Domain', '');
            $Expire = 0;

            // If the domain being set is completely incompatible with the current domain then make the domain work.
            $CurrentHost = Gdn::request()->host();
            if (!stringEndsWith($CurrentHost, trim($Domain, '.'))) {
                $Domain = '';
            }

            safeCookie($Name, $SessionID, $Expire, $Path, $Domain);
            $_COOKIE[$Name] = $SessionID;
        }
        $Session->Attributes = @unserialize($Session->Attributes);
        if (!$Session->Attributes) {
            $Session->Attributes = array();
        }

        return $Session;
    }
}


Seems like ISIS' lone wolfs are on the attack.
A security alert at Manchester Airport has been stood down after a 'suspicious device' was found on an Air France jet.
Greater Manchester Police said the device, on a flight to Manchester from Paris Charles De Gaulle, has been seized by officers and "safely security checked".
Airport operations have returned to normal, the police said.
"Shortly before 1.30pm on Saturday 21 November 2015, police received a report of a potentially suspicious item on a flight from Paris due to land at Manchester Airport.
"The aircraft landed a short time later, where it was met by emergency services and airport staff and passengers safely disembarked from the flight.


Now that the academic school year is over, it is time to rebalance your work and life activities. Ideally, you will want to take a work break during the sluggish days of July and August to reflect, renew and recalibrate for the next term. However, if you are like many Americans, you will probably not plan to leave the office, as vacation is counter to the informal and formal structure of your work.
A Glassdoor study (www.glassdoor.com) of 2,200 employees suggests that average US workers take only half of their allotted paid vacation while other research (www.projecttimeoff.com) suggests that many Americans do not take any. Americans do not fully vacation because of insufficient income, job insecurities, insurmountable workloads, and workplace cultures that are intolerant of employees taking time off. They may also save vacation days for family emergencies such as caring for unruly children or tending to aging parents facing unexpected health crises.
University of Miami's Flexible Summer Workweek Program guidelines (https://umshare.miami.edu/web/wda/humanresources/FlexibleSummerWorkweekProgram/FlexibleSummerWorkweekGuidelines.pdf and Lewis University Summer Flexible Schedule (https://www.lewisu.edu/welcome/offices/hr/summerflex.htm) for examples.
Participating in community venues can greatly enhance your work-life balance. In fact, just knowing that they are available can significantly reduce your stress, as noted by work-life scholar, Marisa Young. Take advantage of low-cost activities, such as public pools, state parks and regional festivals. Check your local newspapers and city government sites for comprehensive listings.
If you are unable to schedule time away from the office, consider restructuring activities within your daily work schedule. Might your schedule allow you to engage in special projects that are not as demanding or more creative? Any variation in the daily grind should provide some much-needed respite from your routine.
Vacations are vital to your overall well-being, like oxygen masks unleashed from overhead airplane compartments during emergencies. If you do not use them, your productivity wanes. So, create ways to find time to relax and recharge as part of your summer self-care. Modest activities can be as enriching as exotic trips abroad if carried out with the same kind of exuberance. When you vacation, you engage in meaningful, relaxing moments that will nourish and carry you forward into the hyperactive months of fall and beyond.


Saturday afternoon, on 1 September 2018, Jamia Ahmadiyya Indonesia held its annual sports event, namely Jamia Sport Competition 2018 (PORJAM).
He explored the profound meaning of what the Holy Prophetsa said regarding the strong believer being better than the weak believer. He explained that the happiness and success of a servant are obviously determined by their enthusiasm and sincerity to do every beneficial thing, both for material and spiritual affairs, and also their state of humility to supplicate before the Almighty God for His succour. When these two elements have been fulfilled, it will be their success. But anyone who fails to pay due attention to this, even a bit, will lose all goodness therein.
Following his address, the principal led prayer to open this event.
All students were devided into their four groups, i.e. Amanat, Diyanat, Rafaqat and Sadaqat and participated in multiple games: football, futsal, volleyball, basketball, badminton, sepak takraw (foot volleyball), sprint 100m, marathon, swimming and table tennis.


text:
Comedy TV on DVD
Comedy TV on DVD──────────All CategoriesHome Garden & Outdoors Gaming Board Games & Card Games DVD & Blu-ray Collectables & Hobbies Music & Books Technology Toys & Games Gifts & Gadgets Sports & Outdoors Clothing Home & Garden
Home / TV on DVD / Comedy TV on DVD / Him & Her - Series 2 DVD
Him & Her - Series 2 DVD
in Comedy TV on DVD
Please note this is a region 2 DVD and will require a region 2 (Europe) or region Free DVD Player in order to play
Russell Tovey and Sarah Solemani star in this comedy that centres on Steve and Becky, an unemployed couple more interested in consumption (food, drink, each other) than they are getting a job. HIM AND HER is a comedy for the naughties: a comedy that lifts the lid on the lives of loafers and the hilarity that ensues. This release contains all episodes from the show's second series.
Death Stranding PS4 Game
"Constantly recommending to all my friends to use this as their one stop gaming and geek online shop!"
— B. Blakemore
Want to know when Him & Her - Series 2 DVD drops below a certain price? Enter your email address and price below and we'll let you know when it drops below that price!


text:
namespace TAO_PEGTL_NAMESPACE::internal
{
   template< typename,
             typename Rule,
             apply_mode A,
             rewind_mode M,
             template< typename... >
             class Action,
             template< typename... >
             class Control,
             typename ParseInput,
             typename... States >
   inline constexpr bool has_match = false;

   template< typename Rule,
             apply_mode A,
             rewind_mode M,
             template< typename... >
             class Action,
             template< typename... >
             class Control,
             typename ParseInput,
             typename... States >
   inline constexpr bool has_match< decltype( (void)Action< Rule >::template match< Rule, A, M, Action, Control >( std::declval< ParseInput& >(), std::declval< States&& >()... ), bool() ), Rule, A, M, Action, Control, ParseInput, States... > = true;

}  // namespace TAO_PEGTL_NAMESPACE::internal

#endif


text:
Q: Visual Studio Installer, perform custom action before files are copied I am using a regular Visual Studio Setup Project to deploy a service.
I need to perform a custom action before the files are copied by the installer.
AFAIS all custom actions (derived from Installer ...) are performed after the files have been copied (which is kind of obvious, since they need to be executed some way).
The actual problem is, that the installer checks by itself which files are in use and stops the service before copying (btw, the dialog of the installer to stop the applications is telling rubbish - but this is a different question). Basically this is a good idea. However, after installation the service configuration is set to re-start the service if it is not running (the service control manager does this job). This configuration is a requirement, it cannot be changed permanently (only temporarily). Later during an upgrade installation this sometimes collides with the (upgrade-)installation process. So in case of an upgrade installation I want to change the (old) service configuration to not restart or even uninstall the (old) service before the files are copied to the target folder. Otherwise copying the files sometimes failes if a file is still in used (since the old service is running again (just restarted by the service control manager) as explained above). To make a long story short, I need to execute some code before the (new) files are copied by the installer.
This is a related question but the answer doesn't fit my question:
Take backup of target dir before files are copied into the target directory by msi Installer

A: The actual answer seems to be: it is not possible.
I didn't have the time to completely switch to WIX or similar alternatives.
This is not a nice solution but it works.
I solved the problem as follows:

*

*Create a new "MySetup.exe" application (Forms, WPF or whatever)

*MySetup.exe checks existings service installations as required (see details of my original question) and uninstalls the services. So it performs the 'custom action'.

*MySetup.exe includes the original MSI file and starts it after the prerequisites have been ensured.

*It checks the results of MSI installation for further error handling.

*One advantage is that I can easily add parameters such as logfile name to the MSI installation.

redpajama_set_name: RedPajamaStackExchange


Summit Landscape Management Irrigation Service Technician's are full-time year round employees that serve both commercial and residential irrigation systems.
-Ability to use multi-meter, wire tracker, fault finder, etc.
-Make necessary repairs to include mainline, valves, laterals, heads, timers, solenoids etc.
-Ability to communicate with clients, supervisor, and coworkers.
While performing the duties of this job, the position is regularly exposed to outdoor environmental conditions including extreme hot and cold conditions. Heavy lifting, bending and crawling may be required. Due to seasonal nature of work, some peak load situations may arise.


text:
About Kipp Shives
About Carl Evangelista
Medical Grants
Women's Grants
Non Profit Organization Grants
Grants By States
Grants By City
Other Grant Information
Grants Guys Videos
Law School Grants Support Both Schools and Students Alike
Kipp Shives | August 14, 2013	| 0 Comments
The top five foundation funders for law school education provide over $20 million a year through the grants they issue through different programs. These grants include scholarships and fellowships and offer assistance to law schools and student law associations. Here we have provided information on what they fund and how to contact each foundation.
The American Bar Association is one of the largest professional organizations in the world. It has almost 400,000 members including attorneys, law students and other professionals affiliated with the legal profession. It was founded in 1878 and maintains its headquarters in Chicago, IL. Annually, it distributes over $8 million dollars in grant funding through two major programs. To reach the ABA, call 1-800-285-2221 or contact the ABA through the foundation website.
ABA Fund for Justice and Education – The FJE was created in 1963 and currently supports the work of the ABA and over 200 public service and educational programs. The five main areas of focus for the foundation deal with access to justice, children and family rights, public education, professionalism in the legal profession and international justice.
ABA Legal Opportunity Scholarship Fund – This scholastic fund offers $5,000 yearly scholarships to minority students to attend law schools accredited by the ABA. Students can receive a total of $15,000 over all three years of school by maintaining program requirements. The fund strives to encourage ethnically diverse students to join the legal profession where minorities are underrepresented. It awards scholarships to 20 students a year. Applicants should have a minimum 2.5 GPA through undergraduate school, show financial need and participate in community service.
Equal Justice Works
EJW was founded by a group of law students in 1986. It works to support law students and graduates that wish to work with underserved communities and causes. It also advocates and lobbies for loan repayment assistance for those in the legal profession that become public interest attorneys. The number to reach the Washington, DC office is 1-202-466-3686.
AmeriCorps Legal Fellowships – AmeriCorps Legal Fellows work with veterans and victims of disasters. Fellowships last two years and start at $36,200 per year plus an education award of $5,550.
Equal Justice Works Fellowships – Between 45-55 lawyers are selected annually for these two-year fellowships. Recipients earn a competitive salary and receive loan repayment assistance.
Public Service Award for a Student – Awards $2,500 to a student from a member law school.
Public Service Award for a Student Group or Project – Awards $2,500 to a student group or project from a member law school.
Loan Repayment Assistance Program – This program matches other loan repayment programs dollar for dollar to pay down student loan debt for lawyers serving in public interest. It covers both undergraduate and graduate debt through federally funded and private education loans.
Skadden Foundation Fellowships
This foundation supports law school graduates who want to pursue a career working with disadvantaged clients through grants that place them with legal and advocacy organizations. Its fellowships award grants to lawyers that serve the poor, homeless, elderly and disabled and who work with critical human rights issues. In some cases, Skadden will apply funding to pay down student loan debt. New law graduates that want to work in the public interest should consider applying for this Peace Corps type legal program. For additional information, contact Director Susan Butler Plum by calling 212-735-2956 or email susan.plum@skadden.com.
Flom Incubator Grants – Incubator Grants pay $10,000 toward projects created by former Skadden Fellows. Funding can be used to expand services or to improve communication with clients. Applications are handled twice yearly with deadlines of January 15 and July 15.
Skadden Fellowships – Fellowships last two years, paying salary and benefits to the fellowship recipient to work with a sponsoring organization. As of 2013, 677 fellowships have been awarded. Visit the foundation website to download an application.
Belgian American Educational Foundation
This is an exchange program between university communities in Belgium and the United States. It offers two fellowships, each sending students, scientists and scholars from each country to the other to attend school or conduct research. Grants are offered to individuals and range from $16,000 up to $50,000 and can be used to pursue law and other graduate level degrees. To contact the BAEF: in Belgium call +32-2-513.59.55 or email mail@baef.be, in the United States dial 1-203-777-5765 or email emile.boulpaep@yale.edu.
Fellowships for Belgian Citizens – The larger of the two programs, last year it sent 88 Belgian Fellows to the United States. Fellowships last 9 – 12 months and offer funding to earn advanced degrees and to pay for research projects. The program also offers conditional grants which are no interest loans for MBA and other management programs.
Fellowships for U.S. Citizens – This program only offers 8 grants a year to study or research abroad, but it awards each $25,000 to be used over one year. It also provides health insurance. Knowledge of Dutch is not required. You must either be enrolled in or have graduated from a graduate level program to apply.
Law School Admissions Council
LSAC is the non-profit that administers LSAT standardized testing. It also provides technology to simplify the admission process to over 200 law schools. It offers a number of initiatives and grant programs. For contact, visit the website contact page or call 215-968-1001.
DiscoverLaw.org Months Program – Available to member schools, this program provides $2,750 grants to fund outreach and awareness to racially and ethnically diverse undergraduate students.
Diversity Initiatives Grant Program – Funds projects that focus on awareness and enrollment in underrepresented minority student groups.
Outreach Grant Program – $10,000 grants are offered to host events that promote legal education. Guidelines require that at least three member schools work together on each event. Applications should be received no later than two months before the planned event.
Research Grant Program – Funds research projects up to $200,000 that deal with topics related to the work of the LSAC. Funds are made to institutions and organizations only.
Students Seeking Support to Attend Law School
Attending law school can be rather expensive, with the average cost of a 3 year program running $130,00 or more. If you are a student looking to attend law school, you should start your search for funding at the school you plan to attend's financial aid office. The Pell Grant offers up to $5,645 per year to low-income students that can be used to attend law school. Currently the program provides around $23 billion each year in grants. Almost all funding available from the U.S. Department of Education's federal student grants and loan programs can be used to attend law school. Also, look into what scholarships are offered through your school. Many of the private foundations that offer funding for students to attend law school work with the schools directly and your school is always the best resource for locating a scholarship or other local aid that support students at your college.
Tags: Law School Scholarships, Law Student Exchange, Public Interest Fellowships
Category: Education Grants
Kipp is the Contributing Editor for Grantsguys.com, covering sources of potential funding in the world of grants. His mission is to assist people like you by locating and sharing private, non-profit and government grants. Got a question or a tip on a neat grant? Connect with him now at kippshives@grantsguys.com. Facebook Twitter Google+
Grants for High School Students to Collect College Cash
Apple Grants: How Students and Schools Can Get Education Discounts
How Target Grants Support Schools and Public Safety Programs
Grants for Hispanic Students Award Scholarships to Attend College
« Illinois Grants Fund Public Programs in the Land of Lincoln
Grants for Adoption Help Families Provide New Homes »
Grants for High School Students to Collect College Cash Apple Grants: How Students and Schools Can Get Education Discounts How Target Grants Support Schools and Public Safety Programs Grants for Hispanic Students Award Scholarships to Attend College
Dental Schools in the United States
Bar Associations in the United States
What is a student grant?
Ronald McBride on Get Free Dentures Through These Grants That Will Make You Smile
Ian Porterfield on Do Grants for Abdominoplasty Provide Free Tummy Tucks?
Rayleen Ryan on Get Free Cataract Surgery and Eye Exams with Sight and Vision Grants
Rita Ditto on Grants for Low-Income Families to Pay for Food, Rent and Bills
Randy kirk on Pfizer Grants Provide Patient Assistance, Health Services and Research
Kayla Freeze-Jones on Grants for Greenhouses and How They Work
Lawanda Jelks on Grants for Quadriplegics Fund Equipment and Rehab Costs
Cynthia Collins on Get Free Dentures Through These Grants That Will Make You Smile
Liz on Basketball Grants Fund Youth Sports Programs
The Charley Wootan Grant Administers Education Assistance
Premature Infant Scholarships and Grants Offered for NICU Nursing
Federal Grants for Education and What They Fund
What is FAFSA and When Should You Apply?
How to Get Grants for Laptops for College Students
A Northern Idaho Grant for Free Firewood
Get up to $5,775 a Year to Attend College with the Pell Grant
How to Apply for the Pell Grant in 2015
Today Is the Best Day to Apply for Grants for College Students in 2015
Beekeeping Grants Support an Important Industry
Small Town Grants Strengthen American Communities
Grants Guys
© 2020 Grants Guys. All Rights Reserved.


The upcoming multiplayer game "Anthem" is getting a demo from Bioware. In the gaming industry of today, demo's have become uncommon but BioWare is going for it so the Anthem demo is expected to come out for all of its PS4, Xbox One, and PC users on 1 February 2019.
The Anthem demo is not going to be the typical preview of the game rather, it will feature the full-game elements so that players can get to know the real essence of the RPG.
Bioware is committed to sharing the action of Anthem with the gaming community to give a peek into the story and the world of Anthem.
However, not everyone will get to experience BioWare's new open-world RPG. According to EA, the demo is exclusive to Access members of PC and consoles, however, you can also pre-order to get access. This may not sit well with those already skeptical of Anthem.
The main focus is going to be the story and gameplay mechanics to give players a taste of things to come.
Bioware's decision for the Anthem demo seems like a surprising move as this might support them in crawling out of the misfortunes faced with Mass Effect Andromeda.
EA would also be looking on to wash off the stains from the Mass Effect Andromeda with the release of Anthem. Hopefully, they would succeed.
Bioware has a lot to prove with the Anthem in terms of story mode as the developers have previously been known for RPG elements deeply rooted in the stories they develop. But Mass Effect 3 and Andromeda lacked a strong narrative.
Bioware claims to have an ever-expanding story mode for Anthem and addition to that, they also believe Anthem to be a storytelling evolution.
But releasing the demo so close to release won't give developers time to gather feedback from the community. In case, there are issues that need to be addressed, BioWare won't have time.


text:
Start Your Success Story
Strategy & Architecture
Web Design & Integrations
Web+Mobile
SEO+SEM
Bloomsburg University Foundation
New Visual Identity Encourages Foundation Giving
The Bloomsburg University Foundation's mission is to support the advancement of Bloomsburg University, one of the oldest and largest universities in the Pennsylvania State System of Higher Education. The foundation was in need of a strategic and tactical partner to help them envision a communications plan for a monumental $50 million It's Personal capital campaign. Our goal: to support the foundation in their kickoff and throughout the duration of campaign.
We started the branding and visual identity process by interviewing members of the university faculty and staff, as well as students and alumni. This research guided development of a comprehensive communication plan with multi-audience, multi-year tactical components. To introduce the campaign, we developed a new website, campaign prospectus and collateral for each of the four campaign priorities.
Prospectus Cover
Priorities Brochures
The campaign website launched in early October 2015, and serves as a critical storytelling platform in support of the foundation's fundraising efforts. The new site is seeing:
23% improvement
Visitors' Time on Site
The It's Personal logo and broader visual identity established through the campaign's initial set of deliverables has proven to be a flexible, adaptable system that has transferred to widespread use in print and electronic communication vehicles, both in projects MoJo Active continues to direct, as well as client-managed projects.
The team at Mojo Active did a great job of working with our staff from both the university and the foundation. From the very beginning of our creative process, they effectively identified our needs and involved the right people from their team to help create a plan that showcases the It's Personal brand and ties it with the university and its mission. MoJo Active also worked closely with us to provide user-friendly solutions that help us keep our website up to date and successfully integrated the It's Personal brand into all of our campaign materials.
-Doug Kleintop, Director of Development
MoJo Active
14 West Brimmer Avenue
Watsontown, PA 17777
Business Driven
Deep Industry Experience
Broad Marketing Experience
SEO + SEM
©2020 MoJo Active, Inc. All rights reserved.


Single panel cartoon, launched by the great Creators Syndicate in April, 1994, and mysteriously still managing to run in hundreds of newspapers and websites, including the The Washington Post, Detroit Free Press and The Globe & Mail.
For an archive dating back to 2003 that is searchable by keyword, please visit Cartoonist Group HERE.
For today's cartoon, please go HERE.
Meanwhile, here's a small sampling of some of the most requested and shared panels.
This area will be updated and changed regularly, so suggestions welcome!
All my cartoons - both Speed Bump and Parade magazine panels - are available as color prints on heavy card stock for $50.
Original art, if not already sold, is also available for $250. Those are black & white, but a free color print is included.
Both prints and original art may be signed and/or inscribed any way you like, since they are sent directly from my attic studio.
If you're interested in reprinting my cartoons in your publication, on your website, on your products, or in a PowerPoint, drop me an email via the Contact link. Rates vary, but my pricing is flexible.
For today's Speed Bump panel, and/or to subscribe to GoComics and get these in your inbox every day (REALLY? REALLY!), click HERE.
Full color book published by Henry Holt in 2015 collects every dog cartoon drawn up to that point, including both Speed Bump and Parade magazine panels, plus a large pawful of BarkBox illustrations.
Smartly edited by Christy Ottaviano and beautifully designed by April Ward, the book also contains personal stories, fun facts, and a few famous pups.
DAPT may be purchased HERE.
A Speed Bump & Slingshot Misadventure series is a chapter book trilogy about a couple of bird buddies who get themselves into, um, "situations."
"This first chapter book series from Coverly, an internationally syndicated cartoonist whose "Speed Bump" cartoons appear in more than 400 newspapers, and the winner of the prestigious Reuben Award for Best Cartoonist, focuses on the travails of a bird named Speed Bump. Speed Bump's brother is the illustrious Early Bird, the one who always gets the worm. This isn't Speed Bump's only problem. He has a hard time waking up, his wings are tiny, his tail feathers are short, and his head is larger than his body. Fortunately, he has a great friend, Slingshot, who knows how to brighten Speed Bump's days. Together they have a life-changing adventure deep in the nighttime forest. Filled with subtle irony, wordplay, and gentle pokes at life, the text is accompanied by appealingly large, cartoon-style, black-and-white line drawings. VERDICT This story will have students laughing out loud and reluctant readers asking for the sequel."
All three books are 120-130+ pages and written for kids ages 7-11.
NotLW may be purchased HERE.
NotLS may be purchased HERE.
NotLZB is available 10/17 and may be pre-ordered HERE.
Picture books I've illustrated, all brilliantly edited by Christy Ottaviano, all published by Macmillan.
There are four collections of Speed Bump cartoons: A Collection of Cartoon Skidmarks (2000, Andrews McMeel), Cartoons for Idea People (2004, ECW), Just One %$#@ Speed Bump After Another (2005, ECW), and Laughter is the Best Medicine (2014, Sellers).
The first three are out of print, but you can still find them at the usual places online or on the not-so-black market.
Do you love dogs? Yeah, me too. And I'm lucky enough to be the primary illustrator for Bark & Co, the cool people who bring you BarkBox.
Take a peek at their Manhattan office (and my murals) HERE.
Their very kind article about me is HERE.
Besides family and friends, my three favorite things in the world might be cartoons, coffee, and beer - and not necessarily in that order, depending on the time of day.
Creating the Java Stout label for Bell's Beer in Kalamazoo was the perfect storm of those three things.
Cartoons that appeared in Parade magazine are also available as prints.
I've only had a few cartoons in The New Yorker, but this one was turned into a mini animation, which I really like. Not sure the gag works as well as the static panel, but you can decide for yourself HERE.


In the diagram a number of battleships are hidden, the complete fleet is shown next to the puzzle. Parts of boats never touch one another, not even diagonally and the numbers next to and below the diagram tell how many parts of boats there are in that particular row or column. More information.
There are 82 Battleships puzzles.