text:
This document (a work in progress) describes some of the design
choices of the Go implementation of Starlark.

  * [Scanner](#scanner)
  * [Parser](#parser)
  * [Resolver](#resolver)
  * [Evaluator](#evaluator)
    * [Data types](#data-types)
    * [Freezing](#freezing)
  * [Testing](#testing)

## Scanner

The scanner is derived from Russ Cox's
[buildifier](https://github.com/bazelbuild/buildtools/tree/master/buildifier)
tool, which pretty-prints Bazel BUILD files.

Most of the work happens in `(*scanner).nextToken`.

## Parser

The parser is hand-written recursive-descent parser. It uses the
technique of [precedence
climbing](http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm#climbing)
to reduce the number of productions.

In some places the parser accepts a larger set of programs than are
strictly valid, leaving the task of rejecting them to the subsequent
resolver pass. For example, in the function call `f(a, b=c)` the
parser accepts any expression for `a` and `b`, even though `b` may
legally be only an identifier. For the parser to distinguish these
cases would require additional lookahead.

## Resolver

The resolver reports structural errors in the program, such as the use
of `break` and `continue` outside of a loop.

Starlark has stricter syntactic limitations than Python. For example,
it does not permit `for` loops or `if` statements at top level, nor
does it permit global variables to be bound more than once.
These limitations come from the Bazel project's desire to make it easy
to identify the sole statement that defines each global, permitting
accurate cross-reference documentation.

In addition, the resolver validates all variable names, classifying
them as references to universal, global, local, or free variables.
Local and free variables are mapped to a small integer, allowing the
evaluator to use an efficient (flat) representation for the
environment.

Not all features of the Go implementation are "standard" (that is,
supported by Bazel's Java implementation), at least for now, so
non-standard features such as `set`
are flag-controlled.  The resolver reports
any uses of dialect features that have not been enabled.

## Evaluator

### Data types

Integers: Integers are representing using `big.Int`, an
arbitrary precision integer. This representation was chosen because,
for many applications, Starlark must be able to handle without loss
protocol buffer values containing signed and unsigned 64-bit integers,
which requires 65 bits of precision.

Small integers (<256) are preallocated, but all other values require
memory allocation. Integer performance is relatively poor, but it
matters little for Bazel-like workloads which depend much
more on lists of strings than on integers. (Recall that a typical loop
over a list in Starlark does not materialize the loop index as an `int`.)

An optimization worth trying would be to represent integers using
either an `int32` or `big.Int`, with the `big.Int` used only when
`int32` does not suffice. Using `int32`, not `int64`, for "small"
numbers would make it easier to detect overflow from operations like
`int32 * int32`, which would trigger the use of `big.Int`.

Floating point:
Floating point numbers are represented using Go's `float64`.
Again, `float` support is required to support protocol buffers. The
existence of floating-point NaN and its infamous comparison behavior
(`NaN != NaN`) had many ramifications for the API, since we cannot
assume the result of an ordered comparison is either less than,
greater than, or equal: it may also fail.

Strings:

TODO: discuss UTF-8 and string.bytes method.

Dictionaries and sets:
Starlark dictionaries have predictable iteration order.
Furthermore, many Starlark values are hashable in Starlark even though
the Go values that represent them are not hashable in Go: big
integers, for example.
Consequently, we cannot use Go maps to implement Starlark's dictionary.

We use a simple hash table whose buckets are linked lists, each
element of which holds up to 8 key/value pairs. In a well-distributed
table the list should rarely exceed length 1. In addition, each
key/value item is part of doubly-linked list that maintains the
insertion order of the elements for iteration.

Struct:
The `starlarkstruct` Go package provides a non-standard Starlark
extension data type, `struct`, that maps field identifiers to
arbitrary values. Fields are accessed using dot notation: `y = s.f`.
This data type is extensively used in Bazel, but its specification is
currently evolving.

Starlark has no `class` mechanism, nor equivalent of Python's
`namedtuple`, though it is likely that future versions will support
some way to define a record data type of several fields, with a
representation more efficient than a hash table.

### Freezing

All mutable values created during module initialization are _frozen_
upon its completion. It is this property that permits a Starlark module
to be referenced by two Starlark threads running concurrently (such as
the initialization threads of two other modules) without the
possibility of a data race.

The Go implementation supports freezing by storing an additional
"frozen" Boolean variable in each mutable object. Once this flag is set,
all subsequent attempts at mutation fail. Every value defines a
Freeze method that sets its own frozen flag if not already set, and
calls Freeze for each value that it contains.
For example, when a list is frozen, it freezes each of its elements;
when a dictionary is frozen, it freezes each of its keys and values;
and when a function value is frozen, it freezes each of the free
variables and parameter default values implicitly referenced by its closure.
Application-defined types must also follow this discipline.

The freeze mechanism in the Go implementation is finer grained than in
the Java implementation: in effect, the latter has one "frozen" flag
per module, and every value holds a reference to the frozen flag of
its module. This makes setting the frozen flag more efficient---a
simple bit flip, no need to traverse the object graph---but coarser
grained. Also, it complicates the API slightly because to construct a
list, say, requires a reference to the frozen flag it should use.

The Go implementation would also permit the freeze operation to be
exposed to the program, for example as a built-in function.
This has proven valuable in writing tests of the freeze mechanism
itself, but is otherwise mostly a curiosity.

### Fail-fast iterators

In some languages (such as Go), a program may mutate a data structure
while iterating over it; for example, a range loop over a map may
delete map elements. In other languages (such as Java), iterators do
extra bookkeeping so that modification of the underlying collection
invalidates the iterator, and the next attempt to use it fails.
This often helps to detect subtle mistakes.

Starlark takes this a step further. Instead of mutation of the
collection invalidating the iterator, the act of iterating makes the
collection temporarily immutable, so that an attempt to, say, delete a
dict element while looping over the dict, will fail. The error is
reported against the delete operation, not the iteration.

This is implemented by having each mutable iterable value record a
counter of active iterators. Starting a loop increments this counter,
and completing a loop decrements it. A collection with a nonzero
counter behaves as if frozen. If the collection is actually frozen,
the counter bookkeeping is unnecessary. (Consequently, iterator
bookkeeping is needed only while objects are still mutable, before
they can have been published to another thread, and thus no
synchronization is necessary.)

A consequence of this design is that in the Go API, it is imperative
to call `Done` on each iterator once it is no longer needed.

```
TODO
starlark.Value interface and subinterfaces
argument passing to builtins: UnpackArgs, UnpackPositionalArgs.
```

Evaluation strategy:
The evaluator uses a simple recursive tree walk, returning a value or
an error for each expression. We have experimented with just-in-time
compilation of syntax trees to bytecode, but two limitations in the
current Go compiler prevent this strategy from outperforming the
tree-walking evaluator.

First, the Go compiler does not generate a "computed goto" for a
switch statement ([Go issue
5496](https://github.com/golang/go/issues/5496)). A bytecode
interpreter's main loop is a for-loop around a switch statement with
dozens or hundreds of cases, and the speed with which each case can be
dispatched strongly affects overall performance.
Currently, a switch statement generates a binary tree of ordered
comparisons, requiring several branches instead of one.

Second, the Go compiler's escape analysis assumes that the underlying
array from a `make([]Value, n)` allocation always escapes
([Go issue 20533](https://github.com/golang/go/issues/20533)).
Because the bytecode interpreter's operand stack has a non-constant
length, it must be allocated with `make`. The resulting allocation
adds to the cost of each Starlark function call; this can be tolerated
by amortizing one very large stack allocation across many calls.
More problematic appears to be the cost of the additional GC write
barriers incurred by every VM operation: every intermediate result is
saved to the VM's operand stack, which is on the heap.
By contrast, intermediate results in the tree-walking evaluator are
never stored to the heap.

```
TODO
frames, backtraces, errors.
threads
Print
Load
```

## Testing

```
TODO
starlarktest package
`assert` module
starlarkstruct
integration with Go testing.T
```

## TODO

```
Discuss practical separation of code and data.
```

redpajama_set_name: RedPajamaGithub


text:
Read | Watch | Listen
Our picks of the best on the internet, for every week we're in lockdown.
Possibly the most soothing content on the internet right now is the rural lifestyle video series produced by Chinese vlogger Lizi Qi. In-between dreamy, focus-pulling shots of the rural Sichuan landscape, Qi plants seasonally, harvests and cooks delicious meals for her elderly grandmother, collects cotton to make cloth, builds bamboo furniture and weaves cloaks. It's an idyllic escape in 10-minute snippets.
https://www.youtube.com/channel/UCoC47do520os_4DBMEFGg4A
If Qi's cooking has you feeling inspired to hit the kitchen, this guide from the very recently late, great Metro magazine (we're pouring out a 40 as we type) tells you all the places in Auckland you can pick up meal ingredients that aren't the supermarket. Although the magazine sadly shuttered with the closure of Bauer Media, they say they'll continue posting already-commissioned content for the rest of the month.
https://www.metromag.co.nz/city-life/city-life-whats-on/where-to-shop-in-auckland-during-the-lockdown-thats-not-the-supermarket
The team at New Zealand Geographic (another fine New Zealand magazine) are adding content daily to their Together At Home series. There's fantastic reading that gives you a deeper insight into New Zealand's wildlife, landscapes and people along with activity suggestions for the whole family.
https://www.nzgeo.com/together-at-home/
Now that you've got all this time to catch up on the pop culture back catalogue that you never had time for before, do you find yourself sort of feeling like… not catching up on that back catalogue? You're not alone. Staying culturally current in an age of entertainment saturation can feel more like an obligation than a chore, says Soraya Roberts for Longreads.
https://longreads.com/2019/04/26/when-did-pop-culture-become-homework/
Freed from the obligation to spend the next week catching up on Parks & Recreation and The Wire, now you can devote yourself entirely to posting TikTok dance videos again. Need inspiration to add authenticity to your game? It's here in this compilation of 20 great modern dance music videos. We feel a little Thom Yorke-esque freneticism coming on.
https://www.pastemagazine.com/music/20-of-the-best-modern-dance-music-videos/
A Whale of a Tale at Britomart
To Grow Roots Where They Land
Britomart stores are back!

redpajama_set_name: RedPajamaCommonCrawl


Preseason poll season is in full swing, and there is some semblance of order to where most people expect programs to end up by the end of the 2016 college football campaign.
But as happens every year, the favorites get knocked off at one point or another and throw everything into chaos. As much as one expects the chalk to hold, it will happen again this fall. Where and when and to which teams these upsets happen is the tough part to predict, but in the ACC, here's a list of 10 of the craziest possibilities.
Of course, knowing the nature of college football, the big shocker could likely come from something off this list, but at this point, here are the ones that make the most sense.
A few things to keep in mind here. For one, the Cougars are a dark horse College Football Playoff candidate and may end up starting the season ranked ahead of Louisville, so this may not qualify as that much of an upset at all. Also, this game is in Houston and, of all things, on a Thursday night. Every avid college football follower knows Thursday night home games are breeding grounds for upsets.
Early in the season, the Seminoles, unless they slip up the first weekend against Ole Miss, are a sure bet to be sitting somewhere in the top 10 or five. But a huge test comes along in the form of the Cardinals, who return plenty of NFL-caliber talent on defense and a quarterback in Lamar Jackson who should be a household name by the end of the year. The fact that this will be in Papa John's Stadium only heightens the possibilities for a Cards win.
Over the last decade or so, this rivalry has lost a good deal of punch on the national scale. This is still a major event in Florida simply due to the amount of crossover in recruiting between the two programs, but Miami's impact in the ACC has been underwhelming. However, the Hurricanes come into this season with renewed hope due to new head coach Mark Richt, and last year's game wasn't exactly a blowout. A Miami win in Coral Gables would send its fans into hysteria.
The Wolfpack figure to be in the lead group behind Clemson, Florida State and Louisville in the Atlantic Division, but have to replace current Patriots backup quarterback Jacoby Brissett. The running game should be on solid footing early on, but if the passing game is still a work in progress, the Pirates could catch them on the second weekend of the season. Although East Carolina did not have a great 2015, it is a perennial tough mid-major program that has beaten ACC teams in the past.
The Tar Heels return almost everyone from last season's Coastal Division champion squad, but quarterback Mitch Trubisky will be a first-year starter. By the time this game rolls around, he should be comfortable running the offense, but the Cavaliers won't be a pushover. Although Virginia did not have much on-field success under Mike London, he did recruit well, so new head coach Bronco Mendenhall may have enough talent on hand to pull off a signature win.
Typically, Auburn can be a difficult team to gauge preseason. Last year the Tigers were a dark horse Playoff contender before falling to a mediocre 7-6 record. Not many people are expecting much out of Auburn this season, but perhaps that's what makes these Tigers dangerous. Jordan-Hare Stadium is always a tough place to come away with a victory, and while Clemson will be heavily favored, Auburn has talent on the roster and Gus Malzahn may be coaching for his job. A desperate Auburn team should not be overlooked.
A classic trap game, this comes right after the Florida State showdown and immediately ahead of a trip to Clemson. In between those major tilts is a trip to this dangerous mid-major program, which went 10-3 with a win over UConn in bowl season last year. The Thundering Herd return starting quarterback Chase Litton and all-purpose threat Deon-Tay McManus. Throw in the fact that this is scheduled to be a night game and there are a lot of reasons to like the upset here.
Georgia Southern is just one of those programs that will always be in the conversation when it comes to knocking off a more talented team. Two years ago, it beat Florida, and last year it took Georgia to overtime before losing. Part of what makes the Eagles such a giant killer is their ability to execute the option so well, but going up against option guru, Georgia Tech head coach Paul Johnson, who led the Eagles from 1997-2001, does not make this an ideal matchup for the team from the Sun Belt. Still, the Yellow Jackets are coming off a poor season and the Eagles have beaten better teams in the past.
Speaking of teams that recently made the jump to FBS that have a history of knocking off big-time programs, is there anyone with a better resume in that department than Appalachian State, which stunned Michigan in 2007? The Mountaineers went 11-2 last season and this game will be at Kidd Brewer Stadium, a rare road game for a Power Five conference school like Miami against a Sun Belt opponent. The Hurricanes don't face a very challenging slate in the first two weeks, but the Mountaineers will have already traveled to Tennessee the first week and may be more battle tested.
It would be foolish for anyone to forget that for all of Georgia Tech's struggles last year, the Yellow Jackets did beat Florida State in stunning, last-second fashion on a blocked field goal returned for a touchdown. That game was in Atlanta, as will this game with the Tigers, who should be unbeaten and somewhere in the top five or higher coming in. But this is a Thursday night game and Tech coach Paul Johnson is a proven giant killer. Clemson will have a short week to prepare for Tech's option, which is never easy to defend, even with the wealth of talent in the front seven Clemson promises to have again this season.
— Written by Adam Kurkjian, who is part of the Athlon Contributor Network and is a reporter for the Boston Herald. He has covered the World Series, Super Bowl, Stanley Cup playoffs, Boston Marathon and Little League World Series, among other events from the high school, college and pro ranks. Follow him on Twitter @AdamKurkjian.


The mission of the 36th Maintenance Group is to integrate and employ maintenance professionals to generate and sustain quality aircraft, munitions, and equipment for the 36th Wing in support of Pacific Command and Pacific Air Force taskings, while also enabling the Air Mobility Command mission.
The 36th MXG vision is to strive to become a world-class maintenance organization serving as PACAF's most ready combat capability from U.S. soil.
An Airman from the 36th Maintenance Squadron recently made the All-Air Force Men's Slow Pitch Softball Team.
The B-1B Lancer officially replaced the B-52 Stratofortress in support of U.S. Pacific Command's Continuous Bomber Presence mission Aug. 15, during a Transfer of Authority ceremony.
History was made Aug. 17, 2016 when all three of Air Force Global Strike Command's strategic power projection bombers, the B-52 Stratofortress, B-1B Lancer and B-2 Spirit, simultaneously took to the sky during their first integrated bomber operation in the Indo-Asia-Pacific region.


Heavy duty, multi purpose tape for use on all floor coverings except vinyl.
Double Sided Carpet Tape 50mm x 25m is rated 4.4 out of 5 by 7.
Rated 5 out of 5 by KEITH 44 from It works It works very well, only needed to use a little on each corner.
Rated 5 out of 5 by connieboy from Very pleased Just used on a carpet repair to cut out old square damaged by cat and stick down new square of carpet. Sticks fantastic. Tip: Use the sharp carpet knife to separate the tape from backing strip.
Rated 1 out of 5 by dmx1 from Does not stick to synthentic rubber Sticks strongly to everything except synthetic rubber. Tried to use on a rubber backed floor mat and had absolutely no stick.
Rated 5 out of 5 by Peter666 from Walking Rugs I have put down rugs in my living room to protect the new carpet from sparks, logs and dust from Stove. They started to march out of the room. Tape at both ends to hold it in place. Works a treat. Just down, so not sure how long it will last before replaceing. Big roll, so have plentry spare.


text:
Football news - Mancini says Euro 2020 delay could work in Italy's favour
Italy coach Roberto Mancini believes that the postponement of Euro 2020 could work in his team's favour although a gap of 10 months between working with his players will create difficulties.
Published 06/04/2020 at 20:15 | Updated 06/04/2020 at 20:23
Mancini has revived Italy's fortunes since taking over in 2018 after they had failed to qualify for the World Cup.
Under his leadership, they finished their Euro 2020 qualifying group with a 100% record and are on a run of 11 successive wins.
Former Atletico coach Antic dies aged 71
"If we had played the European Championship in June, we would have had a good chance but maybe we would have faced national teams who are better prepared because they started to rejuvenate the squad before us, or have an long-established team like France," he told Sky Sport Italia.
"But with another year, the lads will have the opportunity to improve in every respect, they will gain experience."
He added: "Our national side can compete among the best. I hope to be coach of the (Italy) team that will win the European Championship for the first time since 1968."
Pogba edges closer to Madrid - Euro Papers
Italy's last match was a 9-1 win over Armenia in November. Their two friendlies scheduled for March were postponed because of the coronavirus outbreak and all matches due to be played in June and July have also been called off with Euro 2020 moved back by one year.
Italy's next scheduled matches will be in September.
"We haven't seen each other for months, we'll see each other in September and it will have been almost a year," said Mancini.
"It will be difficult. Then we'll have a congested calendar with the Nations League, European championship and World Cup qualifiers. There will be very few opportunities to train."
Italy has registered 132,547 cases of coronavirus, with 16,523 deaths.
"There is great bitterness," said Mancini. "Unfortunately many people are no longer with us and that is the most difficult thing to accept."
"None of us would have wanted the postponement of the Euros. Many people have died and football takes second place."
Allardyce not worried by possible probe into Snodgrass omission
Solskjaer reluctant to upset Man Utd balance with transfer exits


text:
Fastpacking the Tour du Mont Blanc in 4 Nights
The Tour de Mont Blanc is one of the most popular and scenic long-distance hiking routes in Europe. It passes through France Italy and Switzerland while circumnavigating the Mont Blanc Massif, a distance of more than 170 km with 10,000 meters of elevation gain plus descent. The route is typically hiked in 10 or 11 days but we'd be spending just four nights on the trail while traveling fast and light. This would be a training run for us in preparation for UTMB, a race that follows roughly the same route that we'd be competing in less than 3 weeks later. But during that race we'd miss some of the best views while running at night.
So this was our chance to really enjoy all that this incredible trail has to offer. The Mont Blanc Massif is located right on the border between France, Italy and Switzerland. We'd start the route in Chamonix, France heading counterclockwise and staying in refuges along the way in France, Italy, and Switzerland before returning to Chamonix where we started. Okay, so it's 8am and we just arrived here in the center of Chamonix. We're actually right at the start finish area for UTMB.
This is where we're going to start our fastpack of the Tour du Mont Blanc. Technically the route actually starts way over in Les Houches down the valley but part of our goal is to get a feel for the course so we're gonna start and finish right here at the start / finish line for the race. So we've got the root loaded on our watch. It starts by running through town and I think we're all set.
We're set. Okay, here we go. We're in les Houches and this is the official start and finish of the TMB. We are here. This is the TMB course but we're going to take this little deviation here because that's going to be more fun. After leaving Chamonix, we had run to Les Houches which is the usual starting point for the route.
From there we'd now climb to Col de Tricot, getting incredible views of just a few of the 4,000 glaciers on the Massif before dropping to Les Contamines in the valley below. We'd continue up the valley, climbing slowly to the refuge where we'd spend our first night on the trail. All right, here we go. Feels like we're starting again. I remember coming down this when I did TDS in 2019. It's kind of the last big descent to Les Houches.
See how steep this is? Yeah, it's pretty steep. Not bad. So this is where we're going to diverge from the UTMB course.
It looks like UTMB goes that way down to St. Gervais les Bains. But we are going to stay high. We're going to climb up that way. As much as we do want to scout out the course, we also want to have a nice experience here and to avoid some towns where we can. So this is one of those cases. Should we just take the train? Wow.
So we're gonna climb all the way up there to Col de Tricot which I remember vaguely from the TDS course again a few years ago. Except I came up from the other side and then came down this way. Okay, now we climb. Now we climb. Wow, this trail is busy! This is what UTMB is gonna be like.
So we're up here at Col de Tricot having our lunch, some cake that we bought back in Chamonix which is delicious. The best lunch. And we're gonna drop down into this valley here and then climb up to that little hill there, Le Truc and drop dow to the other side, to the bigger valley which should be les Contamines and then we have just one more big climb.
So we're sort of at the high point for the day. But we have to do another climb, almost this high, pretty close to this high up to our refuge before we're done today. Okay, down we go. We're going to climb up to that little viewpoint there. A little extra elevation gain never hurt anybody.
We were there earlier, that's Col du Tricot. So we're dropping down into the valley here, down to Les Contamines which we could see from up top there and then we've got one more big climb left up to our refuge. So we just left Les Contamines and we're back on the UTMB course and it looks like it kind of ducks in and out on a bit of pavement, then on to some gravel and we're basically just kind of following this up the valley and then we'll start climbing. They even have local craft beer.
It's too bad we still have a big time ahead of us! So we're about to start the climb, which looks to be about 800 meters, maybe 780 meters to our refuge for the night which is called le Refuge des Pres and it sits at 2,200 meters so it's pretty high up there. Okay, so this is where we diverge from the TMB and from the UTMB course. Bonjour. That guy was rad! Okay, less than 200 meters of climbing to go.
Nice eh? Stunning. We have arrived. We think so anyways. We think. That must be it.
Nice. Refuge Des Pres. I see beer on tap.
I'm happy to be done for today. Nine hours. Yeah. 37.5 km.
Well, all the hiking boots and shoes have to be put downstairs here in the basement and then they have Crocs for everyone to wear around the hut, which is great. We got done just in time, eh? It looks like just a short shower. Speaking of which, we had showers which felt really good and I think we're gonna have a beer now. Looks pretty good! Leaving our refuge on day two, we'd now climb up to Col du Bonhomme for our first views of the day. After dropping into the valley on the other side, we'd then climb back up to Col de La Seigne on the Italian border.
We'd then drop back down and would continue through the valley on the other side before our last climb of the day to our Refugio which sits above the town of Courmayeur just before the halfway point of the route. Day two, here we go. Okay, so it's day two and we're about to join back up with the route here with the Tour de Mont Blanc.
You can see it down in the valley there, that's where we would have continued on and we would have climbed up here by this waterfall coming up had we not climbed up early to our refuge. He just wants to run with us! Hah, no. No? I think that's the Col du Bonhomme just up there. Col du Bonhomme. Beautiful! So it looks like now we traverse up there kind of along the edge of this valley. This is a nice refuge up at 2,443 meters.
Look at this view. Okay, now we drop down to Les Chapieux which should be a little town where we can buy some lunch for the road. Big descent! That was over a thousand meter descent. 1034. And look at this! So we just got to the bottom of this long descent and I noticed that I am missing one of the straps from my poles which is going to make the next - what do we have like, 8000 meters of climbing left over the next few day? It's gonna make that a little bit tougher.
Maybe I can figure something out, maybe MacGyver something here. First we'll get some lunch. Oh yea, that's what I want, thanks. It looks like during UTMB there's an aid station kind of just back there maybe.
I managed to MacGyver a strap. I just had to sacrifice my waistband here. Bonjour. Lots of trail runners out today.
Look at the goats! They're so cute. Bonjour. So I've been testing out a powdered drink mix here from Naak. It's an energy drink but it has protein and BCAAs (amino acids) which makes it unique and makes it suitable for longer distance efforts. So I'm planning on using it for UTMB, not as my primary fuel source, but more as a supplement. The one I have is watermelon flavored, but it comes in lime as well.
I just want to test it out in advance of the race here to see how it sits and how it tastes after a few hours of continual use. So I just have it pre-portioned in little baggies which is probably what I'll do for UTMB as well. I'll have some with me and then some in my drop bag for the halfway point.
Almost there. The col is right up there, our high point for the day. Isn't this just incredible? This has to be one of the most beautiful places in the world. I'm here doing the thing I love absolutely the most, with my partner, the person most important to me. Just an incredible feeling.
So I've just made it to the top of Col de la Seigne which I think is our high point for the day at just over 2,500 meters. It is stunning up here, lots of glaciers. It's very windy which is nice because it was a hot climb. Jeff's just a couple minutes behind me.
He stopped to fly his drone down below and I just kept going for a bit. He's catching up now. Look at that! A new perspective on Mont Blanc. And this is Italy.
Bonjour. C'est la Refuge Elisabetta. Wow, just surrounded by glaciers.
Incredible. Finishing your sandwich? Well we've got about 7 km left with 400 meters of climbing as we make our way up and then down to our Refugio. I think that's our high point up there.
Look at that view. Okay, pretty much all downhill from here. Made it. We made it. There's that Italian architecture.
Love it. Bonjour. Look at this, eh? Pretty nice! Yesterday we were sharing a dorm with another couple, we had bunk beds and two bathrooms for the whole floor, for everybody.
So this is nice! It's like a hotel. We have our own bathroom, a big queen size bed. Just one night in Italy, gotta have some wine. And pasta as an appetizer. And pasta as an appetizer.
Okay, here we go day three and this is our biggest day of the week. Oh, he wants some belly rubs. Okay, as I was saying, day 3. This will be our biggest day so far in terms of both distance and elevation gain and I'm starting to feel the descents mostly in my quads. I don't know about you.
But overall, I feel pretty good. Not bad. My legs feel good. It's my back, my left shoulder has been causing me some problems. We'd start day 3 by passing through Courmayeur, the start and finishing point of Tor Des Geants, a race I did in 2018.
After a steep climb, we'd spend most of the day traversing the valley with Incredible views of the Mont Blanc Massif before climbing to Grand Col Ferre where we'd cross into Switzerland. From there, we'd slowly descend the valley to our third refuge in the town of La Fouly. Look at that view though. So we just arrived in Courmayeur.
This is the Sports Center were we did check-in for To Des Geants where we waited for 3.5 hours for for check-in and gear inspection. We're just gonna pass through here but Courmayeur would be an excellent place to spend the night. We could have pressed on last night to here pretty easily.
It only took us about a half hour to get down here from the refuge we did stay at. But we have been here a few times before so we felt like we had kind of done it. Yeah, we felt like we'd kind of seen it and we wanted to spend an extra night up in the mountains. The architecture here is just really cool.
Tunnel Pizza, best pizza in Courmayeur right there. This here is the start line for Tor Des Geants. The big arch goes up right over here and we run up this road. Busy section of trail here. Lots of people getting a late start from Courmayeur I think. It's time for some decisive passing here.
Ciao. So we stayed it's just on the other side of that little hill there last night. So that climb took us about an hour. It said it would take just over two on the sign post. So we've pretty consistently been cutting everything in half, all the estimated times which tracks well, people usually take 7 to 10 days to do this route and we're doing it in just over four, four and a half. So that makes sense.
Technical, this trail. You want a cappuccino? Yea, I'll have a cappuccino. So it hadn't even occurred to me until just now that we actually came through here during Tor Des Geants, we're on the TDG route.
We went the opposite direction, we went down the way we just climbed up here. It would have been at night, probably around 10 or 11 p.m I think, maybe 10 o'clock. Yeah, we must have come through this Refuge. I don't remember the Refuge itself, but I think there would have been an aid station right around here and we would have dropped down into the valley back to Courmayeur.
I've of course got a film on my channel about Tor Des Geants. If you haven't seen it go check that out. We're about to traverse here along the Tor Des Geants route, for a little bit anyway for the next few kilometers. What was that? I just met Hillary Allen! So exciting. She's an American runner.
She's for sure a podium contender this year at UTMB. She ran TDS the year I did it. I think she was third or fourth, like a really solid performance. She is a really strong runner and she's running the full lap this year. So I recognized her and I said hi and I introduced myself and she was super nice.
They're also fastpacking it but they're going all the way to Champex tonight. Anyways, that was cool. Girl crush moment. You guys have cows in England? Now with horns! Cows in England don't have horns this big! These may look like bulls but they're not, they're females. You can see the udders here.
I learned that during Swiss Peaks, and they're usually quite friendly. Give him a little pet! I gotta remember to wash that hand. So these filters get clogged sometimes and mine seems to be pretty clogged from I think all the glacial till that I've been filtering from the glacier water. Giving it a quick rinse like that in not running water but in still water almost always does the trick.
Yeah, that did the trick. I think this is where those cows came from that we just saw, that little stable here. It's funny how they they kind of seem to know where to go and obviously they know where to come back and how to get back home at night. So this is where the TMB diverges again from the Tor Des Geants route.
We would have come from down that valley. We climbed up and over Col Malatra. We had a beautiful view, an incredible reveal of the Mont belong Massif. I was there right at sunset. It was absolutely beautiful.
And then ran down the valley to this point and then back the way we just came. But for now we're gonna say goodbye to the Tor Des Geants course and continue on our way on the TMB. Bonjour! Wow, look at these beautiful horses! Wow. That was such a beautiful Refugio. Next time we do this we should definitely try and book in advance and stay here.
Yeah, it's like a hotel! Yea, stunning, beautiful setting. And the food looked amazing too. The food looked nice. We're about halfway through our distance for the day and it looks like a little over halfway through the climbing.
We are almost done this long traverse here. We're about to drop down a couple hundred meters and then do one more big climb and after that it's all downhill to La Fouly. All right, down we go. Now we climb. I think what I love most about this place is just how it's how obvious it is that everything was shaped by water and ice and continues to be. All around us the rivers and the valleys and the glaciers up above.
The mountains are alive, and they're being reshaped right before our eyes. You can keep up Audrée! I think this is the toughest climb so far in terms of grade and altitude and in terms of what we already have in our legs today. Yeah this climb is no joke.
We'll be well past the halfway point during UTMB here too. So it's gonna be a tough climb! There it is. So now we've just got a massive descent over the next 11 km down to our Refugio and we're done for the day. Of course, seemingly out of nowhere a refuge appears. No, we've gotta keep going. I could use water.
So we are officially in Switzerland. We didn't realize it at the time but I think the Col up there was the Border. So we've been in Switzerland for the last half hour or so.
So welcome to the Swiss Alps! All right, we just got some water and used the washroom. We're back on the road, probably a half an hour from our refuge. It looks like we just follow the river down the rest of the way This place is quite expensive because it's super swanky. So we opted for the dorm tonight which should be fine.
But check out these showers... these rooms... and of course once again, making use of our complimentary sandals. So we were able to do a little laundry last night which felt very luxurious after three days of running in the same dirty clothes.
Unfortunately, they're a little damp still. So I'll give it a few more minutes before we put that back on. Good power hike. He's saying, "thank God we're going up!" "This descent nearly destroyed my quads!" Sounds about right. So day three was another beautiful day. Day one was a lot of peekaboo views where we were sort of in the trees quite a bit and then day two just kept getting better and better and I really didn't think that day three could top that but I was wrong, it did.
La Fouly looks to be a beautiful town, I wish we had more time to spend here. In fact, we'd love to come back and do some skiing. The ski touring here is supposed to be excellent. But it's almost eight o'clock which means it's time to hit the trails again and to say goodbye for now.
Leaving La Fouly on day four, we'd continue the rest of the way down the valley on our way to Champex where we'd now join up with part of the route that I'd run during the Swiss Peaks 360k back in 2019. After a long traverse, we'd drop down to Trient and on to Vallorcine back in France where we'd spend our final night on the trail. This reminds me of all the little villages that we ran through during Swiss Peaks 360. It was one of my favorite parts, aside from the mountains of course. It looks like that's the end of our descent here this morning. Now we're going to begin the first of a couple of climbs, starting with a small one followed by two bigger ones.
We're arriving in Champex Lac which means we're about to intersect with the course that I ran back in 2019 during the Swiss Peaks 360k. We're probably going to stop for an espresso at the lake here because I remember it being just beautiful and of course during the race I had to kind of rush through it. This here was where the tents were. This is actually the UTMB aid station at Champex. We got to use it, it was a week after UTMB.
I remember driving here and driving around forever looking for the aid station. It really wasn't obvious during Swiss Peaks. And so I guess we'll be back here at this aid station during UTMB. Now it's time for an espresso and maybe a little snack, maybe some pie or something. There are crosses like that everywhere in the mountains in Switzerland. Bienvenue en Suisse! I had blocked out that whole last section from Champex Lac pretty much just to here.
But I remember this! It's quite humid today, I've been sweating buckets. So I've been drinking a lot of water and I'm supplementing that with salt pills, just make sure my electrolytes stay in balance. You can see Audrée has been reduced to using one pole because she has a really bad knot in her one shoulder just from the action of using poles. It only seems to bother her on the climbs, not while she's running. So she's giving her left arm a bit of a break.
It started late on day one but I didn't think too much of it. But then on day two got much worse. Yesterday, on day three it was excruciating. It's like this knot and it just pulls up on my neck and down to my elbow. So it's really painful and that's all I can think about.
I've been training with poles all summer, so this is not new, and I've done races with poles and a pack before. So I'm not sure. Maybe from traveling, hey? Sitting on the plane? Yeah, maybe from trying to sleep on the plane in a funky position.
I think it could be a mix of a lot of things. Maybe when we're in Annecy in a couple of days I'll try and find a massage therapist or something. Yea, definitely find you an RMT. Fix me up. During SwissPeaks, there was a little aid station here.
I'm pretty sure I sat and had pasta, spaghetti with tomato sauce if I remember correctly. So I think we might stop here again for a Coke or something. Bonjour. We stopped for a quick little snack at that last refuge there. So now we're dropping all the way down to a town called Trient which is where the TMB diverges again from the Swiss Peaks 360 course. But this ridge here, I ran along it.
It would have been probably three days into the race on just a few hours sleep at this point. It's as beautiful as ever. Big cowbells! We drove through here on our way from Chamonix to Switzerland for the race (Swiss Peaks). I remember driving around here again, looking for the aid station and I remember the cemetery. I'm thinking these tents are going to be the aid station for UTMB. This Naak drink mix has been working out really well.
What do you think? I do like that the taste is quite subtle as well. It's like you have a little flavor but it's not overpowering. There's not much in this town in terms of restaurants or stores even. So I think we'll just press on and eat what we have. Vallorcine. Four hours, so hopefully two-ish for us, two and a half. And then we're done? And then we're done.
That's where we stop for the night. So what about lunch? We miss lunch. There's no lunch. Oh, okay. I guess lunch was that cake. So we just left Trient and we're about to start our last big climb followed by a big descent down to Vallorcine where we're spending the night.
This is one of two possible routes on this section of the TMB. We're following the UTMB course, but we could have taken a higher and likely more scenic route. But unfortunately, there weren't any refuges available on that section by the time we booked in mid-spring. You really want to book this almost a year in advance to make sure you have lots of options with the refuges.
But we did want to kind of stick to the UTMB course as much as possible. So it sort of worked out in the end. That's that pass that we just came through over there. You can see the bridge too. We're about three quarters of the way up this climb and I think this is gonna be a tough one during the race. It comes quite late in the race. And Audrée up ahead getting it done with one pole no less.
Yea, it's beautiful, hey? We're just coming to the top of our climb here and right across there I can see a massive dam. The Swiss definitely love their mega dam projects. And I went over there during the Swiss Peaks 360. I came it to Finhaut over on the right there, right as the sun was setting, and up through those mountains over a Col there and it was just a surreal experience. It's so cool being back here. And you see two more dams right below.
All right, we're just arriving in Vallorcine. It's about a kilometer and a half to our refuge and we're gonna have dinner and a beer. I might have two beers to celebrate because we're almost done this thing! Oh, something smells good. Oh, this is it.
Oh great, that's our dinner that smells so good! It's pretty nice. It's a super old building. It has a lot of character.
Lots of character. I found a book that has some history on the chalet here. It was built in 1723 in a traditional style.
It talks about how the front half was for living the back half was for the animals and the ceilings are so low, I can only imagine that maybe people were shorter back then. Our fifth and final day would be a short one at around 19 km with just one big climb followed by a long traverse high above the Chamonix valley before following the UTMB race course down to Chamonix and through the city center where we'd started our adventure four days prior. A little cold today.
Yeah, it's chilly. Today is a short one. It's about 18 km as we head back to Chamonix from Vallorcene here. So we got a little bit of a later start, about 8:30.
But we've got lots of time to get back by around lunchtime which is our target. So our route today is really just one big climb and fortunately Mont Blanc is back in view. It was largely absent from the route yesterday. Just about done our last big climb and this one going up to La Flagere actually I think is quite fun. Not too steep, it's a nice grade, some switchbacks and big and open. Well there's Chamonix back in view, back where we started four and a half days ago. So we're the final stretch here, how do you feel? Great, I feel like I can for sure bomb down this.
Yea, visualizing the finish line. We're going to be hearing the party and the crowd at the finish line. I'll be running downhill like my life depends on it. Yea, we're just a kilometer and a half from the finish here, running through town.
Unfortunately, we'll both probably be finishing in the middle of the night or at least late at night. Middle of the night for you, early morning for me maybe. It might be light out - hopefully not. Straight down here through the main square to the church.
Four and a half days after we left. An incredible experience, part one of two. We get to do it all over again in just two and a half weeks.
Spike & Nigel Mogg - Talk about The Quireboys, Touring, New Lp & more - Radio Broadcast 27/11/2022 2023-01-26 08:11
Top 8 Countries to Visit in 2023 (for Adventure) 2023-01-24 14:53


text:
Q: SwiftUI ScrollView with content frame update closure I want to have a ScrollView where you can be aware of the content frame changes as the user scrolls (similar to didScroll delegate in UIKit UIScrollView).
With this, you can then perform layout changes based on the scroll behavior.

A: I managed to come with a nice solution for this problem by making use of View Preferences as a method to notify layout information upstream in the View Hierarchy.
For a very detail explanation of how View Preferences work, I will suggest reading this 3 articles series on the topic by kontiki
For my solution, I implemented two ViewModifiers: one to make a view report changes on its layout using anchor preferences, and the second to allow a View to handle updates to frames on views on its subtree.
To do this, we first define a Struct to carry the identifiable frame information upstream:
/// Represents the `frame` of an identifiable view as an `Anchor`
struct ViewFrame: Equatable {

    /// A given identifier for the View to faciliate processing
    /// of frame updates
    let viewId : String

    /// An `Anchor` representation of the View
    let frameAnchor: Anchor<CGRect>

    // Conformace to Equatable is required for supporting
    // view udpates via `PreferenceKey`
    static func == (lhs: ViewFrame, rhs: ViewFrame) -> Bool {
        // Since we can currently not compare `Anchor<CGRect>` values
        // without a Geometry reader, we return here `false` so that on
        // every change on bounds an update is issued.
        return false
    }
}

and we define a Struct conforming to PreferenceKey protocol to hold the view tree preference changes:
/// A `PreferenceKey` to provide View frame updates in a View tree
struct FramePreferenceKey: PreferenceKey {
    typealias Value = [ViewFrame] // The list of view frame changes in a View tree.

    static var defaultValue: [ViewFrame] = []

    /// When traversing the view tree, Swift UI will use this function to collect all view frame changes.
    static func reduce(value: inout [ViewFrame], nextValue: () -> [ViewFrame]) {
        value.append(contentsOf: nextValue())
    }
}

Now we can define the ViewModifiers I mentioned:
Make a view report changes on its layout:
This just adds a transformAnchorPreference modifier to the View with a handler that simply constructs a ViewFrame instance with current frame Anchor value and appends it to the current value of the FramePreferenceKey:
/// Adds an Anchor preference to notify of frame changes
struct ProvideFrameChanges: ViewModifier {
    var viewId : String

    func body(content: Content) -> some View {
        content
            .transformAnchorPreference(key: FramePreferenceKey.self, value: .bounds) {
                $0.append(ViewFrame(viewId: self.viewId, frameAnchor: $1))
            }
    }
}

extension View {

    /// Adds an Anchor preference to notify of frame changes
    /// - Parameter viewId: A `String` identifying the View
    func provideFrameChanges(viewId : String) -> some View {
        ModifiedContent(content: self, modifier: ProvideFrameChanges(viewId: viewId))
    }
}

Provide an update handler to a view for frame changes on its subtree:
This adds a onPreferenceChange modifier to the View, where the list of frame Anchors changes are transformed into frames(CGRect) on the view's coordinate space and reported as a dictionary of frame updates keyed by the view ids:
typealias ViewTreeFrameChanges = [String : CGRect]

/// Provides a block to handle internal View tree frame changes
/// for views using the `ProvideFrameChanges` in own coordinate space.
struct HandleViewTreeFrameChanges: ViewModifier {
    /// The handler to process Frame changes on this views subtree.
    /// `ViewTreeFrameChanges` is a dictionary where keys are string view ids
    /// and values are the updated view frame (`CGRect`)
    var handler : (ViewTreeFrameChanges)->Void

    func body(content: Content) -> some View {
        GeometryReader { contentGeometry in
            content
                .onPreferenceChange(FramePreferenceKey.self) {
                    self._updateViewTreeLayoutChanges($0, in: contentGeometry)
                }
        }
    }

    private func _updateViewTreeLayoutChanges(_ changes : [ViewFrame], in geometry : GeometryProxy) {
        let pairs = changes.map({ ($0.viewId, geometry[$0.frameAnchor]) })
        handler(Dictionary(uniqueKeysWithValues: pairs))
    }
}

extension View {
    /// Adds an Anchor preference to notify of frame changes
    /// - Parameter viewId: A `String` identifying the View
    func handleViewTreeFrameChanges(_ handler : @escaping (ViewTreeFrameChanges)->Void) -> some View {
        ModifiedContent(content: self, modifier: HandleViewTreeFrameChanges(handler: handler))
    }
}

LET'S USE IT:
I will illustrate the usage with an example:
Here I will get notifications of a Header View frame changes inside a ScrollView. Since this Header View is on the top of the ScrollView content, the reported frame changes on the frame origin are equivalent to the contentOffset changes of the ScrollView
enum TestEnum : String, CaseIterable, Identifiable {
    case one, two, three, four, five, six, seven, eight, nine, ten

    var id: String {
        rawValue
    }
}

struct TestView: View {
    private let _listHeaderViewId = "testView_ListHeader"

    var body: some View {
        ScrollView {
            // Header View
            Text("This is some Header")
                .provideFrameChanges(viewId: self._listHeaderViewId)

            // List of test values
            ForEach(TestEnum.allCases) {
                Text($0.rawValue)
                    .padding(60)
            }
        }
            .handleViewTreeFrameChanges {
                self._updateViewTreeLayoutChanges($0)
            }
    }

    private func _updateViewTreeLayoutChanges(_ changes : ViewTreeFrameChanges) {
        print(changes)
    }
}

A: There is an elegant solution to this problem, Soroush Khanlou already posted a Gist of it so I won't copy-paste it. You can find it here and yeah...Shame that it isn't a part of the framework yet!

redpajama_set_name: RedPajamaStackExchange


text:
Student Sport Ireland CLG is recognised by Sport Ireland and Sport Northern Ireland as the governing body for third level sport on the island of Ireland.
Our vision is to work in partnership to enhance student health and well-being through increasing participation in sport and physical activity in third level colleges in Ireland.
Our mission is to promote and develop sport and physical activity in third level colleges in Ireland.
Our members comprise of affiliated third level institutes and the college of Honorary Members.
Affiliated institutes are represented by Sports Dept staff including Directors of Sport, Heads of Sport and Sports Officers on the SSI Board and its standing committees. Follow this link to view a full list of SSI Third Level Contacts
Honorary Membership is awarded to individuals who have made an outstanding contribution to the development of third level sport on the island.
SSI is affiliated to FISU (the International University Sports Federation) and EUSA (European University Sports Association)
The organisation was established in 2005 with the merger of the Council of University Sports in Ireland and the Irish Student Sport Association. At the time of the merger the organisation was known as CUSAI (the Colleges and University Sports Association of Ireland) before being renamed as Student Sport Ireland (SSI) in May 2013.
SSI is governed by its Constitution adopted in December 2018.
The SSI Board of Directors is led by the President with Directors elected at the company's Annual General Meeting held every February.
The Board and its work is informed by the company strategic plan launched in September 2017: Working For Third Level Sport and Physical Activity
The strategic plan was informed the SASSI research study which investigated sport and physical activity participation, preferences and provision at third level, and which surveyed over 9,000 students in 31 third level institutes on the island. The study is believed to be the largest of its kind undertaken in Europe.
The Board and staff are supported by its five Standing Committees in the delivery of the strategic plan and the work programme.
Sport Ireland Governance Code for Sport.
SSI determines that it is Type B company under the Code of Governance
In 2018 SSI embarked on the journey to be compliant with the Governance Code with the SSI Board committed to the five Principles of Good Governance
In January 2021 the SSI Board declared that the organisation was compliant with the Sport Ireland Governance Code for Sport.


text:
Q: How to repeatedly update the same table using shiny modules I have a shiny app that uses modules. In this app there are several drop downs with choices that need to be populated in a table. The first drop down relates to the second and gives the row filter to change the value of the second dropdown in the second column of the table, however the values in the first drop down should not change the values in first column of the table.
The table should first automatically populate with the default values of the drop downs (these vary so this cant be hard coded). The user of the app will look at choices and click the update button when they want a change to happen in the table. It is not obvious from this reproducible example but in the larger app the user will need to continuously update the table from the last update they did, not just send a full table of data to repopulate the whole thing. I know how to use the values from the drop downs to populate a table once, but I am having trouble understanding how I can store a table (or any object) somewhere so it can be accessed and updated continuously.
In case the description is not totally clear, I expect a table like this to appear on initialization:

then if I change dropdown 2 to 'b' and click update table I expect it to look like this:

finally if I change dropdown 1 to 'sandwich' and then change dropdown 2 to 'a' and click update table, I expect the table to look like this:

Below is the code for a minimal example and in the TabButtonServer module you will see my best attempt at getting this to work but it does not. As mentioned above the crux of the issue is I don't know how I am supposed to store the table when its updated so that it can be referenced again later. I very much appreciate any help someone could offer.

## first drop down
ChooseUI1 <- function(id) {

  selectInput(NS(id, "choice1"),
              label=NULL,
              choices=c("foo", "bar", "ham", "sandwich"))

}

ChooseServer1 <- function(id) {

  moduleServer(id, function(input, output, session) {

    reactive({
      input$choice1
    })

  })
}

## second drop down
ChooseUI2 <- function(id) {

  selectInput(NS(id, "choice2"),
              label=NULL,
              choices=c("a", "b", "c", "d"))

}

ChooseServer2 <- function(id) {

  moduleServer(id, function(input, output, session) {

    reactive({
      input$choice2
    })

  })
}

## button to change table
TabButtonUi <- function(id){

  actionButton(NS(id, "tab_change"),
               label="Update Table")

}

TabButtonServer <- function(id, c1, c2) {
  stopifnot(is.reactive(c1))
  stopifnot(is.reactive(c2))

  moduleServer(id, function(input, output, session) {

    start_table <- reactive({
      cbind.data.frame(col1=c("foo", "bar", "ham", "sandwich"),
                       col2=c("a", "b", "c", "d"),
                       stringsAsFactors=FALSE)
    })

    new_table <- data.frame(col1=character(), col2=character())
    output_change <- eventReactive(input$tab_change, {

      if(input$tab_change == 0) {
        new_table <- start_table()
      } else {
        new_table[new_table[ , "col1"] == c1(), "col2"] <<- c2()
      }
      new_table

    }, ignoreNULL=FALSE)

    reactive({
      output_change()
    })

  })
}

## view table
viewTabUi <- function(id){
  tableOutput(NS(id, "view_tab"))
}

viewTabServer <- function(id, tab) {
  stopifnot(is.reactive(tab))

  moduleServer(id, function(input, output, session) {

    output$view_tab <- renderTable(tab())

  })
}

## the app
ui <- navbarPage(
  title="test",
  tabPanel(title="first page",
           sidebarLayout(
             sidebarPanel(
               ChooseUI1("c1"),
               ChooseUI2("c2"),
               TabButtonUi("tab"),
               viewTabUi("view_tab")
             ),
             mainPanel(

             )
           )
  )
)

server <- function(input, output, session) {
  c1 <- ChooseServer1("c1")
  c2 <- ChooseServer2("c2")
  tab <- TabButtonServer("tab", c1, c2)
  viewTabServer("view_tab", tab)
}

shinyApp(ui, server)

A: One way to do is to use reactiveValues() object as shown below.
## first drop down
ChooseUI1 <- function(id) {

  selectInput(NS(id, "choice1"),
              label=NULL,
              choices=c("foo", "bar", "ham", "sandwich"))

}

ChooseServer1 <- function(id) {

  moduleServer(id, function(input, output, session) {

    reactive({
      input$choice1
    })

  })
}

## second drop down
ChooseUI2 <- function(id) {

  selectInput(NS(id, "choice2"),
              label=NULL,
              choices=c("a", "b", "c", "d"))

}

ChooseServer2 <- function(id) {

  moduleServer(id, function(input, output, session) {

    reactive({
      input$choice2
    })

  })
}

## button to change table
TabButtonUi <- function(id){

  actionButton(NS(id, "tab_change"),
               label="Update Table")

}

TabButtonServer <- function(id, c1, c2) {
  stopifnot(is.reactive(c1))
  stopifnot(is.reactive(c2))

  moduleServer(id, function(input, output, session) {

    start_table <-  cbind.data.frame(col1=c("foo", "bar", "ham", "sandwich"),
                                     col2=c("a", "b", "c", "d"),
                                     stringsAsFactors=FALSE)

    rv <- reactiveValues(df=NULL)

    observeEvent(input$tab_change, {

      if(input$tab_change == 0) {
        rv$df <- start_table
      } else {
        rv$df[rv$df$col1 == c1(), "col2"] <<- c2()
      }

    }, ignoreNULL=FALSE)

    reactive({
      rv$df
    })

  })
}

## view table
viewTabUi <- function(id){
  tableOutput(NS(id, "view_tab"))
}

viewTabServer <- function(id, tab) {
  stopifnot(is.reactive(tab))

  moduleServer(id, function(input, output, session) {

    output$view_tab <- renderTable(tab())

  })
}

## the app
ui <- navbarPage(
  title="test",
  tabPanel(title="first page",
           sidebarLayout(
             sidebarPanel(
               ChooseUI1("c1"),
               ChooseUI2("c2"),
               TabButtonUi("tab"),
               viewTabUi("view_tab")
             ),
             mainPanel(

             )
           )
  )
)

server <- function(input, output, session) {
  c1 <- ChooseServer1("c1")
  c2 <- ChooseServer2("c2")
  tab <- TabButtonServer("tab", c1, c2)
  viewTabServer("view_tab", tab)
}

shinyApp(ui, server)

Alternative answer: To take advantage of the modules programming, you could use one selectInput module multiple times as shown below
####  drop down
ChooseUI1 <- function(id) {

  selectInput(NS(id, "choice1"), label=NULL, choices=NULL)

}

ChooseServer1 <- function(id,df_col) {

  moduleServer(id, function(input, output, session) {
    updateSelectInput(session, "choice1", choices= unique(df_col))

    reactive({
      input$choice1
    })

  })
}

## button to change table
TabButtonUi <- function(id){

  actionButton(NS(id, "tab_change"), label="Update Table")

}

TabButtonServer <- function(id, c1, c2, start_table) {
  stopifnot(is.reactive(c1))
  stopifnot(is.reactive(c2))

  moduleServer(id, function(input, output, session) {

    rv <- reactiveValues(df=NULL)

    observeEvent(input$tab_change, {

      if(input$tab_change == 0) {
        rv$df <- start_table
      } else {
        rv$df[rv$df$col1 == c1(), "col2"] <<- c2()
      }

    }, ignoreNULL=FALSE)

    reactive({ rv$df })

  })
}

## view table
viewTabUi <- function(id){
  tableOutput(NS(id, "view_tab"))
}

viewTabServer <- function(id, tab) {
  stopifnot(is.reactive(tab))

  moduleServer(id, function(input, output, session) {

    output$view_tab <- renderTable(tab())

  })
}

## the app
ui <- navbarPage(
  title="test",
  tabPanel(title="first page",
           sidebarLayout(
             sidebarPanel(
               ChooseUI1("c1"),
               ChooseUI1("c2"),
               TabButtonUi("tab"),
               viewTabUi("view_tab")
             ),
             mainPanel()
           )
  )
)

server <- function(input, output, session) {
  df <-  cbind.data.frame(col1=c("foo", "bar", "ham", "sandwich"),
                          col2=c("a", "b", "c", "d"),
                          stringsAsFactors=FALSE)
  cc1 <- ChooseServer1("c1",df$col1)
  cc2 <- ChooseServer1("c2",df$col2)
  tab <- TabButtonServer("tab", cc1, cc2, df)
  viewTabServer("view_tab", tab)
}

shinyApp(ui, server)


text:
Alta Madrone Affordable Apartments Filling with New Residents
Post Date: August 26th, 2021
The Sonoma Index-Tribune reflects upon SAHA's five-year effort to approve and build Alta Madrone in Sonoma.
San Jose Development to Provide 87 Affordable Homes
Affordable Housing Finance reports on groundbreaking of Arya, which will provide 87 affordable homes to San Jose and bring transit and pedestrian improvements to the neighborhood.
Arya Affordable Housing Development Breaks Ground in San José
SAHA and the City of San José celebrate the groundbreaking of Arya, an 87-home affordable housing development in San José's SoFA district. The project will serve as a model for addressing climate change through emission-reduction strategies, and bring transit improvements to area.
Post Date: June 25th, 2021
The Sonoma Index-Tribune reports on veteran Bob Krah's search for a home, and how he found it at Alta Madrone in Sonoma.
Bringing Veterans Home in Contra Costa County
Post Date: November 12th, 2020
SAHA announces the groundbreaking for Veterans Square, a 30-home affordable housing development in Pittsburg supporting veterans.
Affordable senior housing project breaks ground in North Berkeley
Post Date: November 5th, 2020
Berkeleyside reports on the groundbreaking of Jordan Court, which will create housing for low-income and formerly homeless seniors at at 1600 Oxford Street in North Berkeley.
Jordan Court Groundbreaking
Post Date: September 24th, 2020
SAHA and All Souls Episcopal Church celebrate the groundbreaking of Jordan Court, 34 new affordable studios for low-income and formerly homeless seniors at 1600 Oxford Street in North Berkeley.
Post Date: February 25th, 2020
The Press Democrat reports on the groundbreaking ceremony for Altamira Apartments, which will provide housing and support services for families and the formerly homeless in Sonoma.
Groundbreaking: Alta Madrone
Groundbreaking of Alta Madrone
Join us on Monday, February 24 at 2:30pm to celebrate the groundbreaking of Alta Madrone, the new construction of 48 units for low-income families and veterans.


text:
Superintendent Goree Moves to Meet Bus Drivers' Demands [VIDEO]
Caddo Parish Schools Superintendent Dr. Lamar Goree talks with 101.7 / 710 KEEL's Robert J Wright and Erin McCarty about his attempts to upgrade parish school bus drivers pay and work conditions. This comes after a partial driver "sick-out" last Thursday and Friday affecting afternoon schedules.
Following a news conference yesterday, the superintendent's office released the following (in part):
"Caddo Parish Public Schools is committed to meeting the needs of students and that begins with the highest quality staff in every department. As part of that mission, Caddo has been working with Transportation Department employees to address issues and ways to increase efficiencies within the district's fleet of nearly 300 buses.
On Tuesday, Superintendent Dr. T. Lamar Goree announced responses to more than 20 frequently asked questions from staff members which were discussed during his meetings on Oct. 11 with bus drivers, attendants, office staff and mechanics. The responses seek to break away misconceptions, but more importantly, to provide for an accurate flow of information between district leadership and employees.
In response to employee inquiries, Dr. Goree has tasked the district's Human Resources Division with conducting a review of bus driver and attendant pay in alignment with comparable districts. Additionally, the district will soon launch a portal that will allow bus drivers to see in real time the status of all field trips and pay associated with field trips. Caddo also is set to begin on-going customer service training for office staff with similar training provided as part of bus driver in-service days."


text:
Bear Clan Patrol is coming to the streets of St. Catharines
The grassroots initiative started in Winnipeg by Indigenous people to build relationships and break down barriers in the community.
Spokesperson Karen Orlandi tells CKTB the patrol will operate on downtown streets Friday and Saturday nights from 6 to 9 p.m. starting July 12.
She says "the goal is to meet people where they're at" and to build relationships with those who are living on the streets or hanging out downtown.
The Bear Clan Patrol also cleans up any drug paraphernalia.
Orlandi says volunteers will be trained on how to speak to people and pick up needles safely with help from Positive Living Niagara.
She says the Bear Clan operates in about 15 cities in Canada
2 million dollar investment in Niagara College
Ottawa has announced nearly two million dollars to help Niagara College build and expand partnerships with the region's advanced manufacturing leaders.
Crash in Welland at train bridge
Canal Bank Street in Welland is closed between 6th and 7th Streets after a collision
Niagara police investigating a stabbing St. Catharines
Police were called the area of St. Paul Street and James Street around 3:45 a.m. this morning after reports of a male in the street with apparent stab wounds
Kala's Home Hardware
9AM JULY 17TH
Larry's 5:30 Roundtable with Paul di Ianni and Ashleigh Myers
Larry and the panel talk about the stories of the day.
Group_Element_Footer_Newstalk610
12 Yates Street St. Catharines ON L2R 5R2
2 million dollar investment i…


text:
Luxury SUVs are in demand nowadays. Those vehicles are combining utility with practicality, with a higher dose of premium elements. So, one option is to buy a regular SUV and spend a lot more for particular upgrades… or just splash the money and invest in some of the proven brands.
There are plenty of luxury SUVs out there. Here is our selection of top 10 models for the upcoming season.
2023 Genesis GV80
It is a new name in the luxury SUV world, but Genesis made an immediate impact. It is a premium branch of the Hyundai, so the GV80 had a good base for upgrades. Like always, the Korean company is offering more than others, at lower prices. Still, the 2023 Genesis GV80 can't compete with high-end versions of German and British SUVs. But, if your standards are not too high, this vehicle will meet them.
Some of the best things about the 2023 Genesis GV80: it will be very safe, the engine surprised everyone with the performance, and the interior is very elegant. On the other hand, there is only one engine under the hood. To be more competitive, the GV80 must add a kind of hybrid unit. Plus, the third row is optional. By picking this upgrade, the comfort is under a question mark, especially for passengers in the third row. The price range of the 2023 Genesis GV80 is from $50,000 to $75,000.
2023 Lexus LX 600
The all-new 2023 Lexus LX 600 is definitely one of the stars of the upcoming seasons. Toyota made a bold move by cutting the Land Cruiser from the US market to provide more room for the LX. So, if the Japanese giant believes in this SUV, then we must too. There are plenty of reasons why the full-size model is so highly anticipated. The LX was already one of the most luxurious SUVs in the market. Now, the styling is new, it has a version with three rows, and more options are added.
But, atop of all, the new engine is under the hood of the 2023 Lexus LX 600. Like many experts predicted, Toyota wanted to improve its efficiency. An old V8 was powerful, reliable, and durable unit, but also very thirsty. Frequent visits to gas stations are annoying. Now, the I-Force Max is there. A twin-turbo V6 replaces an eight-pot engine and brings better gas mileage, as well as higher outputs. Still, we will see if V6 can keep the off-road driving abilities of its predecessor at the same level. Of course, the pricing of the new LX model is updated. Now, the base MSRP is just under $90,000.
The most popular model in the full-size premium SUV segment, according to sales charts, is Cadillac Escalade. The company recently updated the luxury vehicle, so there is no surprise why this model tops others. A mighty V8 engine is under the hood, it provides plenty of space in all three rows, and the infotainment system is stunning. Plus, it comes in the ESV version with a long wheelbase.
But, what really is going to make the SUV so special next year is the 2023 Cadillac Escalade V model. A high-output version of the vehicle is on the way and engineers are going to boost a 6.2-liter V8 engine. Superchargers and other tuning are squeezing the maximum from the plant, so the power outputs can be around 650 hp. On the other hand, the price of this configuration will be close to $150,000, making it one of the most expensive luxury SUVs on the list.
2023 Mercedes GLS
One of the vehicles that can cost more than the Escalade V is the 2023 Mercedes GLS. Well, you will have to pack it with the top of the lineup options, including the AMG bundle. Or, if you are really after a super-luxurious and unique model, be quick to purchase the 2023 Mercedes-Maybach GLS 600 version, which will be available as the limited edition. Prepare $160,000 for this one, or $135,000 for the AMG GLS 63 if you want to save some cash. It is still a great option with 603 hp and 627 lb-ft of torque.
The versatility of the lineup is what makes the 2023 Mercedes GLS so special. The base price might attract you. Buying such a big Mercedes under $80k seems like a bargain. But, that is the package with a six-cylinder engine. If you want a V8, those configurations are already in a six-digit price range. AMG is the top model until Maybach made the GLS even more luxurious.
Of course, there is another German carmaker that will build one of the best 2023 luxury SUVs. Out pick from Bavaria is the 2023 BMW X6. The coupe-SUV is attractive and powerful. It makes a statement. Yes, the X5 is the flagship model, and the X7 is bigger and new, but the design of the X6 is what draws buyers. Also, it is more expensive thanks to various upgrades. Compared to mentioned SUVs, the 2023 BMW X6 is not offering the third row because of the sloped roof. That will also harm the cargo space. But, buyers of this vehicle won't care.
All the versions of the 2023 BMW X6 are using the xDrive AWD system. Like Mercedes, the Bavarian manufacturer made a maneuver with a six-cylinder engine. The base configuration costs less but delivers only 335 hp. A 4.4-liter V8 is the engine you want under the bonnet of your vehicle. It costs $20,000, but it's worth. In case you don't want further upgrades, the system creates 525 hp. With the M Performance package, the outputs climb to 600 ponies. But, that is not all – there is the ultimate Competition package that squeezes 15 more hp from the V8 engine.
It was already one of the most popular SUVs in the market. Now, with the Type S package, the MDX is even more competitive. We were waiting for this package to arrive for quite long. Acura brought it for its TLX sedan first, and it didn't take too much before Type S became an optional upgrade for the flagship SUV. Enhances of performance and styling are accepted and now we can talk about the 2023 Acura MDX Type S as one of the best luxury SUVs for next season.
The base version is equipped with a V6 engine. It is not special compared to the competition. The Super-Handling all-wheel drive is a recommendable upgrade and one of the best AWD systems in the market. But, the SUV needed something else. Experts believed that the hybrid version can fix the situation. Instead, the 2023 Acura MDX Type S jumped in and stole the show. A 3.0-liter engine is turbocharged and sends power through a 10-speed auto transmission (355 hp and 354 lb-ft). The price of the SUV with the Type S package is $68,000.
The 2023 Lincoln Aviator before Navigator? Yes, and here is why… The company is preparing an update for the mid-size luxury SUV. It can bring new themes for the Black Label. Plus, the plug-in hybrid configuration available with the Grand Touring version is delivering 494 hp and 630 lb-ft of torque, which is more than Navigator can do. Well, the full-size SUV needs upgrades as well. Its main rival, Cadillac Escalade, will be out soon with the V-Performance package. Until something big happens to the flagship vehicle, Aviator stays the No1 SUV in the family.
So, the main configuration of the mid-size model is a turbocharged V6 engine that cracks 400 hp. Not bad. But, it becomes even more impressive when the same engine gets support by a plug-in hybrid system and increases outputs to nearly 500 ponies. It is not all. The PHEV engine can be combined with the most luxurious package available for Lincoln vehicles – Black Label. Unique interior themes are available, but the price jumps to $90,000.
Comparing the 2023 Lexus RX to the rest of the models on this list, we would say there is nothing special to add about this SUV. But, it is still the best-selling premium vehicle in the US. The versatility is a key – the RX is available with standard engine and hybrid, base layout and extended version, classic appearance and aggressive stance brought by the F Sport package. Plus, the price of the base model is still under $50,000 and the redesign might happen already in 2023.
We already highlighted the best things about the 2023 Lexus RX. A power output goes from 290 hp with the standard setup and up to 310 hp if you select the RX 450h hybrid. The SUV is a two-row model, but it becomes a seven-seater with the RX 350L version. It is also possible to combine a hybrid engine with an extended body. The F Sport enhances the appearance of the SUV, making it more attractive with a unique grille and darkened details.
Lexus LQ to underpin the next RX SUV
Volvo is one of our favorite automotive companies. Whatever the Swedish manufacturer brings, stuns the market every time. There are plenty of novelties and future concepts we can talk about. The XC100 might become the flagship SUV, and the Recharge package is something special about the 2023 Volvo XC90 and other vehicles that recently got it. It is not a model with an all-electric drivetrain yet, but in the foreseeable future, the carmaker will do it with most vehicles in its portfolio.
For now, the same 2.0-liter is under the hood of the 2023 Volvo XC90. With the Recharge PHEV package, the outputs rise to 400 hp and 480 lb-ft. The carmaker is not going to use a larger displacement. Instead, they are developing cleaner sources of power. And of course, safety is the top priority. Driving Volvo brings peace of mind.
Well, for the finale, we left an exotic vehicle. Its starting price is above every other SUV on this list. But, the 2023 Lamborghini Urus will take you to another dimension of luxury. Everything in this vehicle is special, and the price indicates that. But, let's look at the specs sheet. The Urus is going to use a mighty 4.0-liter V8 tuned to deliver 650 hp. Of course, AWD is standard. Max speed of the SUV is 189 mph and it sprints 0-60 mph in just 3.5 seconds.
Lamborghini made a bold move by delivering Urus, their first four-door vehicle. Plus, it was a challenge for other builders of exotic cars. Next year, Ferrari is launching the Purosangue SUV. It will change the market, although not too many buyers can afford such vehicles. But, the presence of companies such as Lamborghini and Ferrari is noteworthy.
2024 Honda Element Rumors, Comeback and Release Date


Following the Cuban authorities´ refusal to grant Cuban blogger Yoani Sánchez permission to travel to Brazil to attend a documentary screening on freedom of expression, the documentary-maker has decided to postpone its showing so that she can attend at a later date.
The Brazilian documentary-maker Dado Galvao has decided to postpone the screening of his documentary Conexão Cuba > Honduras (Cuba Connection Honduras) because Cuban blogger Yoani Sánchez has been refused permission by Cuban authorities to travel to attend the event as a guest speaker. The screening was due to take place on 10 February in Jequié, Bahia State, Brazil. The film features the stories of a number of Cuban and Honduran bloggers who have faced censorship in their countries, including Yoani Sánchez herself.
Yoani Sánchez was refused an exit visa to travel to the screening, the nineteenth time in four years that the Cuban authorities have arbitrarily denied her permission to leave her country. Several of those requests to travel have been for the purpose of receiving awards for her blogging and other activities which seek to promote freedom of expression in Cuba. Amnesty International believes that the Cuban authorities´ refusal to grant Yoani Sánchez exit visas is a punitive measure in response to the peaceful expression of her critical views and is an attempt to silence her voice on the international stage.
Dado Galvao has announced that he would like to screen the documentary at the end of April, and will again be inviting Yoani Sánchez to attend as a guest speaker. Amnesty International will be closely monitoring the situation and will take further action as appropriate.
No further action is required for the moment. Many thanks to all who sent appeals.


text:
Acute Myeloid Leukemia (AML) is a malignant proliferation of myeloblasts in the blood and bone marrow. The hematopoietic precursors are arrested in an early stage of development. Most AML subtypes are distinguished from other related blood disorders by the presence of more than 20% blasts in the bone marrow. The disease is commonest in the middle-aged and elderly.
Clinical Features:
Although the onset is usually acute there is a smouldering or "preleukemic" phase in about 15% of cases.
The presenting features of AML, as in ALL, are generally those of bone marrow failure:
Anemia with weakness and lethargy.
Leucopenia with recurrent infections.
Thrombocytopenia with purpura and bleeding. Bleeding may be particularly severe in acute promyelocytic leukemia (APL/M3) in which disseminated intravascular coagulation (DIC) is a feature.
Hepatosplenomegaly but not lymphadenopathy is common.
Infiltration of the gums and perineum is a feature of AML, particularly M4 and M5.
FBC & Blood film.
Coagulation profile.
Biochemistry profile including U&Es, LFTs, Bone, LDH, Uric Acid and hematinics.
CXR.
CT scan neck, thorax, abdomen and pelvis.
ECG.
Echocardiogram.
Cultures, in particular blood cultures.
Bone marrow aspirate, trephine, cell markers and cytogenetics.
Anemia is usually present. Anisocytosis and poikilocytosis are common.
The total leucocyte count is usually raised with myeloblasts the predominant cell type. The neutrophil count is usually reduced.
The platelet count is usually low.
The bone marrow is hypercellular and aspiration may be difficult. Blast cells predominate. Features of dyserythropoiesis and dysgranulopoiesis are seen.
In the "preleukemic phase" there is depression of one or more cell lines in the blood with few if any blast cells present. In the marrow, there is usually marked dyshematopoiesis and there may or may not be a modest increase in blast cells. Ringed sideroblasts may be seen on iron stains.
Morphology is the gold standard for blast enumeration with a blast percentage of 20% defining AML in the WHO classification system. Of note, a blast percentage of 30% was used by the FAB classification.
Myeloblasts vary in size but are usually intermediate or large cells with relatively abundant blue cytoplasm. The nuclear chromatin is finely dispersed with often more than two nucleoli per cell. The finding of "Auer Rods" is pathognomonic of AML.
Monoblasts are usually large cells with voluminous cytoplasm which may contain azurophil granules. The nucleus is often folded and contains 3-5 nucleoli.
It is difficult in some cases to differentiate myeloblasts from lymphoblasts and cytochemistry and immunophenotyping may then be helpful.
Myeloblasts are typically Sudan black and Myeloperoxidase positive and PAS negative. They are often diffusely positive for non-specific esterase (NSE).
Monoblasts are more strongly positive for NSE.
Cytogenetic Analysis:
Cytogenetic studies performed on bone marrow provide important prognostic information. They are useful for confirming a diagnosis of APL, which bears the t(15;17) chromosome abnormality (PML/RARa) and is treated differently.
Chromosomal abnormalities are seen in the majority of cases; t(15;17), inv(16) and t(8;21) are good prognostic features whereas trisomy 8, monosomy 7 and monosomy 5 are poor prognosis disease.
Fluorescence in situ hybridization (FISH) studies can be used to get a faster overview of cytogenetic abnormalities than traditional cytogenetic studies. FISH does not replace cytogenetics.
Molecular Marrow Evaluation:
Several molecular abnormalities that are not detected with routine cytogenetics have been shown to have prognostic importance in patients with AML. The bone marrow should be evaluated at least with the commercially available tests. Patients with APL should have their marrow evaluated for the PML/RARa genetic rearrangement. When possible, the bone marrow should be evaluated for Fms-like tyrosine kinase 3 (FLT3) and nucleophosmin (NPM1) mutations.
FLT3 is the most commonly mutated gene in persons with AML and is constitutively activated in one-third of AML cases. Internal tandem duplications (ITDs) in the juxtamembrane domain of FLT3 exist in 25% of AML cases. In other cases, mutations exist in the activation loop of FLT3. Most studies demonstrate that patients with FLT3-ITD mutations tend to have a particularly unfavorable prognosis, with an increased risk of relapse and shorter overall survival (OS) compared with patients without the mutation . Analysis of FLT3 is commercially available.
Mutations in NPM1 are associated with increased response to chemotherapy in patients with a normal karyotype.
Treatment of AML:
Supportive treatment:
Includes transfusion for anemia, treatment of infections, platelets for bleeding, and social and psychological support. Patients should receive leucodepleted, irradiated blood products to reduce the risk of transfusion-associated graft versus host disease, cytomegalovirus (CMV) transmission, and febrile transfusion reactions. Patients usually receive packed red cells when the hemoglobin level falls below 8 g/dL, those with significant respiratory and cardiac disease might require transfusion at a higher hemoglobin level. Patients receive platelet transfusions when the platelet count is <10,000/mm3. Patients with active bleeding will be transfused to a platelet count of 50,000/mm3; patients with CNS hemorrhage should be transfused to a platelet count of 100,000/mm3. If disseminated intravascular coagulation (DIC) is present (M3) large numbers of platelets and clotting factor replacement therapy are required.
Induction chemotherapy:
Initial therapy attempts to induce remission and differs most from ALL in that AML responds to fewer drugs. The basic induction regimen includes cytarabine (ara-C) by continuous IV infusion or high doses for 5 to 7 days; daunorubicin or idarubicin is given IV for 3 days during this time. Some regimens include 6-thioguanine, etoposide, vincristine, and prednisone, but their contribution is unclear. Treatment usually results in significant myelosuppression, with infection or bleeding. There is significant latency before marrow recovery. During this time, meticulous preventive and supportive care is vital.
In APL and some other cases of AML, disseminated intravascular coagulation (DIC) may be present when leukemia is diagnosed and may worsen as leukemic cell lysis releases procoagulant. APL is a particularly important subtype, representing 10 to 15% of all cases of AML, striking a younger age group (median age 31 years) and particular ethnicity (Hispanics), in which the patient commonly presents with a coagulation disorder. In APL with the translocation t(15;17), all- trans retinoic acid (ATRA/tretinoin) corrects the DIC in 2 to 5 days; combined with daunorubicin or idarubicin, this regimen can induce remission in 80 to 90% of patients and bring about long-term survival in 65 to 70%. Arsenic trioxide is also very active in APL.
Consolidation therapy:
After remission, many regimens involve a phase of intensification with the same drugs used for induction or with other drugs. High-dose cytarabine regimens may lengthen remission duration, particularly when given for consolidation in patients < 60 years. CNS prophylaxis usually is not given to adult patients because with better systemic disease control, CNS leukemia is a less frequent complication. In AML patients who have completed consolidation, maintenance therapy has no demonstrated role.
Relapse:
Patients who have not responded to treatment and younger patients who are in remission but who are at high risk of relapse (generally identified by high-risk molecular or chromosomal abnormalities) may be given high-dose chemotherapy and stem cell transplantation. Extramedullary sites are infrequently involved in isolated relapse. When relapse occurs, additional chemotherapy for patients unable to undergo stem cell transplantation is less effective and often poorly tolerated. Another course of chemotherapy is most effective in younger patients and in patients whose initial remission lasted > 1 year.
Prognosis:
Remission induction rates range from 50 to 85%. Long-term disease-free survival occurs in 20 to 40% of patients and increases to 40 to 50% in younger patients treated with intensive chemotherapy or stem cell transplantation.
Prognostic factors help determine treatment protocol and intensity; patients with strongly negative prognostic features are usually given more intense forms of therapy because the potential benefits are thought to justify the increased treatment toxicity. An important prognostic factor is the leukemia cell karyotype. The specific chromosomal rearrangements of the different forms of AML affect the outcome.
Three clinical groups have been identified: favorable, intermediate, and poor. Patients who have the cytogenetic findings of t(8;21), t(15;17), and inv(16) typically have a favorable response to therapy, durable remission, and improved survival. Patients with a normal karyotype have an intermediate prognosis, and patients with a poor prognosis are those with a deletion of chromosome 5 or 7, trisomy 8, or a karyotype with > 3 abnormalities.
Molecular genetic abnormalities are becoming more important in refining prognosis and therapy in AML. Mutations in FLT3 kinase in particular indicate a poorer prognosis and are targets for additional therapy. Other negative factors include increasing age, a preceding myelodysplastic phase, secondary leukemia, high WBC count, and absence of Auer rods. Except in APL, the FAB or WHO classification alone does not predict response.
Travel Insurance:
Travel insurance is very important for people who have or have had cancer. Getting travel insurance when you have acute leukemia can be difficult.
Insurance companies only make money from people who don't claim. Because you've been ill, they think you're more likely to claim. For example, you might need to cancel your trip or have medical treatment abroad. This makes you a bigger risk to the company, and they can refuse to give you travel insurance.
When traveling abroad, if you are receiving active treatment for your leukemia especially chemotherapy this may affect your immune system making you more prone to infections. Also, certain vaccinations are not recommended for people traveling with leukemia.
Some high street travel insurance companies will give you medical insurance if you have a doctor's letter saying you're fit enough to travel. But many others will insure you only for treatment that isn't to do with your cancer.
Further information on getting travel insurance if you have leukemia is available from Cancer Research UK.
Vardiman JW, Harris NL, Brunning RD. The World Health Organization (WHO) classification of the myeloid neoplasms. Blood. 2002 Oct 1. 100(7):2292-302.
Smith MT, Skibola CF, Allan JM, Morgan GJ. Causal models of leukaemia and lymphoma. IARC Sci Publ. 2004. 373-92.
Ghiaur G, Wroblewski M, Loges S. Acute Myelogenous Leukemia and its Microenvironment: A Molecular Conversation. Semin Hematol. 2015 Jul. 52 (3):200-6.
NCCN Clinical Practice Guidelines in Oncology. Acute Myeloid Leukemia: Version 1.2015. National Comprehensive Cancer Network. Available at http://www.nccn.org/professionals/physician_gls/f_guidelines.asp
Haferlach C, Alpermann T, Schnittger S, Kern W, Chromik J, Schmid C, et al. Prognostic value of monosomal karyotype in comparison to complex aberrant karyotype in acute myeloid leukemia: a study on 824 cases with aberrant karyotype. Blood. 2012 Mar 1. 119(9):2122-5.
DiNardo CD, Cortes JE. New treatment for acute myelogenous leukemia. Expert Opin Pharmacother. 2015 Jan. 16 (1):95-106.
Grimwade D, Walker H, Oliver F, Wheatley K, Harrison C, Harrison G, et al. The importance of diagnostic cytogenetics on outcome in AML: analysis of 1,612 patients entered into the MRC AML 10 trial. The Medical Research Council Adult and Children's Leukaemia Working Parties. Blood. 1998 Oct 1. 92(7):2322-33.
Karen Seiter, MD; Chief Editor: Emmanuel C Besa, MD Acute Myelogenous Leukemia: Background, Pathophysiology, Etiology http://emedicine.medscape.com/article/197802-overview
Michael E. Rytting, MD Acute Myelogenous Leukemia (AML) – Hematology and Oncology – Merck Manuals Professional Edition http://www.merckmanuals.com/professional/hematology-and-oncology/leukemias/acute-myelogenous-leukemia-aml
Fenaux P, Chastang C, Chevret S, Sanz M, Dombret H, Archimbaud E, et al. A randomized comparison of all transretinoic acid (ATRA) followed by chemotherapy and ATRA plus chemotherapy and the role of maintenance therapy in newly diagnosed acute promyelocytic leukemia. The European APL Group. Blood. 1999 Aug 15. 94(4):1192-200.
Giles F, O'Brien S, Cortes J, et al. Outcome of patients with acute myelogenous leukemia after second salvage therapy. Cancer. 2005 Aug 1. 104(3):547-54.
Getting travel insurance. Cancer Research UK http://www.cancerresearchuk.org/about-cancer/coping/practically/travelling-with-cancer/travel-insurance/getting-travel-insurance
Acute Myeloid Leukemia (AML) is a malignant proliferation of myeloblasts in the blood and bone marrow. Most AML subtypes are distinguished from other related blood disorders by the presence of more than 20% blasts in the bone marrow.
Category: Leukemias
Dr. faiza adbaiba
thanks Dr. for all these information
Alan John Cook
I have not been diagnosed with Leukemia, however after a lot of medical radiation am worried that may cause leukemia, especially as my father had it. due to having high ferritin reading ( no obvious cause and normal iron ) I have regular blood checks.
On March 1st my blood film showed 'Neutrophils showed left shift, WBC count was 5.7 and Neutrophils 3.57
On March 15th blood film reported 'slight neutrophil show toxic granulation, WBC was 6.42 and Neutrophils 3.67
On in April blood test reported no abnormal issues WBC was 6.7, Neutrophils 4.46
On June 23rd, CBC reported normal but comment neutrophils show left shift WBC was 5.2 and Neutrophil 2.77
On July 1st, CBC again reported as normal no left shift detected, WBC 5.8, Neutrophils 2.98
I fully understand that left shift would be reaction to infection ( I had neither that I knew of at time of left shift reports ) but surely if I had an infection both my WBC and Neuts would also show an increase, clearly in the last two test if anything they are showing a reduction.
Having read your acute leukaemia report I am concerned I may have some kind of pre leukemic condition as you mentioned that could reduce WBC and Neuts.
Any advice/comments welcome.
The left shift means the appearance of some less mature forms on the blood film like band neutrophils and metamyelocytes. These are commonly seen in response to infection or inflammation. Raised ferritin could also be reactive to an underlying infection, inflammation, liver disease, alcohol excess not only in malignancy. I would suggest avoiding doing frequent blood tests because it would provoke unnecessary anxiety for you. You haven't mentioned the irradiation dose you have previously received and for which indication? Generally speaking, if leukaemia will happen no one can prevent it!
I would suggest repeating your CBC only if you have symptoms, otherwise just once a year.
BW,


Individually wrapped promotional sweets have been a staple part of many of our clients promotional product range from a number of years. As our promotional individually and branded flow wrapped sweets are a low cost product they are the perfect item to give out at conferences and exhibitions, to have in a bowl on reception or to include when sending out parcels and orders.
We have a great range of personalised individually wrapped sweets. If you're looking for a bulk order of branded sweets then we have options starting from 25KG, however we also offer options for customers wanting to order less, starting from as little as 1500 personalised sweets.
Our range includes personalised flow wrapped sweets, corporate double twisted fruit flavoured sweets, branded fudge and printed chewy candy sweets. Our selection goes beyond what is shown on our website so if you are looking for a specific promotional sweet then let us know and we will do our best to source the perfect item for you.