In this post we’re going to dive into physics simulation with Clojure. The ideas in this post were mostly inspired by this paper by Thomas Jakobsen.
My motivations for working on this toy project were:
C
lojure I
nteractive D
evelopment E
nvironment that R
ocks)The source code can be found here. The result:
main-
to bind them allThis code uses the Quil library to render points
and lines. In the main-
function, the sketch
macro from the Quil library is
used to bind the physics domain to the UI.
(defn -main []
(quil/sketch
:host -main
:title "Verlet Integration"
:size [width height]
:setup setup
:update update-state
:draw draw
:key-pressed key-pressed
:mouse-pressed mouse-pressed
:mouse-dragged mouse-dragged
:mouse-released mouse-released
:features [:exit-on-close]
:middleware [quil-mw/fun-mode]))
The sketch macro basically asks the developer to configure which ‘handler functions’ it should call when certain events occur. For instance:
key-pressed
mouse-pressed
update-state
draw
Because I configured Quil to run in functional mode (quil-mw/fun-mode)
, Quil:
:setup
function as the initial state
state
to each handler function to update itevent
argument to keyboard - and
mouse handler functions.The handler function signatures therefore look like this:
(defn draw [state] ...)
(defn update-state [state] ...)
(defn key-pressed [state event] ...)
(defn mouse-pressed [state event] ...)
What does a snapshot of this world state look like? key-pressed
gives some
hints:
(defn key-pressed
[state event]
(let [raw-key (:raw-key event)
new-state (cond
(= \b raw-key) (load-world (load-a-file "blocks.edn"))
(= \c raw-key) (load-world (load-a-file "cloth.edn"))
(= \p raw-key) (load-world (load-a-file "points.edn"))
(= \s raw-key) (load-world (load-a-file "sticks.edn"))
(= \i raw-key) (show-info-message)
(= \q raw-key) (quil/exit)
:else state)]
new-state))
So on pressing a key, a certain world is loaded. Let’s look into the ‘sticks’ world:
{:points {:p0 {:x 10 :y 1 :oldx 0 :oldy 0}
:p1 {:x 100 :y 100 :oldx 100 :oldy 100}
:p2 {:x 0 :y 500 :oldx 0 :oldy 525}
:p3 {:x 25 :y 475 :oldx 0 :oldy 525}
:p4 {:x 250 :y 200 :oldx 250 :oldy 200 :pinned true}
:p5 {:x 350 :y 100 :oldx 350 :oldy 100}}
:sticks [{:links [:p0 :p1] :length 138}
{:links [:p2 :p3] :length 40}
{:links [:p4 :p5] :length 140}]}
Nothing special here. Just a map containing :points
and :sticks
. We’ll dive
into the particulars of points and sticks soon.
This physics simulation deals with Points, and Sticks connecting Points. The Points are the things that seem to have direction and speed, are influenced by gravity and lose speed because of friction or because of bouncing against world borders. The Sticks try to keep their 2 Points apart according to the configured Stick length. The simulation loop boils down to:
In code:
(defn update-state
[state]
(->> state
(update-points)
(apply-stick-constraints)
(apply-world-constraints)))
This code can be read like this: ‘with state
, first update-points
, then
apply-stick-constraints
, and finally apply-world-constrains
’.
Points are the main abstraction in this code. I decided to use a record to name them:
(defrecord Point [x y oldx oldy pinned])
A Point stores its current coordinates and the coordinates it had in the
previous world state. On top of that it has a pinned
property which indicates
if a Point is pinned in space and - as a result - stays on the same coordinate.
A pinned Point can be unpinned by clicking it with the mouse pointer.
The update-point
function calculates the velocity of the Point and adds some
gravity in the mix:
(defn update-point
[{:keys [x y oldx oldy pinned] :as point}]
(if pinned
point
(let [vx (velocity x oldx)
vy (velocity y oldy)]
(->Point (+ x vx) (+ y vy gravity) x y pinned))))
Reading superficially, this code says: if the Point is pinned then return the same Point. Otherwise, calculate it’s velocity (based on the current - and previous x & y coordinates), add some gravity in the y direction and return the newly calculated Point.
The function uses destructuring to name all the arguments of the incoming Point. With destructuring, you can bind the values in a data structure without explicitly querying the data structure. So instead of getting each and every value out of Point and binding it to a ‘new’ name…
(let [x (:x point)
y (:y point)
oldx (:oldx point)
oldy (:oldy point)
pinned (:pinned point)]
...)
… you can very effectively tell the function that it will receive a map {}
with keys x y oldx oldy pinned
and that this function should have those
variables available under the same name:
[{:keys [x y oldx oldy pinned] :as point}]
The code in my repository has some additional type hints, because I wanted the simulation to run smooth on my laptop and wanted to learn a bit more about type hinting and compiler optimizations.
And that’s it with regard to Points. In a couple of lines of code Points are already moving and reacting to gravity in the simulation.
It’s time for Points to meet the harsh reality of life. Walls are harder than Points and therefore Points should bounce off of them:
(defn hit-floor? [y] (> y height))
(defn hit-ceiling? [y] (< y 0))
(defn hit-left-wall? [x] (< x 0))
(defn hit-right-wall? [x] (> x width))
(defn apply-world-constraint
[{:keys [x y oldx oldy pinned] :as point}]
(let [vxb (* (velocity x oldx) bounce)
vyb (* (velocity y oldy) bounce)]
(cond
(hit-ceiling? y) (let [miry (- oldy)]
(->Point (+ oldx vxb) (+ miry (- vyb)) oldx miry pinned))
(hit-floor? y) (let [miry (+ height height (- oldy))]
(->Point (+ oldx vxb) (- miry vyb) oldx miry pinned))
(hit-left-wall? x) (let [mirx (- oldx)]
(->Point (+ mirx (- vxb)) (+ oldy vyb) mirx oldy pinned))
(hit-right-wall? x) (let [mirx (+ width width (- oldx))]
(->Point (- mirx vxb) (+ oldy vyb) mirx oldy pinned))
;; else: free movement
:else point)))
To explain what happens here, a picture might help.
Imagine a Point moved from A to B in the last Point update. This means a Point
record is persisted with its x
and y
being the coordinates of B and oldx
and oldy
being the coordinates of A. If a wall line crossed the imaginary line
A-B, the Point history should be rewritten. In essence, line A-B is mirrored in
the wall it hits, giving rise to another imaginary line C-D where C mirrors A
and D mirrors B. The miry
(mirror-y) and mirx
(mirror-x) variables in the
code contain C coordinates mirroring A coordinates.
The simulation will take a little velocity loss into account when bouncing at
walls. Therefore, D’ is calculated by using the x and y velocities (vx and vy)
multiplied by a bounce factor (leading to the vxb
and vyb
variables in the
code).
When the world state is drawn, the Point will fly off in exactly the right direction. Additionally, because of the history rewrite, subsequent Point updates will keep moving the Point in the right direction.
The picture shows the situation when hitting the ceiling. Hitting the floor and the walls works similar. And that’s all the math and code you need to simulate Points moving in a bounded space. Now let’s add Sticks to the simulation.
Not only walls are restricting Points from free movement; Sticks also constrain them. A Stick connects 2 Points and has a configured length. The goal of the Stick constraint is to move the Points at the end of the Stick to the configured length of the Stick.
Instead of trying to calculate the solution that satisfies all Stick constraints at once, this code simply looks at one Stick at a time and ‘solves’ the constraint problem by repeatedly solving Stick constraints in isolation.
(defn apply-stick-constraint
[{length :length :as stick}
{p0x :x p0y :y oldp0x :oldx oldp0y :oldy pinp0 :pinned :as p0}
{p1x :x p1y :y oldp1x :oldx oldp1y :oldy pinp1 :pinned :as p1}]
(let [{:keys [dx dy distance]} (distance-map p0 p1)
difference (- length distance)
fraction (/ (/ difference distance) 2)
offsetX (* dx fraction)
offsetY (* dy fraction)
p0-new (->Point (- p0x offsetX) (- p0y offsetY) oldp0x oldp0y pinp0)
p1-new (->Point (+ p1x offsetX) (+ p1y offsetY) oldp1x oldp1y pinp1)]
[(if pinp0 p0 p0-new) (if pinp1 p1 p1-new)]))
apply-stick-constraint
takes a Stick and 2 Points (P0 and P1) as arguments.
These arguments are heavily destructured. To understand what happens precisely,
the next picture might be helpful:
Let P0 and P1 be two Points with a Stick S between them. P0 and P1 have already
been updated by the update-point
function and their new (x,y) coordinates are
(40,50) and (70,90) respectively. This means:
Since the Stick between P0 and P1 was configured to have a length
of 150, and
we want P0 and P1 to be adjusted by the same amount, P0 should be located at
Point S0 (10,10) and P1 should be located at Point S1 (100,130). This is
exactly what apply-stick-constraint
achieves:
difference
in the configured length
of the Stick and the distance
of P0
and P1 is 100fraction
of the distance
between P0 and P1 that needs to be added to
P0 AND to P1 is 1. So by extending the distance
P0 and P1 with exactly 50
(distance
times fraction
) in both directions, we’ll solve the Stick
constraint.offsetX
on P0x and P1x and using offsetY
on P0y and
P1yConceptually a scaled helper triangle is used to move P0 and an identical scaled
helper triangle is used to move P1. The scale of this triangle is determined by
the fraction
which in this case is 1. These triangles are depicted in red.
Each Stick in the world is updated before a new world frame is drawn. It is very well possible that the neatly placed P0 and P1 are moved to different coordinates by another Stick constraint before the complete update is over. This sometimes results in wiggly behavior, although in most cases, the simulation is perceived to behave naturally.
Finally, the Points and Sticks have to be drawn on screen:
(defn draw
[state]
(quil/background 255)
(if (:info-message state)
(quil/text info-message 20 20)
(do
(doseq [point (vals (:points state))]
(quil/ellipse (:x point) (:y point) 7 7))
(doseq [stick (:sticks state)]
(let [points (:points state)
p0 ((first (:links stick)) points)
p1 ((last (:links stick)) points)]
(quil/line (:x p0) (:y p0) (:x p1) (:y p1)))))))
Start by clearing the screen. If there is an :info-message
entry in the
state
, draw the info-message
. Otherwise draw all Points in state
as a
quil/ellipse and draw all Sticks as a quil/line. And that’s all folks!
As always, it was a pleasure working with Clojure. It turns out to be easy to work in a very mutable domain with mostly pure functions, also thanks to the excellent Quil library.
My current version of cloc tells me that
core.clj is 230 lines long, but it counts the function documentation as code.
Therefore, I ran a new cloc
command without the doc strings. It then counts
159 lines of clojure, approximately half of which are dedicated to UI
interaction and the other half to physics simulation. Not bad at all!
I’m glad I decided to ‘bite the bullet’ and learn Emacs and CIDER. I now use Emacs for all my Clojure(script) development. In addition, I use Emacs for most of my text editing these days including writing and planning.
I’d like to thank Michiel Borkent a.k.a. @borkdude for reviewing an earlier version of the code and giving me very helpful feedback. Faults and not-so-idiomatic Clojure code remaining are my own.
Please share your comments, suggestions and thoughts about this blog post on twitter.com/mmz_. Thanks for reading and Happy Coding!


Since the ripe age of 8, Dan has been known as a serious bubkis. Logic would dictate that he would eventually grow out of his bubkis phase. But as of 2017 there has been little change.
If someone you know has been afflicted with the bubkis, please contact your local developer.


{% extends "base.html" %} {% import "elements.html" as elements %} {% block content %} {{ elements.modal("Word", "Docs", "context") }}
We want to classify documents into the following categories:
Which words are likely to appear in the same category as


THE GAME (1997) A Film Review by Ted Prigge Copyright 1997 Ted Prigge
Director: David Fincher Writers: John D. Brancato and Michael Ferris (with a re-write by Andrew Kevin Walker) Starring: Michael Douglas, Sean Penn, Deborah Kara Unger, James Rebhorn, Armin Mueller-Stahl
There's a scene late in "The Game" where the protagonist suffers what is probably the most kafkaesque, surreal, and literally breath-taking sight. I'm not going to go out and say what it is, because, well, I want you to see this movie, but when I saw it, even I felt as alienated and paranoid as the protagonist. This is the skill that David Fincher has: to pull us into the movie so much, that we're as scared and thrilled as the protagonist. So basically, this is the most thrilling thriller in a long while. Well, since "Se7en."
 It's his 48th birthday, and he's more miserable than usual since that was the birthday when his father killed himself by throwing himself off the very roof under which he lives. He's a control freak, but more of a calmed-down one, instead of a frantic Steve Buscemi-ite, who calmly yet with a sense of fatigue, works in his giant yet claustrophobic office, and even has to be told by his secretary that "Rachel on line 2" is his ex-wife.
 It's something from a company called "CRS" (forget the breakdown of this ackronym) that is meant to relax rich people or something. Nicholas is reluctant but eventually goes to their offices, has a little chat with one of their heads (James Rebhorn, finally getting a farily meaty role after all these years), and is launched into an hour of bizarre exercises.
We, like him, have no clue what this game is about or the purpose or anything about it. They say it will come to him, and it eventually does. Weird things begin happening to him - i.e. he finds a clown draped across the front of his house, dressed like his dad; his television starts talking to him; and he gets a note telling him he must follow some waitress he accidentally got fired from an elite restaurant (Deborah Kara Unger, from "Crash").
The events start out like little pranks, but they soon become eery and dangerous. More and more bizarre things begin happening to him, and he soon becomes incredibly paranoid, as do we. We go through everything he does, mainly because we get to know the character so well that he soon becomes like one of those Hitchcock everybodies: a flawed human being who plumets into a world of intrigue and surrealism. Soon, Nicholas is fighting an unknown assailant, trying to find the purpose of the game, and trying to get out of it before anything worse happens.
By the time the film's over, we're as ragged as Nicholas. We're with him, praying for an explanation for what he and we have been through. And the ending would be a huge let-down if it weren't for the great direction, which finishes up masterfully.
David Fincher is quickly becoming one of the better directors around. With his underrated "Se7en" behind him (not to mention the very underrated "Alien 3"), he has proven that he can combine great style with substance. While "Alien 3" was just pure atmospheric fun, "Se7en" had a satirical message, and "The Game" manages to try and fill in the gaps of what's missing in the life of the modern-day Ebenezer Scrooge.
He's also obviously very influenced by Hitchcock. As I said, the Nicholas character is a pure Hitchcock character, but that's not where it ends. We also get a kind of bleak and gritty version of one of his movies, some straight-out homages, and the strong sense of message Hitchcock was so flawless at attaining. I mean, all that's missing is a walk-on by Mr. Fincher. We even get scenes that are near duplicates of some of his work, as well as some of the themes. There are two scenes straight out of "North by Northwest," there's a touch of "Vertigo at the end," and there's probably even more if I went back and disected more carefully.
But not only is this a kind of tip-of-the-hat to Hitchcock, but it's got Kafka written all over it. Nicholas is alienated, and is absolutely alone at more than one point in the film. And as the film goes on, he gets more and more paranoid. This kind of twisted horror view of the world is exactly what Kafka wrote about, and this film is basically modern-day Kafka.
As far as acting goes, Michael Douglas gives the best performance he has in years, presenting a very flawed yet very likable man. He's easy to sympathize with, and you can just see him getting more and more crazy as the film goes on. He's in almost all of the scenes (okay, so he's in all of them), and most of the actors are pretty much cameos or short walk-ons.
Sean Penn, in fact, is almost a cameo. He has about three scenes in the film, but he uses them nicely. He's very slimey (he's the black sheep brother, remember?) and at one point is incredibly nervous. He does a much better job than Jodie would have (even though Jodie probably could have pulled it off, since she's one of the best actresses in the world).
Also, Deborah Kara Unger (who I had yet to see act) is amazing in this, and should be picked up for more cool movies in the future. She has a very naturalistic style to her acting, making the lines seem more down-to-earth than they would be coming from the mouth of another actor. James Rebhorn (who was in such films as "Scent of a Woman" and "My Cousin Vinnie") is also very brief, but is excellent with what screen time he has. And Armin Mueller-Stahl is good in a very, very brief role.
The writing is ingenius. Yes, there are very agape plot holes, but they never seem too incredible at the time, but that's really due to the direction.  The dialogue is witty and interesting, with some very funny lines that come naturally instead of force-fed.
And, of course, the direction is amazing. David Fincher combines engrossing visuals with depth; atmostphere with purpose. He brings things to such high tension that there were whole scenes where I literally held my breath until the big shock came. As I said, he is becoming one of the best directors around.
"The Game" is probably going to be written off as just a "very good thriller." But really, folks, thrillers this good do not come around every month or so. They're about as rare as a visit from the Comet Kahoutek. So appreciate this film, because we won't see a better thriller until the next David Fincher film.
MY RATING (out of 4): ***1/2
Homepage at: http://www.geocities.com/Hollywood/Hills/8335/
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


This End User License Agreement (“Agreement”) is between you and HKEPC IR and governs use of this app made available through the Apple App Store. By installing the HKEPC IR App, you agree to be bound by this Agreement and understand that there is no tolerance for objectionable content. If you do not agree with the terms and conditions of this Agreement, you are not entitled to use the HKEPC IR App. In order to ensure HKEPC IR provides the best experience possible for everyone, we strongly enforce a no tolerance policy for objectionable content. If you see inappropriate content, please use the “Report as offensive” feature found under each post.
1. Parties This Agreement is between you and HKEPC IR only, and not Apple, Inc. (“Apple”). Notwithstanding the foregoing, you acknowledge that Apple and its subsidiaries are third party beneficiaries of this Agreement and Apple has the right to enforce this Agreement against you. HKEPC IR, not Apple, is solely responsible for the HKEPC IR App and its content.
2. Privacy HKEPC IR may collect and use information about your usage of the HKEPC IR App, including certain types of information from and about your device. HKEPC IR may use this information, as long as it is in a form that does not personally identify you, to measure the use and performance of the HKEPC IR App.
3. Limited License HKEPC IR grants you a limited, non-exclusive, non-transferable, revocable license to use theHKEPC IR App for your personal, non-commercial purposes. You may only use the HKEPC IR App on Apple devices that you own or control and as permitted by the App Store Terms of Service.
4. Age Restrictions By using the HKEPC IR App, you represent and warrant that (a) you are 17 years of age or older and you agree to be bound by this Agreement; (b) if you are under 17 years of age, you have obtained verifiable consent from a parent or legal guardian; and (c) your use of the HKEPC IR App does not violate any applicable law or regulation. Your access to the HKEPC IR App may be terminated without warning if HKEPC IR believes, in its sole discretion, that you are under the age of 17 years and have not obtained verifiable consent from a parent or legal guardian. If you are a parent or legal guardian and you provide your consent to your child’s use of the HKEPC IR App, you agree to be bound by this Agreement in respect to your child’s use of the HKEPC IR App.
5. Objectionable Content Policy Content may not be submitted to HKEPC IR, who will moderate all content and ultimately decide whether or not to post a submission to the extent such content includes, is in conjunction with, or alongside any, Objectionable Content. Objectionable Content includes, but is not limited to: (i) sexually explicit materials; (ii) obscene, defamatory, libelous, slanderous, violent and/or unlawful content or profanity; (iii) content that infringes upon the rights of any third party, including copyright, trademark, privacy, publicity or other personal or proprietary right, or that is deceptive or fraudulent; (iv) content that promotes the use or sale of illegal or regulated substances, tobacco products, ammunition and/or firearms; and (v) gambling, including without limitation, any online casino, sports books, bingo or poker.
6. Warranty HKEPC IR disclaims all warranties about the HKEPC IR App to the fullest extent permitted by law. To the extent any warranty exists under law that cannot be disclaimed, HKEPC IR, not Apple, shall be solely responsible for such warranty.
7. Maintenance and Support HKEPC IR does provide minimal maintenance or support for it but not to the extent that any maintenance or support is required by applicable law, HKEPC IR, not Apple, shall be obligated to furnish any such maintenance or support.
8. Product Claims HKEPC IR, not Apple, is responsible for addressing any claims by you relating to the HKEPC IR App or use of it, including, but not limited to: (i) any product liability claim; (ii) any claim that the HKEPC IR App fails to conform to any applicable legal or regulatory requirement; and (iii) any claim arising under consumer protection or similar legislation. Nothing in this Agreement shall be deemed an admission that you may have such claims.
9. Third Party Intellectual Property Claims HKEPC IR shall not be obligated to indemnify or defend you with respect to any third party claim arising out or relating to the HKEPC IR App. To the extent HKEPC IR is required to provide indemnification by applicable law, HKEPC IR, not Apple, shall be solely responsible for the investigation, defense, settlement and discharge of any claim that the HKEPC IR App or your use of it infringes any third party intellectual property right.


{# urlFragment is an optional hash fragment like #tabs that can be used so that clicking a pagination button auto-scrolls user to that's expected to exist on destination page hiLo is '#hi' '#lo' or undefined. undefined means neither #} {% macro render(currPage, totalPages, baseUrl, urlFragment, hiLo) %} {% set suffix = '' %} {# reset state of suffix #} {% if totalPages > 1 %}


GitLens
Git supercharged
GitLens supercharges the Git capabilities built into Visual Studio Code. It helps you to visualize code authorship at a glance via Git blame annotations and code lens, seamlessly navigate and explore Git repositories, gain valuable insights via powerful comparison commands, and so much more.
Don't miss how easy it is to configure GitLens!
What's New in GitLens 8 🎉🎈
- 8.2 APRIL 2018
- NEW
Adds new stand-alone GitLens History explorer to visualize the history of the current file — undocked version of the GitLens explorer history view
- NEW
Adds richer tooltips to the GitLens explorer and GitLens Results view, and richer working tree and upstream status to the GitLens explorer
- NEW
Adds an indicator to the GitLens explorer's branch history to mark the synchronization point between the local and remote branch (if available)
- NEW
Adds ability to easily switch between relative and absolute dates via the
gitlens.defaultDateStyle
settings — closes #312 - NEW
Adds annotation format settings (
gitlens.*.format
) to the interactive settings editor - NEW
Adds new
gitlens.currentLine.scrollable
setting to specify whether the current line blame annotation can be scrolled into view when it is outside the viewport — closes #149, #290, #265 - NEW
Adds
gitlens.statusBar.reduceFlicker
setting to the interactive settings editor - FIXED Fixes #314 — Toggle line annotation doesn't work properly
- FIXED Fixes #310 — "via Terminal" commands need quoting around work directory
- FIXED Fixes issues with the active repository in the GitLens explorer failed to update properly
- FIXED Fixes issues with Open File, Open Revision, and Show File History commands and images and other binary files
- FIXED Fixes issues preventing nodes in the GitLens explorer from expanding properly in certain cases
- FIXED Fixes issues when refreshing nodes in the GitLens Results view
- 8.1 MARCH 2018
- NEW
Adds automatic issue linking to Bitbucket, GitHub, GitLab, and Visual Studio Team Services for commit messages in hovers
- NEW
Adds support to toggle annotations for each file individually or for all files at once — closes #289
- NEW Adds icons to remotes in the GitLens explorer based on the remote service provider
- NEW Adds multi-cursor support to current line annotations — closes #291
- IMPROVED Renames Compare Selected Ancestor with Working Tree command to Compare Ancestry with Working Tree and removes the need to select a branch first, since all compares are performed with the working tree — closes #279
- FIXED Fixes #294 — Keyboard shortcuts will now default to chorded to avoid conflicts. Only affects new installs or if you remove the gitlens.keymap setting
- 8.0 FEBRUARY 2018
- NEW Brand new welcome experience — you're looking at it
- NEW
Brand new interactive settings editor — GitLens is easier than ever to customize to suit your needs
- NEW Brand new website — check it out!
- NEW Adds a tree layout option to branches in the GitLens explorer — thanks to Yukai Huang (@Yukaii)!
- IMPROVED Reworked settings — clearer, simpler settings
- FIXED Previous settings will now be migrated properly — sorry everyone 😢
See the release notes for the full set of changes
Welcome
Thank you for taking the time to try GitLens!
GitLens is an open-source extension for Visual Studio Code created by Eric Amodio. While GitLens is generously offered to everyone free of charge, if you find it useful please consider supporting it.
GitLens simply helps you understand code better. Quickly glimpse into whom, why, and when a line or code block was changed. Jump back through history to gain further insights as to how and why the code evolved. Explore the history and evolution of a codebase. Dive right in and see how GitLens can help!
Here are just some of the features that GitLens provides,
- a GitLens explorer to navigate and explore repositories or file histories
- an on-demand GitLens Results view to explore commits, histories, and searches, or visualize comparisons between branches, tags, commits, and more
- authorship code lens showing the most recent commit and # of authors to the top of files and/or on code blocks
- an unobtrusive current line blame annotation at the end of the line
- on-demand gutter blame annotations, including a heatmap, for the whole file
- detailed blame information accessible via hovers
- on-demand recent changes annotations to highlight lines changed by the most recent commit
- a status bar blame annotation showing author and date for the current line
- commit search — by message, author, filename, commit id, or code changes
- many powerful commands for exploring commits and histories, comparing and navigating revisions, stash access, repository status, etc
- and so much more
GitLens is powerful, feature rich, and highly customizable to meet your specific needs — find code lens intrusive or the current line blame annotation distracting — no problem, it is quick and easy to turn them off or change how they behave via the built-in GitLens Settings editor, an interactive editor covering many of GitLens' powerful settings. While for more advanced customizations, refer to the GitLens settings docs and edit your User Settings.
Support GitLens
While GitLens is generously offered to everyone free of charge, if you find it useful please consider supporting it.
I've been building GitLens in my spare time1 for almost 2 years now. From its very humble beginnings, GitLens has grown wildly beyond my expectations — in both its reach as well as its demands on my time and attention. While I enjoy giving my free time and attention to GitLens' development and growth, I would like to do even more.
Show Your Support ❤
To my incredible backers — thank you so much for your contributions. I am truly humbled by your generosity and support. Please know that your support plays a important role in helping me realize GitLens' potential in making developer's lives easier.
If you'd like to join them in supporting GitLens, please consider the following — feel free to choose more than one. 😉


Best results when car is facing in z direction (towards you)
Usage:
New wheels will get the current suspension settings, you can edit single wheels via the SceneExplorer (update VehicleControl if wheels dont show up) or apply settings created with the settings generator to wheel groups.
Press the "test vehicle" button to drive the vehicle, use WASD to control, Enter to reset.
Known Issues: Dont save while testing the vehicle, you will save the location and acceleration info in the j3o.
Code Example to load vehicle:
//load vehicle and access VehicleControl Spatial car=assetManager.loadModel("Models/MyCar.j3o"); VehicleControl control=car.getControl(VehicleControl.class); rootNode.attachChild(car); physicsSpace.add(control); //then use the control to control the vehicle: control.setPhysicsLocation(new Vector3f(10,2,10)); control.accelerate(100);


Neutra locavore Godard single-origin coffee squid Truffaut quinoa DIY hella. Thundercats brunch blog, sartorial squid hashtag Echo Park occupy.
Bicycle rights actually ethnic wolf, freegan irony McSweeney's Odd Future 3 wolf moon pour-over keytar blog beard cliche master cleanse.
Cred plaid cornhole farm-to-table irony Pitchfork, aesthetic Tonx next level street art church-key shabby chic. Brooklyn fap DIY semiotics.
Quinoa post-ironic skateboard keytar chillwave tattooed. Pug distillery kitsch, seitan hoodie Neutra put a bird on it VHS PBR&B Schlitz master cleanse pop-up aesthetic McSweeney's Brooklyn. Twee Schlitz photo booth, Banksy raw denim semiotics whatever locavore.
Brooklyn typewriter distillery, Tumblr McSweeney's four loko deep v squid paleo. Food truck Truffaut fashion axe gluten-free squid. Austin four loko small batch Schlitz literally shabby chic fanny pack, sartorial narwhal before they sold out. Hella chia sustainable crucifix, mustache Thundercats VHS.


Get Started, Part 3: Group Messaging
Estimated reading time: 2 minutesPrerequisites
Introduction
In part 3, we will learn about group messaging in mesibo. With group messaging, you can send a single message to multiple users belonging to a group in one-shot. Group messaging is an extremely poweful, useful and popular feature.
However, before proceeding further, ensure that you have read the Prerequisites above.
Group Messaging
What if you have to send a message to multiple users ? One solution is to send same message to each user one by one. So if you have N users, you will have to send a message N times. This is not only ineffective but unmanageable. Imagine, you have to recall or delete or reference this message, you will have to do it for all N individual messages.
Instead, mesibo allows you a create a set of users as a group. Once you create a group, all you have to do is to send a single message to the group and mesibo will automatically send that message to all the users in the group. Very simple! You can create group of any size without any restrictions.
Group Types
Group is a very powerful way to communicate with set of users. There are various kind of group messaging possible, just to categorize a few:
-
Normal Group: any user can send and receive messages to a group.
-
Restricted Group: only selected users can send messages to a group and selected users can receive messages from the group. Senders and receivers can be a disjoint set.
-
Broadcast Group: only admin can send messages to the group.
-
Public Rooms: anyone can message, even non-members.
-
Round-robin (hunt) Group: only one user from the group will receive the message in round robin fashion. This is quite useful for creating specialized groups; for example, in a group of support staff, only one of them will receive a message from customer.
Mesibo supports all such and more group types which you can specify at the time of group creation and modify at any point in time later. However, instead of hardcoding group types, mesibo allows you to specify sending and receiving behavior of the group and individual group members for greater flexibility, for example,
- Anyone can send
- Members can send
- Only selected members can send
- Only Selected Members can receive
- Members can receive
- One of the active member can receive, etc
You can dynamically change the group or the member behavior at any point in time and it will be instantly applied to the group or group member(s).
Conclusion of part three
That’s all for this page. In the next section, we learn how to enable voice and video calling between your users.
messages, messaging, group messaging, fan-out


BetterBatch is similar to other things already out there so why use it?
BetterBatch by default checks the return value for every command. If a command fails then the script will stop. Batch files make it very easy to ignore that an individual step has failed.
This may sound like a minor improvement but it makes a huge difference. It allows individual bits of functionality to be easily broken up.
If you want to avoid having to specify a variable that can be reasonably calculated from another variable you can easily factor this out to a simple script. In the following example I show how to set the ISO 639 Language code (used in XML) from the language name.
DOS Batch:
if /i "%lang_name%"== 'ABHAZIAN' set lang_iso_639=AB
if /i "%lang_name%"== 'AFAN (OROMO)' set lang_iso_639=OM
...
if /i "%lang_name%"== 'ZHUANG' set lang_iso_639=ZA
if /i "%lang_name%"== 'ZULU' set lang_iso_639=ZU
BetterBatch:
lang_iso_639 = (system) Get_iso_639_lang.pl <lang_name>
This perl file of course has to have the language table coded into it also but not it can be called easily from anywhere else too. And as the funcitonality is broken up - it will be easier to test for errors.
It is very easy to add checks at any point in the process. Compare the following two methods of checking if a file exists...
DOS Batch:
if not exist somefile goto Some_Error_Condition
BetterBatch:
- exists: somefile
Any other check can be easily added by calling a batch/exe/script that returns 0 for sucess and a non-zero value for failure.
In Dos batch files if a variable does not exist then no error message will shown, and the variable will be replaced with “” (empty string). If you want to check variables then you have to add code for every variable you want to check.
In BetterBatch all used variable definitions are checked before anything is run.
Once you specify the logfile variable then all output is logged there, so it will be easier to track down where something went wrong (but as most errors will stop the script anyway - it is unlikely that you will have too many unforseen errors
BetterBatch files are simpler than DOS Batch files in many ways which makes them easier to understand.
Variable references are also easier to read. In Batch files variable references are defined using %% for both start and end tags while in BetterBatch files they are defined using < and > for hte start and end tags respetively. If there are multiple variables in a line - then it makes it much simpler to see all the variable references
DOS Batch:
set build_folder=%PROJECT_FOLDER%\%BUILD%\%LANG%
BetterBatch:
build_folder: <PROJECT_FOLDER>\<BUILD>\<LANG>
In Batch files it can be difficult to create another batch file that defines all the variables required. It can be done - but as there is no checking for undefined variables - it makes it difficult to track down errors. Commands and Variables can be used in other YAML files making it possible to define common YAML files that have no project nor machine specific information.
In DOS batch files you cannot split a long line over multiple lines (to aid readability). In BetterBatch there are a number of ways of doing it:
Specify value as a YAML string (starting on the first line - automatically continued on the following lines - as long as they are more indented:
- run: echo this is a very
long string that will treated after parsing a single line
by BetterBatch - this is a feature of YAML.
echo this is a very long string that will treated after parsing a single line by BetterBatch - this is a feature of YAML.
The main reason for using BetterBatch rather than a full fledged scripting language is that the YAML configuration files are much simpler.
If a user does not know Python/Perl/Ruby/Lua/etc. it would be a significant effort for them to learn that language to do what they can do easily using BetterBatch.
You can create tools/checks/etc for BetterBatch in any language you want. As long as it can be executed on the command line - it can be used by BetterBatch.
This means that in a single YAML file you could set variables from PERL files, call a check written in Python, and execute a script in a BATCH file
BetterBatch files act as a glue between different components. BetterBatch does not apply force restrictions on these components other than they can be run on the command line and that they return 0 on success. This means that anything written for a BetterBatch process will also work (and can be debugged) outside of BetterBatch.


--- layout: default title: Dividers page-header: headline: "Dividers" alignment: left parent: label: "Layout" url: "/layout" page-navigation: - label: "Inverse Styling" link: "#dividers-inverse-styling" - label: "Spacing Modifiers" link: "#dividers-spacing-modifiers" navigation: - label: "Spacing Direction Modifiers" link: "#dividers-spacing-direction-modifiers" ---
Dividers are a simple way to create separation between content. CNVS includes a simple divider in both a normal and inverse style.
Use either the class .divider
or go old-school with the

tag to create a divider. Dividers fill the width of their parent containers. By default, dividers have space above and below.

 …


Higher values mean more effectiveness. AoE max is capped at group size. *FPA = Frames Per Attack (25 frames = 1 second)
Loading...


KPSEWHICH(1) KPSEWHICH(1) NAME kpsewhich - standalone path lookup and and expansion for kpathsea SYNOPSIS kpsewhich [options] [filenames] DESCRIPTION This manual page is not meant to be exhaustive. The complete documenta‐ tion for this version of TeX can be found in the info file or manual Kpathsea: A library for path searching. kpsewhich is used as a standalone front-end of the kpathsea library that can be used to examine variables and find files. When the -format option is not given, the search path used when looking for a file is inferred from the name given, by looking for a known extension. If no known extension is found, the search path for TeX source files is used. OPTIONS kpsewhich accepts the following options: -debug num Set debugging flags. -D num Use a base resolution of num; the default, set by the installer, is typically 600. -dpi num As -D. -engine string Set $engine in the environment, which is used in some search paths. -expand-braces string Print variable and brace expansion of string. -expand-path string Print complete path expansion of string. -expand-var string Print variable expansion of string. -format name Use file type name. See the info manual for a list of valid names, or use the -help option to print the list. -help Print help message and exit. -interactive Ask for additional filenames to look up. -mktex fmt enable mktexfmt generation. (fmt=pk/mf/tex/tfm) -mode string Set device name for $MAKETEX_MODE to string; no default. -must-exist Search the disk as well as ls-R if necessary. -no-mktex fmt disable mktexfmt generation. (fmt=pk/mf/tex/tfm) -path string Search in the path string. -progname string Set program name to string. -show-path name Output search path for file type name. See the info manual for a list of valid names, or use the -help option to print the list. -var-value variable Print the expansion of variable. -version Print version information and exit. SEE ALSO mktexlsr(1), mktexmf(1), mktexpk(1), mktextfm(1). Kpathsea 6.1.0 1 March 2011 KPSEWHICH(1)


Created: 15.06.2010
By: Gabshot
Email<EMAIL_ADDRESS>Thank you for purchasing my theme. If you have any questions that are beyond the scope of this help file, please feel free to email via my user page contact form here. Thanks so much!
This theme is a fixed layout with two columns. All of the information within the main content area is nested within a div with an id of "content". The sidebar's (column #2) content is within a div with an id of "aside". The general template structure is the same throughout the template. Here is the general structure.
If you would like to edit the color, font or stye of any elements in the document, you would do the following:
a { color: #bf1e2e; text-decoration: none; }
If you find that your new style is not overriding, it is most likely because of a specificity problem. Scroll down in your CSS file and make sure that there isn't a similar style that has more weight.
I.E.
#nav > li > a { color: #fff;}
So, to ensure that your new styles are applied, make sure that they carry enough "weight" and that there isn't a style lower in the CSS file that is being applied after yours.
I'm using one CSS file in this theme. The reset rules for some of the elements may be found in the begining of the css document. This file also contains some general styling, such as anchor tag colors, font-sizes, etc. Keep in mind, that these values might be overridden somewhere else in the file.
The file is separated into sections using:
/* - general - */ some code /* default form styling */ some code /* structure */ some code /* header */ some code
And so on for further site elements. Every separate element or block of similar rules have such opening comment.
If you would like to edit a specific section of the site, simply find the appropriate label in the CSS file, and then scroll down until you find the appropriate style that needs to be edited.
Text color inside the about author block info that goes right after the post/portfolio item can be easily altered by changing the hex value of the color rule inside the following selector:
.about-author dd { margin: 20px 0 0; color: #505050;}
All the JavaScript code responsible for extra functionality is stored inside js/dw.js file. Scripts use jQuery framework (v1.3.2+)
The file starts with 'config' object including all config parameters:
I've included all-in-one psd with this theme. Every layer has proper name and each detail is in separate layer all layers are in catalogs which are subpages.
Fonts. The theme uses mostly free font Helvetica! The "Twitter feed" and "bu night" use freeware font Yelly.
Icons. To make the layout looks even more professional in the theme are included Icon Sets released on the GNU General Public License or Free for commercial use.
Once again, thank you so much for purchasing this theme. As I said at the beginning, I'd be glad to help you if you have any questions relating to this theme. No guarantees, but I'll do my best to assist. If you have a more general question relating to the themes on ThemeForest, you might consider visiting the forums and asking your question in the "Item Discussion" section.
Gabshot


Agent Portal Redesign
Role: Junior Designer
Lead: Edwin Rogers
Tools: Omnigraffle, Photoshop, Illustrator
Project Completed: July 2015
GOGO Worldwide Vacations is the largest privately owned leisure travel chain in the United States that serves over one million customers annually. They currently have over 170 stores in 14 states.
GOGO Travel's agents operate through a booking engine to quickly secure their clients their dream vacation. Working with Softvoyage, it was our job to re-vamp the entire engine to be clean, responsive, and intuitive.
Booking a vacation has a lot of moving parts, and the UI must be clear, concise, and intuitive in order to guide the user. We espeicially wanted to simplify the experience of choosing an airplane seat. The old GoGo travel interface had minimal visuals and no way to directly choose a seat with a clear UI. Airplane seats can be the most expensive part of a vacation, and we wanted to increase user confidence that they were making the right choice.
Lucinda books an amazing trip for her clients
After a long day of packing her clients get to the airport tired and annoyed by traffic.
Lucinda’s clients board the airplane and find that their seats are less than optimal.
Lucinda gets a less-than happy call from her clients after their trip.
Choosing a plane seat can be an overwhelming experience for a user.  There were three key points that I wanted to improve upon.
Typically in the past this type of interaction would appear in a modal, amplifying clutter on the user's page and in their digital environment. Research has shown that minimizing page content eases user choice and simplifies the experience.
One clear pain-point of decision making when it comes to choosing a flight seat is definitely cost-factors and upgrades. With accessability in mind, we wante to make it clear what seats cost and if there was additional features to the seat.
This can be an especially challenging part of booking a trip, so we wanted to increase user delight through soft color and clear interactive touch-points to heighten confidence.
We wanted to make the seat the star of the story here, and give the user as much information as we could. This way when this booking is made, there isn't any surprises by the the time the user's clients get on board. They're already aware if they're in the dreaded exmergency exit seats.


{% extends "profile/base.html" %} {% import "macros/forms.html" as forms %} {% import "macros/bootstrap.html" as bsu %} {% block pagetitle %}{{ gettext('Account data for user %(name)s', name=current_user.get_full_name()) }}{% endblock %} {% block content %}


This presentation is online:
Growing, mid-sized global mining company
Multi-year investment in Enterprise IT systems
Some very important interfaces
Small team: efficiency & skills
Balance
| Modern | vs. | Practical |
| Quality | vs. | Budget |
| Solid | vs. | Nimble |
Boring ≠ Bad
Use new/unproven tech only where it matters
Optimise Globally (Architecture! ☺)
You should really read this!
One team.
Dev to improve Ops
Ops Experience to improve Dev
However...
Standard language
Used by most middleware systems
Collaboration! :-)
e.g. using XSpec
USD
AUD
1.20613
M
2014-12-10
CAD
HKD
7.07113562438128
ZYFC
2014-12-10
...
USD
AUD
1.20613
M
2014-12-10
USD
TND
1.8566
M
2014-12-10
...
Watch a Demo by the creator Jeni T
In most cases a non-issue
Used to be dicey before 7.10
AusPost's "POSLog" interface used only XSLT for 1m+ messages/day
| First Name | Last Name | Last Name | First Name | |
|---|---|---|---|---|
| Marie | Curie | Becquerel | Henri | |
| Henri | Becquerel | Curie | Marie | |
| Pierre | Curie | Pierre | ||
Basically the GROUP BY clause in SQL...
,
Adapted from template solution by Jeni T.
Makes many things much simpler!
Supported in a limited way from PI 7.31 SP11
Alternative: Java wrapper.
...
And lots of other improvements...
Now supported in 7.31 and later!
Needed a way to address shortcomings of the ESR:
Initial learning curve
Discipline required
Code reviews before merging into master
Offshore development: Only trusted devs have merge rights
Avoid edit conflicts
An SAP tool for Github code review!
"Monitoring is Still a Big Issue" - IFG for PI Survey
Traditional Alert Framework
Since 7.3: also Component-Based Message Alerting & SolMan
Difficult to set up; very sparse documentation
SolMan as central monitor, polls other systems for alerts
Lots of noise & false positives
25% adoption
Barriers:
Alert Framework
⇧
CBMA
⇧
Custom Solution
Brittle
Noise
Email == Spam
Brittle
Noise
Email == Spam
More Complex! :-(
[null]1 message failed for "DEFAULT_ALERTRULE" on "MMG_SAPERP_PRD010" {
"Component": "MMG_SAPERP_PRD010",
"ErrCat": "Application",
"ErrCode": "ABAP.APPLICATION_ERROR",
"ErrLabel": "2000",
"ErrParams": {},
"ErrText": "Application has thrown an exception",
"FromParty": "",
"FromService": "SUNGARD_AVANTGARD_PRD",
"Interface": "AccountingDocumentAvantGardTreasuryJournalBulkCreateRequest_In",
"MonitoringUrl": "http://host:port/sap/bc/gui/sap/its/webgui/SE61_DISPTXT?~transaction=*SXI_SHOW_MESSAGE%20MSGGUID=56D34B27536511E4B7A700000C5922FA",
"MsgId": "56D34B27536511E4B7A700000C5922FA",
"Namespace": "http://mmg.com/p2m/sap_appl",
"RuleId": "d42a9af9fdc53609843f5a1d9f211911",
"Timestamp": "2014-10-14T05:45:54Z",
"ToParty": "",
"ToService": "MMG_SAPERP_PRD010"
}
Simple
Manual monitoring
Noise
Chat
Mobile app & push notifications
Searchable history
Freemium
Difficult to keep track
Who watches the watcher?
Issue tracking
De-duplication
On-call rosters
Cheap
Eliminated manual monitoring
With a simple XSLT to transform CBMA alerts to OpsGenie API messages.
Find this presentation at
http://slides.BlueT.com.au/saug2015po
<EMAIL_ADDRESS>+61 403 933 472
@sufw


Borders
A collection of classes to make styling your borders a breeze.
Styles
Classes to style your tags
| Outline Styles | ||
.border-dotted |
Use the .border-dotted class to add a dotted border to an element. |
|
.border-dashed |
Use the .border-dashed class to add a dashed border to an element. |
|
.border-thick |
Use the .border-thick class to add a thick border to an element. |
|
.border-thin |
Use the .border-thin class to add a thin border to an element. |
|
.border-transparent |
Use the .border-transparent class to make the border of an element transparent. |
|
.border-none |
Use the .border-none class to remove the border from an element. |
Colors
Easily change the border color of your elements using boba's eye-catching palette.
| Colors | ||
To change the border color of an element, add a .border-{COLOR} class. |
||
.border-red |
Add this class to make the border of an element red. | |
.border-orange |
Add this class to make the border of an element orange. | |
.border-yellow |
Add this class to make the border of an element yellow. | |
.border-green |
Add this class to make the border of an element green. | |
.border-teal |
Add this class to make the border of an element teal. | |
.border-blue |
Add this class to make the border of an element blue. | |
.border-indigo |
Add this class to make the border of an element indigo. | |
.border-purple |
Add this class to make the border of an element purple. | |
.border-pink |
Add this class to make the border of an element pink. | |
.border-dark |
Add this class to make the border of an element dark. | |
.border-light |
Add this class to make the border of an element light. | |
.border-black |
Add this class to make the border of an element black. | |
.border-white |
Add this class to make the border of an element white. |
Extended
Additional utilities to help you fine-tune your borders.
Hover
For a more subtle effect, use the hover classes to change the border color of your element only when someone hovers/focuses on it.
| Hover | ||
To change the border color on hover, add a .border-hover-{COLOR} class. |
||
.border-hover-red |
Add this class to make the border of an element red on hover. | |
.border-hover-orange |
Add this class to make the border of an element orange on hover. | |
.border-hover-yellow |
Add this class to make the border of an element yellow on hover. | |
.border-hover-green |
Add this class to make the border of an element green on hover. | |
.border-hover-teal |
Add this class to make the border of an element teal on hover. | |
.border-hover-blue |
Add this class to make the border of an element blue on hover. | |
.border-hover-indigo |
Add this class to make the border of an element indigo on hover. | |
.border-hover-purple |
Add this class to make the border of an element purple on hover. | |
.border-hover-pink |
Add this class to make the border of an element pink on hover. | |
.border-hover-dark |
Add this class to make the border of an element dark on hover. | |
.border-hover-light |
Add this class to make the border of an element light on hover. | |
.border-hover-black |
Add this class to make the border of an element black on hover. | |
.border-hover-white |
Add this class to make the border of an element white on hover. |
Active
For an even more subtle effect, use the active classes to change the border color of your element only when someone someone clicks on it.
| Active | ||
To change the border color when clicked, add a .border-active-{COLOR} class. |
||
.border-active-red |
Add this class to make the border of an element red when clicked. | |
.border-active-orange |
Add this class to make the border of an element orange when clicked. | |
.border-active-yellow |
Add this class to make the border of an element yellow when clicked. | |
.border-active-green |
Add this class to make the border of an element green when clicked. | |
.border-active-teal |
Add this class to make the border of an element teal when clicked. | |
.border-active-blue |
Add this class to make the border of an element blue when clicked. | |
.border-active-indigo |
Add this class to make the border of an element indigo when clicked. | |
.border-active-purple |
Add this class to make the border of an element purple when clicked. | |
.border-active-pink |
Add this class to make the border of an element pink when clicked. | |
.border-active-dark |
Add this class to make the border of an element dark when clicked. | |
.border-active-light |
Add this class to make the border of an element light when clicked. | |
.border-active-black |
Add this class to make the border of an element black when clicked. | |
.border-active-white |
Add this class to make the border of an element white when clicked. |
Combinations
Combine the various border helper classes to create the perfect element coloring.
<div class="border-red border-hover-green border-active-blue"> Red, Hover-Green, Active-Blue </div>
Shades
Even more utilities to help you create the perfect border color.
Color Shades
Further fine-tune the color of your border by adjusting its shade.
| Color Shades | ||
|
To change the shade of your colored border, use the |
||
.lighten-border-3 |
Add this class to make your border 3 shades lighter. | |
.lighten-border-2 |
Add this class to make your border 2 shades lighter. | |
.lighten-border-1 |
Add this class to make your border 1 shade lighter. | |
| Base Color | This is a default border using .border-red for reference. |
|
.darken-border-1 |
Add this class to make your border 1 shade darker. | |
.darken-border-2 |
Add this class to make your border 2 shades darker. | |
.darken-border-3 |
Add this class to make your border 3 shades darker. |
Hover Shades
Further fine-tune the color of your border on hover by adjusting its shade.
| Color Shades | ||
|
To change the shade of your colored border on hover, use the |
||
.lighten-border-hover-3 |
Add this class to make your border 3 shades lighter on hover. | |
.lighten-border-hover-2 |
Add this class to make your border 2 shades lighter on hover. | |
.lighten-border-hover-1 |
Add this class to make your border 1 shade lighter on hover. | |
| Base Color | This is a default border using .border-hover-red for reference. |
|
.darken-border-hover-1 |
Add this class to make your border 1 shade darker on hover. | |
.darken-border-hover-2 |
Add this class to make your border 2 shades darker on hover. | |
.darken-border-hover-3 |
Add this class to make your border 3 shades darker on hover. |
Active Shades
Further fine-tune the color of your border when clicked by adjusting its shade.
| Color Shades | ||
|
To change the shade of your colored border when clicked, use the |
||
.lighten-border-active-3 |
Add this class to make your border 3 shades lighter when clicked. | |
.lighten-border-active-2 |
Add this class to make your border 2 shades lighter when clicked. | |
.lighten-border-active-1 |
Add this class to make your border 1 shade lighter when clicked. | |
| Base Color | This is a default border using .border-active-red for reference. |
|
.darken-border-active-1 |
Add this class to make your border 1 shade darker when clicked. | |
.darken-border-active-2 |
Add this class to make your border 2 shades darker when clicked. | |
.darken-border-active-3 |
Add this class to make your border 3 shades darker when clicked. |


 Currently connets to Facebook but does not have permissions to collect geotagged posts.
Connect your Facebook profile
App pending Facebook review. Currently connets to Facebook but does not have permissions to collect geotagged posts.
Foursquare: {{accounts.foursquare.0.extra_data.firstName}}
{% else %}Connect your Foursquare profile
{% endif %} {% if accounts.flickr %}Flickr: {{ accounts.flickr.0.extra_data.person.realname|get_item:"_content" }}
{% else %}Connect your Flickr profile
{% endif %} {% if accounts.openstreetmap %}OSM: {{accounts.openstreetmap.0.extra_data.display_name}}
{% else %}Connect your OSM profile
{% endif %} {% if accounts.mapillary %}Mapillary: {{accounts.mapillary.0.extra_data.username}}
{% else %}Connect your Mapillary profile
{% endif %} {% if accounts.meetup %}Meetup: {{accounts.meetup.0.extra_data.name}}
{% else %}Connect your Meetup profile {% endif %} {% if accounts.strava %}
Strava: {{accounts.strava.0.extra_data.firstname}} {{accounts.strava.0.extra_data.lastname}}
{% else %}Connect your Strava profile {% endif %} {% if accounts.inaturalist %}
iNaturalist: {{accounts.inaturalist.0.extra_data.login}}
{% else %}Connect your iNaturalist profile {% endif %}
There's one more thing you could help with then! Consider sharing your Google Location history with me. This information would help "ground truth" your social media activities. As usual, I keep everything confidential and no one will connect this back to your real identity. Visit this page for instructions if you're in!
Log in with Instagram
Log in with Twitter
Log in with
App pending Facebook review. Currently connets to Facebook but does not have permissions to collect geotagged posts.
Log in with Foursquare/Swarm
Log in with Flickr
Log in with OpenStreetMap
Log in with Mapillary
Log in with Meetup
Log in with Strava
Log in with iNaturalist
By logging in with 3rd party applications and connecting your profiles, you authorize my tools to collect basic information (such as user names and timelines) from your online accounts. {% endif %}


--- layout: post title: How Should You learn to Code? date: 2015-04-25 18:34:20.000000000 +01:00 categories: - Digital Marketing tags: [] status: publish type: post published: true meta: _edit_last: '1' hefo_before: '0' hefo_after: '0' _thumbnail_id: '186' _wpas_done_all: '1' _yoast_wpseo_linkdex: '70' _yoast_wpseo_focuskw: how learn code _yoast_wpseo_metadesc: Few discuss how to learn to code. I find that frustrating, so I decided to answer it myself. Here are my two cents on how to learn to code. _wpt_view_count: '50' _wpas_skip_8772856: '1' _wpas_skip_8772378: '1' author: login<EMAIL_ADDRESS>email<EMAIL_ADDRESS>display_name: Evan first_name: '' last_name: '' excerpt: !ruby/object:Hpricot::Doc options: {} ---
Few discuss how to learn to code. I find that frustrating. So, I decided to answer the question. Here are my two cents:
Starting out
It's important to make sure you're headed in the right direction when you jump into programming. Whether it's Javascript, Ruby, Objective C, or Java, etc, you'll deal with an amalgam of choices of languages and paths to take, but you've come to that point:
You want to create something!
QUESTIONS:
Is it necessary to quit your day job to learn to code?
I struggled with this question. I first thought it was possible when I got out of college and started working in digital marketing 40 hours a week. I taught myself Html and CSS and thought I could easily add javascript to my resume. However, learning programming is completely different than mark up languages. After struggling for months, I decided to quit my job and go back to school and give myself time to learn to code. In my opinion, if you can do it while holding up a 40 hour week job, props to you!
Answer: Try it out before quitting your job. Don't let it get in the way. If becomes a problem, consider the costs and benefits of quitting your day job.
Should I have to pay to learn code?
I personally have only paid for books and did a lot of trial courses online. However, I feel this is not enough for me to learn efficiently and effectively. I strongly recommend buying a book and have a least one subscription to an online coding school. This saves you time and hassle from getting lost in the freebies. Instead, you'll spend more time on coding.
Answer: Pay for it, but pay as little as possible and don't take on all the freebies you can find.
What's better: paying for classroom coding school or online courses?
I couldn't learn online while holding up a day job.  I see the online courses as great ways to learn all the tricks of the trade, but I don't think it beats the classroom. The downside is coding schools cost loads of money. There are some social enterprises that teach code for free for particular groups. In London, CodeFirst Girls and Django Girls are free and provide excellent coding courses. Search your local coding schools online and see what your city has to offer. Plus, you can go to many free networking events to meet other programmers.
Answer: If you can do it online, you are a pro. If you have some time and cash, go to some classroom coding events (meetups) in your local area and figure out what works for you.
How long will it take to become a employable programmer?
Good programmers spend years perfecting their craft. I'd say you become an employable programmer after being employed for a couple of years. How's that possible?
I started learning a month or so ago. I'm still learning the bits and pieces and not yet employable. Some coding schools tout that it takes 6-12 weeks to learn code and get hired. However, just because you may get the job, it does not mean you are qualified.
Plenty of people stumble into jobs as junior programmers. They know some code and put an app or two together, but they show potential. After a couple of years, programmers become more comfortable with collaboration in git and slack. They know how to freelance and how much they are worth. Plus, they know how to code efficiently, saving themselves and their employers time.
Answer: You aren't employable until you've held a programming job or have worked in the industry - so learn, make something, get hired, and learn some more.
How should I learn to code?
Follow these rules:
I've only just started my coding journey, I've learned a lot from networking events and my peers. Look out for coding resources and guides in my future blog posts.
Time to play with some Ruby.


Executive Summary
This document serves as a basic architecture and design document for
mapping the GJTAPI Service Provider interface into available Asterisk
API calls and protocols. The intention is to provide full JTAPI support
for the Asterisk open-source VoIP PBX under the X11 open-source
licence. In addition JAIN JCC and JAIN Jcat support will also be
forthcoming.
In the spirit of releasing early and gathering developer interest and
support, the development of the Asterisk GJTAPI service provider will
proceed from basic capabilities to more advanced functions. For the
first major milestone, only basic JTAPI support will be provided.
Table of Contents
History
GJTAPI is an open-source Java Telephony framework that supports three
Java telephony standards:
- JTAPI. Currently JTAPI 1.3.1 is supported, although a branch to
support JTAPI 1.4 has had a significant amount of work done on it.
- JAIN JCC 2.1. This is a JCP JSR that supports basic call control
functionality targetted at the network telephony providers
- JAIN JCAT. This is a JCP JSR for providing coordination and
transaction control of telephony calls (such as applications invoked on
calls), targetted at the network telephony providers.
In order to support the three standards as well as the multiple
packages within JTAPI itself (GJTAPI supports base, callcontrol, media
(1.2 and 1.3) and privatedata), while simplifying the development of
the GJTAPI service providers, GJTAPI defines a hierarchy of interfaces
that a service provider may implement. So, for instance, implementing
the interface "BasicJtapiTpi" provides enough functionality to support
the core JTAPI package.
Introduction
The purpose of this document is to outline how GJTAPI service provider
methods and events will be mapped to Asterisk protocols such as IAX,
FastAGI and ManagerAPI. It is intended to be a living document and to
take input from developers as they develop certain components.
Please do not edit this in Word or
some other word processor that pollutes the HTML with a lot of style
cruft.
Asterisk Protocols
IAX
FastAGI
ManagerAPI
Implementation Plan
- Implement BasicJtapiTpi. This allows us to set up the provider,
register listeners, create calls, release calls, get Addresses and get
Terminals.
- Implement CCTpi. Provides support for Hold, Unhold and Join.
- Implement MediaTpi. Supports playing
sounds, recording sounds, generating signals, retrieving signals.
- JccTpi. Support JAIN JCC
- JcatTpi. Supports basic Jcc requirements of beeping, attaching media, setting load
control, getting address types and getting dialled digits.
- ThrottleTpi. Supports Jcat requirements of suspending and reconnecting calls,
registering and unregistering addresses, and managing terminal text.
Domain Models
What do an Address, Terminal and Call map to in Asterisk
Address
This is probably fairly trivial. It is
just a number that can be associated with an Asterisk end-point.
Terminal
Call
Service Provider Mappings
Step 1
To start, we need to support five things:
- Initialization. Do we use initialize(Map) entries to define which
Asterisk machine to connect to, with user name and password?
- getAddresses(). How do we find all the Addresses in the Asterisk
Domain?
- getTerminals().
- reserveCallId() and createCall(). How do we instantiate and place
a new call?
- answerCall(). How do we tell a call to be answered? What does
this mean?
- release(). Can we shut down the leg of a call? Using what API?
- Monitor events and event translation. How do we track a call's
state. It would be nice to get caller id information as well.
Future Work
© 2005, GJTAPI Project Team


TALES cancellation
Sometimes it is desirable within a TAL attribute to 'break out of' the current action and abort whatever
was happening. For example, if a tal:content
attribute
were filling in the current user's username but no user were logged in - the current user object might be null.
Cancellation would allow the TAL content operation to be aborted, leaving the hard-coded HTML content of the
element in place.
One way of handling this and avoiding an error would be to abort the content attribute altogether. This may be
performed in
a TALES path:
expression by providing multiple paths
within the expression.
Different TAL attributes react differently to action cancellation.
Any expression result may cancel the action. In order to do so, the expression result should be an object
which implements CSF.Zpt.Rendering.IActionCanceller
. If the result returns true
for
the method ShouldCancelAction()
(which is defined by that interface), then it will cancel the TAL
action. You may also use
the built-in root variable default
.
Example
Consider the following:
<p tal:define="currentUser Model/CurrentUser">
You are logged in as
<span tal:content="currentUser/Name | default">an unknown user</span>.
</p>
This is very similar to the example provided for
providing multiple paths to an expression, except
that the fall-back value is the built-in root variable
default
. This would cause the content attribute to be aborted, and for the existing content of
the span
element not to be replaced. In this case, that provides us with our fall-back content.


Longboarding is the act of riding on a longboard skateboard. A longboard is greater in size (both length and width) than its smaller counterpart, the skateboard, and has more stability, traction and durability due to lower wheel durometers. Many, but not all longboards, use trucks (axles) that contain different geometric parameters than a skateboard as well. These factors and their variation have given way to a variety of disciplines, functions and purposes for a longboard. The angles at which some longboards can turn, as well as their ability to coast long distances make them more suitable for cruising on streets than regular skateboards.


last updated: 2001-08-12
Contents
| Move Properties
| B,
KO, MN, W
|
| Setup Properties
| AB,
AE, AW, PL
|
| Node Annotation Properties
| C,
DM, GB,
GW, HO,
N, UC, V
|
| Move Annotation Properties
| BM,
DO, IT, TE
|
| Markup Properties
| AR,
CR, DD,
LB, LN,
MA, SL,
SQ, TR
|
| Root Properties
| AP,
CA, FF,
GM, ST, SZ
|
| Game Info Properties
| AN,
BR, BT, CP,
DT, EV, GN,
GC, ON, OT,
PB, PC, PW,
RE, RO, RU,
SO, TM, US,
WR, WT
|
| Timing Properties
| BL,
OB, OW, WL
|
| Miscellaneous Properties
| FG,
PM, VW
|
SGF Properties (FF[4])
Move properties
Property: B
Propvalue: move
Propertytype: move
Function: Execute a black move. This is one of the most used properties
in actual collections. As long as
the given move is syntactically correct it should be executed.
It doesn't matter if the move itself is illegal
(e.g. recapturing a ko in a Go game).
Have a look at how to execute a Go-move.
B and W properties must not be mixed within a node.
Related: W, KO
Property: KO
Propvalue: none
Propertytype: move
Function: Execute a given move (B or W) even it's illegal. This is
an optional property, SGF viewers themselves should execute
ALL moves. It's purpose is to make it easier for other
applications (e.g. computer-players) to deal with illegal
moves. A KO property without a black or white move within
the same node is illegal.
Related: W, B
Property: MN
Propvalue: number
Propertytype: move
Function: Sets the move number to the given value, i.e. a move
specified in this node has exactly this move-number. This
can be useful for variations or printing.
Related: B, W, FG, PM
Property: W
Propvalue: move
Propertytype: move
Function: Execute a white move. This is one of the most used properties
in actual collections. As long as
the given move is syntactically correct it should be executed.
It doesn't matter if the move itself is illegal
(e.g. recapturing a ko in a Go game).
Have a look at how to execute a Go-move.
B and W properties must not be mixed within a node.
Related: B, KO
Setup properties
Restrictions
AB, AW and AE must have unique points, i.e. it is illegal to place
different colors on the same point within one node.
AB, AW and AE values which don't change the board, e.g. placing a black
stone with AB[] over a black stone that's already there, is bad style.
Applications may want to delete these values and issue a warning.
Property: AB
Propvalue: list of stone
Propertytype: setup
Function: Add black stones to the board. This can be used to set up
positions or problems. Adding is done by 'overwriting' the
given point with black stones. It doesn't matter what
was there before. Adding a stone doesn't make any prisoners
nor any other captures (e.g. suicide). Thus it's possible
to create illegal board positions.
Points used in stone type must be unique.
Related: AW, AE, PL
Property: AE
Propvalue: list of point
Propertytype: setup
Function: Clear the given points on the board. This can be used
to set up positions or problems. Clearing is done by
'overwriting' the given points, so that they contain no
stones. It doesn't matter what was there before.
Clearing doesn't count as taking prisoners.
Points must be unique.
Related: AB, AW, PL
Property: AW
Propvalue: list of stone
Propertytype: setup
Function: Add white stones to the board. This can be used to set up
positions or problems. Adding is done by 'overwriting' the
given points with white stones. It doesn't matter what
was there before. Adding a stone doesn't make any prisoners
nor any other captures (e.g. suicide). Thus it's possible
to create illegal board positions.
Points used in stone type must be unique.
Related: AB, AE, PL
Property: PL
Propvalue: color
Propertytype: setup
Function: PL tells whose turn it is to play. This can be used when
setting up positions or problems.
Related: AE, AB, AW
Node annotation properties
Property: C
Propvalue: text
Propertytype: -
Function: Provides a comment text for the given node. The purpose of
providing both a node name and a comment is to have a short
identifier like "doesn't work" or "Dia. 15" that can be
displayed directly with the properties of the node, even if
the comment is turned off or shown in a separate window.
See text-type for more info.
Related: N, ST, V, UC, DM, HO
Property: DM
Propvalue: double
Propertytype: -
Function: The position is even. SGF viewers should display a
message. This property may indicate main variations in
opening libraries (joseki) too. Thus DM[2] indicates an
even result for both players and that this is a main
variation of this joseki/opening.
This property must not be mixed with UC, GB or GW
within a node.
Related: UC, GW, GB
Property: GB
Propvalue: double
Propertytype: -
Function: Something good for black. SGF viewers should display a
message. The property is not related to any specific place
on the board, but marks the whole node instead.
GB must not be mixed with GW, DM or UC within a node.
Related: GW, C, UC, DM
Property: GW
Propvalue: double
Propertytype: -
Function: Something good for white. SGF viewers should display a
message. The property is not related to any specific place
on the board, but marks the whole node instead.
GW must not be mixed with GB, DM or UC within a node.
Related: GB, C, UC, DM
Property: HO
Propvalue: double
Propertytype: -
Function: Node is a 'hotspot', i.e. something interesting (e.g.
node contains a game-deciding move).
SGF viewers should display a message.
The property is not related to any specific place
on the board, but marks the whole node instead.
Sophisticated applications could implement the navigation
command next/previous hotspot.
Related: GB, GW, C, UC, DM
Property: N
Propvalue: simpletext
Propertytype: -
Function: Provides a name for the node. For more info have a look at
the C-property.
Related: C, ST, V
Property: UC
Propvalue: double
Propertytype: -
Function: The position is unclear. SGF viewers should display a
message. This property must not be mixed with DM, GB or GW
within a node.
Related: DM, GW, GB
Property: V
Propvalue: real
Propertytype: -
Function: Define a value for the node. Positive values are good for
black, negative values are good for white.
The interpretation of particular values is game-specific.
In Go, this is the estimated score.
Related: C, N, RE
Move annotation properties
Restrictions
Move annotation properties without a move (B[] or W[]) within the same
node are senseless and therefore illegal.
Applications should delete such properties and issue a warning.
BM, TE, DO and IT are mutual exclusive, i.e. they must not be mixed
within a single node.
Property: BM
Propvalue: double
Propertytype: move
Function: The played move is bad.
Viewers should display a message.
Related: TE, DO, IT
Property: DO
Propvalue: none
Propertytype: move
Function: The played move is doubtful.
Viewers should display a message.
Related: BM, TE, IT
Property: IT
Propvalue: none
Propertytype: move
Function: The played move is interesting.
Viewers should display a message.
Related: BM, DO, TE
Property: TE
Propvalue: double
Propertytype: move
Function: The played move is a tesuji (good move).
Viewers should display a message.
Related: BM, DO, IT
Markup properties
Restrictions
CR, MA, SL, SQ and TR points must be unique, i.e. it's illegal to have
two or more of these markups on the same point within a node.
Property: AR
Propvalue: list of composed point ':' point
Propertytype: -
Function: Viewers should draw an arrow pointing FROM the first point
TO the second point.
It's illegal to specify the same arrow twice,
e.g. (Go) AR[aa:bb][aa:bb]. Different arrows may have the same
starting or ending point though.
It's illegal to specify a one point arrow, e.g. AR[cc:cc]
as it's impossible to tell into which direction the
arrow points.
Related: TR, CR, LB, SL, MA, SQ, LN
Property: CR
Propvalue: list of point
Propertytype: -
Function: Marks the given points with a circle.
Points must be unique.
Related: TR, MA, LB, SL, AR, SQ, LN
Property: DD
Propvalue: elist of point
Propertytype: inherit
Function: Dim (grey out) the given points.
Have a look at the picture to get an idea.
DD[] clears any setting, i.e. it undims everything.
Related: VW
Property: LB
Propvalue: list of composed point ':' simpletext
Propertytype: -
Function: Writes the given text on the board. The text should be
centered around the given point. Note: there's no longer
a restriction to the length of the text to be displayed.
Have a look at the FF4 example file on possibilities
to display long labels (pictures five and six).
Points must be unique.
Related: TR, CR, MA, SL, AR, SQ, LN
Property: LN
Propvalue: list of composed point ':' point
Propertytype: -
Function: Applications should draw a simple line form one point
to the other.
It's illegal to specify the same line twice,
e.g. (Go) LN[aa:bb][aa:bb]. Different lines may have the same
starting or ending point though.
It's illegal to specify a one point line, e.g. LN[cc:cc].
Related: TR, CR, MA, SL, AR, SQ, LB
Property: MA
Propvalue: list of point
Propertytype: -
Function: Marks the given points with an 'X'.
Points must be unique.
Related: TR, CR, LB, SL, AR, SQ, LN
Property: SL
Propvalue: list of point
Propertytype: -
Function: Selected points. Type of markup unknown
(though SGB inverts the colors of the given points).
Points must be unique.
Related: TR, CR, LB, MA, AR, LN
Property: SQ
Propvalue: list of point
Propertytype: -
Function: Marks the given points with a square.
Points must be unique.
Related: TR, CR, LB, SL, AR, MA, LN
Property: TR
Propvalue: list of point
Propertytype: -
Function: Marks the given points with a triangle.
Points must be unique.
Related: MA, CR, LB, SL, AR, LN
Root properties
Property: AP
Propvalue: composed simpletext ":" simpletext
Propertytype: root
Function: Provides the name and version number of the application used
to create this gametree.
The name should be unique and must not be changed for
different versions of the same program.
The version number itself may be of any kind, but the format
used must ensure that by using an ordinary string-compare,
one is able to tell if the version is lower or higher
than another version number.
 DOS/Unix MGT
[NNGS:?] Unix No Name Go Server
[Primiview:3.0] Amiga OS3.0 Primiview
[SGB:?] Macintosh Smart Game Board
[SmartGo:1.0] Windows SmartGo
Related: FF, GM, SZ, ST, CA
Property: CA
Propvalue: simpletext
Propertytype: root
Function: Provides the used charset for SimpleText and Text type.
Default value is 'ISO-8859-1' aka 'Latin1'.
Only charset names (or their aliases) as specified in RFC 1345
(or updates thereof) are allowed.
Basically this field uses the same names as MIME messages in
their 'charset=' field (in Content-Type).
RFC's can be obtained via FTP from DS.INTERNIC.NET,
NIS.NSF.NET, WUARCHIVE.WUSTL.EDU, SRC.DOC.IC.AC.UK
or FTP.IMAG.FR.
Related: FF, C, text type
Property: FF
Propvalue: number (range: 1-4)
Propertytype: root
Function: Defines the used file format. For difference between those
formats have a look at the history of SGF.
Default value: 1
Applications must be able to deal with different file formats
within a collection.
Related: GM, SZ, ST, AP, CA
Property: GM
Propvalue: number (range: 1-16)
Propertytype: root
Function: Defines the type of game, which is stored in the current
gametree. The property should help applications
to reject games, they cannot handle.
Valid numbers are: Go = 1, Othello = 2, chess = 3,
Gomoku+Renju = 4, Nine Men's Morris = 5, Backgammon = 6,
Chinese chess = 7, Shogi = 8, Lines of Action = 9,
Ataxx = 10, Hex = 11, Jungle = 12, Neutron = 13,
Philosopher's Football = 14, Quadrature = 15, Trax = 16,
Tantrix = 17, Amazons = 18, Octi = 19, Gess = 20.
Default value: 1
Different kind of games may appear within a collection.
Related: FF, SZ, ST, AP, CA
Property: ST
Propvalue: number (range: 0-3)
Propertytype: root
Function: Defines how variations should be shown (this is needed to
synchronize the comments with the variations). If ST is omitted
viewers should offer the possibility to change the mode online.
Basically most programs show variations in two ways:
as markup on the board (if the variation contains a move)
and/or as a list (in a separate window).
The style number consists two options.
1) show variations of successor node (children) (value: 0)
show variations of current node (siblings) (value: 1)
affects markup & list
2) do board markup (value: 0)
no (auto-) board markup (value: 2)
affects markup only.
Using no board markup could be used in problem collections
or if variations are marked by subsequent properties.
Viewers should take care, that the automatic variation
board markup DOESN'T overwrite any markup of other
properties.
The final number is calculated by adding the values of each
option. Example: 3 = no board markup/variations of current node
1 = board markup/variations of current node
Default value: 0
Related: C, FF, GM, SZ, AP, CA
Property: SZ
Propvalue: (number | composed number ':' number)
Propertytype: root
Function: Defines the size of the board. If only a single value
is given, the board is a square; with two numbers given,
rectangular boards are possible.
If a rectangular board is specified, the first number specifies
the number of columns, the second provides the number of rows.
Square boards must not be defined using the compose type
value: e.g. SZ[19:19] is illegal.
The valid range for SZ is any size greater or equal to 1x1.
For Go games the maximum size is limited to 52x52.
Default value: game specific
for Go: 19 (square board)
for Chess: 8 (square board)
Different board sizes may appear within a collection.
See move-/point-type for more info.
Related: FF, GM, ST, AP, CA
Game info properties
Property: AN
Propvalue: simpletext
Propertytype: game-info
Function: Provides the name of the person, who made the annotations
to the game.
Related: US, SO, CP
Property: BR
Propvalue: simpletext
Propertytype: game-info
Function: Provides the rank of the black player.
For Go (GM[1]) the following format is recommended:
"..k" or "..kyu" for kyu ranks and
"..d" or "..dan" for dan ranks.
Go servers may want to add '?' for an uncertain rating and
'*' for an established rating.
Related: PB, BT, WR
Property: BT
Propvalue: simpletext
Propertytype: game-info
Function: Provides the name of the black team, if game was part of a
team-match (e.g. China-Japan Supermatch).
Related: PB, PW, WT
Property: CP
Propvalue: simpletext
Propertytype: game-info
Function: Any copyright information (e.g. for the annotations) should
be included here.
Related: US, SO, AN
Property: DT
Propvalue: simpletext
Propertytype: game-info
Function: Provides the date when the game was played.
It is MANDATORY to use the ISO-standard format for DT.
Note: ISO format implies usage of the Gregorian calendar.
Syntax:
"YYYY-MM-DD" year (4 digits), month (2 digits), day (2 digits)
Do not use other separators such as "/", " ", "," or ".".
Partial dates are allowed:
"YYYY" - game was played in YYYY
"YYYY-MM" - game was played in YYYY, month MM
For games that last more than one day: separate other dates
by a comma (no spaces!); following shortcuts may be used:
"MM-DD" - if preceded by YYYY-MM-DD, YYYY-MM, MM-DD, MM or DD
"MM" - if preceded by YYYY-MM or MM
"DD" - if preceded by YYYY-MM-DD, MM-DD or DD
Shortcuts acquire the last preceding YYYY and MM (if
necessary).
Note: interpretation is done from left to right.
Examples:
1996-05,06 = played in May,June 1996
1996-05-06,07,08 = played on 6th,7th,8th May 1996
1996,1997 = played in 1996 and 1997
1996-12-27,28,1997-01-03,04 = played on 27th,28th
of December 1996 and on 3rd,4th January 1997
Note: it's recommended to use shortcuts whenever possible,
e.g. 1997-05-05,06 instead of 1997-05-05,1997-05-06
Related: EV, RO, PC, RU, RE, TM
Property: EV
Propvalue: simpletext
Propertytype: game-info
Function: Provides the name of the event (e.g. tournament).
Additional information (e.g. final, playoff, ..)
shouldn't be included (see RO).
Related: GC, RO, DT, PC, RU, RE, TM
Property: GN
Propvalue: simpletext
Propertytype: game-info
Function: Provides a name for the game. The name is used to
easily find games within a collection.
The name should therefore contain some helpful information
for identifying the game. 'GameName' could also be used
as the file-name, if a collection is split into
single files.
Related: GC, EV, DT, PC, RO, ID
Property: GC
Propvalue: text
Propertytype: game-info
Function: Provides some extra information about the following game.
The intend of GC is to provide some background information
and/or to summarize the game itself.
Related: GN, ON, AN, CP
Property: ON
Propvalue: simpletext
Propertytype: game-info
Function: Provides some information about the opening played
(e.g. san-ren-sei, Chinese fuseki, etc.).
Related: GN, GC
Property: OT
Propvalue: simpletext
Propertytype: game-info
Function: Describes the method used for overtime (byo-yomi).
Examples: "5 mins Japanese style, 1 move / min",
"25 moves / 10 min".
Related: TM, BL, WL, OB, OW
Property: PB
Propvalue: simpletext
Propertytype: game-info
Function: Provides the name of the black player.
Related: PW, BT, WT
Property: PC
Propvalue: simpletext
Propertytype: game-info
Function: Provides the place where the games was played.
Related: EV, DT, RO, RU, RE, TM
Property: PW
Propvalue: simpletext
Propertytype: game-info
Function: Provides the name of the white player.
Related: PB, BT, WT
Property: RE
Propvalue: simpletext
Propertytype: game-info
Function: Provides the result of the game. It is MANDATORY to use the
following format:
"0" (zero) or "Draw" for a draw (jigo),
"B+" ["score"] for a black win and
"W+" ["score"] for a white win
Score is optional (some games don't have a score e.g. chess).
If the score is given it has to be given as a real value,
e.g. "B+0.5", "W+64", "B+12.5"
Use "B+R" or "B+Resign" and "W+R" or "W+Resign" for a win by
resignation. Applications must not write "Black resigns".
Use "B+T" or "B+Time" and "W+T" or "W+Time" for a win on time,
"B+F" or "B+Forfeit" and "W+F" or "W+Forfeit" for a win by
forfeit,
"Void" for no result or suspended play and
"?" for an unknown result.
Related: EV, DT, PC, RO, RU, TM
Property: RO
Propvalue: simpletext
Propertytype: game-info
Function: Provides round-number and type of round. It should be
written in the following way: RO[xx (tt)], where xx is the
number of the round and (tt) the type:
final, playoff, league, ...
Related: EV, DT, PC, RU, RE, TM
Property: RU
Propvalue: simpletext
Propertytype: game-info
Function: Provides the used rules for this game.
Because there are many different rules, SGF requires
mandatory names only for a small set of well known rule sets.
Note: it's beyond the scope of this specification to give an
exact specification of these rule sets.
Mandatory names for Go (GM[1]):
"AGA" (rules of the American Go Association)
"GOE" (the Ing rules of Goe)
"Japanese" (the Nihon-Kiin rule set)
"NZ" (New Zealand rules)
Related: EV, DT, PC, RO, RE, TM
Property: SO
Propvalue: simpletext
Propertytype: game-info
Function: Provides the name of the source (e.g. book, journal, ...).
Related: US, AN, CP
Property: TM
Propvalue: real
Propertytype: game-info
Function: Provides the time limits of the game.
The time limit is given in seconds.
Related: EV, DT, PC, RO, RU, RE
Property: US
Propvalue: simpletext
Propertytype: game-info
Function: Provides the name of the user (or program), who entered
the game.
Related: SO, AN, CP
Property: WR
Propvalue: simpletext
Propertytype: game-info
Function: Provides the rank of the white player. For recommended
format see BR.
Related: PW, WT, BR
Property: WT
Propvalue: simpletext
Propertytype: game-info
Function: Provide the name of the white team, if game was part of a
team-match (e.g. China-Japan Supermatch).
Related: PB, PW, BT
Timing properties
Property: BL
Propvalue: real
Propertytype: move
Function: Time left for black, after the move was made.
Value is given in seconds.
Related: TM, OT, WL, OB, OW
Property: OB
Propvalue: number
Propertytype: move
Function: Number of black moves left (after the move of this node was
played) to play in this byo-yomi period.
Related: TM, OT, BL, WL, OW
Property: OW
Propvalue: number
Propertytype: move
Function: Number of white moves left (after the move of this node was
played) to play in this byo-yomi period.
Related: TM, OT, BL, WL, OB
Property: WL
Propvalue: real
Propertytype: move
Function: Time left for white after the move was made.
Value is given in seconds.
Related: TM, OT, BL, OB, OW
Miscellaneous properties
Property: FG
Propvalue: none | composition of number ":" SimpleText
Propertytype: -
Function: The figure property is used to divide a game into
different figures for printing: a new figure starts at the
node containing a figure property.
If the value is not empty then
- Simpletext provides a name for the diagram
- Number specifies some flags (for printing).
These flags are:
- coordinates on/off (value: 0/1)
- diagram name on/off (value: 0/2)
- list moves not shown in figure on/off (value: 0/4)
Some moves can't be shown in a diagram (e.g. ko
captures in Go) - these moves may be listed as text.
- remove captured stones on/off (value: 0/256)
'remove off' means: keep captured stones in the
diagram and don't overwrite stones played earlier -
this is the way diagrams are printed in books.
'remove on' means: capture and remove the stones from
the display - this is the usual viewer mode.
This flag is specific to Go (GM[1]).
- hoshi dots on/off (value: 0/512)
This flag is specific to Go (GM[1]).
- Ignore flags on/off (value: 32768)
If on, then all other flags should be ignored and
the application should use its own defaults.
The final number is calculated by summing up all flag values.

Related: MN, PM, VW
Property: PM
Propvalue: number
Propertytype: inherit
Function: This property is used for printing.
It specifies how move numbers should be printed.
0 ... don't print move numbers
1 ... print move numbers as they are
2 ... print 'modulo 100' move numbers
This mode is usually used in books or magazines.
Note: Only the first move number is calculated
'modulo 100' and the obtained number is increased
for each move in the diagram.
E.g. A figure containing moves
32-78 is printed as moves 32-78
102-177 is printed as moves 2-77
67-117 is printed as moves 67-117
154-213 is printed as moves 54-113
Default value: 1
Related: MN, FG
Property: VW
Propvalue: elist of point
Propertytype: inherit
Function: View only part of the board. The points listed are
visible, all other points are invisible.
Note: usually the point list is given in compressed
format (see 'point' type)!
Points have to be unique.
Have a look at the picture to get an idea.
VW[] clears any setting, i.e. the whole board is
visible again.
Related: DD, PM, FG


{% extends "eha/login.html" %} {% comment 'LICENSE' %} Copyright (C) 2023 by eHealth Africa : http://www.eHealthAfrica.org See the NOTICE file distributed with this work for additional information regarding copyright ownership. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. {% endcomment %} {% block extrafields %}
{{ form.realm.errors|striptags }}
{% endif %}


This page will highlight patients who have had a Shared Health Summary uploaded at the Broken Hill Medical Centre. The overall number will be the total number of Shared Health Summaries uploaded to date.
BHMC Shared Health Summary Uploads : July 2016 -> June 2017


Leave the egg whites out to reach room temperature before you start whisking. It helps make them fluffy and it stays that way for a while.
Fill a large bowl with hot water. Then place the bowl of your eggs white in there to warm up the eggs faster. It usually takes 2-3 minutes to reach room temperature, so you don't have to wait.
Why is whisking room temperature egg whites better? I have never heard of that before!
It has something to do with the molecules in the egg once it reaches room temperature. That's all I know!
Kylie K.
I make my eggs fluffy by using a large whisk. Whisk in a circular motion to bring air into the egg whites. It doesn't take that long and isn't as time consuming as you think.
Jenny R.
I use a whisk too! I usually start whisking slowly first. And then after a few minutes, I'll speed it up. Learned this technique from a friend and it works everytime!
Me