text:
I'm writing these lines on an old Atari 800 XL. Or rather, it looks like one from the outside. But everything beneath the surface has been removed and replaced by a stamp-sized 20$ microcontroller that – plugged into a PC – pretends successfully to be a USB keyboard.
I don't even remember what got me into mechanical keyboards. Maybe the news that Notch wrote Minecraft on a IBM Model M? It's not the first time I heard that particular keyboard being mentioned and finally I gave in and bought one for myself. I wasn't aware how much of a difference the choice of keyboard makes. In hindsight that's just ignorant – now that I've typed on decent keyboards I'll never be content with typing on a mushy OEM device again. The Model M, however? It feels great, but a little too heavy and loud for everyday use. I'm typing on much lighter Cherry MX Reds now. But it will always remain the keyboard that introduced me to the world of mechanical keyboards and it was the reason why – some rainy day last fall – I was browsing a local flee market for used keyboards.
I had no luck with that, but I found an Atari 800XL for 20€ that was in great external condition and I figured I could try to turn it into a keyboard instead.
Core Society
There are striking similarities between my current project Core Society and Grove Script which was the first domain specific programming language I've ever written. It was a really fun project on two levels: It's fun to come up with a domain specific language of your own and then write a parser for it and an interpreter, where, for a change, optimization for speed is actually justified. But once you have established that new interface to talk to your computer the *real* fun can begin: To figure out how to use that new language and see what you can do with it. When you already know a systems inner workings and can change it on a whim if something doesn't please you the learning experience isn't even painful. Core Society is like this. It's about programming cellular automata.
Cellular Automata
Cellular Automata are a well known concept in computer science. Typically you have a regular grid of cells, each in one of a finite number of states. Based on a set of rules you can look at a cell and it's neighbours and decide on the cell's next state. Now you just apply these rules repeatedly to all cells in the grid. It's amazing to think about the complexity that can emerge from even simple setups. Take Conway's Game of Life for example where each cell has only two possible states (on/off) and where only four simple rules define a cells next state based on itself and the local neighbours. And despite that it's not only capable of generating complex evolving patterns, you can even build a Universal Turing Machine with it!
Conway's Game of Life is a simple rule based system, quite in contrast to God's Game of Life
But why simple rules and simple cell states? When I hear the word 'Cell' I think of the building blocks of all known living organisms, capable of self-replication and functionally quite complex. I wanted to step away from simple, rule based systems and towards the complexity of living cells. Why not build a cellular automaton where each cell is a fully programmable little computer? No external rules would decide how a cell's state would change – only the initial programming of the cores would determine the course of the simulation.
The Cores
I've never written an emulator before but that was exactly what I needed to do next – just that I wasn't emulating an already existing computer system but a system I had yet to define. A system specifically designed to serve as a programmable cell in a CA.
The architecture I've settled with acts like a von Neumann machine where instruction and data share the 256 16bit words of memory. That means the whole memory is mapped to an 8bit address space. Because I can't use less than a word (16 bit) to encode an instruction I figured there are enough bits left to encode additional information along with the instruction – including the target address the operation is meant to operate on. All other computer systems I know don't have instructions that operate directly on memory. Not only because they have a far larger amount of addressable memory but also because they are designed to run efficient on physical hardware and memory access is a bottleneck. Thus most CPU's have a couple of registers to store binary data in. When you program for those CPU's in assembler you typically spend a lot of instructions copying data between registers and memory and I was pretty excited about a chance to get away without it. Apart from that a lot of the basic instructions in CoreSociety's assembly language will look familiar if you know other assembly languages. Here's the full list.
After planning the instruction set from a semantic point of view I needed to figure out how to map the instruction and all relevant parameters to one or, if the instruction is more complex, two words of memory.
To be memory-efficient not all bits encode the same kind of information in every instruction. For example not all instructions have a second parameter. The INC instruction just increases the value at the given address, while the SET instruction replaces the value at a given address with a new value that also needs to be supplied. If an instruction expects a second parameter the next word following the instruction is assumed to encode this parameter.
Here's how it works in detail: The highest four bit of an instruction word always encode the instruction group. If a group consists of complex operations that require two operands only 2 bits are available to identify the group member. The 3rd bit (Param Flag) will encode whether the following parameter word, that encodes the second operand, is interpreted as a numeric value or as a pointer to an address. So there are 16 distinct groups possible that can either consist of 4 complex or 8 simple instructions. More then enough for our needs.
The next bit is the Target Flag and it tells the processor how the lower 8bits of the instruction word, that always encode the first operand of the operation, are to be interpreted. When it's set the operation's target is not an address but a numeral value or an address reached by indirection. Indirection means the passed address is not used directly as the target but read to get another address which is then used as a target.
When a second parameter is required the word after the instruction can either be interpreted as a 16 bit numeric value or an address that can be either supplied direct or by (recursive) indirection.
The Assembler
To verify the architecture I've build a prototype IDE to write and run core programs in. Basically you write a listing of a custom assembly language which is immediately compiled into a core's memory. The core's memory is visualized as colored blocks and also written out in HEX numbers. You can step through the code and watch the operations change the memory. The assembly language is pretty simple. There's a 3-letter mnemonic assigned to each instruction followed by one or two operands. You can use labels to assign names to specific memory addresses and use those names instead of the actual address. Comments are also supported.
This is the IDE where the cell-programms are written and tested. Click for an unscaled version!
It's surprising what you can do with just 512 bytes. A program to calculate prime numbers that I wrote as an early test-case was only 17 words long, leaving more then enough room to store the primes. Another positive side-effect of such tiny memory is that you can visualize all the data with a couple hundred pixels. I found it pretty fascinating to watch the little cores work!
A core viewed in the IDE spending 255 energy on calculating primes. The last primes it finds is 19, then he runs out of energy.
The Grid
The next step after implementing the virtual system that would represent a cell in the Cellular Automata was to put a bunch of them together in a grid so that they could start interacting.
This is the GRID the simulation takes place. Each tick the core with the highest unbound energy get's to execute an instruction. Energy is distributed cyclical until the energy budget is spend!
With the basic set of instructions in place I needed to figure out the rules by which cores (e.g. the cells) would be able to interact with their neighbours and how the system would decide which core would get to execute an instruction next. The straight-forward solution would be to just let them execute one instruction one after another and to add some instructions to read and write the memory of neighbouring cores.
But I've settled with something more complex. I had this grand vision that Core Society might evolve into a platform for competitive programming games. Like an arena where you'd try to write the perfect program to beat a challenge or compete with other programs for grid space. So I added an energy mechanic that governs the execution and interaction of programs. Energy is a precious resource that each core accumulates over time. It is spend when a core executes instructions. A core can spend energy to shield itself, preventing adjacent cores from writing into it's memory. It can also reserve an amount of energy that when released allows the core to execute a number of instructions uninterrupted. There is an instructions that allows you to transfer energy into a neighbouring core. And one to drain energy from it, respectively.
So with a few bytes a core can be programmed to copy it's program to neighbouring cores. Once the program has spread over multiple cores those can work together to establish dominance of the grid against competing programs or fulfil whatever goals they were programmed to.
Last but not least – to facilitate the creation of scenarios – I added an instruction to raise and one to lower a global score. It serves as a metric to gauge efficiency of a solution to a scenario. Obviously the more excess energy you can spend on raising the score the better the final score will be. The initial board state could involve some cores that lower the score constantly so a high scoring solution would need to be very efficient in gaining control of these cores as fast as possible.
The green core is calculating primes, supported by the grey cores who provide it with energy! The blue cores try to prevent the red core from taking over the board by spending their energy to keep a shield up and supporting neighbours.
Give it a try!
If you'd like to see more than animated gifs I'd suggest you check out Core Society's Github repository or download it's content as a ZIP. It includes a precompiled executable, full source-code, documentation and a couple of scenarios including reference solutions.
Getting Started
- You might need to install the .Net Framework 4.5 redistributables if you don't have them installed.
- Then just start the prebuild executable (CoreSociety.exe) or build it yourself with Visual Studio 2013. (Should run on Mono, too)
- Click on the top left icon to open a scenario. A click on the 'Play' Icon starts the simulation.
- You can click on a listing in the 'Deck' to open the IDE window that allows you to modify the listing. The changes will automatically apply to the initial state of all cores that show the listing's color.
- To learn more about the instruction set and how to program a core have a look at the Documenation.
- If you've got questions and can't find answers in the docs just comment below!
Minimal Bitcoin Miner in C#
Bitcoin was introduced in 2009 as a digital, decentralized currency. In the Bitcoin network there's no central authority. Instead a public ledger of every transaction is validated and shared using peer-to-peer technology. Recently there was a surprising spike in the value of Bitcoins, making me curious to find out more of the system behind.
Bitcoin transactions are grouped and confirmed by encoding them in a block and adding it to a blockchain that is protected by strong cryptography. The cryptographic calculations aren't provided by a central authority – instead anyone with capable hardware and mining software installed can provide computational labor to help solve the next block.
When a block is solved the successful miner (or mining pool) earns a reward in Bitcoins. (Currently 25 BTC – worth about 2500€) This is quite an incentive and so Bitcoin mining evolved into a very competitive market. Advanced mining software uses GPU's to compute hashes a hundred times faster then possible on CPUs and there is even dedicated hardware with hashrates in the Giga-range and a better Hashrate/power-consumption ratio. Nonetheless incredible amounts of electricity (~1 GW/h) are wasted on mining Bitcoins which is basically spend calculating zillion's of SHA256 hashes. Currently the combined network of miners calculates roughly 80.000.000.000.000 Hashes per second. Crazy stuff.
If you are trying to understand how Bitcoin mining software works but can't find a reference implementation that is minimal and easy to understand (like me, 2 days ago) here's my contribution:
Miniminer is a simple CPU based Bitcoin Miner in C#. Only about 300 lines of code but fully functional, open source and uploaded on Github.
It uses the basic GETWORK protocol to connect to pools and mines at ~400Kh/s a second. That's not fast enough for serious mining but enough to find a valid share eventually, submit it to the pool server and be happy about the fact that you understand every single line of code that made it happen!
Grove Script
In the past months I've been reading up on procedural generation and emergence. My reasearch led me to develop a scripting language to be able to interactively 'program' L-system based fractal animations. It's meant to be easy to pick up and modify, so it might be a nice sandbox for people that would like to learn to program or just want to engage in a session of creative coding. It's quite fun once you've gotten the hang of it!
I think every programmer has dabbled with Fractals at one point. I remember generating Mandelbrot images on the very first computer my family owned.
Last fall Josh Parnell pitched his project Limit Theory on Kickstarter. His claims sounded way too ambitious for a one-man project, yet he raised more then 350% of the funding goal. So why did people trust him to pull it off? His pitch video was featuring quite some cutting-edge procedural generation technology.
This project rekindled my interest on that topic. I found a pdf copy of the book "Algorithmic Beauty of Plants" and was intrigued. The basic concept of L-System is simple enough. It's grammar based rewriting system, a theoretical framework for modelling the development of simple multicellular organisms, introduced 1968 by the Hungarian theoretical biologist and botanist Aristid Lindenmayer.
But the above book introduced me to more advanced variants of L-Systems, adding context sensitivity, randomness and parameters. The examples were quite impressive and my urge to experiment with it irresistible.
Usually L-Systems define a bunch of production rules that operate on strings of symbols. When a rule is applied it replaces a sequence of symbols in the string (the predecessor) by a different, typically more complex sequence (the successor). The more iterations you perform the longer and more complex the string of symbols becomes. Symbols are statically defined to do a very specific thing like rotating or moving a cursor to generate a rendering.
Imagine the above string of symbols were generated using L-Systems. F is defined to move forward, + to rotate left and – to rotate right.
This method of programming line based drawings by controlling a cursor through commands that move and rotate it relative to it's current state is called Turtle Graphics. The programming language Logo designed for educational use first introduced it and it's quite intuitive to grasp.
Grove Script
My experiments turned into a little scripting language to interactively 'program' L-system based fractals, called Grove Script. At first it seems like it does nothing special as it is based on the concept of using turtle graphics in conjunction with L-systems, too.
But, instead of statically defining an alphabet of symbols that the productions operate upon and that have a specific meaning when executed, in Grove Script the symbols refer to executable code. The key idea is that instead of programming everything like in your typical programming language or forfeiting the flexibility of procedural languages completely like in your typical rewriting system Grove Script brings both worlds together. It allows you to use rewriting rules to create complex sequences of procedure calls by applying simple rules to equally simple axioms.
And unlike most other script- or programming languages where writing and running the program are separate steps Grove Script is aiming to allow users to develop fractal renderings and animations in an fun, intuitive process: There's no compiling or restarting required when you change the code. You get instant feedback on your changes. I let Bret Victor explain why that's a good thing!
You're free to use your favorite Text Editor to write Grove Script. But when the script you're editing is running in the interpreter every changes you make will be instantly incorporated.
The most basic productions just replace a token with a with some replacement whenever it is encountered. Rules need not be simple, though. Grove Script supports:
- Context Sensitivity – Rule can require multiple tokens to be encountered in order.
- Parametric Tokens – Tokens can have a parameters attached.
- Conditions – Production trigger only if the supplied boolean expression evaluates to 'true'
- Consequences – Rule-specific code can be executed whenever a production triggers. Great to raise some counter variables.
Instruction Set
As mentioned before I use the concept of Turtle Graphics in Grove Script. All pixels are drawn by the turtle, controlled by only a handful of straightforward commands. Besides commands to modify the turtles spatial state you can set the size, transparency and color of the line. That's it.
There are other commands to save and restore the interpreter state on a stack – very important to generate branching structures. There's an instruction to call subroutines or a list of subroutines. And of course those subroutine-lists are ideal to be generated with L-System-inspired productions. So you got a command to initialize a list with the axiom and one to apply a ruleset. Last but not least you can define variables through commands that can be used in algebraic and boolean expressions.
But all in all there are only a dozen commands you have to familiarize yourself with to unlock the full potential of Grove Script.
I found a way to handle all the usual control flow (conditional branching, loops) with 3 basic instructions that operate on code blocks marked using Tab indentation.
- Repeat – Continue with the first of all previous instructions of the same block depth
- Break – Skip all following instructions of the same or greater block depth
- Gate – When condition evaluates to false, skip all following commands of the same or greater depth, except other Gate instructions op's of the same depth.
Using these control-flow instructions to the desired effect is a little counter-intuitive though. So to improve the usability I added macros that will unfold to the required operations when the interpreter parses the script. Macros blend well with instructions and improve readability. Being able to write code that uses familiar words like "while, until, repeat, if, else" hopefully appeals to people with and without programming background alike.
Thanks to macros you can write this…
repeat 4 out 'foo
… which unfolds to this…
set _c, 4 gate _c > 0 out 'foo set _c, _c-1 repeat
The interpreter is written in C++ and quite fast. It renders even complex fractals that require thousands of instruction calls in real-time. If it's possible to render 60 frames per second it would be a waste to never change the output. By using the time() function in expressions you can generate fractals that change over time and render animations. Another important function in that regard is random() which provides you with pseudo random numbers. You can use the time() to calculate the random seed to be used by the PRNG and suddenly the randomness is under your control. It took me a while to figure out how to use these elements in conjunction with productions but once you've gotten the hang of it it's quite easy to script quite impressive looking vector graphics that let you forget that everything you see is rendered with the plain olde Turtle Graphics approach.
Excuse the poor quality. I just captured the interpreter with Hypercam instead of rendering to video directly.
To experience Grove Script the way it's meant to be you should check out the Github repository. There's a precompiled interpreter, full source-code, documentation, examples and a half finished tutorial! Feel encouraged to try it for yourself: Start Grove.exe. Drag&Drop some scripts from the example folder to the application. You can edit the script while Grove executes it and it will adapt at run time. If you've got questions and can't find answers in the Docs or from the tutorial just comment below!
There's no reason this shouldn't compile on Mac or Linux. If you want to make your own build you need the Cinder Framework – the rest is just plain standard C++.
And if you just want to know how Grove Script looks like without having to download and run executables from the internet here's the listing that generates the animation from the above video:
//set some basic constant parameters to be used in expressions set speed, 15 set fadetime, 20 set budstep, 5 set maxage, 70 set leafAge, 5 //let the size of the structure adapt with window size set step, 0.5*_height/480 //these variables change every frame because they all depend on the current //value of the time() function. //Thanks to the modulo operate age wraps around at maxage. set age, (speed*time()) % maxage set fade, min(1, (maxage-age) / fadetime) out fade set age, 2.5*age^0.55 set frac, max(0.01, frac(age)) //each structure should look unique. //So we use a different random seed for every new structure out 'rnd seed, floor(time()*speed/(maxage)) shuffle floor(time()*speed/(maxage)) //init the turtle dir random(360) pos 0, step*(5*age-100) //set the axiom of the 'plant' structre seed plant, A(0,0,1) //apply the ruleset 'r1' as often as the plant is old. repeat age grow plant, r1 //fun info: how many buds were generated? out budCnt //render 'plant' twice - mirrored. push rotate -45 run plant pop rotate 135 run plant //Now the Tokens that the L-System operates upon are defined. //light blue tips of the structure #A(age, angle) run shade(leafAge/frac) size frac^0.5 move step*frac^0.5, angle //what becomes of A in the next cycle - a simple curve #B(t, angle) run shade(leafAge/(t+frac)) size (t+frac)^0.5 move step*(t+frac)^0.5, angle //B becomes C when it's old enough to spawn leaves - does the same thing, though #C(t, angle) run B(t, angle) //a growing leaf #L(t, angle) run leaf(t+frac, angle) //a finalized leaf #xL(t, angle) run leaf(t, angle) //a growing bud #Y(t, spread, angle) run bud(0.3*(t+frac), (spread+frac)*budstep, 0.1*angle) //a finalized bud #xY(t, spread, angle) run bud(0.3*(t+frac), (spread+frac)*budstep, 0.1*angle) //render a bud #bud(len, angle, curve) run budshade(1/len) //left side push size 2*len^0.3 rotate angle move len^0.3, angle size len/2 rotate -90 move len, -angle pop //right side push size 2*len^0.3 rotate -angle move len^0.3, -angle size len rotate 90 move len, angle pop //stem rotate curve move 0.55*len^0.7 //render a leaf #leaf(len, ang) size 1 rotate 10*ang*len^0.6 move 0.5*len^0.3 move len^0.6, ang*(60+len*5) rotate 180 - ang*0.4*(60+len*10) move 0.5*len^0.5, -ang*(len*5) move 0.7*len^0.5, ang*(len*10) //color buds #budshade(alpha) visible alpha * fade rgb 1.0-0.8*alpha*alpha, 0.6*alpha+0.2, 0.2*alpha*alpha //color rest #shade(alpha) visible alpha * fade rgb 1.0-0.5*alpha, 0.5*alpha+0.5, 0.3*alpha #[ push #] pop //The rules are evaluated in the order of appearance. //rare rules appear first, if all are skipped the general case is usually to just grow the existing tokens #r1 //BRANCHING //higher c makes a vine less likely to bend or split but increases chance to spawn buds A(i, j, c) : rnd(0, c) > 2+budCnt -> B(1, j) Y(0, 1, j) raise budCnt, 1 //if old enough there's a chance to split into 3 A(i, j, c) : i > c and rnd() < 0.5/c -> B(1, j) [ A(0, rnd(-40,-60), c+2) ] [ A(0, rnd(40,60), c+2) ] A(0, 0, c+1) //...or into 2 A(i, j, c) : i > c and rnd() < 0.5/c -> B(1, j) [ A(0, rnd(-40,-60), c+1) ] A(0, rnd(40,60), c+1) //or just change the direction A(i, j, c) -> B(1, j) A(i+1, j+rnd(-90, 90)/(c+1), c) //LEAVES //based on the curvature leaves spawn on different sides B(i, j) : j < 0 and i = leafAge-1 -> C(i+1, j) [ L(0, 1) ] B(i, j) : j > 0 and i = leafAge-1 -> C(i+1, j) [ L(0, -1) ] //GROWTH //and of course everything needs to grows Y(i, j, k) -> Y(i+1, j+1, k) xY(i, j, k) B(i, j) -> B(i+1, j) C(i, j) -> C(i+1, j) L(i, j) : i > 1+rnd(7) -> xL(i+1, j) L(i, j) -> L(i+1, j)
The following wall of text contains musings on how todays video games are missing their potential. I analyzes the game industry's focus on surface values and why that's a bad thing. I argue that photo-realism isn't required for immersion, and point out what is instead. I draw parallels to the state of AI research. I critizise a lack of investments in R&D and a stagnation despite video games being far from realising their potential. Read it!
I wanted to create games for the better part of my life. I enjoyed playing video games but what fascinated me was their yet unfulfilled potential. Hardware was growing more powerful at a staggering pace and games were the only kind of consumer oriented software that could motivate people to upgrade their systems every two years. It was this synergy between hardware and video games that allowed both industries to prosper. We were witnessing the birth of a new medium and I wanted to have a part in shaping it.
Moore's law, the prediction made in 1965 that the complexity of integrated circuits would double every two years, remained surprisingly accurate for over half a century. The improved capabilities of electronic devices changed our lives profoundly. When I'm surfing the net with my smartphone, reading a book on my kindle, depending on amazon, google, wikipedia or the navigation assistant to solve my day-to-day problems I realize that technology has advanced way beyond what I could have imagined 15 years ago.
Video Games on the other hand turned into a disappointment. Not because my career plans failed – I have studied multimedia engineering and make my living in the games industry. But the product is not what 15-year-old me would have expected videogames to be like in 2013. Not remotely close. That's a thought provoking revelation for someone that devotes most part of his waking hours to games.
Partial Occlusion Field-of-View
It seems like there are problems that I have to solve over and over again. Pathfinding is one of them. Another is visibility determination.
When you need to know if there's an unobstructed line of sight between point A and point B you typically just cast a ray from A to B and see if it hits something. The set of all points that can be reached with an unobstructed line from A are referred to as A's Field of View. Calculating it accurately would require an unlimited amount of rays, so you typically sacrifice accuracy by partitioning space in some discrete data structure. Grids, Trees, Pixels, Voxels… that kind of thing.
In this post I'll focus on FoV calculations on square grids. Using a low resolution square grid is a pretty huge abstraction, and the whole point of this article is to show how to get some accuracy back without losing too much performance! But let's start simple…
Calculate Field of View with Raycasting
As long as you only care for a Boolean result (is a square B visible from square A in the center) it's straight forward to calculate using raycasting.
First of all consider how many rays you need: Just enough so that every field that could potentially be part of the Field of View is passed by at least one ray. So better define a max range or you would still have to cast an unlimited number of rays despite working on a low resolution square grid. Now select fields at maximum range so that those fields completely enclose your center. Draw lines to them and all closer fields are automatically tested too!
Raycasting only towards fields at max-range reduces the algorithms complexity from O(n³) to O(n²). Thtat's a huge difference! Imagine how the illustration would look like if all cells would be target of a raycast…
For line-drawing you can just use Bresenham's Line Algorithm. All clear fields covered by the line are part of the field of view. As soon as you hit an opaque field abort the raycast. It's not part of the field of view and all other fields that follow along the direction of the ray are occluded by it.
There's room for improvement
When I tried to use the raycasting approach to implement dynamic lighting for an isometric 2D game engine I found that I would have to find an improved algorithm to make it look great.
Consider an opaque field casting a shadow. A lot of fields will neither be fully lit nor fully in shadow. From light source's point of view those fields are partially occluded! So I wanted my fields to specify their membership in the Field of View as a percentage (0 – 100%) and not just a Boolean (true or false).
The other limitation I hoped to overcome were integer coordinates. It didn't suffice to say a light-source is on Field (x,y) – I wanted to specify the exact position on the field the light would come from. So I needed to be able to precisely define the center of my Field of View by using non-integer coordinates.
The Mission
I hope I managed to convey an idea of what problem the algorithm I'm about to present is trying to solve. To be sure let's sum up the situation:
- We operate on a square grid that partitions a 2D plane in equally sized fields.
- Some squares are clear (will allow light to pass through) while others are opaque (will block light).
- We define a point for which we want to calculate the Field of View.
- We want to know the degree of occlusion for each square closer then the max range.
My research didn't yield any established solution so I accepted the challenge to find a new one (or reinvent the wheel, who knows). Here's a demonstration of my solution in action:
The full source of the demo is available under the MIT license. However, deducting an algorithm from poorly documented AS3 source code might be a little inconvenient if you want to understand the principles behind it. So I conclude the post with a explanation of the algorithm.
Partial Occlusion Field of View
It helps to think of center of the Field of View as a light source from which light is spreading equally in all directions. The spreading light will exit a square on the edges facing away from the light source and enter a neighbouring square. So for each square you can clearly identify one or two neighbouring cells that all the light is coming from.
Now all you have to do to know how much light is going through a particular square is to ask the relevant neighbours to describe their contribution. If a neighbouring square is opaque it will contribute no light. Otherwise it will contribute a portion of the light it itself received – which can be anything between zero and the width of the shared edge.
Circular sectors to represent beams of light
A simple way to express the "portion of light" is a circular sector. With the center known we just have to store two angles to define such a sector.
This illustration shows how the light passing between two occluders can be described by specifying two angles: Alpha and Theta.
Due to the nature of the grid one sector (e.g. two angles) per neighbour is enough to describe it's contribution! This is because occluders are always one square in size and thus the shadows they cast can't be smaller then one square. With this method of describing lightbeams it's easy to form unions and intersections of lightbeams, too. Unions, when we want to combine the light coming from two different neighbouring squares and Intersections when we constrain the result to the size of our current square.
The Algorithm
The algorithm can be summed up as follows:
FOR EACH non-blocking square:
1: Identify all neighbours that are not opaque
AND share an edge AND are closer to the center.
2: Store the contribution from the first neighbour
as circular sector A.
3: IF a second neighbour exists: store the contribution
from the second neighbour as circular sector B.
4: Calculate a circular sector C that describes the maximum
amount of light that could possibly pass the current square.
5: Form the UNION of A and B and INTERSECT with C to receive D.
D describes the amount of light actually passing the current square.
The smaller the ratio of D to C the bigger the occlusion.
The following illustration demonstrates the process on a square that happens to be half occluded. Only one neighbour contributes light, while the other is opaque.
This animated illustration shows how to calculate the occlusion of a square based on the occlusion of the two of it's neighbours closer to the center.
Calculating a Squares circular Sector
But how to calculate a circular sector that describes the maximum width light beam that could go through a particular square (labeled 'C' in the above illustration)?
To find it you simply calculate alpha for all four corners of the square and pick the largest and the smallest angle to form the circular sector. The resulting sector will enclose the full square.
The illustration shows that there's a distinct pattern in what corners you would have to pick. So you don't have to calculate four values and then discard two. Instead you can evaluate the sign of the x and y component of the vector pointing from lightsource to the square and to predict the correct ones. And if you're going through the sourcecode of my reference implementation and notice these weird looking lines now you know what they do! dx and dy describe the position of the square in relation to the center and (x1, y1) and (x2, y2) are the corner's that define the sector.
var sx:Number = (dx == 0) ? 0 : (dx < 0) ? -1 : 1;
var sy:Number = (dy == 0) ? 0 : (dy < 0) ? -1 : 1;
var ox:Number = (sy == 0) ? sx : 0
var oy:Number = (sx == 0) ? sy : 0
var x1:Number = x + 0.5 * (1 - sy + ox);
var y1:Number = y + 0.5 * (1 + sx + oy);
var x2:Number = x + 0.5 * (1 + sy + ox);
var y2:Number = y + 0.5 * (1 - sx + oy);
Recursion vs Iteration
Another difficulty worth mentioning is that to calculate a particular square's occlusion the occlusion of it's relevant neighbours must be known first. How can we make sure they are already calculated?
The obvious approach would be to use recursion, which means that whenever we query the sector of a cell that hasn't yet been evaluated it's sector will be calculated before the query returns the correct value. To calculate the FoV (e.g. the degree of occlusion of all squares within max-range of the center) using recursion, trigger the evaluation in the four corners of the bounding rectangle. All squares enclosed by the rectangle will be visited before the calls return. There's just no other way for the recursion to terminate than by reaching the center tile for which the occlusion is always known. This is when the evaluation-method ceases to calling itself on neighboring cells and begins to return values. It's a good idea to implement it so that each cell is only calculated the first time it is queried and cache the result. That way subsequent queries don't incur an unnecessary reevaluation.
There's nothing wrong with that approach as long the stack space suffices. But if this could be a problem it's also possible to devise an iterator pattern that will visit squares in such an order that all relevant neighbours have already been calculated.
The demonstration I've linked implements both the recursive and the iterator based version of the algorithm as well as some raycasting based FoV as a reference. Here's the source code of the demo! It's released under the MIT License and includes all relevant dependencies. I hope you enjoyed the lengthy read, feel free to post questions or comments!
Finally blogging on my own webspace!
I have a domain, webspace and unlimitted traffic… there is no good reason beyond lazyness to not host my own blog.
So, no more forwarding to wordpress.com for I found the time and bravery to make the move! I hope everything still works. In the days to come I'll explore the new customization options that I now have.
Matrix Magic
1. How do the properties a, b, c, d, tx and ty map to the coefficients of the matrix?
- deltaTransformPoint transforms a point without applying the translation.
x' = a * x + c * y;
y' = b * x + d * y;
- transformPoint transforms a point including the translation.
x' = a * x + c * y + tx;
y' = b * x + d * y + ty;
3. How to setup the matrix to get the desired transformation?
If you need it you can set tx and ty to move the transformed points relative to the new origin.


text:
Padres mark the anniversary of Gwynn's debut
SAN DIEGO -- On this day in 1982, Anthony Keith Gwynn Sr. made his Major League debut for the Padres. The answer to your next question is easy enough to answer.
Of course he had a hit. Two of them, in fact.
Gwynn, who passed away on June 16 after a battle with cancer of the salivary gland, played all 20 years and 2,440 games of his Major League career with the Padres.
That career started against the Phillies at Jack Murphy Stadium in Mission Valley, the Padres' home at the time.
Gwynn, hitting fifth and playing center field, went 2-for-4 with a run scored and an RBI.
He had to wait until the eighth inning for his first hit, a double off Sid Monge. He added a single in the ninth inning against Ron Reed, but the Padres fell, 7-6, before a crowd of 33,558.
Those two hits were the first of many for Gwynn, who finished with 3,141. He went into the Hall of Fame in 2007.
On June 27, a crowd of 23,229 gathered at Petco Park for a memorial tribute to Gwynn, a moving tribute that included speeches by Reggie Jackson, Trevor Hoffman and Gwynn's agent and longtime friend, John Boggs.

subset: commoncrawl


text:
The maximum number of products that can be compared is 4. Please refine your selection.
Bungalow Flooring Lab Border Charcoal Dog Mat
Price pending
Sold in stores only. Selection varies by store. Check your local store for availability.
Bungalow Flooring Lab Border Charcoal Dog Mat
Price Match Guarantee Details
Attributes / Specifications
Doormat or Pet Bowl Mat that keeps everything off your floors. Our Aqua Shield mat are a great solution for anyone with a pet. They are offered in a variety of styles, sizes & colors. Suitable for indoor & outdoor use. Easy care, all you have to do is hose them off as needed.
- Aqua Shield floor mats are offered in a variety of styles, sizes & colors, are the best solution to trap dirt, water and moisture. Premium grade, anti-static polypropylene fiver face will not mildewm mold or rot and is resistant to the most exteme elements, including intense sunlight.
- Exclusive "Water Dam" rubber border keeps dirt and water in the mat and off the floor. Molded design will not crush or break down over time or use.
- Non-skid, SBR rubber backing is green friendly with 25% recycled rubber.
- Made in the USA
- Certified slip-resitant by the National Floor Safety Institute
- Suitable for indoor & outdoor use
- Hose clean as needed. Remove stubborn stains with a mild detergent & scrub brush.
. For more information go to www.P65Warnings.ca.gov.
- Weight5 LB
- Days to ShipShips Next Business Day
- Primary BrandBungalow Flooring


text:
Last-Resort for Heart Failure Could Be Best Fix
Doctors have discovered that a heart pump designed to help keep patients alive until a transplant becomes available may actually help the heart heal itself. WSJ's Larry Greenberg explains how it could bring new hope to seriously ill patients. (Photo: Getty)
This transcript has been automatically generated and may not be 100% accurate.
... I ... a potential major breakthrough for patients waiting for heart transplants as a mechanical pump used to help them temporarily survive ... actually appears to help their own weekend parts ... Bruckheimer ... the Wall Street Journal Personal editor Pursell Journal editor Mary Greenberg right here he's been overseeing the story he ... joins us right now they're a ... very interesting here and can use a lot of people who think while I'm not connected to it that transplant but let's ... back up a step ... this Hopes primary function is what ... will ... when you servicing this is one of those amazing medical stories in which ... the um doctors to their surprise had seen that ... on that the pump that ... in pump inserted as a temporary fix ... can help to heart ... actually feel it so happened in the heart the leaves of is an amazing idea ... aam when a patient has severe heart failure ... on a heart transplant might be their only option ... aam in the case they will have ... to get that if a donor heart is new building right away they will have a pumpkin planted ... to become a law to keep them alive until ... Annan's takeover for the heart ... until a donor heart can be found and sending found in some of these patients when against time for the transplant a vermouth this pump ... it apart ... and has made he had a resting period and has begun to heal itself did they do they know why that is happy to just ... taking the work off that hard for a while it that's presumably one of the one of the um what's going on but they don't really know they don't even really know why the pump itself ... read ... makes the hearts you know kind of change its shape and gets smaller ... and look more like ... a normal hearts ... says it was the next stage is the next eight to get a group of people for trial to see if you leave them up aam but don't give a transplant ... what's the long to how long they survive you have an Eagle Ford to Test stars of the questions they want answered and now it is a clinical trial getting underway ... made by the University of Pennsylvania ... um um cardiology team and be we'll ... look it's this this questions which patients are most likely to benefit from this procedure ... on how long can fix last ... and any any any anecdotal evidence I found so far that their patients who've been removed from these comps ... and it made for years afterward without having a transplant oh yes there are um we're we've talked to one newbie in our story tonight a ... man in Philadelphia has been two years ... without ... without his heart pump pump he was ... nineteen when now when he ... almost died and that was twenty three that can go back school is working ... until four companies whose heart is working on it so


text:
Pall Wassertechnik GmbH, Hamburg, is a subsidiary of Pall Corporation, the worldwide market leader within separation and filter technology. Pall develops and produces efficient state-of-the-art membrane filtration systems for sea and wastewater purification. A core area is leakage water from refuse dumps. The company employs some 10,000 people in 27 countries.
In addition to fresh and waste water purification systems, Pall Wassertechnik specialises in systems for turning sea water into drinking water on board ships, based on the principle of reverse osmosis (RO) using state-of-the-art membrane technology. For such systems, corrosion-resistant pumps must be used in order to obtain optimal system lifetime.
With the CRT series, Grundfos is the only major pump manufacturer in the world producing high-pressure multi-stage centrifugal pumps made of titanium offering almost 100% protection against corrosion.
The situation
RO technology is a proven technology, and the versatile know-how that Pall possesses within the area of membrane technology is utilised for a wide range of applications. An example of this is the DT disc module in reverse osmosis for purification systems, which has proven particularly efficient and cost-effective. Pall's systems cover all areas of water purification and include solutions capable of handling 100-20,000 l/h. Every day, more than 2,000 systems are delivered worldwide.
The technology used in systems for drinking water extraction is tested to the limit. Systems from Pall Wassertechnik comply with all standards and specifications for the shipbuilding industry as well as for offshore plants. On drilling platforms as well as on land-based seawater plants, the systems have proven to be not only long-lived and reliable, but also highly robust and maintenance and user-friendly.
The Grundfos solution
The Grundfos CRT pumps are characterised by their high level of resistance to chlorine-containing corroding substances, oxidising acids and brine-containing substances. Titanium used to be perceived as an expensive and exotic material for making pumps, but this misconception can today be dismissed as investments are now typically seen in the context of total life cycle costs (LCC), while investment costs have been greatly reduced thanks to mass production.
Titanium is resistant to oxidising acids and chloride solutions, capable of withstanding deep-seated rust attacks and stress corrosion. Due to its low density (4.4 kg/dm3 as compared to 7.8 kg/dm3 for steel), titanium is the ideal raw material for heavy-duty applications on ships and other offshore applications as well as for a variety of aggressive liquids in industry.
The Grundfos CRT range is capable of delivering a head of up to 20 m3/h and a pressure of up to 20 bar.
The outcome
Due to its high content of chlorine ions, seawater is especially aggressive to metals. Consequently, Pall now installs Grundfos CRT pumps in all their RO systems for ships (including many marine units used by naval vessels). These systems have a drinking water capacity of 5,000 l/h.
Being corrosion-resistant, the Grundfos CRT series pumps have a long life expectancy. Despite the initial higher investment costs (a CRT pump typically costs twice as much as a comparable high-grade steel pump), the investment in a CRT pump is returned on the first failure of a conventional pump due to corrosion.
100% corrosion-free pumps - Long lifetime of RO systems - Low weight and increased strength of systems - Reduced service and maintenance costs
Pall Wassertechnik GmbH
Grundfos provided
- 100% corrosion-free pumps
- Long lifetime of RO systems
- Low weight and increased strength of systems
- Reduced service and maintenance costs
Pumps used
- Grundfos CRT range
If you need a similar solution, please contact us for further information.
If you need a similar solution, please contact us for further information.


text:
CHICAGO - The body of a Chicago man poisoned with cyanide after winning the lottery will be exhumed as authorities try to figure out exactly how he died.
The Cook County medical examiner plans to exhume the body of Urooj (oo-ROOJ') Khan on Friday morning from a Chicago cemetery.
Khan died in July as he was about to collect $425,000 in lottery winnings. His death was initially ruled a result of natural causes, but a relative pressed for a deeper look.
Full toxicology results revealed in November that Khan was poisoned. His death was reclassified a homicide.
Authorities hope a forensic autopsy will produce more evidence and tests on Khan's organs may determine whether the poison was swallowed, inhaled or injected.
The medical examiner expects to finish the autopsy Friday.


text:
"Simplicity is supreme sophistication"
Leonardo da Vinci
Designed by Pierre Arpels in 1949, the watch that bears his name epitomizes Van Cleef & Arpels' vision of masculine elegance. A blend of sophistication and restraint, it is notable for a thin case held by two central attachments.
Pierre Arpels watch, 38 mm. 38 mm white gold case; white gold bezel; white lacquer dial, honeycomb motif; white gold crown, round diamond; shiny charcoal gray alligator bracelet; white gold hallmarked pin buckle; DEF, IF to VVS diamond; manual-winding mechanical movement (830P), 60 hour power reserve
Reference : VCARO3GI00
Diamond : 1 stone, 0.04 carats
Case Dimensions : 38 mm
Water resistance : 3 ATM
Bracelet Material : Shiny alligator, square scale
Buckle type : Ardillon buckle
Manual-winding mechanical movement (830P), 60-hour power reserve
Please note that each Van Cleef & Arpels creation is handmade. As a result, carat weight and stone quantities may differ slightly from one creation to the next. Final price may vary slightly depending on the materials and size.
For Home Delivery service in UAE and Gulf countries, contact us on: +97144252740 and in KSA on: 800126001. (prices online indicated for UAE only)


text:
Season's Greetings From Washington D.C.
$ 4
Who says you can't spread holiday cheer while still repping hard for your home city? Send holiday love with a little reminder that you hail from the best city in the nation.
Card is blank inside.
-Card measures 4.25 x 5.5 inches
-Flat printed on 100# Whip Cream French Paper Poptone Cover
-Also available as a boxed set of eight


text:
When Jovial Foods, Inc. offered us samples of their brand new gluten-free pasta they claimed had the taste and texture of authentic pasta, we looked forward to the opportunity to judge for ourselves.
We were pleasantly surprised. This is an excellent pasta, virtually indistinguishable from regular pasta in flavor, color, shape and consistency.
The Pasta
We received five different varieties: Spaghetti, Penne Rigate, Fusilli, Capellini and Caserecce.
All the pastas come in 12 ounce boxes. Protein is higher than most gluten-free pastas at 5g/serving. Fat is low at 2g. Each serving provides 4% of the recommended daily allowance of iron.
Upon opening the packages, we immediately noticed the appearance. Jovial paid a lot of attention to producing pastas that look genuine. Not too thick, not too thin. Many gluten-free pastas are featureless, oddly sized or in some other way different in appearance from "normal" pasta. Jovial was careful to insure the color, ridges, shapes and sizes are what you would find in traditional pasta varieties.
When preparing the pastas, we simply followed the instructions on the box. We salted the water. Oil was not called for, so we did not add it. Once it was boiling, we dropped in the pasta. First, we prepared it al dente. Then, we cooked it normally. Finally, we continued boiling it for a few minutes once it was done to see what would happen.
This pasta is forgiving. It kept its shape, even when overcooked. More importantly, it stayed together when we stirred the pot. Although every pasta requires you to "stir occasionally," this sometimes breaks your gluten-free spaghetti into spaghetti bits. The Jovial pasta stayed intact.
No rinsing was required. We just strained the pasta through a colander. It maintained its shape and resisted clumping together.
The pasta tastes extremely mild and adopted the flavor of the sauces well. We used a marinara sauce, a robust Italian sausage-based sauce and plain butter. We noticed the sauce seemed to stick to the pasta well.
One thing we did not expect was for the pasta to remain fresh and pliable after 24 hours in the refrigerator. Most gluten-free pastas are fine when you cook them, but rapidly turn hard and dry when refrigerated. Not Jovial. After our meal, we placed the leftover pasta in a bowl and covered it with plastic wrap. When we checked it the next day, it was almost as fresh as when we cooked it.
We wondered if there was some secret to this new gluten-free pasta that made it different from the others? But, a review of the ingredients revealed them to be the same as those found in most gluten-free pastas: "organic brown rice flour, water."
Special Rice Makes Superior Rice Pasta
Jovial explained that they discovered certain varieties of rice make superior pasta. The special organic brown rice strains they use are grown exclusively in Italy. The result is a pasta with a firm texture and mild flavor that combines with any type of sauce.
It turns out the ingredients was not the only difference.
Master Craftsman Combine Experience and Expertise
Jovial's pastas are produced by the most experienced gluten-free pasta makers in Italy, who began producing gluten-free pasta in 1972. These Tuscan master artisan pasta makers used pasta production methods handed down over five generations to transform organic brown-rice flour into the most authentic gluten-free pasta available.
The pasta is pressed with antique bronze dies and slow dried at low temperatures. These are the same time-honored methods that are used to make Italy's best wheat pasta. The antique bronze dies are used because they create a rougher texture to better absorb sauces.
The brown rice flour is milled fresh for each production and utilized within 48 hours of milling to insure the freshest flavor.
Commitment to Gluten-free Safety
Jovial Pasta is certified by the Gluten Intolerance Group. Jovial's production facility also uses automated sample selection during production and in-house Elisa testing to less than 5 parts per million.
The manufacturing plant is dedicated gluten-free and free of the top allergens: milk, eggs, fish, Crustacean shellfish, tree nuts, peanuts. Jovial gluten-free pasta is made from pure, select varieties of brown rice, organically-grown exclusively in Italy. The pasta contains no soy or corn, starches or diglycerides. (Although Jovial pastas do not contain soy, their manufacturing facility does produce soy-based products.)
Earth-Friendly Packaging
Jovial is committed to providing healthful products. This commitment extends to their packaging. The company uses recycled cardboard in its packaging and is 100% recyclable. The inner bag looks like clear plastic, but is actually made from wood pulp and is fully compostable.
How Jovial Gluten-free Pastas Came About
Carla Bartolucci, the president of Jovial Foods, Inc., suffers from food sensitivities so she understands what it is like to live with a restricted diet. In her words, "Jovial gluten-free products were developed out of a heartfelt compassion for all of us who have had foods intolerances affect our health and wellness. We believe eating gluten-free should be pleasurable, and not feel like a sacrifice. We do not believe that gluten-free products cannot be made to taste great, it is just a matter of how relentless you are in developing them."
Bartolucci's relentless development has resulted in a truly exceptional gluten-free pasta that we all can enjoy.
Where to Buy
Jovial's gluten-free pastas are available at leading natural food stores nationwide and on Amazon.com. Find a location near you by visiting the Jovial website and using their retailer locator. New stores are adding the products so in addition to checking the list, ask your local natural food stores if they have or can carry Jovial Brown Rice Pasta. Major food distributors supply Jovial, so you can also ask your local grocery store manager to order it for you if they do not already carry it. Prices range from $4.39 to $4.69 per box in stores and $3.25 to $3.50 per box if you buy 6 boxes on Amazon.com.
Special $1.00 Off Coupon
Click here to view a printable $1.00 off coupon for any Jovial pasta.
Contact Jovial
Jovial Foods, Inc.
5 Tyler Drive
North Franklin, CT 06254
Phone: 877-642-0644 from 8:30am to 4:30pm EST on weekdays.
E-mail: firstname.lastname@example.com
Website: Jovialfoods.com


text:
ImageFans is an image search and management program that can search and download images from Internet. It has an internal image finder and image downloader. This powerful image search tool can collect hundreds of graphics from the web with one...
3d Image, Animal Image, Animated Gifs, Cartoon Image, Colorful Image, Dragon Image, Free Background Image, Free Download, Free Image, Funny Image, Funny Picture, Ghost Image, Image Search, Image Spider, Jesus Image, Jpeg Image, Motion Picture
07-May-2004Shareware(Free To Try)
Image Convertor, an easy to use and convenient image conversion utility. When you want to turn all of your images in different formats into jpeg format to save so much disk space, or what to create image thumbnails, you can choose Image Convertor to
Convert And Shrink Image, Create Image Thumbnail, Image Convertor, Make Watermark
17-April-2005Shareware(Free To Try)
Neomesh Image Console is a command line image converter allowing you to convert image formats, create GIF animations, join images horizontally or vertically and manipulate your images. Image Console is able to load 22 and save 17 image formats...
Command Line Bmp, Command Line Gif, Command Line Image, Command Line Image Converter, Command Line Image Resizer, Command Line Jpeg, Command Line Jpg, Command Line Thumbnail, Command Line Tif, Commandline Image, Console Animation, Console Image
11-January-2005Shareware(Free To Try)
This is an upgrade to the latest version of Acronis True Image Home.
If you have purchased previous versions of Acronis True Image, as well as Acronis Migrate Easy, you can easily upgrade them to Acronis True Image 9.0 Home.
Backup, Hard Disk, Imaging, Upgrade, Windows
01-February-2006Shareware(Free To Try)
Create image maps for your website with this easy-to-use tool from Multimedia Australia. Simply select the image you want to use, choose a shape, then visually draw the image map regions. The image map coordinates can be copied to the clipboard...
Css, Css2, Editor, Editors, Html, Html 4.01, Html Editors, Image, Image Map, Image Maps, Internet, Map, Page, Site, Web, Webpage, Website
27-November-2005Shareware(Free To Try)
AKS Image Comparer is a utility that allows you to compare two JPG files and show differences between them. For instance, this tool allows you to compare two versions of the same image, chart, diagram or scheme.
Version 1.0 features a plain...
Compare Image, Compare Picture, Diff Image, Diff Picture
15-January-2007Shareware(Free To Try)
Using ViewPic you will able to: view BMP, GIF, JPEG, JPG, PCX, PNG, TIF, TIFF, TGA, PGM, PPM, PBM, ICO, WMF, EMF image files; view slide show in full screen; set a wallpaper on your desktop; rotate, mirror, change height, width and color...
Convertor, Image, Show, Slide, Viewer, Wallpaper
15-April-2001Shareware(Free To Try)
Switchblade was created with one goal in mind. To make it harder for people to take images from your website. SwitchBlade will protect your images by cutting them in more than one image and also add alt tags to the html code generated for the image.
Copyright Protection, Image Conversion, Image Slicing, Security
02-February-2002Shareware(Free To Try)
Instant ThumbView is a tiny image viewer that displays image thumbnails in a tooltip window when mouse pointer is hovered over an image file in Windows Explorer. It supports a lot of popular image file formats, including BMP, GIF, JPEG and so on.
Context, Contextmagic, Explorer, Extension, Free, Graphic, Image, Infotip, Instant, Picture, Shell, Software, Thumbnail, Viewer, Windows
17-February-2006Shareware(Free To Try)
X360 Tiff Image Processing ActiveX OCX help you to create and maintain multiple Tiff. You can append,delete,insert,move and swap pages within existing Tiff.You can also view and save Bmp,Emf,Gif,Jpeg, Pdf,Png,Tiff,Wmf image,get Tiff tags and Exif.
Image Activex, Image Ocx, Image Processing Activex, Image Processing Ocx, Image Viewer Activex, Image Viewer Ocx, Tiff Activex, Tiff Ocx, Tiff Viewer Activex, Tiff Viewer Ocx
15-November-2007Shareware(Free To Try)
This is a batch conversion tool that resizes your images and saves them as JPEGs. It supports many different image file formats and can modify a large number of images at once.
Batch Image, Camera, Gallery, Graphics, Image, Jpeg, Png, Software, Thumbnail Generator, Web
09-October-2003Shareware(Free To Try)
LuckyZoom is the best way to display your images in incredible detail. Your customer does not need to click anything - they just move their mouse over image and can see every detail in your product! Features include: Fast - the page loads as...
GOGO Exif Image Viewer Pro ActiveX OCX helps you to get all embedded image information include EXIF, TIFF and GPS tags. It also allows you to write useful information back to Jpeg, Png and Tiff image. You can use it as a simply image viewer ActiveX.
Exif, Gps Embedded Tags Viewer For Jpeg, Png, Tiff, Tiff Image Activex Ocx
23-June-2006Shareware(Free To Try)
View images and photos as slide shows with different effects at your computer with this compact, flexible and very easy to use image viewer. It also contains various items for controlling how the image is displayed and supports 340+ image formats.
Bmp, Image, Img, Jpg, Pic, Picture, Show, Slide Show, Slides, View, Viewer
04-February-2004Shareware(Free To Try)
Unicode Image Maker is designed for situations when you need to use unicode text in a program but its not supported natively; you can use this tool to create a graphics image of your unicode text and embed the image instead.
Graphics, Images, Text, Unicode
i-Fun Viewer is fast, image viewer with support for all common image formats. It has an streamlined interface and is simple to use. It supports thumbnail browsing, image editing and slideshows. Other features include: Ability to assign text...
Bmp, Camera Software, File Viewer, Gif, Gif File, Gif Viewer, Graphic, Graphic Program, Graphic Software, Graphic Viewer, Image, Image Software, Image Viewer, Image Viewers, Jpeg, Jpeg Viewer, Jpg, Jpg Viewer, Picture Software, Picture Viewer
Very popular JPG image converter that combines basic image editing (resize, crop, rotate, watermark) with batch image conversion to JPG. It also features shell integration and you can convert files right from Windows. Command line supported.
Bmp To Jpg, Change To Jpg, Convert, Graphic Converter, Image, Image Converter, Jpg Converter, To Jpg
07-April-2006Shareware(Free To Try)
Advanced GIF converter that supports batch mode conversion to GIF file format, basic image editing actions and shell integration. You can call it from another applications or start on scheduled base using
command line support.
Bmp To Gif, Change To Gif, Convert, Gif Converter, Graphic Converter, Image, Image Converter, Jpg To Gif, To Gif
GOGO Exif Image Viewer ActiveX OCX helps you to get all embedded image information include EXIF, TIFF and GPS tags. It also allows you to write useful information back to Jpeg, Png and Tiff image. You can use it as a simply image viewer ActiveX.
25-June-2006Shareware(Free To Try)
Copy protect the images on your web site and CD using image encryption and domain lock. Secure Image Pro is recommended image protection for photographers and advertising professionals. Pro will enctrypt more than 3,000 images on a single click.
Capture, Copy, Encrypt, Image, Photo, Pics, Protect, Safe, Secure
17-December-2005Shareware(Free To Try)


text:
Apache Camel Plugin
compile "org.grails.plugins:routing:1.4.0"
Provides message routing capabilities using Apache Camel
grails install-plugin routing
Please note that all development (including the examples) have recently been migrated to GitHub. Please update your branches!
Grails-Routing 1.2.3 is the current stable version.See GitHub for known issues.Sources: https://github.com/padcom/grails-routingContinuous integration: http://dev.aplaline.com/hudson/job/grails-routing/
1.2.0 breaking changesRoute builders (so called Route classes) are now standard Camel
RouteBuilderdescendants not plain classes with
configureclosureRoute reloading has been removed. Apache Camel does not support route reloading and the existing hack didn't work properly in the latest version of that library.
Since version 1.2.0 this plugin does not use ConfigurationHolder or any other static holders. Therefore it is safe to use it in an environment where on one Tomcat there is more than Grails application running
OverviewThe grails routing plug-in allows you to send and route messages to a wide variety of destination endpoints directly from your Controllers and Services. It also provides a new Grails artifact, Routes, to configure your routes using known Enterprise Integration Patterns via the Apache Camel Java DSL.This plugin is a new and updated version of the grails-camel plugin with virtually the same capabilities but it targets Apache Camel 2.9.0 instead.
Creating RoutesTo create a new route, use the
grails create-route command:
This will create a route in your
grails create-route MyMessage
grails-app/routes directory:
In the configure closure you have full access to the Camel Java DSL to configure your message routes.
import org.apache.camel.builder.RouteBuilderclass MyMessageRoute extends RouteBuilder { def grailsApplication @Override void configure() { def config = grailsApplication?.config // example: // from('seda:input').to('stream:out') } }
Route Configuration
Simple ExampleTo create a route from an in-memory queue called "input.queue" to stdout, use:
This would print out any Object sent to "seda:input.queue" to the console.
Slightly More Complex ExampleSuppose you wanted to send messages asynchronously to the following Grails Service:
Using Camel's bean integration, we can deliver messages directly to any Grails Service:
class MyService {
def myMethod(fooBarText) {
log.info "Got text: ${ fooBarText }"
This would deliver any message with the text "FooBar" in the body to the myMethod method of the myService service.This example also illustrates one of the routing enhancements the plug-in offers. You can pass a Closure to the "filter", "when" and "process" DSL methods.
from("seda:input.queue").filter { it.in.body.contains("FooBar") }.to("bean:myService?method=myMethod")
Receiving emails from GMailTo receive emails from a GMail account is quite simple with Apache Camel and its camel-mail component. Here's what you need to do:Enable IMap access to the GMail account you want to check (How to is here)Add the necessary runtime dependency to Camel Mail component in BuildConfig.groovy
Follow the instructions on Apache Camel Mail component documentation page to setup the route
runtime 'org.apache.camel:camel-mail:2.9.0'
Hot reloadingIf you want your service classes or beans to be hot reloadable DO NOT use
in your service class. This is a known limitation as of now and will not work.
static transactional=true
Sending MessagesThe plug-in provides a new method, "sendMessage", to all Controllers and Services for sending messages to endpoints. It accepts a String endpoint and an Object message:
This would send the Map "myMessage" to an in-memory queue called "input.queue".If you need to send a message with headers you can use the following construct:
def myMessage = [name:"foo",data:"bar"] sendMessage("seda:input.queue", myMessage)
def myMessage = "The content of my message" sendMessageAndHeaders("seda:input.queue", myMessage, [ header1: "value", header2: 2 ])
ConfigurationIn order to be able to run multiple applications utilizing this plugin in one JVM you're going to need to change the ID of the camel context bean. You can do so in your Config.groovy like this:
grails.camel.camelContextId = 'hello'
Configuring thread pool (available as of 1.2.2)Up until now only the default configuration was available (as per official docs):
Currently the default options are maintained as per that definition but the following options can be specified in Config.groovy to override the defaults:
<threadPoolProfile id="defaultThreadPoolProfile" defaultProfile="true" poolSize="10" maxPoolSize="20" maxQueueSize="1000" rejectedPolicy="CallerRuns"/>
grails.routing.threadPoolProfileConfig.poolSize grails.routing.threadPoolProfileConfig.maxPoolSize grails.routing.threadPoolProfileConfig.maxQueueSize grails.routing.threadPoolProfileConfig.rejectedPolicy
Using Camel and ActiveMQ for JMS MessagingTo use JMS messaging use the routing-jms plugin. It provides all the required artifacts right out of the box and makes integrating JMS messaging a breeze.
Camel ComponentsApache Camel has a wide variety of built-in Components for message delivery, such as JMS, SMTP, Web Services and Jabber. Take a look at the Apache Camel documentation for a comprehensive list. By default the following components are included:
- camel-groovy
- camel-stream
This will include full support for ftp:// endpoints in your application's routing facilities. For a complete list of available components see the Apache Camel documentation
Integration with Quartz pluginServices and controllers are not the only artifacts capable of sending messages to through the Camel router. Once you install the grails-quartz plugin your jobs will be capable of sending messages just like your services and controllers do. This facility is unique to this plugin and is as of this moment not available in the original grails-camel plugin.
Ready to use examplesHere you'll find a simplistic example with just one controller (HomeController) and just one action (the index action) that when invoked will send a message to an internal queue (seda:input) which will then be routed to standard output (stream:out)Here is another simplistic example to demonstrate the integration with Quartz plugin. The ExampleJob is executed every 5 seconds and sends a message to the internal queue (seda:input) which will then be routed to standard output (stream:out)
- Chris Navta - The original grails-camel plugin as well as the original version of this documentation
- Matthias Hryniszak - Quartz integration and adoption to Camel 2.9.0 and examples
- Arsen A. Gutsal - Latest upgrade to Camel 2.9.4


text:
This site uses cookies to give you the best experience. Privacy Policy.
Free Shipping on orders over £35
Krystal London
Colour: Emerald
Finish: Silver Plated
The simple Sweetheart Necklace. The dangling heart pendant from a chain at a chic angle makes for a stylish impact. This elegant style is one of Krystal Londons most celebrated heart pieces of jewellery. Rest assured only the best and unique Swarovski Crystal has been used to construct the Sweetheart necklace.
Handmade in London with love
Product Code: KS5027
Terms and Conditions apply. See more for details


text:
The chemist and the conservator
They work together to trace molecular "fingerprints" of rare pigments
Shelley Svoboda uses a fine surgical blade to take pigment samples from 18th-century paintings. She used to tell visitors to her lab at the Colonial Williamsburg Foundation that she only needed to remove a piece smaller than the period at the end of this sentence.
She doesn't say that now. You can see the period at the end of this sentence, but you can't see anything as small as the amount now needed to do scientific analysis of pigment—at least not with the naked eye.
"The idea, especially with these historic paintings, has always been to remove a minimal amount of paint," explains Svoboda, a Colonial Williamsburg conservator specializing in paintings. A collaboration with Kristin Wustholz, assistant professor of chemistry at William & Mary, has produced a new technique that allows precise chemical analysis from a single near-microscopic particle excised from the painting.
The technique uses a laser microscopy method known as surface enhanced Raman scattering (SERS). Much like the objects of their study, 18th-century portraitists who prepared their own paints, Wustholz and the students in her lab begin their work by mixing a paste of silver-colloid nanoparticles.
"You place the silver nanoparticles on the paint sample you want to analyze," Wustholz explained. Then the sample goes onto a glass slide and into the SERS laser. The molecules in the sample react to the laser, vibrating and scattering the light. The pattern of the scattered light is diagnostic for the substance being analyzed.
Looking for fingerprints
"The silver nanoparticles act as an antenna, essentially. It gives you a very strong signal, like a fingerprint, almost," she said.
That "fingerprint" is the vibrational spectra unique to the molecules in the paint. Wustholz can compare the fingerprint of the sample to a database of known vibrational spectra of pigments.
Wustholz's SERS laser approach is a great improvement over conventional Raman spectroscopy, until now the go-to protocol for paint analysis. "Raman spectroscopy is great. It provides you with the vibrational fingerprint. The problem is that it's incredibly insensitive; only about one in a million photons will be Raman scattered," she explained—thus the need for the larger sample to be taken from the painting.
The chemists correlate SERS work with a second examination of the paint, using fluorescence microscopy. The two-pronged approach, Wustholz says, gives a superbly accurate and detailed fingerprint of paints.
Wustholz describes the SERS process as "minimally invasive," while fluorescence is completely nondestructive; it even can be done at a distance. These attributes are a godsend to a conservator of paintings such as Svoboda. The two—along with two of Wustholz's undergraduates—collaborated on a study of pigments used in two 18th-century portraits that were in Svoboda's lab. The collaboration led to a paper in the scientific journal Analytical Chemistry, with Wustholz's students Stephen Dinehart '12 and Lindsay Oakley '12 as co-authors.
"Both of those paintings are from about the same era, but one is by Sir Joshua Reynolds—the biggest name in painting in London at the time. Robert Feke is an American, the first American-born painter," Svoboda explained. "Feke is actually a little earlier than the Reynolds, 1748— but we found that they both were using the same materials, most probably British."
In their examination of Reynolds' Portrait of Isaac Barré and Feke's Portrait of William Nelson, the team was searching for the molecular fingerprints of colorants known as lake pigments. They were especially interested in finding evidence of a prized—and quite expensive—red pigment known as carmine lake.
Red pigment = red flag
Svoboda explains that lake pigments are organic dyes compounded into a mineral carrier. In the case of carmine lake, the dye comes from the scales of a particular insect. She said that lake pigments, much valued by 18th-century painters for their "beautiful, luminous colors," raise a luminous red flag when today's art professionals suspect their presence.
"They are more prone to damage from light fading," she said, "and we can't share the paintings with the visitor without light." Svoboda says museums have developed exhibition techniques for protecting light-vulnerable works by displaying them with minimal illumination.
Both carmine lake and another red pigment, madder lake, present fading concerns, Svoboda said. Red colorants weren't only used to paint red coats and the like; they were commonly mixed with—or used on top of—other colorants to produce flesh tones. "It gives a vitality and translucency that the artists found nothing else could contribute," she said, but it's often been difficult to do more than suspect the presence of carmine lake, especially if you allow for three centuries of potential sun damage.
Isaac Barré's portrait was put to the new minimally invasive SERS protocol. Viewing the painting's surface underneath the floor microscope in her lab, Svoboda plied her surgical blade in two areas, taking tiny samples. Feke's William Nelson got the same treatment.
"I just break through the varnish with a very small action of the blade," Svoboda says. "With a good blade you can slice through a single large pigment grain, and the naked eye can't even see the cut in the varnish."
SERS microscopy can find the molecular fingerprint of even faded pigments. Wustholz and Svoboda had good reason to suspect carmine lake in the Portrait of Isaac Barré; Sir Joshua Reynolds maintained detailed notes on his technique and paint preparation. The paints Feke used represented more of an unknown quantity.
Wustholz took the samples to her lab in William & Mary's Integrated Science Center, where she got Dinehart and Oakley started on the nanoparticle prep and the microscopy.
"When we first looked at the sample, we just saw some kind of red pigment," Oakley said. "We suspected it was probably either carmine lake or madder lake."
It was a while before the students caught onto the feel of the SERS laser microscope ("It's like learning to drive," Wustholz says.)
"We have to move the sample around and try to find the best spot that will give a high intensity spectrum," Dinehart explained. "It takes a lot of luck and a lot of maneuvering. We've spent hours back there just moving one tiny sample around trying to find the perfect fingerprint."
The fingerprints—verified by fluorescence microscopy—verified presence of carmine lake in the flesh of the Reynolds portrait, as Svoboda suspected. "The art history record shows that Reynolds' flesh has faded in many paintings that we know of, sometimes very early," she said. "But it's been very hard to definitively identify the lake, because many analytical techniques require a fairly good sized sample. Until now."
A surprising find
The analysis also showed that Feke used carmine lake in his Nelson portrait, a bit of a surprise in a work by a Colonial painter. Svoboda said that a Colonial apothecary could have been a source of the high-priced colorant.
The ability to identify positively a pigment provides a number of benefits. Curators can take appropriate measures when hanging especially vulnerable works. Svoboda and other conservators can work with more assurance when they know the pedigree of the pigments on their canvasses.
The chemist and the conservator are now working together to identify colorants in Colonial Williamsburg's Carolina Room, a relocated 1830s parlor that's a conservation treatment in progress.
"SERS, to me, is a magical thing," Svoboda said. "It just opens up a whole avenue of study in these faces of history." In turn, the chemists take pleasure in working on a project that generates interest outside of the lab.
"If I tell my family that I'm synthesizing silver nanoparticles, they don't really care," Dinehart said, "but if I can tell them that I'm working with the Colonial Williamsburg Foundation on a three-hundred-year-old painting, then people get a little more excited about it."


text:
Maxzide patient assistance program
Maxzide (triamterene)
If you need help paying for Maxzide, Prescription Care may be able to help you get your medication for just $49 per month.* We work with your healthcare provider to help you enroll in the Maxzide patient assistance program. The full application process will be handled by us, providing you with regular access to affordable Maxzide without any hassle or stress.
Your monthly Maxzide cost savings if eligible
You can receive your Maxzide prescription for just $49 per month, every month. This flat fee covers the full cost of your medication, regardless of retail price.
Am I eligible for the Maxzide patient assistance program?
If you meet the eligibility criteria, you could receive Maxzide without paying the full retail price. Every individual Maxzide assistance program application is reviewed by us.
- US residency
- Combined household income
- Insurance status
Up to $36,000
Up to $50,000
Up to $100,000
How do I apply for the Maxzide patient assistance program?
Prescription Care takes the stress out of applying for the Maxzide patient assistance program. Start by completing our enrollment application and tell us about all medications you're taking, including Maxzide. We'll also require details about your healthcare provider, insurance, and your household income, as this information is required by the pharmaceutical manufacturers who ship your medication.
The application process will be handled by us if we determine you may be eligible for assistance. We will submit your application on your behalf and help to enroll you in the Maxzide patient assistance program. Once you are accepted and enrolled in the program, we'll request your Maxzide medication refills on your behalf for up to one year.
Is Prescription Care a Maxzide coupon provider?
Prescription Care does not provide Maxzide coupons or Maxzide discount cards. We don't offer printable coupons, Maxzide manufacturer coupons, Maxzide discounts, rebates, Maxzide savings cards, trial offers, free Maxzide, or free samples of Maxzide. Prescription Care is a service provider that helps eligible individuals access the Maxzide patient assistance program. Remember that when obtaining your Maxzide medication through Prescription Care, your total cost for the medication will always be $49 per month. You'll likely save more with Prescription Care than with a coupon.
Can Prescription Care help me get Maxzide if I have insurance?
If your insurance company won't pay for your Maxzide medication, or you have a high copay or coinsurance responsibility, we may be able to help. We could also help you if you don't have insurance.
How much is Maxzide with insurance?
The cost of Maxzide varies between healthcare plans. You can find out your copay with your current insurance by speaking to your healthcare provider or pharmacist. Remember, if you are approved for assistance, you'll likely save more if you get your Maxzide medication through Prescription Care.
How much is Maxzide without insurance?
Maxzide prices without insurance will vary depending on where you buy it. With Prescription Care you'll always pay a flat monthly fee of $49.


text:
Leo Igwe, who has done more to expose and publicize the brutal attacks on child "witches" in Africa over the last few years than anyone else, has an article on the James Randi Educational Foundation website about this horrible practice and what fuels it. Speaking first about an orphanage that cares for 32 of the child victims, he writes:
Very little is known about this 'home' in Sang where children accused of witchcraft or of being 'agents' and instruments of the devil are taken care of. The children are from a day old to sixteen years. They are victims of superstitious beliefs which constitute the basis of the local thought and culture. In many parts of northern Ghana, a child whose mother dies after delivery is often percieved to be an 'evil child', a curse to the family or community and an agent of the devil. In a region where many deaths are seen as unnatural, many babies are accused of killing their mothers through witchcraft and magic. And to prevent such an 'evil child' from wreaking more havoc, the baby is abandoned or dumped at an anthill to die. Children who are born with disability are also accused of witchcraft. Disability is generally percieved to be abnormal and unnatural. Witchcraft accusation is often a way of reacting to abnormalities in children. Children with disabilities are often thrown into an 'evil forest' or are killed in order to remove the 'curse' from the family or to disable and get rid of their their evil magic and witchcraft. According to local caregivers, some children were brought to the center by their parents out of fear that they could be murdered by family or community members who regard them as evil.
There is need for an intensive public enlightenment campaign to get people in northern Ghana to abandon the superstitious belief that associates disability with withcraft and magic. People need to be educated to act and react with care and compassion, not irrational fear, to any form of disability or 'abnormality' in children or in any other human being. But this much needed awareness program cannot happen due to lack of principled stance on the witchcraft phenomena. Witchcraft is a charged and controversial topic. And many locals do not like tinkering with it. There are too many people; local chiefs, priests, soothsayers, etc. with vested interest in witchcraft belief and practice. Those trying to combat witchcraft related abuse are mainly faith based organisations like the one managing this orphanage or religious individuals who actually believe in witchcraft. They do not openly question or are willing to challenge witch beliefs.
For instance, two NGOs working to address the problem in the region stated in their brochure that they 'do not challenge the existence or otherwise of witchcraft and its effects on individuals and communities'. It is difficult to understand how these organisations can execute a comprehensive and effective campaign without challenging witchcraft claims. Getting the local population to understand that witchcraft is an imaginary crime, a form of superstition, should be a critical part of any efforts or program to tackle and eradicate witch persecution and killing.
Ignorance and irrationality are sometimes harmless, but they can also result in innocent people being killed and maimed.


text:
LONDON—Someone will be getting a grilling about this. British fire crews say a truck carrying a cargo of cheese has burst into flames on an English road.
The truck loaded with 24 tons of cheese caught fire on a rural road in Somerset, southwest England.
Devon and Somerset Fire and Rescue service said Thursday that fire spread rapidly through the truck and set its consignment of cheese alight.
The fire department believe that the blaze was caused by a fault with the vehicle.
Before it suffered the fire—and cheesy meltdown—the driver had been headed for a mechanic to have a problem fixed.
No one was reported hurt in the incident.


text:
- February 14, 2011
The 2010 Mobile Year in Review
Comscore presents the inaugural Mobile Year in Review report, a look at the top trends in mobile throughout 2010 and their implications for the coming year. The report looks across the U.S., EU5 and Japan, providing insights on the dynamic mobile ecosystem:
- How did market enablers (3G penetration, smartphone adoption and unlimited data plans) impact the growth of mobile media in 2010?
- What were the year's top device trends, how have smartphone devices changed the market?
- In what ways does mobile media consumption vary across geographies?
- How did browser and application usage drive content consumption, and which content categories saw the largest gains?
- What role did social media play in the growth of mobile in 2010?
- How are consumers using mobile media to stay connected, how has daily consumption changed?


text:
I'm exploring the web to find sites I like
Francisco Medina Ascencio KM 3.5 | Zona Hotelera Norte, Puerto Vallarta 48300, Mexico
"it is an average hotel but i loved it anyways"
Posted by: peter on Nov 23, 2014
see all reviews
Enjoy a wonderful view to Banderas Bay, one of the best beaches in Puerto Vallarta, surrounded by friends who will make your stay unforgettable.
Share your experiences with others. Don't forget to send your review to Debbie by using an easy form.
"Excellent stay in a private condo at the Holiday Inn (with a view to die for...)"
Posted by:
Tom on Mar 16, 2011 >
2 contribution(s) Canada
Visited on: Mar, 2011 | Leisure | Family and Kids
854 people found this review helpful
The HI is a real nice option, maybe a good 3.5–4 star place, real pleasant, with a large pool and on a good beach for the hotel zone. Instead of reserving a room at the resort itself, we rented from a person who owns a small condo (large studio) on an upper floor of the Sea Rivers building at the resort - FANTASTIC. We paid $800 for a week rent (+ security deposit), which gave us a real nice condo, ocean front on the 14th floor – much better than a regular hotel room. The condo was very nice with incredible views and was well furnished (see the room description below). To find options there, google the Sea Rivers at the Holiday Inn condos for rent (there are a few advertised on VBRO & TA); we rented ours through the VeryVallarta website and all went smoothly.
The resort is well located too - real easy access via bus or taxi to the downtown (or the marina...), and a supermarket and a few stores nearby.
Room Number:
Room Block:
Block Sea Rivers Building
At the airport - ignore the timeshare people and head for the taxi stands (or for your tour bus).
At the Holiday Inn: Pleasant hardworking staff, but they are clearly better at checking people into the regular Holiday Inn resort rooms (those on AI packages for the most part) than at dealing with people going to private condos in the Sea Rivers building. It took them maybe 40 minutes to locate our key and give us all the documents...
Ours was not a room, but a well-sized studio apartment. We were on the 14th floor, with a large balcony looking right over the ocean - views to the left over Puerto Vallarta and the mountains, views to the right for sunsets, and below the pool. Fantastic. The condo was fairly large - we had a king-sized bed, a sunken area with two sofas, a basic kitchen with all the necessary utensils, a good bathroom and toilet area, etc. Other private condos often have a closed-off BR with 2 queen beds - we liked the open space of ours. One of the sofa beds converted into a larger-than-single bed for our daughter. It was well furnished, with a small fridge, toaster oven, microwave and electric heaters for pots and pans, a coffee maker, and a TV with cable. Real nice - sitting up high overlooking the pool and beach, watching the boats go by and the sun go down, sipping on our margaritas.
Restaurants and Bars:
With a private condo, you can either pay upon arrival at the hotel for an all-inclusive food package ($43 after discount per day per person - a good deal) or pay each time you eat or drink (charging it to your room with a 15% discount). As Puerto Vallarta has great restaurants, we preferred to eat out a lot and charged occasional food to our room. At the hotel, they have a nice outdoors terrace restaurant (buffet & a la carte), and indoors Mexican (no vegetarian options) and Italian restaurants - the last one had the best reputation; we ate there once, liked the style and service, but thought the pasta was fairly ordinary. Drinks were alright; you can request better quality liquor at a cost.
OUTSIDE THE HOTEL: If you walk down the beach towards town, after about 5 minutes you'll reach the Los Tules resort – near the other end of the resort they have a pleasant small restaurant with good breakfasts beside a pool and near the beach. In front of the Fiesta Americana, there is a chi-chi French restaurant, and across the street a Pizza Hut. The Peninsula Plaza about 150m up the street away from town has several decent restaurants, a Starbucks and the Canadian consulate. A better option is to head downtown to the Malecon (by taxi about 50 pesos) or the Southside (60-80 pesos) where there are a lot of good restaurants. On the Southside, try Coco's Kitchen (at 122 Pulpito: real good food in a garden courtyard), Archie's Wok (excellent Asian food near the pier), and Casa Isabel (up high: great ambiance and views). On the Malecon, the Cheeky Monkey has cheap decent drinks and food and is loads of fun; as is the Café Roma pizzeria. And for upscale Mexican food in a courtyard, try El Arrayan about an 8 minute walk up the hill from the Malecon.
The Holiday Inn has a large round pool with an island in the middle, heated in the winter, with sunken seats and a bar. There is a deep section, and kiddies section, and a larger maybe 4 foot deep section. The grounds are nice but not real spread out, with the usual annoying people who "reserve" chairs early in the morning with their towels. The beach is decent - typical Hotel zone - and during dry season you can walk maybe a mile (1.5 km) to the north (in rainy season, a small stream becomes a river that you can't easily get by, so you can only walk maybe 5 minutes north before getting blocked).
Activities on and off the Resort/Hotel:
The HI has the usual activities – a kiddies area, pool aerobics, beach volleyball, and the typical evening entertainment (karaoke…) . In the resort there are a few stores, a tours desk, the timeshares desk in front of the Sea Rivers elevators (for those who like to suffer), and a hairdressers/pedicure… place.
The resort is well located – with real easy access via bus (7 pesos) or taxi to the downtown (or the marina... about 50-80 pesos). We bought breakfast foods, chips and a few drinks at the Soriana supermarket located in a small mall across the street and maybe 250 yards (meters) walk towards town. (Another Soriana is found about 400m walking away from town, and the Walmart with good wine and drink prices is about another 300m past that – it had considerably better prices than in the airport duty free shops.) Around the same area is the start of the marina, from where alot of tours start.
Other Comments:
We'd definitely return, but again to a condo at the Sea Rivers and not to a regular hotel room (we're even toying with the ideal of buying a condo there for ourselves...). Yeah, the beaches are not as nice as in Nuevo Vallarta, but you aren't trapped in a golden all-inclusive prison far from everything either - I'd generally take the old hotel zone or downtown far over the marina or Nuevo any day, and the HI is a real nice, not-too-expensive option.
"it is an average hotel but i loved it anyways"
Posted by:
peter on Nov 23, 2014 >
1 contribution(s) Canada
Visited on: Nov, 2014 | Leisure | Solo
574 people found this review helpful
I had not such a good time here but it also had its good sides so I am giving this hotel a three star rating based on my experience. Even though I saw some bad reviews I still hired the place and kept an open mind so this is from a honest point of view. Majority of the staff was very pleasant and seemed nice and very warm; they made you feel at home. The location of the hotel was something loved; it was very close to the beach so I didn't have to spend money on transportation going to the beach or walked a long distance going to the beach. You should go with insect repellants as there are sand flies there that bit me all day long and made my stay at the beach uncomfortable. I still had same experience at the snack bar but hey, I was busy enjoying my stay to care so much about a bunch of flies feeding off my skin. They have just one a la carte restaurant that had different menu on a different daily basis so it wasn't that bad and most of the time I went out to eat but my breakfast and lunch so it wasn't much of a bother to me as I didn't spend most of my days at the hotel. The hotel is really clean; the rooms are great, big and spacious and had all the basic amenities. I loved my stay here and will be back here again next here.


text:
I posted this last year but felt the need to re share it with you as a reminder that Monday is NOT a holiday but a day to remember those who came before us, and those who give themselves today so that you and I have the freedom we sometimes take for granted.
We don't have to allow the commercial aspect of marketing to rush us into the next holiday on the 'list' so quickly! Remembering those who gave their lives for our freedom should be savored. Remembering those who lost their lives regardless of the battle they fought should be remembered in our hearts forever.
Loss affects every one of us. Death will greet us all, eventually. Risking your life for the lives of others is the ultimate sacrifice. Material loss means nothing to those who survived a battle…of any kind. Loss puts life into perspective. We need to continue being the change we want to see in our world and appreciate the gift that those who came before us gave. Battles are fought but not always won, leaving a legacy behind to be remembered.
The Heroes who fought to give us our freedom are being whisked away too quickly so we can drown in the madness of gross obsession for stuff none of us need. Stuff! Where has all the meaning gone? Wants and needs have become one of the same. They are NOT the same. What we need is to get back to the basics before we can't see through all the distractions swirling around us, calling us like a deep seeded addiction calls an addict. Consumerism…we have all taken a hit of that drug. STOP the madness!
I don't think we take enough time to appreciate what's truly important in life. Health, freedom, spirit, love, friendship, unity and peace. The essence behind what is lovely in life is being over powered by marketing, money and greed. We can't allow the human spirit to be set aside for such meaningless garbage!
We are reminded often lately how precious life is. The love that is present in our hearts for those who gave their lives selflessly can't be forgotten. Lest We Forget is a phrase to caution us against forgetting those who died in war.
We can't take any of our possessions with us when we leave this world, but I do believe when one is awarded with a 'medal of honour' it transcends with whom it belongs in spirit. Honour in your own way those who left you behind. Give those you loved their very own medal of honour to take with them when they go.
Human spirit rises in tragedy. We naturally reach out to those who experience a loss, it's human nature. Compassion is alive and well. We are surrounded by Heroes in memory and in life as are we surrounded by Angels. I like to believe our Heroes get first dibs on the Angels waiting…and our Angels are past fallen Heroes giving themselves once again.
"Jealous of the Angels"…by Jen Bostic


text:
Stretching from the warm tropical shores of the Caribbean to the wild and windswept archipelago of Tierra del Fuego, South America has a dizzying treasure trove of landscapes that have long seduced independent travellers seeking an unforgettable experience. Belgian photographer Pascal Mannaerts has been captivated by the continent since he discovered photography during his student years; here is a selection of his amazing pictures of Brazil, Bolivia, and Peru.
The Altiplano, near La Paz, Bolivia
Dried frogs, potions and medicinal plants in the Witches' Market, La Paz, Bolivia
Sur Lípez, Bolivia
Ancestral remains in a cave in Villamar, Bolivia
Abandoned train, Uyuni, Bolivia
The streets of Copacabana, Bolivia
A woman living in the Antiplano, Bolivia
Ipanema beach, Rio de Janeiro, Brazil
Lago do Pelourinho, Salvador, Brazil
Portrait of a man in Barreirinhas, Brazil
Lençóis Maranhenses National Park, Brazil
The view of Rio from Sugarloaf Mountain, Brazil
A man drumming during a street party, Rio de Janeiro, Brazil
An Uros woman, Lake Titicaca, Peru
Mama Peruana in traditional dress, Cusco, Peru
Children walking their llama home, Cusco, Peru
Bolivia is one of our top countries to visit in 2014 – find more of the top countries, cities and best-value destinations with the Rough Guide to 2014.
All photographs courtesy of Pascal Mannaerts – you can see more of his work at www.parcheminsdailleurs.com.
Explore more of Brazil, Peru and Bolivia with the Rough Guide to South America on a Budget. Book hostels for your trip and don't forget to purchase travel insurance before you go.