Writing a personal essay is a process like other writing, but it has some distinct steps that can be helpful when crafting it. When writing any essay there is a structure to the writing and a personal essay also has structure, but it has the overlay of the personal aspects, too.
When writing a personal essay, it is important to think about how your past can be told in a way that is interesting and on target for the essay's topic. As you recall the experiences in your life, consider how you have grown from them, any humorous moments and lessons learned. Is there one that is particularly poignant or scary or funny or emotional? Those climactic events might be the place to start your personal essay. Once you decide what event or events are will be included, then you must decide what feeling or emotion you want your reader to have as a result of your essay. This will help you to decide the best tactic for describing the events.
Creating a first draft is the beginning of the process. This draft can be a first attempt at the topic. Getting the information down and the details in place is the point of the first draft. From there, the shape and the refining can begin.
Revision is the nest step. This is where the grammar and mechanics must be checked to make sure that the piece flows. Also, reading through the essay to make sure that the events are in sequential or logical order and the overall tone of the piece is what the writer wants it to be. Add details that are concrete and use descriptive language that can vividly paint a picture for the reader in this draft.
Getting a reader is always a good idea because that person may catch things that slip through when the author of the essay is reading it.
Keep the emotion or action going through to the end. Make sure that the conclusion of the piece is as strong as the introduction and the body of the piece. Don't disappoint the reader at the close of the essay.
A personal essay is one that can convey great detail and evoke emotions from the reader when crafted well. Allowing enough time to write drafts and revise the essay is a key to making it a well written piece.


text:
Buzzing for the boys!
Tom Lees has spoken of his delight in the S6 camp following the dramatic win over Birmingham on Saturday.
Trailing 1-0 late in the game, Wednesday turned the St Andrew's contest on its head through a quickfire Gary Hooper brace to seal victory.
And Lees – returning to duty following a nine-week spell on the sidelines – summed up the feeling in the dressing room post-match.
He told swfc.co.uk: "I think that performance summed up the form of the last few weeks and the character we have in the squad.
"There were great scenes at the end because Birmingham is a difficult place to come to and get a result but we got the win and we are now firmly in the play-offs.
"I'm absolutely buzzing for the boys."
Typically magnanimous, Lees steered the spotlight away from himself when probed after posting a valuable 90 minutes in the Midlands.
The defender, skipper for the day, made his first appearance since sustaining a hamstring injury in the Capital One Cup clash at Stoke on the first day of December.
He explained: "I don't want to concentrate on me because it was such a fantastic result.
"All I will say is that it's been a long nine weeks and I've worked as hard as possible with the phyios to get back as soon as I can.
"It was mixed emotions for me because of the goal but these things happen.
"The most important thing was the team performance and the result and we got both."

redpajama_set_name: RedPajamaCommonCrawl


text:
Q: Casting of pointers in C Can someone please explain me what these 2 lines mean?
short * two_byte_pointer = (short*) 10;

int * four_byte_pointer = (int*) 10;

I thought that we can only use int* before the equal to sign. But how is it possible to cast a number with short*? Can you please explain me how pointers are also casted in C?

A: Your code (for example first line) means:
Dear compiler, here is a pointer to short short * .
It is named two_byte_pointer.
I would like it to have a value assigned =.
The value I am thinking of is something else, but I want you to trust me that it is a pointer to short - honest (short*).
The value I am using is 10.
And I would not believe a word of it if I were your compiler or your colleague reading the code. Not without some explanatory comments and a quote from the memory part of the description of your environment.
It might make sense in some embedded environments with memory mapped special registers at an unusual location. Maybe not, see the comments by the busybee below.
I am pretty sure that this is just a very theoretical example and "10" is just "a number example".
The naming of the variables with two_byte and four_byte is based on assumptions on the sizes of types in your environment. Apart from that I would name it pointer_to_two_byte, slightly longer, much more precise (not discussing naming style otherwise here).

A: If you cast something the compiler just takes whatever value you provide and interprets it as the type you cast it to. So in this example it will interpret 10 as a pointer to a short. The value of a pointer is the memory address it points to. Using this pointer will almost certainly fail because most systems don't allow you to access memory at such a low address.
Casting a number to a pointer can be useful if you need to do calculations on an address and use the result as a pointer.

redpajama_set_name: RedPajamaStackExchange


text:
package nhz.http;

import nhz.Alias;
import nhz.NhzException;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONStreamAware;

import javax.servlet.http.HttpServletRequest;

public final class ListAccountAliases extends APIServlet.APIRequestHandler {

    static final ListAccountAliases instance = new ListAccountAliases();

    private ListAccountAliases() {
        super("account");
    }

    @Override
    JSONStreamAware processRequest(HttpServletRequest req) throws NhzException {

        Long accountId = ParameterParser.getAccount(req).getId();
        JSONArray aliases = new JSONArray();
        for (Alias alias : Alias.getAllAliases()) {
            if (alias.getAccount().getId().equals(accountId)) {
                aliases.add(JSONData.alias(alias));
            }
        }

        JSONObject response = new JSONObject();
        response.put("aliases", aliases);

        return response;
    }

}

redpajama_set_name: RedPajamaGithub


between the college or university and the student. Just because U.S. News and World Report ranks a school number one does not mean that school is right for you.
So why not create your own "Best Colleges" list? You can create a list of Best Colleges for Me! Here are some criteria (created by Allen Grove) you might consider to include. Don't include all of these, just those that are important to you.


text:
package com.myzone.reactive.reference;

import com.google.common.base.Supplier;
import com.myzone.reactive.event.ChangeEvent;
import com.myzone.reactive.event.ReferenceChangeEvent;
import com.myzone.reactive.observable.Observable;
import com.myzone.utils.Matchers;
import org.hamcrest.core.IsEqual;
import org.junit.Test;

import static com.myzone.reactive.observable.Observable.ChangeListener;
import static com.myzone.utils.Matchers.TransformationMatcher.namedTransformation;
import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.same;
import static org.mockito.Mockito.*;

/**
 * @author myzone
 * @date 30.12.13
 */
public abstract class ObservableReferenceTest {

    private final Supplier<ObservableReference<String, ReferenceChangeEvent<String>>> observableReferenceFactory;

    public ObservableReferenceTest(Supplier<ObservableReference<String, ReferenceChangeEvent<String>>> observableReferenceFactory) {
        this.observableReferenceFactory = observableReferenceFactory;
    }

    @Test
    public void testUpCast() {
        ChangeListener<String, ReferenceChangeEvent<String>> changeListener1 = new ChangeListener<String, ReferenceChangeEvent<String>>() {
            @Override
            public void onChange(Observable<String, ? extends ReferenceChangeEvent<String>> source, ReferenceChangeEvent<String> event) {
                source.removeListener(this);
            }
        };
        ChangeListener<String, ChangeEvent<String>> changeListener2 = new ChangeListener<String, ChangeEvent<String>>() {
            @Override
            public void onChange(Observable<String, ? extends ChangeEvent<String>> source, ChangeEvent<String> event) {
                source.removeListener(this);
            }
        };

        ObservableReference<String, ReferenceChangeEvent<String>> observableReference = observableReferenceFactory.get();
        observableReference.addListener(changeListener1);
        observableReference.addListener(changeListener2);
    }

    @Test
    public void testChange() throws Exception {
        ChangeListener<String, ReferenceChangeEvent<String>> changeListenerMock = mock(ChangeListener.class);
        ObservableReference<String, ReferenceChangeEvent<String>> observableReference = observableReferenceFactory.get();

        observableReference.set("old ololo");
        observableReference.addListener(changeListenerMock);
        observableReference.set("new ololo");

        verify(changeListenerMock, timeout(100)).onChange(same(observableReference), argThat(Matchers.<ReferenceChangeEvent<String>>transformationMatcher()
                .with(namedTransformation("getOld", ReferenceChangeEvent<String>::getOld), new IsEqual<>("old ololo"))
                .with(namedTransformation("getNew", ReferenceChangeEvent<String>::getNew), new IsEqual<>("new ololo"))));
    }
}


In 1993 we introduced a game programming course to the undergraduate computer science program at the University of North Texas. At the time, this was a controversial, much-challenged, and difficult move. There were no course materials, books, or web pages available. Interestingly, the only objections were from faculty — both the students and the administration were in favor of the class. Objections were raised about the industry-driven focus of the class and the perceived trivial nature of entertainment computing. Since 1993 the initial game programming class has evolved with the fast-moving game industry, and spawned more classes and an undergraduate certificate in game programming. After more than a decade and a half of operation, our game programming classes have positioned our alumni for employment in companies including Acclaim Entertainment, Ensemble Studios, Gathering of Developers, Glass Eye, iMagic Online, Ion Storm, Klear Games, NStorm, Origin, Paradigm Entertainment, Ritual, Sony Entertainment, Terminal Reality, and Timegate Studios. Our early alumni are moving upward in the game industry to programming director and producer level positions.
In sharp contrast to their early history, game programming classes are now gaining acceptance in academia (see, for example, Feldman , Moser , Adams , Faltin , Jones , Becker , Alphonce and Ventura , and Sindre, Line, and ValvÊ ), resulting in a proliferation of new classes and programs nationwide, and a move towards a professionally recommended curriculum in game studies . Unlike institutions such as Digipen, Full Sail, and SMU's Guildhall that offer specialized degrees or diplomas in game programming, we offer game programming as an option within a traditional computer science curriculum. Keeping in mind that many institutions are starting game programs, and that many of them are designing their curricula in an ad hoc manner, the purpose of this paper is to share some of what we have learned from experience over the last decade and a half by describing our game programming classes, the design philosophy behind them, and some of the potential pitfalls to be avoided.
We begin by discussing game industry needs in Section 2, and some important issues in the design of a game programming class in Section 3. We will discuss our introductory class in more detail in Section 4, and our advanced class in Section 5. Section 6 describes two new classes and a recently introduced undergraduate Certificate in Game Programming at UNT. Section 7 discusses the need for separate lab space for use in game programming classes. The Conclusion contains some data about the impact of game programming on the computer science program at UNT. A preliminary version of the material in this paper appeared in [12, 13, 14].
Work on a large project, that is, larger than the typical "write a program for a linked list" kind of programs that are typically used as homeworks in programming courses.
Creation of a game demo or two, something nontrivial that plays well and showcases the programmers' ability. This shows that the applicant is devoted enough to have spent their own time to create something, and has the perseverance to see it through to completion.
That the applicant is a "team player", somebody who can work in a multidisciplinary team with other programmers and nontechnical people such as artists.
That the applicant can learn independently, because the game industry continues to push the boundaries of what can be done using new computer technology.
That the applicant is well-versed in game technology.
Team Attitude: The ability to work in a team to get the job done, without unnecessary friction.
Self-starters: The ability to work without constant supervision.
Follow-through: The ability to see tasks through to the end.
Communication: The ability to communicate with programmers and nonprogrammers.
Responsibility: The ability to take responsibility for things that have been done, and are to be done in the future.
In addition to satisfying the needs of aspiring game programmers, we quickly found that the game programming classes are attractive to general students as a capstone experience, paralleling the experience of Jones . Indeed, our class projects meet most of the requirements of the capstone project CS390 in .
Other employers are also attracted to students who have experience with a group software project with nontechnical partners. Feedback has suggested that game demos created with artists tend to show better in interviews than the typical project created by programming students alone.
Should the classes be theory based, or project based?
What software tools should be used?
Where do programming students find art assets?
Should students be free to design any game in any genre, or should their choices be limited?
Should students write their own game engine, or work with a pre-existing engine?
On the first question, the options were either a theory class with homeworks and exams, perhaps augmented with small programming projects, versus a project class in which the grade is primarily for a large project programmed in groups. We chose the project option, understanding that students would come out of the classes with two substantial game demos that will play a major role in their first job interview in the game industry.
The DirectX SDK (Software Developer's Kit) can be downloaded and used free of charge. Visual Studio Express can be downloaded and used free of charge, which with the addition of the Windows Platform SDK (also available for free) and the DirectX SDK can be used for game development under Windows.
DirectX is updated every two calendar months. This means that bug fixes are applied quickly. Unlike OpenGL, there is little or no trouble supporting available video cards. A major version of DirectX is released regularly (DirectX 10 will be available within a year), which ensures that the API keeps up with the latest in graphics technology.
Students benefit from using in class the same tools and techniques used by a substantial fraction of the game industry.
Students should be exposed to as many different compilers and APIs as possible during their academic tenure (this is encouraged in Section 10.2.2 of ). Our students are already exposed to open source software including g++ and OpenGL in other Computer Science classes. DirectX and Visual Studio add to this experience, and are in no way intended to supplant it.
On the third question, that of art assets, the obvious choice is to have students take advantage of the free art on the web. Our experience is that students benefit substantially from working with art students. Not only do they benefit professionally in learning to collaborate across disciplinary lines, but they are strongly motivated to produce better code when they see better art. We will describe more of our collaboration with the College of Visual Arts and Design at the University of North Texas in Section 4.
It allows for a more shared experience, enabling students to learn and collaborate across group lines.
It gives the flexibility to reassign group membership in response to late drops and overheated group dynamics.
It allows the art class to streamline their process by using a pipeline art production line where necessary.
However, we have found that the element of creativity, student morale, the quality of the resulting games, and the outcomes all suffer when any kind of constraint is placed on the game being developed.
It allows the students to "stand on the shoulders of giants", that is, to achieve more than they can on their own by leveraging existing code.
It prepares them for the game industry, where they will likely find themselves working on an existing engine, or at least with an existing code base.
It is easier for faculty to teach from an existing game engine than to teach students to create their own game engines.
Teaching students to use a single game engine simply trains them in its use. The learning curve in a single 15-week class is typically so steep that they run the risk of spending their time wrestling with code rather than developing general skills.
Existing game engines for educational use tend to be poorly documented, low in features, and unstable. Students find that they spend most of their time trying to force a recalcitrant engine to do what they want it to do, or coding around obscure bugs. They are often resentful of the fact that their grade depends on somebody else's ability to write code, particularly when it is obvious that somebody "else" writes bad code.
The code for existing game engines is generally production code, code that is designed to run fast and be maintainable, rather than teaching code, which is further designed to teach basic concepts.
Students who are exposed to the internal code of a simple game engine are able to more quickly pick up the details of the proprietary game engine at their first job.
Students entering the game industry will most likely spend the majority of their professional lives modifying and making additions to somebody else's code. This is the last opportunity that they will have to devote major slices of their time on their own game engine.
For these reasons we opted to teach game engine programming with the class project being to create a game engine using some standard utilities, rather than modifying a free or proprietary game engine.
Our introductory game programming class, now called Game Programming 1, was introduced in 1993 as a special topics class. Despite some initial resistance from faculty curriculum committees, it received its own course code CSCI 4050 and catalog entry in 1997, effective in Fall 1998. It is offered once a year in Fall semesters.
A: "It really knocks my socks off."
B: "It's a pretty cool game."
C: "It's an OK game."
D: "It's not there, but at least you tried."
F: "You really blew it off, didn't you?"
Does it run without crashing?
Are there few (preferably no) bugs?
Does it have an intro, a title screen, a credits screen, a menu screen, help screens?
Does it play with the keyboard, mouse, and/or joystick?
Does it have sound support?
How is the game play? Is it fun?
Game Programming 1 is taught in parallel with a game art class taught to art students in the College of Visual Arts and Design at UNT. Part of the art students' grade is to produce the art work for a game programmed by our students. To encourage group synergy we teach both the art and programming classes at the same time in different rooms in the same building. Classes run for 3 hours in the evening, and the final hour is reserved for group meetings between the artists and programmers. We have experimented with running the classes at different times, and at the same time in different buildings, resulting in both cases in a massive drop-off in meeting attendance, and a corresponding decrease in the quality and number of completed games at the end of the semester.
Allowing students to form their own groups based on common interests has proved to be the best way of maintaining interest and excitement about the projects. At the end of the first class we take the students in both classes — typically 30–35 programmers and 15–20 artists — into a large classroom and have them stand up sequentially and introduce themselves to the class, asking them specifically to talk about what kind of games they like to play, what kind of game they would like to create, and any prior experience. We then allow them to wander around at random, and come to the front of the room when they have formed a group of two programmers with one artist. We have found that the amount of artwork required by a simple sprite game is within the ability of a single art student to create in a single class. However, we always have one or two groups of odd sizes, which are handled in a case-by-case manner.
Final projects are presented to the instructor in a series of 30-minute slots over two days during Finals week. They are graded on the final executable only, the instructor does not look at source code. After demonstrating the game and allowing the instructor to play, the students are quizzed on their individual contributions to the game, to ensure that they actually did what they claimed to have done. Grading on the executable only is a radical departure from other classes that the students have taken in the computer science curriculum, but is an important real-world constraint.
Starting in the Fall 2002, we instituted a game contest for students in CSCI 4050 and the associated game art class. Entry is strictly optional, and does not contribute to grades. The contest is judged by a panel of 4 or 5 local representatives from the game industry. Prizes are donated by Texas game and publishing industries, ranging from the more expensive books and games to less expensive T-shirts and posters. The contest lasts 2–3 hours, and is open to the general public.
Holding the contest in the final week of classes, approximately one week before the deadline for turn-in of the final projects, encourages students to start coding early. Previous attempts at getting students to get started early were focused on checkpoints and documentation. Preliminary progress reports and play testing dates proved to be positive up to a certain point, after which insistence on more checkpoints and documentation took up valuable time that could more profitably be spent creating the actual game. The game contest is a much more positive way of reinforcing the final deadline.
Our proximity to the DFW metroplex with its high density of game development companies makes it easy to attract guest lecturers. We encourage visits by teams from development houses including artists, programmers, and designers, and have them speak to the combined class of artists and programmers. Rather than technical presentations, we have guest lecturers speak about what it is like to work in the game industry, what it takes to get their first job, and what educational paths the students should pursue. Typically, we have two or three presentations per semester.
We have used a teaching technique called incremental development. Rather than going through the DirectX documentation or tackling a single monolithis game engine, we teach using a basic game called Ned's Turkey Farm, a simple side-scroller in which the player pilots a biplane and shoots crows (see Figure 1). The aim is not to teach this game per se, but rather to teach the development of games in general using this engine as an example. It is designed to have many of the features of a full game in prototype form so that students can use code fragments from it as a foundation on which to build their own enhancements. The students are graded on the basis of a project, which is to create a sprite-based game in groups together with art students from the concurrent game art and design class.
Figure 1: Screen shot of Ned's Turkey Farm.
code that must be made to add the new features. An average of one demo is presented per week. A typical class begins by running the demo and pointing out the new features, followed by a powerpoint slideshow describing the new demo, its new features, the theory or principles behind them, and any implementation details, but at a high level without getting bogged down in the code. This is followed by running windiff and going through the code changes in more or less detail depending on the complexity and difficulty of the code. Often, we run Visual C++ to show students in real time the effects of minor code tweaks.
Demo 0 is, for many students, their first Windows application. It fires up a black fullscreen window with a text prompt and waits for user to hit the ESC key to exit. Students learn how to register a fullscreen window, create it, draw graphics on it using the Windows GDI, respond to user keyboard input, and shut down the application gracefully. They are introduced to the concepts of Windows messaging and the message pump.
Demo 1 is our first Direct3D application. It starts Direct3D and displays a shoebox background consisting of a floor and a backdrop. It may be run either fullscreen or windowed by changing a global variable.
The executable for Demo 2 looks the same as Demo 1, but there is a lot more under the hood. We add XML scripting using TinyXML. Now the students can change the behaviour of the demo by editing Ned.xml in an XML editor instead of having to recompile the code. This allows the art students to change some of the settings in the game easily.
Debugging may seem like a moot issue until students seriously start creating their own game. The problem with DirectX fullscreen debugging is that DirectX takes complete control of the screen. The Visual Studio debugger is the first line of defense, but some bugs will crash the debugger. The debug code in Demo 2 will let the programmer read debug output in real time in a client console application on a second monitor, or on the screen of a second computer. It will also save the debug output in a file, and display it in the Visual Studio debugger's Output window. It accepts printf-like parameters, and it can be disabled with two keystrokes by commenting out a single #define.
Demo 3 is our first attempt at simple real-time animation. A plane sprite moves across the background. F1 tabs between game view and eagle-eye view, in which the camera pulls back so the programmer can see what is happening "behind the scenes.
Demo 4 has more objects, managed by a sprite manager and an object manager. The object manager is a first draft only in that it can create objects but not yet delete them. Sprites are now animated with multiple frames of animation. There is now a continuous, infinite scrolling background with the camera in motion to keep the plane in the center of the screen.
In Demo 5, crows now have simple rule-based artificial intelligence with some randomness thrown in to make them behave slightly differently. They try to avoid the plane as much as they can given a limited attention span. Flocking can be seen as emergent behaviour. The plane fires a bullet when the player hits the space bar. Bullets have a fixed lifetime. When a bullet hits a crow, the crow explodes and turns into a falling corpse, which disappears when it hits the ground. The object manager now has full functionality, in that it can now delete objects and recycle their space.
In Demo 6 there is a game shell wrapped around the game engine, consisting of an intro sequence (a logo screen, a title screen, and a credits screen), and a menu screen. The player can click out of any of the intro screens. From the menu screen one can play a game or quit by pressing the appropriate key on the keyboard. After each game, the player is returned to the menu screen after they kill the last crow, or preemptively by pressing ESC. From there the player can re-enter the game engine. We show how to gain direct access to the back buffer to blit the intro screens there directly.
Demo 7 introduces sound, managed by a sound manager class. Since DirectSound will not allow a sound to be played multiple times simultaneously, the sound manager keeps multiple copies of each sound, sharing the sound data, and automatically selects the first copy that is not currently playing. The plane engine sound loops.
Demo 8 uses DirectInput to give faster access to input hardware. We start by using it for the keyboard and mouse instead of using the Windows messages like in previous demos. We also add some 2D animation for clickable buttons on the menu page. The mouse is used to press menu screen buttons, as a joystick, and to fire the gun. The buttons on the main menu are drawn as 2D sprites. There is a custom DirectInput mouse cursor.
Demo 9 adds joystick control to the DirectInput code, and adds a device selection screen with radio buttons.
Demo 10 adds more complexity to the game, and introduces the drawing of text in screen space. We add multiple levels, with more crows as level number increases, and a success screen in between levels. Player can now be hit by crows, which reduces health and ultimately kills the player. The player's health and number of lives are managed by a score manager. We add text on the screen showing the level number, number of crows, health, lives and score.
Demo 11 stores in the Windows registry the game settings that should persist from one execution of the game to the next. We start with the high score list and the initial input device. Checksums are used to detect tampering. New code is added to display the high score list, enter a new name typed in by the player into high score list, and manage the stored high score list.
The advanced game programming class, now called Game Programming 2, was introduced in 2000 as a special topics class. It received its own course code and catalog entry in 2003, effective in Fall 2004. It is offered once a year in Spring semesters. The introductory game programming class is a prerequisite.
Quality: Models often have inappropriate triangle count (too high or too low) and topological defects (degenerate, detached, or sliver triangles, for example).
Post-processing: Models often require significant post-processing, for example, they may not be located at the origin, and may have triangles listed in the wrong order for back-face culling.
File format: Models are often posted in various formats, for which loaders must be written or adapted from other code. File format converters exist, but they are typically expensive, buggy, or produce low-quality results that require post-processing.
Motivation: Programming students are more excited about their games, and hence better motivated, if they can have custom art created on-the-fly in response to group design decisions. Our experience has shown that downloading art from the web typically results in dissatisfied students and lackluster games.
The biggest drawback to having students create a custom 3D game engine is the amount of work involved. It is imperative that students use some basic utilities, for example, the D3DXUtil library provided in the DirectX SDK. We have used a set of improved utilities (including a basic rendering engine, a model importer, and implementations of Euler angles, matrices, vectors, quaternions, axially aligned bounding boxes), published in Dunn and Parberry . We have had the greatest success from using a simple game engine which we call SAGE. Students who wish a different experience are permitted to download and use any free game engine.
As with Game Programming 1, one of the key elements of this class is the excitement generated by having programming students work with art students. In the advanced game programming class, however, there is a significant barrier to communication between the artists and the programmers: the model file format problem. The art students can work with sophisticated 3D modeling tools such as Maya, Lightwave, and 3D Studio Max, but unfortunately the native file formats generated by these programs are proprietary and difficult to load. The programming students work with Microsoft DirectX, which has strong support for its own file format, called ".x". We have found this disconnect between the file formats used by the artists and the programmers the most difficult gulf to bridge. All of the plug-ins, exporters, and file converters we have tried have the disadvantage of being expensive or unreliable, or both. Worse still, they fail annually when the College of Visual Arts and Design upgrades its subscription to the 3D modeling tool of choice, leading to a last-minute scramble to provide software tools in time.
With which the player can interact.
A graphics renderer, using pixel shaders and HLSL. It is essential for student morale that the rendering engine be reasonably close to cutting edge, and to provide the latest shader technology.
Objects, including a method for importing 3D models created by artists, and an object manager that takes care of object creation, behaviour, rendering, and destruction.
A 3D world, consisting of terrain and some method for level-of-detail to increase rendering speed.
Input from the keyboard, mouse, and joystick to enable the player to interact with the world and the objects in it.
Collision detection to enable interaction between the player, the objects, and the world.
A particle engine to enable visual effects that follow from that interaction.
SAGE brings the experience of incremental development to a fully 3D game engine, based on an educational pedagogy that has a proven track record. SAGE includes a sample game, Ned's Turkey Farm 3D. The code consists of a sequence of game demos, each showcasing a new feature. The feature is demonstrated in rudimentary form, leaving room for students to enhance it. The trick is getting it complex enough to convey the fundamental principles, yet simple enough for students to understand. SAGE has Doxygen generated documentation, and approximately 200 pages of tutorials. SAGE is developed in C++, uses DirectX 9.0, and is accompanied by Visual Studio project files. It is released under a BSD open source license, and is available on the first author's website and in the Microsoft Developer Network Academic Alliance Curriculum Repository.
SAGE is organized as follows. The following description applies to Demo 6, the complete fully-featured project. The top-level folder contains two subfolders, Ned3D containing game-specific code, and SAGE containing engine code. The Ned3D folder consists mainly of game-specific classes derived from the basic SAGE classes, which we will not describe further here. The SAGE folder contains two subfolders, SAGE Resources containing resources for the console and effects files for the pixel shaders, and the Source folder containing SAGE source code.
SAGE\Source contains the following subfolders.
Common: Low-level code, which will be described in more detail below.
DerivedCameras: A free camera and a tether camera.
DerivedModels: An animated model using animation frames and linear interpolation, and an articulated model.
DirectoryManager: A directory manager, which manages the organization of resources in subfolders.
Game: The GameBase class, which contains game logic code.
Generators: A name generator and an identifier manager.
Graphics: Graphics related code, including vertex buffers, index buffers, and effects.
Objects: Game objects and the object manager.
Terrain: The terrain code, including height map and LOD.
Water: Code for water animation, including use of the reflection pixel shader.
WindowsWrapper: An abstraction layer for Microsoft Windows specific code.
AABB3.cpp, AABB3.h: Axially aligned bounding boxes.
Bitmap.cpp, Bitmap.h: Bitmap image reader.
CommonStuff.h, CommonStuff.cpp: Common stuff that doesn't belong elsewhere.
EditTriMesh.cpp, EditTriMesh.h: Editable triangle mesh class.
EulerAngles.cpp, EulerAngles.h: Euler angle class.
MathUtil.cpp, MathUtil.h: Basic math utilities.
Matrix4x3.cpp, Matrix4x3.h: Homogenous transformation matrix code.
Model.cpp, Model.h: Simple class for a 3D model.
Renderer.cpp, Renderer.h: Rendering engine (modified somewhat from its original form in ).
TriMesh.cpp, TriMesh.h: Triangle mesh class.
WinMain.cpp, winmain.h: Windows dependent code.
camera.cpp, camera.h: Base camera class, from which the free camera and the tether camera are derived.
fontcacheentry.cpp, fontcacheentry.h: Encapsulates the Direct3D font class.
plane.cpp, plane.h: Math plane class.
random.cpp, random.h: Pseudorandom number generator.
texturecache.cpp, texturecache.h: Texture cache class.
Phase 1 of SAGE consists of approximately 35,000 lines of C++ code (including header files, code, and comments). The code is distributed into four parts, the Common framework (described above), SAGE code, tinyXML, and code specific to the sample game, Ned's Turkey Farm 3D. The number of lines of code in each of these modules is given in Table 1. The code architecture is described in Figure 2, with the foundation being code from Microsoft DirectX and the Windows API, the Common framework being layered on top of that, supporting the SAGE engine, with code specific to the particular game supported by SAGE layered on top of that.
Table 1: Number of lines of code in SAGE.
Figure 3: Demo 0 showing the plane model.
Demo 0 demonstrates the code for reading and displaying a model. The code for Demo 0 shows the programmers how to import a model, render it, and perform simple operations such as rotation and camera motion under user control. In addition, the executable is a useful tool for artists and programmers to check for correct export of models, which can be created using a 3D modeling tool such as Maya or 3D Studio Max (see Figure 3).
Each modeling program has a proprietary file format that changes with each version, the updating of which can cause previously used models to become unusable. Each has facilities for plug-ins to export to a different file format. Some file formats are text, some are binary. Direct3D has a native file format (.X). Other popular file formats exist, eg. Quake II, Quake III models. Managing the input of art assets is one of the biggest startup hurdles in making a game demo. File format converters exist, but our experience with them has in general been less than positive, often resulting in the introduction of degenerate triangles, sliver triangles, missing triangles, detached triangles, and the mangling of origin, axes, normals, and scale.
To help avoid these problems, SAGE uses the S3D format from , and includes an S3D plug-in for Maya. S3D is a simple text format that enables the programmer to view the model data directly in a text editor to check for simple errors.
Demo 1 covers terrain input and rendering. It reads a height map from an image file and renders an island surrounded by a small finite area of ocean (see Figure 4). Simple grid-based level of detail is provided. A free camera can be used to explore the terrain. A simple console allows the user to modify game properties easily.
Demo 2 covers shaders using HLSL. Shaders are provided for texture blending (demonstrated on textures that change with terrain height), and for reflections in water (see Figure 5). A triangle of water that moves with the camera gives the illusion of ocean extending to infinity. We particularly avoided the temptation to create a large number of shaders, preferring to leave that for students. Since shaders are an intricate subject the shader tutorial is the longest of our tutorials, consisting of approximately 50 pages.
Figure 4: Demo 1 showing ocean and island.
Demo 3 covers game engine architecture, including objects, an object manager, a tether camera, and Direct-Input. Types of objects supported include rigid objects, articulated objects, and animated objects. Articulated objects consist of separate hierarchically organized parts that may be moved or rotated independently, such as the propellor on the airplane and the blades on the windmill in Ned's Turkey Farm 3D. Animated objects consist of key frames created by the artist as a set of rigid objects. The SAGE animated object provides in-betweening using linear interpolation. Ned's Turkey Farm 3D has crows implemented as animated objects.
Demo 4 covers collision detection using axially aligned bounding boxes (AABBs). Collision of objects with terrain, objects with objects, bullets with objects are detected. Object-terrain collision is implemented by interpolating terrain height within a triangle, object-object collision is implemented using AABB-AABB intersection, and bullet-object collision is implemented using ray-AABB collision detection. In a real game, AABB collision detection would be only the first or primary level of collision detection, designed to quickly eliminate noncolliding objects. Subsequent levels of collision detection, including bounding boxes and bounding spheres at the secondary level, and triangle-triangle collision detection as the tertiary level, are left as possible projects for the student. For educational purposes, SAGE will render AABBs in real time for classroom demonstrations (see Figure 6).
Figure 5: Demo 2 showing terrain reflections and texture blending.
Figure 6: Demo 4 showing AABBs.
Figure 7: Demo 5 showing cloud of feathers created using particle engine.
Demo 5 covers particle engines and provides a general purpose particle engine that is used in Ned's Turkey Farm 3D for explosions, clouds of feathers (see Figure 7), smoke, gunfire flash, and dust raised by a bullet hitting the terrain.
Demo 6 covers stereo 3D sound using DirectSound.
The second new class is a Topics class in which the students specialize in the advanced topic of their choice, working in groups. This helps students to fulfill Requirement 4 of Section 2. Topics undertaken recently include water animation, procedural clutter, procedural quest generation, shaders, shadow rendering, and cell processor programming. Undergraduates are encouraged to work with graduate students, which exposes them to academic research and increases the probability that they will return for a graduate degree.
Completion of the four classes, Game Math and Physics, Game Programming 1, Game Programming 2, and Topics in Game Development entitles students to an undergraduate Certificate in Game Programming, starting 2010.
Providing a dedicated game programming laboratory proved to be an important requirement when developing the game programming classes. The standard open laboratories provided by universities are unsuitable for game programming classes for several reasons.
The process of updating software is typically slow and cumbersome, since open labs catered to a wide range of students from various disciplines.
The hardware, in particular the graphics cards are not up to expected standards.
Students developing and playing games are distracting to other lab users, and game development students typically run afoul of any rules against game playing, despite the argument that it is required for a class assignment.
Since game students are required to work in teams with other programmers and artists, a substantial amount of team meetings during development and debugging need to be actually at the keyboard. Open labs are typically designed for students who work alone, and in general have a policy of silence.
Game development students are excited about what they do, and in consequence tend to be rowdy and loud.
A dedicated game development space provides a place where students can meet and work with other students who share their interest. The area becomes a crucible for independent learning and experimentation that inspires students to greater efforts and achievements.
Figure 8: Current laboratory layout.
We started with a small room with three computers in 1993. As space became available, we moved to larger quarters in 1994 and 2001, finally moving into the current location in which we have approximately 570 square feet, 12 computer workstations, and a file server. The computers are on a special 2-year up-grade cycle, as opposed to the standard 3 or 4-year upgrade cycle, paid for by course fees from the game programming classes. Dual monitors are a must for on-screen debugging.
We found that the best organization for the lab is the "bull pit" model, with computers around the outside of the room. The center of the room has tables arranged for conferences and meetings and for laptop use. The computer workstations are connected to the wired network through a router that serves as a firewall to prevent packet floods generated by rookie game programmers from swamping the building's network.
One corner of the room has been set up with a sofa, a TV, and several game consoles to foster interaction between students and provide an inviting club-like atmosphere. A typical day will find people playing a game on the console, playing networked PC games, writing code for their own game engines, and engaged in vigorous discussions on subjects ranging from linear algebra to graphics using one of the many whiteboards.
The location of the lab is important. Currently it is across the hall from the author's office, which since the office and lab doors are usually open, facilitates the author's interaction with students. The space is located away from the other faculty offices where the noise generated by the students will not cause a problem for more sober and sensitive colleagues.
To ensure that the lab software is kept up-to-date and that the hardware does not get stolen, we hire a student as lab monitor. He or she is required to keep the lab open for 20 hours per week. The job usually goes to one of the alumni of the game programming courses so that he or she can provide help to the current crop of students. In addition to this paid position, several trusted students also have lab access on the understanding that they provide additional informal open hours by allowing other students to use the lab while they are there. The lab door is fitted with an electronic card-swipe lock that monitors and records entry. Figures 8 and 9 show the lab layout.
Figure 9: Planned laboratory layout. Unlabelled rectangles are tables.
We have had success over the last decade and a half with a two-course sequence in game programming in a traditional computer science undergraduate curriculum. The classes are project based, and feature collaborative work with art students in the College of Visual Arts and Design. In addition to training aspiring students for the game industry, the classes also provide a capstone style project experience for all computer science students.
Our experience with game industry involvement is that while companies are, with a few notable exceptions, reluctant to provide any sort of concrete support for game development programs in academia, individuals are much more positive. Requests for guest lecturers from industry almost always results in great presentations from motivated, knowledgable, and experienced game programmers and artists.
The author believes that game programming classes at UNT have had a significant effect on student enrolment and retention. Student numbers are currently dropping in computer science and engineering programs nationwide, which is mirrored at UNT (see Figure 10). Figure 11 shows enrollment figures for the introductory and advanced game programming classes from to present compared to the total number of Bachelor's degrees awarded by the Department of Computer Science and Engineering. The introductory class was capped at 35 students in 2002. We see that a substantial fraction of graduates have taken game programming.
SAGE can be downloaded from http://larc.csci.unt.edu/sage, and was funded by a grant from Microsoft Research.
Figure 10: Total enrollments in undergraduate degrees in the Department of Computer Science and Engineering, 1996–2009.
Figure 11: Game class enrollment versus number of CSE Bachelor's degrees awarded by academic year (for example, 1993 means Fall 1993 to Summer 1994).
Figure 12: Number of alumni getting jobs in the game industry, 1994–2009.
 J. C. Adams. Chance-It: An object-oriented capstone project for CS-1. In Proceedings of the 29th SIGCSE Technical Symposium on Computer Science Education, pages 10–14. ACM Press, 1998.
 C. Alphonce and P. Ventura. Object orientation in CS1-CS2 by design. In Proceedings of the 7th Annual Conference on Innovation and Technology in Computer Science Education, pages 70–74. ACM Press, 2002.
 K. Becker. Teaching with games: The minesweeper and asteroids experience. The Journal of Computing in Small Colleges, 17(2):23–33, 2001.
 Computing Curricula 2001: Computer Science. Steelman draft, The Joint Task Force on Computing Curricula, IEEE Computer Society, ACM, 2001.
 F. Dunn and I. Parberry. 3D Math Primer for Graphics and Game Development. Wordware Publishing, 2002.
 N. Faltin. Designing courseware on algorithms for active learning with virtual board games. In Proceedings of the 4th Annual Conference on Innovation and Technology in Computer Science Education, pages 135–138. ACM Press, 1999.
 T. J. Feldman and J. D. Zelenski. The quest for excellence in designing CS1/CS2 assignments. In Proceedings of the 27th SIGCSE Technical Symposium on Computer Science Education, pages 319–323. ACM Press, 1996.
 IGDA Curriculum Framework. Report Version 2.3 Beta, International Game Developer's Association, 2003.
 R. M. Jones. Design and implementation of computer games: A capstone course for undergraduate computer science education. In Proceedings of the 31st SIGCSE Technical Symposium on Computer Science Education, pages 260–264. ACM Press, 2000.
 M. Mencher. Get in the Game! New Riders Publishing, 2003.
 R. Moser. A fantasy adventure game as a learning environment: Why learning to program is so difficult and what can be done about it. In Proceedings of the 2nd Conference on Integrating Technology into Computer Science Education, pages 114–116. ACM Press, 1997.
 I. Parberry, M. Kazemzadeh, and T. Roden. The art and science of game programming. In Proceedings of the 2006 ACM Technical Symposium on Computer Science Education, pages 510–514. ACM Press, 2006.
 I. Parberry, J. Nunn, J. Scheinberg, E. Carson, and J. Cole. Sage: A simple academic game engine. In Proceedings of the Second Annual Microsoft Academic Days on Game Development in Computer Science Education, pages 90–94, 2007.
 I. Parberry, T. Roden, and M. Kazemzadeh. Experience with an industry-driven capstone course on game programming. In Proceedings of the 2005 ACM Technical Symposium on Computer Science Education, pages 91–95. ACM Press, 2005.
 G. Sindre, S. Line, and O. V. Valve Positive experiences with an open project assignment in an introductory programming course. In Proceedings of the 25th International Conference on Software Engineering, pages 608–613. ACM Press, 2003.


I have been interested in astronomy virtually my whole life, starting with grinding and polishing a six inch Edmund mirror back in the early '60's. Given the times, and my family traditions, I opted for a military career that lasted a total of thirty years. During those years my association with the hobby was limited to reading and looking at pictures.
Upon my retirement from the Army I did the typical Law Enforcement track. It only took a year with the Sheriff's Department to realize that I just didn't want to carry a gun anymore. While looking around for a challenging alternative I ran across an ad for a "Mechanition" (Read Gofor) at the Steward Observatory Mirror Lab. I was intrigued and applied for the position. I was promptly told that I was over-qualified. They felt that with my intensive experience as a retired Army Green Beret, with a Law Enforcement stint, and a BS from Northern Arizona University, that I would become quickly bored and move on.
Since I had virtually no experience in optics of ANY size, I argued that I could not possibly be over-qualified. My love for the science and desire to work in such a prestigious institution in ANY capacity would more than make up for what I lacked in direct experience. Still, I was told that I was over-qualified. I was finally ready to give up but asked one thing before I went away. I would stop bugging, but I wanted the answer in person. In what was, I am sure, an act of desperation, I was given an interview.
I met with the Mirror Lab Manager on a typical summer morning and began my tour and interview. It was clear that the answer was not going to change, but decorum dictated that I be treated as a serious candidate. I learned that the position was generally filled by an Op/Sci undergrad; far from my age of fifty five, and worldly experiences. In any case, the Manager lead me through the lab where I encountered the second 8.4 meter mirror destined for the LBT in Arizona. As we passed the mirror located on the giant test tower, I touched the edge of the monster mirror and smiled. This apparently piqued the Manager's curiosity and he asked what I was thinking. I responded that this was not a telescope, it was a time machine. One that would reach billions of years into our past, perhaps to the origin of the universe. That comment got me the job!
I was so excited to be a part of something so immense in physical size, but also in technological advancement beyond imagination. My spare moments between sweeping floors and getting tools for the "real" workers were spent in reading science papers on the projects, quizzing Phd's with stupid questions, and filling notebooks with critical information. I was, literally, in "Hog" heaven.
By the end of the first year I had become the goto guy to assist the project scientists and engineers. On one particular occasion I was way up in the test tower along with the Chief Scientist of the Lab conducting tests on the mirror some ninety feet below. As we had nothing in common, the conversation was limited to "Hand me that", or "Step back out of the way". Desiring to elevate my "serf to master" relationship I mused that it was interesting that this mirror would become significant by utilizing Heisenberg's Uncertainty principle. I received a tolerating stare and a question from the scientist, "What do you mean by that?". I said that since we were using laser interferometry to test the mirror; the wave theory of light, and imaging would be done using CCD cameras detecting photons of light; the particle theory of light, I found it interesting. He looked at me for a moment and then said, "Who are you?". I replied that I was a gofor in the lab. Nothing more was said that day.
I continued asking questions and being somewhat underfoot, but harmless. The scientists and engineers began to notice me and actually engaged in multi-word sentences. To make a long story short, I was promoted to Senior Staff Technician with an attendant 500% raise and became the Assistant Supervisor of the Large Optics Fabrication Lab. Why? Because I showed an insatiable thirst for knowledge and became an asset to the program. This all happened in my fifty fifth and sixth years. I had actually become one of the team, frequently invited to meetings chaired and attended by Scientists and Engineers!
The cycle time required to produce a finished 8.4 meter mirror was about two years, if nothing went wrong, which of course, it always did. The entire process starting with casting, progressing through grinding and polishing, and terminating with integrating the mirror to the steel structure known as the "Cell" which would ultimately become the optical assembly ready to be shipped to some far off mountaintop. Because of my lack of experience and my age, I searched for documents that would spell out each of the steps in the process. There were none! As a career military man, I was stunned! The whole process was so new that the developers of each major stage; Casting, Polishing, and Integration were still in charge of their respective steps and simply directed work crews based on their memory. While the system worked well, without proper instructional documentation, the very future of the process was entrusted to the mental and physical health of essentially three men!
I began a two year project of writing and documenting the entire process utilizing a Mil-Spec format that incorporated exact details including digital pictures of each step in the process. I thought my efforts would be appreciated and accepted without reservation. I was wrong. I was presented with the, "If you write it all down ANYBODY could do it!" dismissal. Job security was suddenly threatened! I was viewed as a pariah and had to take my efforts underground. Two years after I started, I completed a nearly two hundred page Mirror Fabrication Specification. It was instantly rejected and relegated to an obscure file on the main server not to be seen again for almost ten years!
I retired from the Mirror Lab in 2009 and moved to a three acre plot forty miles east of Tucson in the Sonora Desert where I built my own 10x12 foot roll-off-roof observatory where I began astrophotography. Years passed before I came in contact with my old boss at a Star Party. Our friendship picked up as though no years had passed. Although formally retired, he had returned to work part-time at the Lab. He told me that my Mil-Spec procedure had been resurrected and was required to be used for each process. My other suggestion that all new Technician hires be required to construct a ten inch Dobsonian telescope following the entire process from casting their own mirror, generating, grinding, polishing, testing, and completing the assembly of their telescope before they could work on large optics had been adopted. I actually made a difference!
Patrick, thank you for sharing! Citizen scientist!
Great read, thanks so much for sharing!
To me that is what it's called " a dream come true", you made a difference and I'm sure you are very happy that your work is now esteemed and contributes to a better knowledge.
Thank you for publishing such a great story.
Living in a burb of Phoenix, I have been to the mirror lab a few times to see various mirrors in various states of completion. It's always an interesting time. 2 words.... Dream Job. You're a lucky man to have had time working there.
I retired from the Mirror Lab over ten years ago. Except for family, and a few friends, nobody knew about my experiences there. My sons told me that my legacy was not in the decades that I spent in the military, but rather my time at the Mirror Lab. Only a handful of people in the world ever got to do what I did. My efforts helped mankind in gaining a better understanding of the universe and our part in it. My great-great grandchildren will be able to look at those giant telescopes in years to come and be able to say "My family helped make this happen". What greater legacy than that? Someday some engineer or scientist will wonder how that four inch long chip in the edge of LBT2 got there, and I'll have the satisfaction of knowing that I left a personal reminder that "I was there!".
Excellent anecdotes and career! Having genuine enthusiasm certainly makes all the difference. I worked optics and then big optics for Uncle Sam and the major observatories, with some of that time in the military. I'd estimate that only 10%, even among the ~professionals~ ... were passionately engaged in what we were providing to the community. The maniacs, thankfully, inexorably floated upward. Happy that includes your experience. Must have been frustrating that they shelved your self-motivated work for a decade; but nice that they eventually implemented that!
That's a great story, Patrick. Two questions, though: Did your experience at such a facility make it more difficult for you to be satisfied with consumer telescopes? Did you get to view through any of the research instruments the mirror lab made optics for?
Wow, those optics guys are an elitist (re: snobbish) group ! Good for you for persevering.
Actually, I think it made me even MORE appreciative of what's available to us "regular" folks. None of the "Big" telescopes have the capability of looking through an eyepiece. All of the imaging is done via CCD cameras or devices. The outputs are on computer screens pretty much the world over. Virtually all research that comes from the images is in the form of data tables, lists of numbers, etc. Making the data into images is almost an afterthought. Although we Technicians did fabricate a fake eyepiece once as a joke for a visiting group of scientists from Asia. A few of them actually looked through the eyepiece! They didn't share our sense of humor.
What a wonderful story! What made me smile the most was touching the mirror helping you get your impossible dream job. I showed some passion for the craft when I applied for my next to last job before I retired, and that worked to help me get my dream job, too. Clear skies!
Thanks for sharing your wonderful story, Pat, which is an inspiration to us in a number of different ways. During my career in a different but similarly technical field, I learned not to dismiss anyone who had a combination of a thirst/passion for knowledge combined with experience in understanding/valuing procedures (e.g. military or space). Those kinds of people are invaluable to a team effort, especially one tackling a complicated project.
All of that experience will be useful to squeeze all that you can out of that 130mm scope!
That was a great read! Thanks for posting this.
What a great second career.
Thanks for sharing, I enjoyed reading your post.
Awesome story. You drew me right in, felt like I was standing right there in your awkward moments with the propeller heads. Thanks for your service to our country and to astronomy.
Wonderful story thanks for sharing. I would love to visit the mirror lab one day!
Wow! Hard to imagine the arrogance that would result in your firing when you're improving the process. However, I've seen this over and over in my job as a computer engineer working on computer graphics architecture and now autonomous cars - employees work for themselves and make decisions that are good for them (as in the example above - you were threatening their job security) not for the project. Good managers can see this and see up incentives to have people work for the project instead of themselves.
Actually, I didn't get fired. I got to do what just about all of us would like to do at one time or another. We got a new Manager that was "oil" and I was "water". We never agreed on anything. One day I decided that my "dream job" had turned into a "nightmare job". I had planned to stay on at the Lab until I was 70 (not uncommon). Instead, when I turned 62 I informed him that I was going to retire but I'd give him 90 days to find a replacement that I could train. His response was that I had a high opinion of myself and he had no intention of replacing me. I jumped into my big yellow dodge truck, drove over to the Arizona Retirement Office and retired. I came back to his office and told him that I decided to move my retirement date up some. "Yeah, when?" he said. "Today", I responded. He went ballistic. For not valuing my presence he sure got mad at me leaving with no notice and banned me from ever coming in to the Lab ever again! I waited my whole life to say to a deserving boss, "Take this job and shove it", to quote Johnny Paycheck. I live about four blocks from the Lab and stop by and say "Hi" to the folks now and then. Oh, that's because he got fired shortly after.
Thank you so much for sharing! So much good--and bad--here; but mostly: inspiring!
Really great story... enjoyed reading it. Appreciate you sharing it.
I'm so glad to read that you cared to document the processes in the mirror lab. It's been my experience that much institutional knowledge is not being saved in out country. Other societies have an apprentice program or similar process for passing on undocumented information. As a materials engineer with experience in electrodeposition and thick film processing, it took over a year to find a replacement when I announced my retirement. No one in our company had been assigned to work with me at all. Our universities and technical schools cannot train specialists to the degree we need. And so many of our processes are not documented as well as mil-specs or as required by older corporate document control systems.
My desire to document procedures was not all together altruistic. Given a two year processing cycle I was afraid I would forget my job by the next time around! I did it as much for myself as posterity.
Very interesting article--thanks so much for sharing your experience. I just toured the Mirror Lab in February, on my first trip to southern Arizona. Absolutely fascinating!
Very thought provoking article. Thanks for writing it.


Call R and D Catering today; we'll take care of everything. With R and D Catering you don't need to worry about a thing. We take care of all the details, from preparation to clean up. We can do one item or the entire meal.
From weddings to cocktail parties, or anything in between. R and D Catering is your best choice. Our attention to detail, and reliability ensure that your event will be a smashing success.
Our food reflects our commitment to exceptional quality. All meals are prepared with a passion for perfection. Your guests will be talking about your wonderful food for days to come. Our menu can be customized to your special needs or wants.
Content copyright . R and D Catering. All rights reserved.


Body packing is a common method for drug smuggling across international borders, since hiding drug packages in body cavities is difficult to detect. This situation can create medical and surgical complications ranging from intoxication to intestinal obstruction. Here we present a case of body packing in a 20-year-old man.
A 20-year-old Hispanic man was brought in by federal agents from a nearby airport complaining of "abdominal discomfort". Physical examination revealed normal sized, reactive pupils and a soft, non-tender abdomen with hypoactive bowel sounds. Laboratory tests were unremarkable. A KUB revealed multiple foreign bodies in the distal small bowel and colon which were confirmed with a CT scan of the abdomen with contrast (Panel A, Arrow) and 3D reconstructed image (Panel B, Arrow showing Drug filled Pallets). The foreign bodies were later confirmed to be illicit drugs. The patient was monitored in the critical care unit and was given oral gut lavage; sixty-five drug pallets were successfully retrieved rectally without any complications.
Figure 1: A KUB showed multiple foreign bodies in the area of distal small bowel and colon (Black Arrow) and 3D reconstructed image showed Drug filled Pallets (Yellow Arrow).
Body packing is practiced for drug smuggling, especially by young men and women. Acute intoxication due to release of cocaine/heroine from ruptured packets can cause life threatening arrhythmias and acute myocardial ischemia. Intestinal obstruction and/or perforation by these packages are not uncommon. Radiographic imaging, including computed tomography scans, will confirm the suspected diagnosis. Asymptomatic patients can be managed with close monitoring in the ICU; treatment is whole bowel irrigation with polyethylene glycol or electrolyte lavage solution. Sometimes this is difficult due to poor patient cooperation. Endoscopic retrieval of drug filled pallets is not safe and potentially harmful because of chances of rupture is high.
Body packing can create medical and surgical emergencies requiring urgent intervention to reverse life threatening situations.
Deitel M, Syed AK. Intestinal obstruction by an unusual foreign body. Can Med Assoc J 1973; 109:211.
Pidoto RR, Agliata AM, Bertoline R, Mainini A, Rossi G, Giani G. A new method of packaging cocaine for international traffic and implications for the management of cocaine body packers. J Emerg Med 2002:23:149-53.
Silverberg D, Menes T, Kim U. Surgery for "Body Packers": A 15 year experience. World J Surg 2006: 30:541-6.


text:
The All Red Music Blog
Nota Musical Nova Iguacu
Posted on September 19, 2019 September 19, 2019 by admin
8 p.m. Freeform Queen Sugar Nova (Rutina Wesley) remains estranged from her family. Stanley Holloway and Wilfrid Hyde-White also star in this 1964 version of Lerner and Loewe's musical that was.
Nota bene: The RFI Listeners Club used to be called "Club. There is no doubt that the next year, in 1902, a transmission from the Marconi station in Nova Scotia, Canada, did cross the Atlantic, and.
In 1971, he became the first African-American to be the musical director and conductor of the Academy Awards ceremony. In 1995, he was the first African-American to receive the Academy's Jean Hersholt.
10/07/2018 – The Trinidad Guardian. / Munnie's Multicultural Musical Masquerade, a children's short story by heritage educator Dr Kris Rampersad has been adjudged a winner "for its wit and musical.
The KQED weekly schedule has been configured to conveniently print on as few pages as possible. However, the final look of your printout can be affected by your printer, printer plug-in, browser or.
Folk Music Syracuse Ny Beginning in folk music, he moved on to bluegrass and then country music, Born in Louisville, Kentucky Perry emigrated to Syracuse, N.Y. and grew up in a. NEW YORK — Pete Seeger, the banjo-picking troubadour who sang for migrant workers, college students and star-struck presidents in a career that introduced generations of Americans to their
The musical is sponsored by Black Label and will draw from the newsmakers of all industries in Nigeria including media, entertainment, oil and gas and many more.
known as João Gilberto (10 June 1931 – 6 July 2019), was a Brazilian singer, songwriter, and guitarist, who was a pioneer of the musical genre of bossa nova in the late 1950s. Around the world he was.
He followed the victims, studying them closely before committing the crimes," said police commissioner Pedro Henrique Medina from the northern suburb of Nova Iguacu. The man was identified as Sailson.
Frank Sinatra once said of Antonio Carlos Jobim, the Brazilian composer often described as the godfather of bossa nova. de una nota so" ("One-Note Samba")–have become international standards,
Treasury Secretary Steven Mnuchin said in a statement that the measures are meant to "deny Cuba access to hard currency" in order to "financially isolate" the island. The United States Treasury.
Ernie Smith will bring musical pleasure at this year' s Caribbean Community of Retired Persons (CCRP) Living Legacy Awards. Slated for September 28, this year's awardees are four Jamaicans who have.
Nyu Pop Music Seminar Pharrell Rogers had very little knowledge of pop music until a few years ago when, as a senior at NYU, she performed a pop song (Alaska) as part of a songwriting master class held by Pharrell Williams. Cue. Classical Music Related Words A type of "ornament" (usually in 17th and 18th century keyboard music) in. for
Pose ," is a dance musical that explores the juxtaposition of several segments of life and society in New York: the ball culture world, the rise of the luxury Trump-era universe and the downtown.
Their irrepressible joie de vivre finds its best outlet through music and dance. Samba, lambada and bossa nova are Brazil's best-known musical exports, but visitors can also discover a plethora of.
It took Gilberto a little while to settle in as he performed "Samba de Una Nota Sô" (One Note Samba. the Jobim standard and bossa nova watermark; and "Wave," another Jobim favorite. He sashayed.
Soprano Karine Bocher from Quebec City took home first prize and the Audience Choice Award at the Canadian Opera Company's third annual Ensemble. Wainwright also treated the audience to a surprise.
It is even rarer that he does so as a singer and a composer of Brazilian funk, a musical genre that emerged in the favelas. He performs here in the gritty city of Nova Iguaçu and other sketchy.
Blues Bar Richmond Va From left, Swedish actress Anita Ekberg known for her role in "La Dolce Vita"; Star Trek icon Leonard Nimoy; Bobbi Kristina Brown, the only child of Whitney Houston and Bobby Brown; legendary blues. Isley Brewing Company has been brewing excellent craft beer in Richmond, VA since 2013! Our tasting room is in the heart of
So last night Miley Cyrus and Mark Ronson were the musical guests on Saturday Night Live , and performed their new song "Nothing Breaks Like a Heart." And while they did an amazing job with the music,
In recent years, however, Pegi Young, who had sometimes sung backup for her husband, began devoting more attention to her own musical endeavors, and in 2007, at age 55, she released her debut album,
Posted in Understanding Music
Blues Bar Richmond Va
Anthony Burger Hymns Songbook
Cult Women Dancing A Ritual
Red Music Shop Review
Gospel Music Vancouver
New Orleans Funk 3 Rar
Latest Chrome Extension For Opera
Phantom Opera Ticket Master
New Orleans Funk Volume 3
Isaac Bashevis Singer Animal Rights
New Dragon Force Singer
Melancholic British Pop Music
Muslims Dancing After 9/11
Mn Orchestra Taj Express
Children Singing This Means War
Dr Dre Is Singing In What Group
Arabs Dancing Colorful Hd
Chance The Rapper Hoodie Champion
Classical Music Agencies Nyc Jobs
Jingle Bell Rock Song Dance
Girl Lead Singer Song Poison
Soul Music That Will Make You Smile
Some Funk Skunk Bass Line
Jezz Woodroffe Music Blogspot
Opera House Hotel Bronx Map
Aladdin The Musical Nyc Tickets
Gospel Music Country Singers
Understanding Music (4,850)


Don't forget to book your seat - only 2 weeks to go!
The 2018 Business Leadership Award winners will be announced at the conclusion of the conference. Tickets are $150 inc GST and you can get your tickets here: Melbourne 27th November and Sydney 29th November.
We also have a few seats left at an exclusive private dining experience at the RACV Club in Melbourne on Monday 26th November, where you will have the opportunity to meet other like-minded senior executives and participate in a thought provoking conversation with Dr Paul Fisher, former executive director at the Bank of England.
Tickets are $220 each and are all inclusive (dinner and a selection of fine wines). Tickets can be booked here.


text:
Q: Regex for svg xlink ninjas!
Can anyone help newbie with parsing of svg? I'd like to grab the id from this string
... id="aws_7e689ce87fd374d90292c52210118050_use3391" style="fill:#f7a80d;fill-rule:evenodd" ...

Seems like i need "All-after-id=-in-quotes"
Thanks!
EDIT:
this is full string:
<symbol viewBox="0 0 79 78" id="postcss_856dd3770d70eb5ae0b1a278a42d4963" ><title>postcss-logo-symbol</title><g fill="none" fill-rule="evenodd"><path d="M15.447 32.623c.106.08.29.132.106.29-.132.184-.29.342-.395.553-.105.185-.184.237-.342.106.21-.343.42-.66.63-.95zM68.342 60.24c0 .078.026.13.026.21.053-.105.053-.158.08-.21h-.106zm0 .236v-.026.026zm-5.368 10.277l-4.58-25.402c-.078-.025-.183-.077-.368-.13.053.105.08.184.106.263.13-.026.184-.026.236-.052 0-.026 0-.052.027-.08l4.58 25.404zm-4.737-31.12c-.026.078-.026.158-.026.237 0-.08 0-.16.028-.238zm.026.526c-.026 0-.026 0-.052-.028v.026c.028.026.028.026.054 0zm-.052.21v-.185c-.077.026-.156.026-.262.053.132.05.264.078.264.13z" fill="#DD3735"/><path d="M78.71 33.967c-.052-1.028-.078-2.056-.184-3.083-.184-1.397-.368-2.82-.684-4.19-.237-1.133-.63-2.214-1.026-3.294-.5-1.265-1-2.556-1.632-3.768-1.026-1.95-2.368-3.69-3.605-5.508-.818-1.16-1.87-2.108-2.66-3.294-.447-.685-1.105-1.264-1.763-1.79-1.053-.845-2.158-1.61-3.263-2.347a32.525 32.525 0 0 0-2.58-1.634c-.71-.397-1.473-.713-2.21-1.056-.842-.395-1.658-.87-2.605-1.054-.238-.05-.448-.13-.685-.21-.605-.21-1.184-.447-1.79-.632-.92-.29-1.815-.632-2.763-.87C50.342 1 49.394.843 48.446.71 47.394.555 46.316.5 45.262.397a26.83 26.83 0 0 0-2.026-.184C42.236.16 41.21.16 40.21.134c-.5-.027-1.026-.08-1.526-.053-.763.026-1.526.105-2.29.21-.736.08-1.473.21-2.183.317-.867.105-1.735.158-2.604.264-.816.106-1.658.264-2.473.396-.29.053-.58.158-.87.21-.63.132-1.288.185-1.92.396-1.13.344-2.263.74-3.368 1.16-1.027.422-2.027.87-3 1.397-1 .552-1.948 1.21-2.895 1.844a45.325 45.325 0 0 0-2.66 1.923c-.84.66-1.63 1.397-2.394 2.135-.42.42-.763.922-1.158 1.396-.657.765-1.315 1.502-1.947 2.293-.524.66-1 1.344-1.5 2.03-.893 1.21-1.656 2.502-2.366 3.794-.29.527-.553 1.054-.816 1.58-.395.79-.816 1.555-1.184 2.372-.264.554-.474 1.16-.632 1.766-.367 1.292-.736 2.61-1.078 3.9-.316 1.16-.395 2.372-.42 3.558-.027 1.054.078 2.082.183 3.136.027.264-.13.58.184.79-.105.29-.026.45.13.5-.182.29.08.476-.024.74-.027.052.08.157.13.236 0 .08-.025.185 0 .264.028.237.133.474.133.738 0 .184.157.395.21.58.026.078 0 .21-.053.263-.158.184-.132.342.105.448.133.342.08.5.054.66.052.236-.027.315 0 .368.21.422.29.896.315 1.37 0 .106.053.212.106.343.026 0 0 .5 0 .5.13-.078.237-.104.368-.157.08.342.158.66.263.95.132.21.132.314.08.34.105.474.157.922.34 1.37 0-.5-.05-1-.13-1.475.368.132.684.263.895.263.027-.08.053-.184.08-.237-.158-.157-.29-.394-.448-.552.053.21 0 .29 0 .37-.105-.054-.237-.107-.368-.16.105-.13.21-.263.368-.42 0-.238-.13-.45-.5-.423.158-.052.316-.13.5-.184.29-.157-.026-.447-.026-.816.026-.447-.237-.895-.316-1.37-.132-.737-.105-1.844-.184-2.582-.158-.132-.29.21-.316.237.08.632.158 1.264.21 1.897-.157-.527-.263-1.107-.394-1.74-.027.185-.053.264-.053.37-.13.13-.026.29.053.474-.184-.08-.395-.052-.395-.052v.738c-.262-.264-.34-.474-.473-.66-.052-.21-.08-.42-.13-.63.05-.133 0-.212 0-.29a15.968 15.968 0 0 1-.08-.634c.026-.026-.026-.42-.026-.42.21.025.343.05.474.05-.263-.34-.08-.552.027-.763.053-.106.237-.13.29-.238.21-.395.553-.71.553-1.212 0-.237.08-.5.105-.738.053-.448.105-.896.13-1.344.054-.58 0-1.16.133-1.713.212-.92.475-1.843.764-2.766.21-.66.448-1.29.71-1.95.395-1.028.764-2.056 1.264-3.03.71-1.424 1.526-2.794 2.316-4.19.5-.87 1.026-1.687 1.58-2.53.525-.817 1.05-1.66 1.657-2.425a21.452 21.452 0 0 1 2.79-2.978c1.053-.948 2.053-1.923 3.184-2.793a32.218 32.218 0 0 1 4.685-3.005c1.343-.71 2.737-1.266 4.132-1.793.895-.342 1.868-.5 2.79-.79 1.052-.343 2.105-.5 3.21-.527.71-.027 1.395-.106 2.105-.185.632-.05 1.263-.104 1.948-.183-.08.105-.106.158-.132.21-.288.422-.604.844-.894 1.265-.237.343-.5.712-.737 1.054-.422.555-.87 1.108-1.264 1.688-.605.87-1.158 1.766-1.79 2.635-.63.843-1.315 1.634-1.973 2.45-.868 1.134-1.684 2.293-2.552 3.426-.79 1.08-1.63 2.11-2.394 3.19-.684.947-1.29 1.95-1.948 2.923-.973 1.45-1.947 2.872-2.92 4.322a271.928 271.928 0 0 1-2.316 3.294c-.053.08-.132.104-.21.157-.21.342-.21.527-.29.685-.21.395-.42.79-.658 1.16-.132.21-.316.394-.474.605-.026-.316.42-.474.21-.87-.13.212-.263.396-.394.607l-.316.63c.105.08.29.133.105.29-.08.133-.158.29-.237.423a.954.954 0 0 0 .29-.264c0 .29-.158.526-.29.763-.105.21-.368.37-.552.527.026.027.21.106.237.132.237-.08.316-.21.343-.132.08-.105.158-.184.184-.263.104-.264.262-.474.525-.58.106-.053.184-.132.263-.21.79-.818 1.606-1.608 2.316-2.478 1.106-1.345 2.106-2.74 3.16-4.11.446-.58.973-1.16 1.446-1.714.078.606.026 1.185 0 1.74-.08.974-.132 1.95-.21 2.95-.027.395 0 .79-.027 1.186 0 .105-.08.184-.08.29 0 .263.08.553.08.817-.08.975-.186 1.923-.265 2.898-.027.21.078.422.13.607-.13 1.422.16 2.925-.078 4.427.184-.29.237-.474.237-.658.025-.158 0-.316 0-.5v-.264c.025-.475.13-.975.078-1.45-.053-.527-.053-1.027.053-1.528.053-.21-.026-.474.106-.738v.395c-.026 1.5.027 3.003-.183 4.505-.027.132.08.37-.21.343-.238.474.052.817-.21 1.08-.054.053.05.29.077.448-.106.317-.106.317.052.343.026.58.08 1.106.105 1.66.42-1 .21-2.03.396-3.058.026.422.053.844.026 1.29 0 .687-.026 1.345-.052 2.03 0 .132-.027.264-.053.396-.08.37-.105.738-.237 1.08-.105.264-.052.66-.052.975v1.003c.105.448-.027.685.052.948-.08.265-.105.344-.08.423l.08.395c.527-.053.29.343.5.553-.158.212-.105.29-.105.397 0 .237-.025.448-.052.685 0 .606-.026 1.212-.026 1.792 0 .08.026.157.026.236 0 .054-.026.74-.026.74.053.078 0 .157-.08.236-.025 0-.104-3.347-.104-3.347h-.395c-.052 1.58.08 3.003-.21 4.48-.316.025-.42.078-.764.078-.816 0-1.632 0-2.448.026-.974 0-1.92.026-2.895.026-.472 0-.972.054-1.446.054-.632 0-1.29-.08-1.92-.08-.975 0-1.922.08-2.896.106-.71.026-1.42.026-2.13.053-.475.025-.95.05-1.422.104-.21.026-.395.105-.658.184-.08 0-.263-.026-.42 0-.265.053-.5.21-.765.264-.395.08-.5.184-.448.58v.263c-.026.052.58-.08.58-.08-.054 0-.08.158-.16.29.212-.08.343-.132.475-.184.395.185.737.08 1.052.16 1.026.262 2.078.37 3.13.473.685.053 1.343.08 2.027.105.973.053 1.947.106 2.92.106.816 0 1.606-.08 2.42-.08 1.13 0 2.264.052 3.395.08.237 0 .5-.028.763-.028h1.92c1.712-.052 3.422-.08 5.133-.13.975-.028 1.975-.08 2.948-.107l3-.08c1.158-.026 2.316-.026 3.448-.05.868 0 1.71-.03 2.58-.055.972-.026 1.972-.105 2.946-.157.527-.027 1.054-.08 1.58-.132.632-.052 1.29-.13 1.92-.157.948-.054 1.922-.08 2.87-.133 1.184-.078 2.368-.183 3.578-.21 1.106-.052 2.237-.026 3.343-.052.974-.027 1.948-.08 2.948-.106l1.66-.08s1.104-.026 1.657-.08c.947-.052 1.894-.157 2.842-.183.604-.027 1.21 0 1.815-.027.973-.026 1.973-.08 2.947-.08.367 0 .762.054 1.236.08-.21.185-.342.29-.5.422.105.026.21.08.316.132a.71.71 0 0 1-.42.13c-.054.133-.107.186-.16.45h.474c-.184 0-.342.237-.526.395-.21-.054-.395 0-.5.29.184.104.158.183.132.29-.316.104-.553.21-.42.552-.107.052-.238.105-.37.184-.13.21-.368.263-.316.553.106.025.21.08.29.104-.132.053-.263.132-.395.184-.473.29-.262.422-.157.554-.08.053-.158.105-.237.132.052.237.13.29.157.29a9.3 9.3 0 0 0-.395.316c-.08.237-.185.342-.29.5-.105.158-.158.37-.29.527-.552.607-.947 1.32-1.657 1.793-.264.185-.5.422-.737.66-.474.447-.895.948-1.395 1.37a29.595 29.595 0 0 1-2.052 1.554 151.56 151.56 0 0 1-2.604 1.792c-.474.315-1 .552-1.5.842-.5.29-.974.554-1.474.843-.316.21-.606.5-.948.66-.868.37-1.79.685-2.684 1.028-.87.37-1.5.685-2.158.922-.605.21-1.237.37-1.868.5-.21.054-.448 0-.685.027-.448.08-.895.186-1.343.238-1.158.158-2.316.264-3.473.422-.685.08-1.343.21-2.027.29-.473.026-.973-.026-1.447-.026-.342 0-.71.08-1.053.027-.552-.08-1.105-.21-1.658-.316-.13-.026-.316-.08-.42-.026-.21.106-.396-.052-.607 0-.13.027-.262-.08-.394-.08-.106-.025-.238.028-.37 0-.29-.078-.552-.183-.87-.157-.313.026-.63-.132-.97-.21-.475-.106-.92-.21-1.396-.317a2.38 2.38 0 0 1-.525-.237c-.685 0-1.133-.026-1.554-.185-.368-.13-.71-.315-1.105-.262-.104.026-.183-.026-.29-.026-.08-.106-.157-.317-.235-.317-.526.027-.842-.42-1.29-.553-.236-.08-.42-.343-.657-.422-.58-.237-1.052-.737-1.71-.816-.21-.027-.42-.132-.658-.21.08.104.13.183.21.262-.763-.37-1.473-.79-2.184-1.186-.104-.026-.183-.13-.262-.184l-.71-.474c-.395.08-.553-.08-.66-.132-.71-.5-1.525-.817-2.21-1.37-.29-.238-.63-.396-.84-.686-.37-.448-.817-.764-1.317-1.027-.394-.21-.762-.448-1.13-.685-.185-.132-.37-.29-.37-.58 0-.185-.078-.37-.315-.264-.105-.158-.21-.342-.342-.395-.316-.13-.526-.37-.763-.58-.237-.21-.42-.5-.71-.605-.527-.21-.843-.658-1.158-1.027-.738-.87-1.396-1.82-2.08-2.74-.053-.08-.158-.133-.237-.212.105.29.237.527.368.79-.262-.105-.446-.29-.604-.474-.027.027 1.815 3.057 1.815 3.057.16.237.29.475.448.712a.813.813 0 0 1-.79-.422c-.236-.42-.5-.684-1.026-.63a4.588 4.588 0 0 1-.13-.58c-.107 0-.185 0-.37-.027.37.58.685 1.08 1.027 1.66-.133-.08-.21-.132-.265-.158.473.5.815 1.133 1.42 1.45.132.605.816.895.974 1.475-.13-.027-.238-.053-.37-.08-.21-.263-.447-.526-.683-.816.052.184.13.342.236.474.316.395.606.79.974 1.133.132.134.316.187.316.424.21.105.29.13.368.13.054.16-.025.397.29.344.21.395.42.395.71.264.343.343.528.37.764.16 0 .13.026.262.026.368.105-.053.08-.132.08-.264.13.105.21.158.262.21.263.37.5.712.868 1.002.5.422.948.87 1.42 1.265.922.765 1.95 1.398 2.975 1.977 1.264.712 2.475 1.476 3.764 2.16 1.552.818 3.21 1.372 4.92 1.767.632.132 1.237.263 1.87.42.55.16 1.104.397 1.657.528.842.185 1.71.343 2.552.5.183.027.37.054.58.08.235.053.524-.053.577.027.132.21.237.104.395.078.184-.053.395-.053.605-.053.737.026 1.447.184 2.184.132.16 0 .396-.133.528.13.236-.105.368-.105.473-.13.028.236 0 .236-.05.262-.054.026-.133.053-.238.132.947.184 1.842.21 2.63 0 1.37.105 2.554-.053 3.686-.448.105.132.184.316.342.053.052-.08.184-.107.29-.133.236-.053.526-.158.736-.08.238.08.317-.13.5-.13.317 0 .606-.027.896-.08.158-.026.316-.105.5-.158a1.285 1.285 0 0 0-.58-.133c.317-.158.606-.29.896-.42-.053.078-.106.183-.21.183h.367c-.08 0-.185.237-.316.395.946-.237 1.814-.448 2.657-.66-.29-.552.315-.367.526-.684-.263.08-.526.158-.79.21.895-.447 1.816-.842 2.71-1.237-.13.158-.29.237-.525.37.158.025.263.025.342.05.42.133.316-.262.447-.5.5 0 .71-.078.947-.158.263-.08.526-.158.79-.263.42-.184.815-.42 1.236-.63.08-.028.21 0 .316 0 .29-.186.394-.344.473-.318.37.053.63-.08.736-.42.184-.133.316-.238.447-.318.578-.316 1.13-.632 1.71-.948.21 0 .316 0 .368-.027.344-.16.66-.342.975-.527a2.258 2.258 0 0 1-.263-.13c.262-.054.34-.08.5-.133.63-.74 1.5-1.24 2.157-1.82.29-.026.29-.105.29-.157.104-.132.21-.29.34-.396.58-.527 1.21-.975 1.737-1.528a37.16 37.16 0 0 0 2.184-2.374c.63-.738 1.264-1.475 1.79-2.292.737-1.133 1.368-2.293 2.026-3.48.474-.842.895-1.685 1.37-2.528.05-.08.157-.185.236-.185.71-.08 1.422-.13 2.106-.21.158-.026.342-.13.5-.21-.08-.132-.132-.29-.21-.422-.106-.16-.264-.29-.37-.45-.104-.13-.183-.29-.262-.447-.08-.13-.158-.236-.237-.37a9.7 9.7 0 0 1-.45-.894c-.026-.08-.08-.21-.052-.29.474-1.027.658-2.134 1.105-3.162.447-1.054.58-2.24.79-3.373.184-1.08.29-2.16.42-3.24.08-.764.185-1.502.21-2.266.16-1.212.106-2.346.08-3.48-.026-1-.08-2.028-.13-3.03zM12.685 66.405c-.184-.21-.342-.448-.526-.658l.08-.08c.287.317.577.633.866.976-.158-.08-.342-.132-.42-.238zm.42.238c.08-.027.16-.027.238-.053.08.132.132.29.21.448-.368-.027-.552-.185-.447-.395zm27.37 10.883v-.08c.5-.052.973-.105 1.473-.157v.077c-.5.08-.973.13-1.473.158zm6.63-.685c-.367.08-.762.133-1.13.186-.132.026-.29.158-.342-.08-.053.027-.106.027-.158.054.13.394.447.078.71.236-.58.08-1.13.132-1.684.21v-.052c.16-.026.343-.053.5-.08v-.078a7.743 7.743 0 0 0-.79-.053c-.077 0-.183.106-.262.132-.105.026-.21.053-.342.053-.447.026-.894.026-1.316.052-.027 0-.08-.026-.106-.026v-.08c1.763-.236 3.5-.473 5.263-.71.027.052.027.105.053.157-.158 0-.263.055-.395.08zm.396-.262c.606-.08 1.16-.132 1.738-.21-1.21.342-1.605.394-1.737.21zM24.58 23.374c.84-1.16 1.71-2.32 2.552-3.505.263-.345.473-.714.736-1.056.08-.106.185-.158.316-.264l-.026-.05c.105-.133.21-.24.263-.344.134-.21.213-.448.318-.685.026-.05.105-.103.105-.103.37.184.37-.21.5-.343.237-.264.474-.553.684-.817.158-.21.316-.395.448-.632.026-.08-.053-.21-.08-.317h-.078c.08-.052.158-.13.237-.184.026 0 .026 0 .052-.026.158-.238.316-.475.474-.686.315-.42.657-.842 1.025-1.21-.052.13-.105.263-.158.368.027 0 .027.027.053.027.316-.422.658-.817.974-1.24-.027-.025-.053-.052-.08-.052-.13.132-.236.264-.368.396-.026-.027-.052-.053-.08-.053.265-.343.528-.685.79-1.08.053.08.106.184.21.395.107-.263.212-.447.29-.632-.078.08-.183.158-.262.238l-.08-.08.474-.71c.5-.712 1-1.45 1.5-2.162.185-.263.42-.474.58-.738.5-1 1.29-1.792 1.894-2.714.132-.184.316-.342.474-.5.13-.16.237-.106.342.026.71.896 1.42 1.818 2.13 2.714.528.66 1.054 1.29 1.554 1.976.605.844 1.184 1.687 1.79 2.53.684.975 1.368 1.95 2.026 2.95 1 1.477 1.947 2.953 2.947 4.428.737 1.08 1.474 2.135 2.184 3.215h-1.344c-1.236-.025-2.5-.13-3.736-.078-1.684.08-3.394.264-5.078.396-2.132.185-4.29.21-6.42.21-.765 0-1.528.107-2.29.16-.922.052-1.817.105-2.738.13-1.08.054-2.13.08-3.21.107-.606.026-1.237 0-1.895 0zm30.183 12.12v.238c-.026 0-.052.027-.105.027-.105-.37-.21-.766-.342-1.135-.263-.765-.553-1.53-1.027-2.214-.528-.737-1-1.5-1.528-2.265-.13-.185-.316-.343-.474-.5-.553-.607-1.106-1.24-1.816-1.687a21.485 21.485 0 0 0-3.29-1.688 7.374 7.374 0 0 1-.92-.474h.63l4.5-.08c.974-.025 1.922-.025 2.895-.078.236 0 .368.08.5.29.236.395.473.79.736 1.186.027.052.08.13.08.21 0 .58 0 1.186.026 1.766.025.606.08 1.186.104 1.792 0 .606-.053 1.238-.026 1.87.027.897.053 1.82.053 2.74zM26.447 26.67c1.237-.053 2.42-.132 3.632-.185.945-.053 1.92-.08 2.866-.132.395-.025.764-.05 1.158 0-.42.212-.842.423-1.21.686-.474.316-.92.737-1.395 1.08-.475.342-.896.764-1.29 1.212-.5.605-1.053 1.132-1.58 1.712-.37.422-.79.817-1.105 1.265-.447.58-.842 1.21-1.263 1.87.132-2.504.29-4.98.184-7.51zm17.185 25.35c-.843.21-1.71.448-2.58.553-.736.106-1.5.08-2.263.08-.686 0-1.344-.026-2.028-.08-.763-.078-1.526-.157-2.263-.5-.633-.29-1.29-.553-1.92-.87-.634-.316-1.265-.684-1.74-1.264-.34-.423-.815-.765-1.236-1.134.08.316.263.58.553.764-.132.158-.316.08-.58-.343-.078.053-.157.08-.21.106.08-.185.158-.37.237-.527-.105-.21-.237-.448-.342-.66-.21-.342-.42-.71-.605-1.053-.053-.08-.053-.158-.105-.237a5.893 5.893 0 0 1-.37-.475c-.21-.315-.394-.657-.657-.974 0 .08.027.158.027.264-.027 0-.053.026-.053.026l-.554-1.344c-.026 0-.026 0-.052.026l.473 1.74c-.026 0-.052.025-.08.025-.077-.104-.156-.21-.21-.34-.052-.212-.21-.212-.34-.133-.08.053-.133.237-.106.316.185.448.395.896.606 1.344.052.158.105.29.184.448.027.053.106.105.106.184.106.21.185.42.316.606.237.316.5.632.737.948.235.316.445.66.656.975.026.053.105.053.13.08.133.395.58.684.896.526.08.606.737.817 1 1.397a11.957 11.957 0 0 1-.763-.343c-.027.026-.027.052-.054.105.316.158.632.316.92.5.265.16.528.317.765.5.316.29.685.45 1.13.554-.024-.08-.05-.107-.05-.107.736.343 1.5.712 2.078 1-2.737.054-5.658.107-8.685.16 0-.5-.026-.975-.026-1.476 0-.21.052-.395.025-.606-.08-1.21-.08-2.424-.237-3.61-.157-1.264-.157-2.503-.13-3.77.025-.683-.027-1.394-.054-2.08 0-.922 0-1.82.028-2.74 0-.132.053-.237.106-.37h.08c.025.054 0 .133.05.16.08.08.212.21.265.184.157-.106.394-.21.447-.37.13-.315.184-.658.184-.974 0-.236.106-.394.21-.553.054-.08.08-.158.133-.263-.105-.08-.21-.132-.342-.237.106-.29.08-.633.475-.79.052-.027.052-.16.08-.238.025-.213.05-.45.078-.66.052.08.08.105.13.157a.42.42 0 0 1 .054-.08c0-.104-.026-.315 0-.315.316-.053.184-.395.342-.553.025-.028-.027-.107-.027-.16 0-.052 0-.13.026-.13.367-.08.315-.475.552-.66.08-.053.105-.13.21-.263.21.368-.158.553-.184.816.446-.263.578-.895.315-1.08.105-.08.21-.184.29-.29.29-.316.604-.606.868-.922.185-.236.29-.526.474-.763.106-.132.316-.237.474-.317.474-.262.92-.552 1.21-1 .053-.053.132-.105.21-.158.08-.053.238-.053.264-.132.027-.052-.052-.184-.105-.263.104-.053.21-.158.42-.264-.08.158-.105.264-.158.37l.13.13c.238-.184.606-.394.843-.552 0-.025-.132-.13-.132-.13-.157.08-.394.21-.63.316.05-.08.05-.132.08-.158.367-.237.735-.474 1.13-.66.92-.42 1.842-.842 2.763-1.237.158-.08.37-.026.553-.026.078 0 .13 0 .21-.026.42-.132.842-.264 1.263-.37.183-.052.393-.078.58-.078.787.025 1.577.025 2.366.078.342.026.658.105.974.21a9.88 9.88 0 0 1 1.184.5c.447.24.868.502 1.29.792.763.5 1.473 1.054 2.236 1.502.737.448 1.316 1.054 1.79 1.74.58.816 1.237 1.554 1.5 2.555l.394 1.74c.08.316.264.632.185 1-.133.66-.238 1.345-.343 2.004-.052.265-.105.53-.078.79.05.82-.265 1.53-.58 2.268-.106.237-.264.475-.395.738a.798.798 0 0 0 .21.106l.237-.474c.027 0 .027 0 .053.027-.132.368-.237.764-.37 1.133-.314.817-.63 1.66-1.025 2.45-.21.448-.58.817-.842 1.24-.262.368-.473.763-.736 1.106-.237.29-.473.58-.79.79-.71.527-1.447 1.054-2.21 1.476-.473.29-1.026.448-1.552.58zm-14.027-1.4l-.026.027c-.055-.026-.134-.052-.186-.105l-.632-.95c-.052-.078-.08-.157-.052-.262.29.448.58.87.895 1.29zm16.37 3.61c1.183-.5 2.157-1.21 3.05-2.028.133-.132.264-.263.422-.37 1.106-.684 1.92-1.633 2.658-2.687.842-1.212 1.395-2.582 2.08-3.873a2.73 2.73 0 0 1 .157-.29c-.053 3.004.29 5.955.684 8.933-2.973.105-6 .21-9.052.316zm26.683-.79c-.026.053-.08.106-.105.16-.027-.054-.027-.133-.053-.24-.158.423-.5.212-.737.212-1.42.027-2.868.027-4.29.027-1.368 0-2.762 0-4.13.024-.448 0-.922.105-1.37.132-1.078.052-2.157.08-3.236.105-.08 0-.158-.13-.29-.236a1.81 1.81 0 0 1-.158.237c-.028-.052-.08-.104-.133-.183-.026.08-.053.158-.08.21H58c-.053-.368-.158-.71-.158-1.08 0-.79.08-1.58.105-2.372.027-.368 0-.71 0-1.054.106.08.185.133.29.21.052-.103.105-.182.158-.26 0 0-.053-.028-.106-.08.05-.027.104-.08.104-.106.026-.08.08-.158.08-.21 0-.185-.054-.343-.08-.5.026 0 .052 0 .08-.028l.157.79h.08c-.106-.183.236-.342-.053-.552-.026-.027.026-.185.026-.264-.08-.157-.13-.315-.21-.526.026-.026.105-.053.184-.08-.105-.052-.184-.104-.263-.13.263-.238.263-.37.026-.633.054-.025.106-.025.106-.05 0-.238 0-.475-.052-.71-.053-.266.08-.58-.316-.74a.79.79 0 0 0 .105.21s-.08.027-.158.08c-.342-.317-.13-.74-.21-1.213.184.053.316.106.447.16-.053-.186-.184-.397-.263-.634h-.107v-1.74c0 .027.184.027.29.054 0-.027.025-.053.025-.08-.08-.105-.185-.21-.29-.342l.053-.053c-.21-.262-.105-.63-.105-.71v-1.845c.264.264-.13.606.264.764v-.263h-.027c-.026-.395-.026-.79-.052-1.186h-.052c-.027.054-.027.08-.054.133h-.052l.158-6.298c.263.342.552.66.736 1 .606 1.108 1.395 2.057 2.132 3.058.632.87 1.21 1.818 1.79 2.714.71 1.08 1.394 2.16 2.105 3.24a81.41 81.41 0 0 0 1.63 2.426c.5.71 1.028 1.396 1.554 2.082.446.606.92 1.212 1.367 1.818.527.738 1.053 1.475 1.58 2.187.262.368.552.737.84 1.106.16.21.396.37.554.5-.025 0-.052 0-.104-.026.08.105.13.184.184.237.29.158.316.316.158.554zM74 46.854v-.185c0 .052.026.13 0 .184zm.895-11.62c-.027 0-.184-.16-.21-.186-.027.08 0 .158-.053.264-.027-.078-.21-.052-.21-.13-.027.368.157.737.13 1.106.08-.053.395-.08.474-.158.027.026.08.052.106.052-.527.396-.395.79-.158 1.24.052.104.21.315.052.526-.052.053.027.21.053.343h.077v.05l-.237.08c-.052-.08-.367-.236-.367-.37v1.346c.263.08.263.448.368.633a.768.768 0 0 0 .107-.21l.027.024c-.027.158-.053.316-.106.475-.052.236-.105.447-.13.684 0 .026.05.08.05.105-.288.66-.13 1.396-.235 2.08-.08.5 0 1.03-.053 1.556-.054.448-.16.922-.264 1.37-.027.08-.08.105-.21.158.052-.316.026-.527-.027-.817-.028 0-.37-.184-.397-.184 0 .37.21.87.29 1.29-.08-.026-.395-.21-.42-.21-.054.316-.054.738-.08 1.08-.027.264-.263.5-.29.79 0 .16.184.264.158.528h.21c0-.526.238-1 .238-1.554h.078c.027.053.106.106.08.132-.053.29-.16.606-.132.896 0 .158.13.316.08.5-.054.16-.08.317-.107.554-.027-.132-.053-.184-.053-.263-.026 0-.263-.027-.29-.027-.026.158.185.316.158.448-.026.026-.052.026-.105.053l-.868-1.266c-.686-1-1.37-2.003-2.054-3.03a6.312 6.312 0 0 1-.475-.79 37.09 37.09 0 0 0-2.71-4.033c-.762-.974-1.37-2.03-2.08-3.055-.656-.975-1.314-1.924-1.972-2.9-.237-.315-.526-.605-.737-.948-.683-1.08-1.29-2.187-1.972-3.267-.58-.897-1.21-1.767-1.816-2.636-.21-.29-.42-.607-.632-.923a.37.37 0 0 1-.052-.182c-.053-.58-.106-1.16-.132-1.713 0-.527.053-1.054.053-1.608v-.474c0-.132.025-.237.025-.37.025-.025.052-.078.078-.104-.763 0-1.553-.028-2.316 0-.5.025-.763-.186-1.105-.555-1-1.133-1.737-2.424-2.605-3.636a162.415 162.415 0 0 0-2.5-3.427c-.685-.922-1.37-1.818-2.053-2.74-.764-1.054-1.5-2.108-2.29-3.162-.948-1.264-1.922-2.53-2.895-3.794-.45-.58-.95-1.133-1.45-1.74.343.054.66.106.975.133l1.264.08c.947.077 1.894.13 2.84.26.79.107 1.58.265 2.396.396 1.738.29 3.448.765 5.106 1.318.974.316 1.92.738 2.87 1.133 2.13.87 4.157 1.924 6.157 3.03.63.343 1 .896 1.472 1.397.685.712 1.37 1.423 2.027 2.16.762.87 1.472 1.766 2.21 2.662.657.79 1.34 1.58 2 2.372.21.237.37.527.552.79.42.633.895 1.24 1.263 1.924.262.502.42 1.082.604 1.635.262.817.526 1.607.79 2.424.183.606.34 1.24.472 1.87.106.423.08.87.21 1.29.16.556 0 1.16.16 1.715.025.053.05.132.078.185.105.104.184.21.026.368-.025.026-.025.13 0 .21.054-.052.08-.105.133-.184 0 .053.025.08.025.105 0 .104-.027.21 0 .315 0 .052.052.13.078.184.053-.054.105-.08.21-.16.237.897.264 1.793.264 2.715 0 .87.157 1.74-.21 2.583.078-.29-.106-.555-.027-.818z" fill="#DD3A0A"/><path d="M58.08 45.482c.025 0 .052.027.052.027l-.027-.03c0-.025 0-.025-.026 0zm4.157 26.036c-.29.21-.58.395-.948.474-.028-.026-.028-.053-.054-.08.29-.184.605-.368.895-.553.027.05.08.104.106.157zM12.895 35.81c.29-.367.58-.736.894-1.105.025.026.235.08.262.105-.29.37-.685.87-.974 1.265-.054-.053-.133-.237-.185-.264zM5.42 48.725c-.21-.448-.42-.923-.63-1.37a.91.91 0 0 1 .236-.106c.29.42.42.92.632 1.37 0 0-.21.105-.237.105zm6.712-12.65c-.158.238-.316.502-.474.74-.026-.028-.316.104-.342.078.158-.237.552-.66.71-.896.027.026.053.053.106.08zM59.422 72.6c.025 0 .025-.026.052-.026.184.026.394.052.605.052-.344.237-.555.21-.66-.026zm-47.24-35.418c.028-.08.08-.158.133-.237.052 0 .13-.027.13-.027.107-.184.107-.316.212-.474-.026-.026-.053-.026-.08-.053-.157.108-.315.24-.473.345.053.052.053.08.053.132-.21-.027-.29.08-.395.368-.026.08-.158.106-.29.21-.026.054-.052.186-.105.317l.027.028c-.053.053-.132.08-.132.08-.158.157-.342.29-.5.447-.026.08-.052.158-.052.237.185-.184.5-.527.737-.738l.027.027c.105-.158.184-.316.29-.474.025.026.025.052.052.08-.08.21-.158.446-.237.657-.055.026-.134.08-.134.053-.105.08-.184.184-.29.263l-.473.316c-.263.237-.526.447-.816.685-.184.29-.368.553-.58.896.317-.08.396.053.37.317.368.052.395-.237.5-.448.026-.054.053-.16.105-.186.237-.21.5-.394.763-.605.053-.053.053-.16.053-.238 0-.026-.133-.026-.212-.053.237-.264.58-.71.816-1 .132-.08.263-.186.263-.265-.026-.29.158-.368.37-.474-.106-.08-.133-.157-.133-.183z" fill="#DD3735"/><path d="M12.71 36.892c-.105.184-.21.342-.315.527l-.158-.08c-.105.605-.474 1.132-.842 1.237.105.053.21.106.29.08.078-.027.13-.16.183-.238l.71-1.028.238-.396-.105-.105zM3.948 48.46c.132 0 .264.026.42.026 0-.105.133-.08.133-.184h.08c0 .132.026.237.026.37h-.552c-.027-.027-.132-.186-.106-.212zm-.21-1.212c-.08-.08-.21-.158-.21-.237-.027-.104.052-.235.13-.367.054.184.08.342.132.527-.027.025-.053.052-.053.078zm.658-1.687c.105.266.21.556.316.82a.798.798 0 0 0-.21.105c-.105-.264-.237-.554-.342-.817a.652.652 0 0 1 .237-.106zm58.58 25.194c.13-.052.288-.08.5-.13-.238.183-.422.315-.58.473-.027-.026-.053-.053-.08-.053.053-.105.106-.184.16-.29zM30.63 15.074c.157-.106.29-.185.447-.29l.052.052c-.16.21-.29.42-.475.685-.026-.183-.026-.29-.053-.42-.026 0 0 0 .027-.026zm7.71 13.333c.237-.106.474-.21.763-.343-.026.158-.026.264-.026.37a.927.927 0 0 0-.264-.054c-.158.027-.448.238-.58.264-.025 0 .106-.21.106-.237zm19.74 22.346c.052.263.552.395.052.658.08.055.157.08.236.134a.2.2 0 0 1-.052.106c-.053.025-.158.078-.21.05-.027 0-.08-.104-.08-.157 0-.237.027-.474.053-.79z" fill="#DD3735"/></g></symbol>

A: Quoting from RegEx match open tags except XHTML self-contained tags :

You can't parse [X]HTML with regex. Because HTML can't be parsed by regex. Regex is not a tool that can be used to correctly parse HTML. [...] Regular expressions are a tool that is insufficiently sophisticated to understand the constructs employed by HTML. HTML is not a regular language and hence cannot be parsed by regular expressions. Regex queries are not equipped to break down HTML into its meaningful parts.

The conclusion I case was the same as the author:

Have you tried using an[sic] XML parser instead?

Which is what you can do!
Try this:

var fragment = document.createDocumentFragment();
var elem = document.createElement('div');

fragment.appendChild(elem);

elem.innerHTML = '<svg viewBox="0 0 120 120" version="1.1" xmlns="http://www.w3.org/2000/svg"><circle cx="60" cy="60" r="50"/></svg>';

alert(elem.getElementsByTagName('circle')[0].getAttribute('cx'));

It should alert 60.
Javascript provides all the tools to mess with this. Just pretend that the string is HTML and you should be fine!

Note: that code is just an example! Addapting it to work properly is easily done in 5 minutes or less.