Actually using Effects of Removal and Correlation Coefficients with the tag values of the derived counts is more accurate than simulations and three is no "random chaos" in my approach.
The Effects of Removal were calculated to six decimal places with combinatorial analysis of all possible combinations for that particular situation. The EoR for each card in a given situation are a least squares line estimate but they are still very, very good. These EoR for each situation are listed in Don Schlesinger's Blackjack Attack 3rd edition. When you do simulations you are going through many, many trials hitting on all of these combinations that have already been taken into account in the EoR. It required a lot of computer power to calculate the EoR to six decimal places for each situation that was only published a few years ago by Don Schlesinger. In Peter Griffins time the EoR were just approximate and to only a few decimal places.
So to double check that my calculations with the EoR were correct, what I did, as I explained earlier, was that I calculated the indices for HL with my spreadsheet. I tested almost every index I could find for the HL. Over 100 indices as I also checked negative indices. In EVERY SINGLE CASE, the calculated indices from the EoR agreed 100% with the published indices generated from simulations.
The EoR calculation are very quick and have zero variance as opposed to simulations that require millions and millions of hands. There is no "random chance" here.
Last edited by bjanalyst; 12-22-2018 at 09:11 PM.
Actually using Effects of Removal and Correlation Coefficients with the tag values of the derived counts is more accurate than simulations. The Effects of Removal were calculated to six decimal places with combinatorial analysis of all possible combinations for that particular situation.
Correct...but only for one card removed, not as an average. This will affect your resulting index point when generating them via algebraic analysis.
The EoR are a least squares line estimate but they are still very, very good. These EoR for each situation are listed in Don Schlesinger's Blackjack Attack 3rd edition. When you do simulations you are going through many, many trials hitting on all of these combinations that have already been taken into account in the EoR. It required a lot of computer power to calculate the EoR to six decimal places for each situation that was only published a few years ago by Don Schlesinger. In Peter Griffins time the EoR were just approximate and to only a few decimal places.
Yes, and today, one can build a simulator that is orders of magnitude faster than what Griffin used. Also, I am not aware of any threaded applications that Griffin could have used on the old dinosaurs he worked on. Today, one can build a multi-threaded simulator or even a blazing fast CA (see MGP, Eric Farmer, iCountNtrack, k_c, et al.) Our very own site host has a blazing fast simulator suite!
Did you do this via Monte Carlo simulation or CA? What do you mean by this?
Again, a CA can help with this. See Farmers CA for an example.
Don Schlesinger's Effects of Removal (EoR) publishined in his book Blackjack Attack, 3rd edition. were calculated from CA (combinatorial analysis) and that is what I used.
I welcome critical analysis of my technique and I would like you to try to pull apart my analysis if you can. So I will give you the opportunity to prove me right or wrong now if you can do simulations.
I would like you to analyze the simplest simulations possible using a canned program you have for HL simulations making only six strategy changes that I will outline below using the AA78mTc. Continue to use the HL for all other strategy changes and for betting. I am asking you to use the HL and not the KO since he HL is balanced and involves less changes and less chances for errors than if you used the KO for example. I want to isolate only these six changes that I will outline below with the HL count.
Let Tc = pseudo Ten Count = HL + AA78mTc where AA78mTc means the Ace is counts ias + 2, the 7 and 8 as +1 and the Tens as -1.
You will see that if you calculated Tc = pseudo Ten count = HL + AA78mTc, you get a count which has a CC of over 98% with a perfect Ten count. Now what we will do is use the best of both. Use the HL where the HL is the better count and use the Tc where the Tc is the better count.
So what I would like you to do then is get a program that simulates the HL and make only the six changes to that program where the Tc is used instead of using the HL. dr = decks remaining.
Make ONLY the above six changes in your HL simulation program. Continue to use the HL for betting and for all other playing strategy variations.
Then compare the results of the HL with these six changes with the HL alone and let me know what happens.
What you are doing is choosing to use the best count for each situation. You use the Tc where the Tc works best which is for insurance and for standing on hard 12 v 2, 3, 4, 5, and 6. You use the HL where the HL count is best which is for all other situations. Actually there are other situations where the AA78mTc improves the HL but the six I mentioned above are the most important and I want to make the simulation as simple as possible with making the minimum number of changes to prove my point and reduce the chance for errors by making only six small changes to a proven HL program.
So run the program with just the HL and then run the same program with the AA78mTc used with the HL for the six situations mentioned above and the HL for all other situations and for betting.
I want you to try to prove me wrong. Please let me know what happens.
I do not have access to simulations but if you do why don't you test this very simple simulation. I want to be proven right or wrong through simulations.
Last edited by bjanalyst; 12-22-2018 at 09:57 PM.
Not here to prove anything. You seems to be invested in your idea and am curious how you came about this project.
Interesting! Unfortunately, I don't have access to a current simulator at this time. I would imagine that you would have done some sim work for your system before publishing you finding. Maybe something to consider? Would be interesting to include sim data for your fourth book. An idea?
This above quote suggests that I have struck a nerve with you. Did I offend you in any way?
Dog's point is EoR's are squishy. You are using full deck EoR's. After one card is removed they change ever so slightly. After a few decks are removed they may change a lot more than that depending on the cards removed. So your calculations are based on an assumption you know to be wrong. That is the full deck EoR's don't change as cards are removed. As cards are removed the algebraic method continues to use the same EoRs. More accurate calculations are made via sim for the different TCs. I don't think it makes a lot of difference until it does. But those deck compositions may be rare. Accuracy is about being closer to the estimates used from sim or any other method. The higher the standard deviation around the average the less accurate the average is for every calculation you use. The squishy EoR's are one cause of inaccuracy using the method you used. No method is 100% accurate but some are more accurate than others. The more accurate your averages are the higher you can bet when everything else is kept the same (RoR, BR, spread, etc). A measure of how much more accurate your system gets you can be seen by comparing optimal bets for the same spread, BR, RoR, etc. If it is more accurate you should have a higher min bet and max bet for the same spread, BR, RoR, etc as generated as optimal bets for approaches being compared by a simulation. Don's EoRs are great and our only starting point, but they aren't a constant throughout the shoe.
No, You did not offend me. I like challenges and I want my calculations to be correct of course. Actually I am glad that you are challenging and questioning my results instead of blinding taking what I say at face value. I want to know the truth and if I made a mistake I would like to know.
You say EoR are "squishy". But Don Schlesinger's has EoR to six significant digits. If they were that "squishy" then why calculate to six significant digits?
I do not have access to any simulations. I was hoping you did. Plus I would like independent verification of my work. Even if I had simulation software I should not be trying to prove my own work. My work should be independently verified.
Even though I do not have actual simulations of HL using Tc = HL + AA78mTc for the six situations mentioned previously, I do have indirect simulation verification in that I used my LSL program to calculate indices for the HL and the indices generated from my LSL program exactly match the published HL indices obtained through simulations. Every index that I tested with my LSL program agreed with published indices. My LSL program gave correct results for dozens of cases and I did not find one case that disagreed with the published HL indices. Thus I am very confident that my results are correct.
Another indication that my LSL program is correct is that I calculated weighted CC (which shows playing efficiency) for various counts such as HL, KO, Hi Opt 1, Hi Opt 2 and more and as expected weighted CC of Hi Opt 2 was the highest which was higher than Hi Opt 1 which was higher than KO which was higher than HL which are the same results obtained through simulations.
So basically, I have not found a single situation where results from my LSL program disagree with published results for known counts.
Based on my calculations presented earlier that showed that the weighted CC of the HL + k*(AA78mTc) are approximately equal to the weighted CC of Hi Opt 2 with side count of Aces, my guess is that simulations would show that the HL + k*(AA78mTc) has approximately the same power as Hi Opt 2 with a side count of Aces.
I have heard that with less then one deck remaining, strange things happen and non-linearity may set in so you may be correct that there are some errors in EoR with less than one deck remaining. But I play the shoe game and the dealers all cut off alt least one deck. So for the shoe game with the cut card at one deck or more, the linearity of the EoR is a very good approximation. Also it should be noted that the insurance bet is the one blackjack bet that is totally linear and insurance is the most important playing strategy variation which is improved by using Tc = HL + AA78mTc. .
If someone could plug in the six changes I mentioned previously into a canned HL simulation program using Tc instead of HL only for those six situations that would be great. Such a sim should show a substantial improvement. The CC of Tc = HL + AA78mTc with EoR for those six situations are of the order of 20% to 30% more than the CC of HL with EoR for those situations. The differences are big and should show up in simulations.
If you know anyone who has simulation software and they can run a HL simulation with just these six changes and compare it with a HL simulation with no changes that would be great. I would like to see the results at which point we can see who is correct and if the differences you point out are significant or not. I think the huge increase in CC for these six situations will overwhelm any "errors" that you mentioned above.
Below are calculations of indices for doubling on hard 9 v 2 that I gave before. I am listing it again to address one of the points that you made and to show you clearly how I calculated indices.. For a given playing strategy situation let EoR(c) = EoR for card 'c" removed from one deck. Then there are 51 cards remaining. This is how the one deck EoR was calculated for each playing strategy situation. So what I did was calculate the slope of the LSL between EoR and the tag values of he derived count. Then I calculate AACpTCp = Average Advantage Change per True Count point as AACpTCp = (51/52)*(LSL slope). Then I calculated Index as Full Deck House Advantage (FHDA) / AACpTCp to get the infinite deck index. As the CC increases the difference in indices between different number of decks decreases and they all converge to the infinite deck indices.
But if you can provide simulations for the above six situations I mentioned that would be great. I would be very interested in the results.
But no one is buying my book because no one believes what I did was correct.
It is not because I don't beleive what you did is correct, it is because I believe what you did is unnecessary and most likely, unachievable, by the vast majority of card counters. It is a small and elite group that can master these multi level, multi tiered systems. Our hats are off to you but do not expect a rush to your systems by the masses.
If I were to suggest a technical push back it would be about error rates that mitigate the advantages you mathematically have proven.
Go find a game with half deck deeper penetration and you will offset much of your systems advantage. Or add to it, if you (and Three) are skilled enough to use your system.
You summed up my point perfectly. I need a better game, more tolerant store, and/or somewhere that doesn't know my face. Better efficiencies through a more complicated count don't do much for me.
Adding either AA89mTc to KO or the AA78mTc to the HL is NOT difficult to do. HL and KO are level one counts easy to keep and AA78mTc, for example, is a plus minus side count that is easy to keep as I explained earlier which I will explain again below. If I was suggesting you use the Hi Opt 2 with a side count of Aces then I would agree with you but I am suggesting the HL with AA78mTc or KO with AA89mTc.
Below I will explain again how easy it is to keep the AA78mTc with the HL for example. I taught my friend Carla the KO with AA89mTc in just one week and she was able to keep both counts in her head without making any errors and Carla is just of average intelligence and had no prior counting experience. I have checked her counts and she was right on each time. You have been courting for years and you can't do what Carla can do who had no counting experience and took her only one week to master? Also you suggested that you are concerned about longevity in playing. So I take it that camouflage play is important to you. Well using the AA78mTc with the HL not only greatly increases playing efficiency for insurance and for hard 12 v 2, 3, 4, 5, 6, it also provides excellent camouflage play.
Updating the AA78mTc or AA89mTc is not as daunting as it may at first seem. For example, AA78mTc which is used with the HL gives the Ace a tag value of +2, seven and eight +1 and Ten -1. There is a lot of cancelling and plenty oftime to update the AA78mTc in the shoe game. Update the HL in your head as soon as the cards hit the table.
On updating the AA78mTc, when the cards are on the table and before players make any playing strategy decisions, look for cancellations. For example, an Ace will cancel two Tens, a 7will cancel a Ten and an 8 will cancel a Ten. Calculate AA78mTs (s = seen during the current round) and then add AA78mTs to AA78mTc from the previous round to get an updated AA78mTc.
Continue to update AA78mTc as players make their playing strategy decisions and dealer finishes his hand. If you have trouble keeping two integers in your head, chips can be used keep track of the AA78mTc. If the Aces, sevens and eights seen on the table during a given round do not conveniently cancel nearby Tens then just calculate AA78s (s = seen during the current round) and then scan for the Ts (Tens seenduring the current round) and subtract one from AA78s for each Ts, i.e. you are calculating AA78mTs = (AA78s – Ts) which is then added to AA78mTc from the previous round to get an updated AA78mTc.
Note that the increase in CC is in the order of 20% to 30% for these strategy changes.
So use HL for betting and for all strategy changes except use Tc = pseudo Ten Count = HL + AA78mTc for these six changes.
SD(AA78mTc)= SD(AA89mTc) = SD(HL) = 0.8771. So AA78mTc can easily be at +12 or -8 as shown in the two examples below.
dr =decks remaining, dp = decks played, tc = true count, Tc = pseudo Ten count .
These strategy changes all occur with HL = 0. If surveillance is just keeping the HL count to see if you are counting, they will be baffled by these strategy changes where they would predict, based on HL = 0, that you would not take insurance and you would hit hard 12 v 2.
n = 6decks, dp = 4 so dr = 2, HL = 12 and AA78mTc = -8.
So here tc(HL) = 12 / 2 = 6 which would mean to take insurance, stand on hard 12 v2.
But Tc = 12 – 8 = 4 and so tc(Tc) = 4 / 2 = 2 and so you would hit hard 12 v 2 and do not take insurance and this all occurs when tc(HL) = 6.
These strategy changes all occur with tc(HL) = 6. If surveillance is just keeping the HL count to see if you are counting, they will be baffled by these strategy changes where they would predict, based on tc(HL) = 6, that you would be betting the LL, you would be taking insurance and you would stand on hard 12 v 2.
Last edited by bjanalyst; 12-23-2018 at 11:46 AM.
I will use this analogy. In a boxing match . Being the strongest guy doesn't mean he will win the fight. No need to elaborate , we already why .


text:
Review: Words & Pictures
Directed by: Fred Schepisi
Written by: Gerald Di Pego
Starring: Clive Owen, Juliette Binoche, Keegan Connor Tracy, Bruce Davison, Amy Brenneman, Adam DiMarco
It's a familiar blueprint when it comes to romantic dramas – boy gets girl, boy loses girl, boy gets girl. In its defence, at least Words & Pictures is trying to elevate itself beyond that simple formula. As the title suggests, it's providing a rigorous debate about the value of words as opposed to pictures. Which is more powerful?
The narrative is centred on two teachers in a public high school. Jack Marcus (Owen) is a high-profile English teacher who has been there so long that he's now part of the furniture. Once a published author, he's lost his motivation in recent years. He struggles to fill his students with a passion for writing and a passion for great literature. Jack's battles with alcoholism (which he refers to as a "hobby") only contribute to his problems and there are some who believe his teaching days are numbered.
Dina Delsanto (Binoche) is the school's newest recruit – an accomplished artist who has accepted a role as an art teacher as somewhat of a "fall back" position. She'd rather be displaying her work in galleries across the globe but she now suffers from the effects of rheumatoid arthritis and it has become extremely difficult for her to paint. Never trained as a teacher, she is trying to work out how best to guide and inspire her very first class.
Jack and Dina clash in the staff room and it seems to provide them both with a much-needed spark. What follows is a fun, engaging, term-long project where the students take a side and try to create a convincing argument. A mere 1,300 words are contained in the Declaration of Independence and yet it was mighty enough to create a country. On the flip side, a photo of an unknown man standing in front of a tank in Tiananmen Square showed the whole world that many were not happy with China's political leadership.
As interesting as this discussion topic may seem, Words & Pictures can't deliver as a movie. The dialogue is really clunky at times. When you see both Jack and Dina interacting with their students, you'd think you were watching a group of Harvard professors toss around ideas. Everyone feels too intelligent and the situation doesn't ring true.
The same can be said of the interaction between Clive Owen (Closer) and Juliette Binoche (The English Patient). The pair had always wanted to worth together and you can sense that they're enjoying their respective roles, but the scenarios crafted by screenwriter Gerald Di Pego (Phenomenon, Message In A Bottle) are too phoney, too manufactured. This is evident right from the start during a silly game where the two characters try to outsmart each other with five-syllable words.
Directed by 74-year-old Australian Fred Schepisi (Six Degrees Of Separation, Last Orders), Words & Pictures aims high but falls into too many of the clichés that we've grown to expect from this genre.

redpajama_set_name: RedPajamaCommonCrawl


KinerjaPay Corp., (OTCQB: KPAY), a digital payment and ecommerce platform ("KinerjaPay" or the "Company"), today released performance results for the quarter ended September 30, 2017. The Company posted quarterly transactional revenue of US$1.76 million, an 1,183% increase as compared to revenue of US$148,748 recorded in the previous quarter.
"We executed well in the third quarter with strong results across the business, and we're on track for a record year. As more consumers and businesses link to our products and services, we become a natural ecommerce solution for both parties. Our results this quarter reflect the trust customers are placing in the KinerjaPay platform," said Edwin Ng, Chairman and Chief Executive Officer at KinerjaPay Corp.
Mr. Ng went on to say "From a marketing standpoint, strong execution and demand for our phone top-up and data plan services drove more than 410,000 transactions and 10,962 new users, as compared to 115,000 transactions and 6,904 new users in the same quarter last year. Average revenue per transaction is also growing from US$3.34 last year to US$4.38 this year. Looking forward, we will continue drive innovation, productivity and market penetration to accelerate growth while further expanding our profit margins. Our momentum is a result of investments in fantastic people, product and partnerships."


text:
Conoblemmus riparius is een rechtvleugelig insect uit de familie krekels (Gryllidae). De wetenschappelijke naam van deze soort is voor het eerst geldig gepubliceerd in 1947 door Mishchenko.

Krekels

redpajama_set_name: RedPajamaWikipedia


Templates in OpenCart provide a powerful way to make your site look exactly the way you want either using a single template for the entire site or a separate template for each site section. Although it sounds like an easy task to build and maintain templates, it can be challenging to get beyond the basics and customize templates to meet your needs perfectly.
First we will install OpenCart. Then we will get familiar with the ways to modify the store configuration. After that we will start styling our OpenCart store by resetting all the browser settings. We will create a banner image step by step. We will control the positioning of our OpenCart modules. We will see how we can use different jQuery plugins to display our products effectively. We will also cover several modern footer creation recipes in this book. Towards the end of the book we will use different eye-catching menus for our store so it really starts to take shape. Finally we will learn how to create an error page and a sitemap page for our store. Once our journey through the book is complete we will have created a modern store with OpenCart and have full control over our store template.
Why do we need to customize our theme?
Tahsin Hasan is a software engineer from Bangladesh. He passed the Zend Certification Examination on 09 August, 2009 and has become the seventeenth Zend Certified Engineer (ZCE) from Bangladesh. This is the top-most certification on PHP from Zend, the developer of this outstanding scripting language. He is a tech enthusiastic and always keeps himself well-equipped with latest technologies. He has written another book, Opencart 1.4 Template Design Cookbook, with Packt. Tahsin Hasan has profound knowledge of LAMP environment. His advanced understanding of database environments and Apache web server is an asset. He has proficiency in scalability and optimizing server performance. He has worked with Symfony, CakePHP, Codeigniter and Zend Framework. Tahsin Hasan shares his ideas and knowledge on tahSin's gaRage; the address is http://newdailyblog.blogspot.com. He welcomes everyone on his blog to discuss latest web technologies. You can get him at tahsin352@gmail.com.


DVC Points Available for Rent For DIBB AP Holders to offer points for rental.
Points to rent £7 per point for stays by end March!
Big Ears 4 months ago.
Jack Daniel's 6 months ago.
Big Ears 1 year ago.
Jack Daniel's 1 year ago.
DVC Dream 3 years ago.


Rung (with a large and ever-changing audience) during Christ Church open day. 50th this year: 6. The following footnotes apply to various subsets of the band: First outside. First on small bells. Windiest quarter.


text:
HMS Northumberland trains with American task group
HMS Northumberland has tested her ability to safeguard merchant shipping during exercises with an American taskforce on her deployment off the east coast of the USA.
The Devonport-based Type 23 frigate was involved in training which culminated in a simulated transit of The Beryl Strait – a fictitious chokepoint akin to the Strait of Hormuz, the Bab-el-Mandeb Strait or Strait of Gibraltar.
During the exercise, the destroyer USS Winston S Churchill acted as a harassing enemy force and was intercepted by Northumberland with a daring manoeuvre, ordered by Executive Officer Lieutenant Commander Jeremy Brettell, in order to protect a merchant vessel in distress.
This was at the end of exercises with the 4th Amphibious Strike group, during which the frigate simulated the use of her cutting-edge Sea Ceptor missile system and deployed her Variable Depth Sonar in training countering threats above and beneath the waves.
This is the first time Northumberland has operated alongside a US Navy Amphibious Task Group. The ship's company have been at a high state of readiness, working hard in defence watches in order to ensure we are ready to respond to various above and below water threats.
Lieutenant Commander Markus Adcock
"This is the first time Northumberland has operated alongside a US Navy Amphibious Task Group," said Lieutenant Commander Markus Adcock, the Weapons Engineering Officer on board.
"The ship's company have been at a high state of readiness, working hard in defence watches in order to ensure we are ready to respond to various above and below water threats.
"Northumberland simulated using her cutting-edge Sea Ceptor missile system and has deployed Variable Depth Sonar capability to tackle such threats, demonstrating the flexibility offered by a Type 23 Frigate in a multi threat environment."
Seamlessly integrating with the US Navy Strike Group the Royal Navy warship, currently operating off the eastern seaboard of the United States, embarked a specialist United States Navy liaison officer to ensure that all the exercises were conducted safely.
Head of the Amphibious Task Group was the USS Bataan, a 41,000 ton Wasp Class Amphibious Assault Ship, named after the World War Two battle fought in the Philippines against Japan.
She can carry a mixture of aircraft including F35B Lightnings and MV22 Ospreys as well as a number of landing craft and hovercraft.
The ship also has the capability to deploy more than 1,600 Marines ashore if needed. The USS New York and USS Oak Hill also formed part of the impressive US Strike Group.
Northumberland has now re-joined the HMS Queen Elizabeth Strike Group, protecting the Carrier Strike Group from sub-surface threats, developing tactics and procedures to operate within the strike group context whilst conducting active and passive anti-submarine warfare operations.
As the deployment continues these operations will gradually escalate in complexity, utilising the ship's Variable Depth Sonar and embarked Merlin Helicopter from 814 Naval Air Squadron.
HMS Northumberland readies for Christmas patrols after jam-packed few months
HMS Northumberland's sailors are preparing for Christmas away from home as they continue on their vital mission to protect UK waters and the nation's nuclear deterrent.
Royal Navy warships monitor significant Russian presence close to UK waters
HMS Queen Elizabeth returns to Portsmouth following Strike Group debut
UK Carrier Strike Group assembles for the first time
HMS Northumberland and RFA Fort Victoria train together
HMS Northumberland (F238)
814 Naval Air Squadron


Being straightforward and kind is often the best approach. Here's how to do it.
Just like beauty, happiness lies in the eye of the beholder.
Family, Fun and Entrepreneurship -- Really?!
Entrepreneurship can be extremely rewarding -- providing tremendous challenge and financial gain.


text:
By Hakan Seyalioglu February 21, 2019 March 9, 2019 Games On Demand: Gen Con
UPDATE: We're pleased to be able to say that Gen Con has released an updated statement on their stance on abuse and harassment. Thank you to Peter and everyone on the Gen Con team!
The steering committee for Games on Demand GenCon 2019 is calling on GenCon, LLC. to strengthen their stance concerning the recent revelations around Zak Smith. The current response (linked here) is weak-spirited and does not provide satisfactory assurance that attendees can feel GenCon will take their side in cases of abuse. We strongly urge GenCon to provide a stronger statement as quickly as possible that names abusers, and distinctly calls out action that will be taken against them so attendees feel like concerns and incidents are taken seriously and dealt with appropriately.
On behalf of Games on Demand at GenCon 2019, we continue to hold the policy that neither Zak Smith nor his games are allowed at our events. Zak has a long history of terrible behavior against cherished members of our community. We believe them, and we believe Mandy, Jennifer, Hannah, and Vivka.
We're very concerned about folks not feeling safe at GenCon 2019, but also fundamentally believe in Games on Demand's presence there. Year after year, we've introduced many new players to indie roleplaying and have tried to provide a second home for our community with a safer and more compassionate space for play. We will be strengthening our guidelines for safety and response within Games on Demand to help players and volunteers feel protected and supported outside of GenCon's existing structures. Whether or not GenCon as a whole can live up to our expectations for safety, Games on Demand is committed to being a safe space for anyone who needs it.
We fully understand and support anyone who feels they might not be able to attend GenCon this year in wake of their position. Again, we urge the convention to strengthen their statement and take a strong stance against abuse.
Tagged gen con, safety.
« Games on Demand at PAX Unplugged
Volunteers Needed for Origins 2019! »


Ukulele Underground Forums > Ukulele Boards > Ukulele Marketplace > HF-3 on FMM!
View Full Version : HF-3 on FMM!
780 for a Kamaka HF-3! Someone buy this!
Great price for a Kamaka tenor, especially one with such nice Koa. Alas, the FMM blurb says "sale pending" for the Kamaka.


text:
node build
rsync -azp --delete --progress site/* vps2:/home/mike/domains/gekko.wizb.it

redpajama_set_name: RedPajamaGithub


In anticipation for AECT next week, I'm trying the WordPress blogging app. I like to live blog the sessions I attend, so if this works, it would be helpful.
In light of my last post on Publish or Perish: The Plague of Academia, I ran across a ten part series called "Scholarly Communication Must Transform," written by Gideon Burton, an Assistant Professor in the English department at one of my alma maters, Brigham Young University. In this series, Gideon discusses his views on the subject. Very interesting reads.
Scholarly communications must not wait for peer review.
1. How do you plan to design your online course to encourage free flow ideas and requests for clarification--discussion forums, email, chatrooms, team activities, other?
I generally make use the discussion boards for clarification. I also generally set up a specific discussion board for clarification, and I will also set up one for general topics or off topics. I call it the Student Union or Watercooler. I generally let the students handle the topics in there and let it be "their space." I use synchronous chat for office hours. I have it open at certain times and students can come in and ask questions as needed. I use Facebook for the same thing.
2. What thoughts do you have about timing access to different components of the lesson(s)--one-time dump, progressive access, access tied to specific assignments, allow students to work ahead or go back to catch up, other?
I've done both, and it generally depends on the content. Some content lends itself to work-at-your-own-pace, and some doesn't.
So there you have it. Nothing earth-shattering, but my opinions nonetheless. I'm actually kind of bummed about how this course is going. Not a whole lot of discussion going on, and everyone is waiting until the last minute to post and that makes it difficult for anyone to respond.
Yeah, you know what I'm talking about . . .
Over the last couple of weeks, there has been some discussion online about the worth of peer review. Is it valuable, or is it antiquated? As an Assistant Professor who goes up for tenure next fall, allow me to contribute my two cents.
I guess the real question behind this whole publish or perish (which leads to peer review) comes back to the idea that if a university is going to grant tenure to a faculty member, they want to ensure that the faculty member is actively participating in their field and contributing meaningfully to the field's body of knowledge.
Do we have a problem there? Not me, I'm good. I look forward to tenure and the security it affords me, so I can see it as a valuable right of passage for a faculty member.
See my previous post to see what my week one response was.
I completely agree with you and I do not see why grading participation is so important. Obviously the ultimate goal is to teach the topics covered in a course effectively by enforcing critical thinking. As long as a student demonstrates that he/she has learned the topics introduced through his/her performace in exams and assignments why we should force an individual to participate in a discussion by assigning grades to participation. I think having a forum to exchange ideas is helpful but a lot of people can learn without participating or by passive participation (by just reading the posts that interests him/her) in a discussion group. My approach would be to provide all the learning tools available to the students and let them choose the most effective method themselves. As instructors our job is to measure the outcome.
I don't see that there are any secrets to the educational process. Students must interact with certain amounts of information in order to make it their own. Participation has been proven to improve the levels of comprehension and absorption for the kinds of things most graduate students are expected to learn in their programs. Yes there are some things that we can learn the first time we see or hear them, but most things take time. Maybe I miss the point of this discussion but some of this is the reason I think I will always prefer the face to face discussions for some subjects.
The real issue is that the educational process is so variable. We can design, design, design to get effective educational materials and activities for our instruction, but we still can't account for the variability in humans as learners. We can design multiple entry points into the instruction (audio, video, verbal, etc.), but we'll still never hit all the learners.
As for your comment that "participation has been proven to improve the levels of comprehension and absorption for the kinds of things most graduate students are expected to learn in their programs," I'm gonna disagree with you on that, but it could just be semantics.
When I teach my instructional design courses, I spend an entire day discussing the question "what is the difference between information and instruction?" Answers are all over the place. Most instructors think they are providing instructional activities to their students, but in reality they are just disseminating information; they are regurgitating content. The difference between information and instruction is the ability to practice. Instruction will involve the ability for the learner to practice and receive feedback. Here is a link to a blog post I wrote on just that topic, with an example of what a grad student response to the question might be (mine from grad school is posted there).
If you take your quote and change it to "PRACTICE has been proven to improve the levels of comprehension and absorption for the kinds of things most graduate students are expected to learn in their programs", then I'd agree (thus my assertion that we just might be disagreeing on semantics.) Otherwise, I think your comment is an overgeneralization. Content is too variable.
I do agree with you that some content lends itself better for face to face instruction. Even as an instructional designer and educational technologist, I don't think everything should be taught online. It just doesn't work. Once I was an instructional designer for an online college algebra class. It was the hardest thing I've ever designed. The technology we have today wasn't available, and it was a nightmare. Now, with that said, online components and simulations can ENHANCE face to face instruction (as can be seen with this story about brain surgeons practicing on virtual brains), but I still want my doctors and pilots to have practiced and learned on someone else before I need their services.
So what do y'all think?
Question #1: How would you implement online discussions in your course?
Question #2: To help students become involved in an online course, what should be included in the syllabus to help guide the students toward active/successful participation?
Well, before I get to my answers, I think it may help a little to give you my background so you'll have insight into how I got here.
I feel like a kid here at the university (I'm only 41), but all through grad school all of my research was in online learning. As a master's student I was selected to design and teach the first fully online course in the state of Utah. Also while a grad student I helped design the Syllabase online course delivery system (a precursor to products like D2L). I've probably either designed or taught almost 30 different online course during my career (I worked in faculty development at my last school--much like H. and K. here). My Ph.D. is in instructional design--specifically focused in this area. So if there is ANY WAY to screw up an online course, I'll be I've done it at least twice . . .. I put all this on the table because I find this stuff VERY interesting. I'm taking the course here to help myself be better, and to hopefully share some of what I've learned. So you can take all of this with a grain of salt, but here are my answers . . .
2) As I stated in my response to someone else, "participation" in an online course is a HORRIBLE criteria. It's extremely difficult to measure effectively, and it's very subjective. Some will think they participated well, and other's simply won't care. What you have to do is structure the assignments so that you take "participation" out of the equation when it comes to assessment. Either they did the assignments, or they didn't. There are plenty of ways to make sure that learners do this. I'm not a fan of counting posts. BOOOOO! There are actually a lot of published rubrics that evaluate the content of a post rather than the number. Think about it. Would you rather have a student in your face to face class who talked constantly (online: posts all the time), or would you rather have one who inputs meaningfully into the discussion, even if it is only one comment? I'll take meaningful discussion anytime. The trick is not letting your students get away with meaningless posts. I find when I teach online I spend a lot of time responding to students saying things like: "Do you really mean that?" or "Is that what you really want to say?" See, students, if they think they can get away without having to back up their comments, will say anything. In a f2f class, we'll question them and press them for follow up. It's harder and more time consuming to do in an online format, but I'd argue it's almost MORE important to do. So long story short (too late!) I never grade "participation" as a criteria.
As for what needs to be in the syllabus? DETAIL, DETAIL, DETAIL. You have to spell it out, brother!
So I've been feeling the need to get back to blogging. It's been tough, though, as I go up for tenure this coming fall, and I've been focusing on getting my research published. Actually, I guess I've been more "micro-blogging" on FaceBook. But my heart has been here. I know there is a lot being written about the future of blogs like this, but I'll be honest with you: while it is really inspiring to hear from people who read this blog (even--especially--when they don't agree with me), my intended audience here is me.
As I said, I go up for tenure this coming fall, and that brings with it extra pressure. And last semester wasn't a good one. Yes, I got three publications, but my teaching wasn't to the level I'm accustomed to. And to make matters worse, while I research and design online instruction, they were all online courses, and I definitely didn't practice what I preach. So I figured I needed to "sharpen my saw." To do this, I enrolled in a course offered by the faculty development group here at Oklahoma State University. The title of the course? The title of this post: Preparing Online Instructors.
We're one week in, and I'm already feeling weird about taking the class. There is quite a range in technological expertise amongst the students, and an even broader range about pedagogy. To be honest, as an instructional designer and when it comes to online instruction, I feel that I'm more experienced than the instructors. Now that's not a knock on them, I just think I've done more. So as we've started discussions, I find I write a lot more detail--based on my experience--than the other learners. I'm afraid I'm going to come off looking like the "know-it-all," and I don't want that. But if you're going to ask me a question, you had better want my answer, because I'll give it to you.
I thought the course would be a good way to get back to blogging, so here's what I'm going to do. As I participate in discussions, I'm going to post my responses here. I don't really know why other than if I'm going to spend that much time writing, I'd like feedback on my ideas and thoughts from those within my field. So feel free to comment.
One more thing, I'll never identify a classmate by name. I'll use an initial.


text:
Yala National Park, Sri Lanka - A Safari Visit
Yala National Park, designated as a wildlife sanctuary in 1900, was one of the first national parks in Sri Lanka. It is the second largest national park, and the most visited.
Located in the South East region of the country, in the Southern Province and Uva Province. The national park covers nearly 400 square miles and is located about 200 miles from Colombo. Yala National Park consists of five parts, two of which are now open to the public.
We would recommend a visit to Yala National Park, a safari tour is well worth the time and effort. The diverse range of extraordinary animals in their natural setting is breathtaking.
The park is extremely important for the conservation of Sri Lankan Elephants, which are best seen between February and July. The park is also known for its birds, around 150 species of birds have been recorded at Yala, many of which have come from the northern winter. These birds include curlews, white-winged black terns and pintails. Local birds include jungle fowl, hornbills, peacocks and orioles and there are thousands of these. The avian highlight, however, is the exceedingly rare black-necked stalk, of which there are only approximately ten in the entire country. The highest leopard concentration in the world can be found here, with over 25 leopards. The leopard subspecies you may well come across are called "panthera pardus kotiya", and are unique to Sri Lanka. The best time to spot leopards is February to June or in July, when the water levels in the park are low. Hopefully you'll also get to see the shaggy-coated sloth bears or the fox-like jackals. If you're lucky, you will also see sambars, spotted deer, boars, mongooses, buffaloes, monkeys and crocodiles, all here in their hundreds.
The lightness of the forest can make seeing these animals quite a challenge; however the small grassy clearings and the waterholes the wildlife gather around are key to this park.
Alongside it's wildlife, the park is known for its fine coastlines and many cultural remains. This area hosted ancient civilisations. There is a monastic settlement called Situlpahuwa believed to have been inhabited by 12,000 people. This is now an important pilgrimage site. There a 1st-century BC vihara, which is a Buddhist complex called Magul Maha Vihara, and a 2nd-century BC chetiya, which is a Buddhist shrine called Akasa Chetiya.
Have a great time, there's so much to do!
Join 6,000+ subscribers and receive the latest news and updates about our luxury travel experiences.
Private secure and spam-free
About the author: Founding & Managing Director
George Burdon - Founding & Managing Director
MykonosGeneral
Best Places To Visit In Mykonos
Best Places To Stay In Mykonos
IbizaGeneral
Best Things to Do in Ibiza
When to Visit Ibiza
Best Places to Visit in Ibiza
Ibiza In August
GeneralIbiza
Where to Stay in Ibiza
Ibiza In July
The Organic Farms Feeding Ibiza Through The Coronavirus Crisis
Easy-to-keep new year resolution: Visit Ibiza!


text:
Update: Tugboat to Tow Hapag-Lloyd's Disabled Boxship to Halifax
Tugboat Maersk Mobilizer will help tow Yantian Express, Hapag Lloyd's disabled containership, to Halifax, Nova Scotia, the US Coast Guard said.
On January 7, 2019, the 95-meter-long tugboat was en route to the 7,506 TEU boxship which was some 1,015 miles northeast of Bermuda, according to the USCG.
The German-flagged container vessel caught fire on January 3 while it was sailing from Colombo to Halifax. The fire started in one container aboard the ship and spread to additional containers.
Efforts to extinguish the fire were launched on the same day but they were hampered by bad weather conditions.
During the weekend, the ship's crew members were evacuated to the tugboat Smit Nicobar after the fire increased in intensity.
The USCG said the tugboat remained on scene, providing firefighting assistance.
"We've been monitoring the situation to provide as much assistance as possible and keeping in open communication," Chief Petty Officer Ryan Langley, operations unit watchstander at the Fifth District command center, said.
Posted on January 8, 2019 with tags fire, Hapag-Lloyd, USCG, Yantian Express.
Crew Evacuated from Fire-Stricken Yantian Express
Hapag-Lloyd evacuated the crew of Yantian Express after the fire increased in intensity.
January 7, 2019 read more →
Fire Breaks Out on Board Hapag-Lloyd's Boxship, Crew Safe
A fire broke out in one container on the deck of Hapag-Lloyd's containership Yantian Express.
Hapag-Lloyd Chooses Scrubbers for Ten Containerships
Hapag-Lloyd ordered ten hybrid ready EGCS for its 13,000 TEU Hamburg-class vessels.
Hapag-Lloyd Christens 15,000 TEU Boxship in Rotterdam
Hapag-Lloyd has christened its 15,000 TEU ship Al Jmeliyah in Rotterdam on September 11.
Boxship Catches Fire off Singapore
A 9,092 TEU containership caught fire on August 23, while it was en route to Singapore.
Photos: Hapag-Lloyd Names LNG-Ready Behemoth
Hapag-Lloyd names containership in the United Kingdom after twenty years.
Hapag-Lloyd Dismisses CMA CGM Merger Reports
Hapag-Lloyd dismissed reports that its French counterpart CMA CGM proposed a merger between the parties.
Vard Clinches Deal for New Hapag-Lloyd Cruises Ship
Vard has secured a new contract for design and construction of a luxury expedition cruise ship for Hapag-Lloyd Cruises.
Hapag-Lloyd: MV Allegoria Suffers Main Engine Failure
MV Allegoria, a containership operated by Hapag-Lloyd, has suffered a main engine problem off Freeport.
Hapag Lloyd's Boxship Hits Three Ferries in Port of Santos
Hapag-Lloyd's Neopanamax boxship Santos Express collided with three ferries while entering the Port of Santos.
Hapag-Lloyd Sets Its First Climate Goal
Hapag-Lloyd is planning to cut its CO2 footprint by 20 percent by 2020.
Stricken MOL Boxship Taken Under Tow
A tug arrived at the location of the stricken MOL Prestige boxship and has started towing the ship.
February 6, 2018 read more →
Hapag-Lloyd Recycles Seven More Boxships
Hapag-Lloyd is sending seven older container ships to be recycled in Turkey and China.
Hapag-Lloyd to Call East Coast of Africa for the 1st Time
Hapag-Lloyd is to launch a new weekly service between the Saudi Arabian port of Jeddah and the east coast of Africa.
9 of 20 Shipping Majors Will Disappear by End of 2018
CEO of Hapag-Lloyd expects consolidation in the sector to continue this year.


Send us a list of the titles you want and the edition: Regular edition (paper), Regular edition (cloth) or Special edition. We ship through the U.S. Postal Service via Media Mail. Postage for 1-4 Books is $6.50, for 5-8 Books is $8.50 Kentucky residents add 6% sales tax.
If you would like us to ship via Priority Mail call us for that postage total. We do ship Broadsides via Priority Mail, again call for that total. Payment should be made by check or money order payable to Larkspur Press. Sorry we do not take credit cards. You are welcome to call with questions.


Earlier this month, EKWB released new X399-based monoblock for GIGABYTE X399 motherboards featuring a newly redesigned cold plate that delivers improved performance that's up to par with EKWB standards. EKWB also offered cold plate upgrades for ASUS X399 Monoblock owners and discount coupons for TR4 Water Block owners. Today, EKWB continues to release new monoblock for X399-based motherboards as EKWB releases one for MSI's X399 motherboard offerings.
This X399 platform based monoblock features a redesigned cold plate with a fin area that covers most of the Ryzen Threadripper IHS surface. The design also ensures that the monoblock cold plate is covering the entire Ryzen Threadripper processor IHS, thus enabling better thermal transfer. The base of the monoblock is made of nickel-plated electrolytic copper while the top is made of quality acrylic glass material. The main nickel plated mounting screws and brass screw-in standoffs are pre-installed so that the installation process is quick and easy.
The EK-FB MSI X399 GAMING RGB Monoblock – Nickel is now available at the EK webstore and partner resellers worldwide with an MSRP of €125.95/$139.99.


WMAS employs approximately 4,000 staff and operates from a network of over 90 Community Ambulance Stations and 16 new fleet preparation hubs across the region. The average age of the fleet is, for the first time, under five years old. There are two Emergency Operations Centres taking over 3,000 emergency '999' calls each day. Every year WMAS responds to more than one million emergency and urgent incidents completing approximately 700,000 non-emergency patient journeys. The Trust also provides emergency preparedness services, special operations and some primary care services. These core services are supported through a range of clinical and corporate functions.
What are the main issues you face in your day-to-day role?
Ensuring operations have sufficient resource available and the fleet continues to operate in a safe and compliant condition.
The rising cost of fuel is a major concern for fleet operators, what are you doing to combat this?
We factor fuel efficiency into our vehicle selection criteria, we operate one of the most fuel efficient ambulance fleets in the UK. 70% of our fuel is drawn from our own bunkers which is purchased utilising a nationally agreed framework at very competitive rates. We also use a single fuel card provider, again as part of a national framework agreement and we closely monitor their usage.
What other issues and challenges are currently facing emergency fleet operators?
This is no different to any commercial enterprise, we have challenging budget constraints that need to be met – operational demand is increasing which results in increased mileage – it's a balancing act which demands we constantly monitor and review our performance looking for ways to innovate and improve.
Is it possible to reduce costs and still offer an efficient emergency service?
Yes, through careful selection of vehicles and equipment, setting realistic replacement schedules, matching maintenance programmes to utilisation and understanding where the cost drivers are we have delivered a number of efficiencies which have reduced costs.
Do electric vehicles have a presence on the WMAS fleet and are you running any other carbon-cutting initiatives?
Not currently, we do intend taking a careful look at this later in the year with potential for trials in some of our non front-line operations.
From a vehicle perspective – converted Ambulances and Response Cars are fitted with various technology that require our engineers to be at the top of their game to maximize vehicle availability.
We are currently working towards implementation of CCTV and a system to provide us with vehicle telemetry for a number of our front line emergency vehicles. The Fleet team implemented a new fleet management system (Fleetwave 2) into our operation at the end of 2013 which is transforming the way the fleet management operation is run.
How do you make decisions about which vehicles and equipment you source for your fleets?
With the inclusion of a number of stakeholders involved within the Trust, we consider a number of factors, clearly purchase price is important but we also analyse a number of other criteria such as, whole life costs, aftersales support, quality, use of sustainable products (particularly in converted specialist vehicles).
What is the most rewarding element of your role?
Being part of a professional team in Fleet Services who continually manage to surprise me with the dedication shown to deliver day in, day out, regardless of the size of the mountain and knowing as a team we make a difference to the quality of patient care delivered.
…and what is the most frustrating?
Do you think there is a place for shared services within the public sector?
Yes, I think there is opportunity providing it is approached in the correct manner. West Midlands Police have recently agreed to support our motorcycle response fleet, with their specialist knowledge of this equipment. It made perfect sense to partner with them rather than investing additional funding into setting up our own support.


text:
Why players will [always] choose to play...
Mo' matches, mo' money, no problem.
In the last couple of posts I've had a pop at FIFPro's At The Limit report.
It outlines their proposal for reducing the workload of elite footballers. Suggesting mandatory pre and mid-season breaks, caps on the number of matches per season and enforced rest periods between games.
It's at best naive. At worst, nonsense. Not because it doesn't make valid points. It does. But it completely overlooks two critical factors: Money. And football's relentless pursuit of it.
And I'm not just talking about the TV companies, governing bodies and boardroom fat cats. All of whom would swallow their collective tongues at the prospect of less product to flog to the masses.
(Sorry, that last line should end: '…at the prospect of less of the beautiful game to share with the worldwide football family.' Pesky predictive text.)
Players are also guilty.
Because fewer matches means less appearance money. Less exposure to bigger clubs, better contracts and more lucrative image rights.
every match you miss means one of the perhaps half dozen squad members battling for the same shirt is out there strutting his stuff. And no-one wants that.
So if it means overplaying, you'll do it. If it means playing at 75% fit, you'll do it. If it means having a pre-match injection to block out the 25% that's broken, torn or strained, you'll do it.
And if it means lying to your manager… Pfft! What do you think…?!
Spoiler alert: there is no such thing as a magic sponge
I regularly played with cortisone injections. Not so I wouldn't miss a Champions League final… or to get me through a World Cup… no, no, no.
I did it to collect fifty quid appearance money on a wet, windy Friday night at Rochdale. It doesn't always have to be a Tuesday night at Stoke, y'know!
Okay, we are talking late 80s, early 90s in Division Three and Four – that's League One and Two for any millennials or iGens* reading this – so the numbers might've changed, but I guarantee the attitudes haven't.
*Note: Of course, no actual millennials or iGens will be reading this. They'll be race-trolling a footballer on Twitterstagram, or doing a knife crime.
The difference between a teammate and a mate
I didn't even know what cortisone was. But I did know I wanted my £50 appearance bonus. I also knew I didn't want some other - quicker, fitter, better – player taking my place. And quite possibly keeping it.
So I had to play. And that meant a pre-match jab. Which sounds harmless. Quaint even. Certainly no indicator of the bone-grinding agony to come in your late 40s every time you drive, climb stairs or spend more than four minutes on an aeroplane.
But professional football is a cut-throat business. Most people will understand that. What might surprise some is the extent and proximity of the throat-cutting. And how far beyond the 90+3 minutes on the pitch it goes.
That, brothers and sisters, is playtime. All you have to worry about during the match is the other team.
There is not a player playing who hasn't been 'done' by a team-mate. Typically one who plays in your position. Often on a Friday. Occasionally on the morning of a game.
The late (tackle) fitness test
In this next bit, the names have been left out to protect the guilty, but the events are actual.
The year is the late 1980s. The setting is the English lower divisions. It's the morning of a non-event match between two non-descript teams. A senior player is giving a fitness test to a first-year professional who's had a spell out injured.
The younger player – who we'll call… erm… Natt Mesbitt - has missed the last six weeks with a broken foot (now called a metatarsal injury). The senior player – who we'll call, er… Blive Caker – had been out of the first-team picture for a while and reached that pitiful stage where he is helping out the coaching staff on match days.
Anyway, the foot in question feels fine. No discomfort from running, jumping, or ball-striking — all good.
Young Natt is thinking that £50 appearance money has got his name all over it. He'll be out on the town tonight!
"How's it feel?"
"Great. 100%."
"Right, let's do a couple of block tackles."
Couple of gentle 50/50s. Side-foot, stationary ball. Nice and steady. Feels fine.
Now a bit firmer. Up the resistance. Rolling ball. But nothing silly – after all, we're in ankle socks. No strapping or shin pads or anything. Not a twinge. All good.
Young Natt's thinking he might even wear the club blazer out tonight. See if he can get a bit of VIP action in Ritzy's nightclub…
"Okay, one more and we're done…"
High. Late. Studs up. Six weeks out.
"…well, you're gonna get them in the game son…" Said the smirking senior player as he walked towards the dressing rooms.
Guess who started the match. And pocketed my £50 appearance money. And guess who stayed in that night.
Matt Nesbitt swapped his short, unspectacular but joyous football career for a much longer, successful one as a football tipster.


Design Advocacy Group | Winners Of The "At Home In A Rowhouse: A 21st Century Rowhouse Design Competition"
Winners Of The "At Home In A Rowhouse: A 21st Century Rowhouse Design Competition"
We would like to thank all who entered the "At Home in a Rowhouse: A 21st Century Rowhouse Design Competition" for innovations on one of Philadelphia's most iconic buildings: the rowhouse. Congratulations to CM(SE)X(Y)-1 by Chris Mulford and Lindsay Rule, as well as FLEXIBLE HOUSE by Uk Jung who were selected as the competition's winners! For more information, please see the PlanPhilly article below.


text:
Critical 'Shellshock' Bug Affects Millions of Devices
252525 SepSepSep 201420142014 Chris Fairey
A critical security vulnerability, dubbed 'Shellshock', in one of the most widely used programs, Bash (Bourne Again Shell) could topple the recent Heartbleed vulnerability as the most severe issue to affect the Internet.
What is Bash?
Bash is a program that is present on millions of devices, and all it does is provide a method for users or other programs to interact with them.
It provides what is known as a shell, that allows users of a device, or programs running on it to issue commands to the operating system and receive responses.
If you are a Windows user, the PowerShell or Command Prompt serve the same purpose. For the OS X users out there, OS X uses Bash, and you can access it yourself via the 'Terminal' application.
How Serious is Shellshock?
Various security companies, along with US-CERT, have labelled Shellshock as the most severe vulnerability to affect devices. US-CERT has given it a score of 10.0.
Simply put, it allows an attacker to execute commands on a vulnerable device by modifying the contents of so-called Environment Variables.
What is an Environment Variable?
An environment variable is a way of storing information that can be accessed by other programs on a system. A typical example of an environment variable you may find on your computer is the PATH variable.
The PATH variable stores a list of directories where your system can find programs/commands to execute - it saves you from having to remember where they are every time you want to use them.
What makes Shellshock so deadly is that there are lots of ways for you to modify environment variables, including via other programs such as a web server.
This means that a system vulnerable to Shellshock could be compromised pretty easily if an attacker placed some code to set or change environment variables in a form on your website, and the server processed the instruction.
How Does Shellshock Work?
In a nutshell, Shellshock is a flaw in how Bash processes environment variables. It exists because Bash allows a user to specify a command after terminating a function definition.
Simply put, in order to exploit a device vulnerable to Shellshock, an attacker would set an environment variable similar to this:
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
The first part of this command says that we are defining an environment variable called 'x', which contains an empty function and an 'echo' instruction that prints the word vulnerable to the prompt. We then execute another instance of Bash and tell it to echo 'this is a test'.
If this is run on a device vulnerable to Shellshock, you will get the following output:
This is because Bash allows users to not only export individual values to environment variables, but also entire functions. However, it should be ignoring the echo instruction that comes after the function definition - it isn't.
This makes it possible for an attacker to trick Bash into executing arbitrary commands by simply overriding existing environment variables that are set or used by web applications, and do so without any authentication checks.
This could enable them to compromise other machines, or extract sensitive data from the affected device.
If you use either Linux or Mac OS X, there should be updates to address this vulnerability available already (although there are reports that the fix developed by the developers of Bash is incomplete, and therefore may still lead to your system being vulnerable under certain circumstances).
It is also worth noting that Bash is often included in many consumer electronics devices (broadband routers, TVs, Blu-ray Players, etc.) and therefore security experts, including us, are urging consumers to check with device manufacturers for updates.
If you run your own Linux-based servers, or host websites on servers provided by hosting companies, we advise that you check for and install any updates immediately. If in doubt, contact your hosting provider and seek their advice.
Privacy Policy (updated 24th May 2018)
DigiPest - owned and operated by Christopher Fairey. VAT Registration No: GB 287 7563 43
© 2019-2022 DigiPest. All rights reserved.


text:
module Ci
  class Build < CommitStatus
    prepend ArtifactMigratable
    include Ci::Processable
    include Ci::Metadatable
    include TokenAuthenticatable
    include AfterCommitQueue
    include ObjectStorage::BackgroundMove
    include Presentable
    include Importable
    include IgnorableColumn
    include Gitlab::Utils::StrongMemoize
    include Deployable
    include HasRef

    BuildArchivedError = Class.new(StandardError)

    ignore_column :commands

    belongs_to :project, inverse_of: :builds
    belongs_to :runner
    belongs_to :trigger_request
    belongs_to :erased_by, class_name: 'User'

    RUNNER_FEATURES = {
      upload_multiple_artifacts: -> (build) { build.publishes_artifacts_reports? }
    }.freeze

    has_one :deployment, as: :deployable, class_name: 'Deployment'
    has_many :trace_sections, class_name: 'Ci::BuildTraceSection'
    has_many :trace_chunks, class_name: 'Ci::BuildTraceChunk', foreign_key: :build_id

    has_many :job_artifacts, class_name: 'Ci::JobArtifact', foreign_key: :job_id, dependent: :destroy, inverse_of: :job # rubocop:disable Cop/ActiveRecordDependent

    Ci::JobArtifact.file_types.each do |key, value|
      has_one :"job_artifacts_#{key}", -> { where(file_type: value) }, class_name: 'Ci::JobArtifact', inverse_of: :job, foreign_key: :job_id
    end

    has_one :runner_session, class_name: 'Ci::BuildRunnerSession', validate: true, inverse_of: :build

    accepts_nested_attributes_for :runner_session

    delegate :url, to: :runner_session, prefix: true, allow_nil: true
    delegate :terminal_specification, to: :runner_session, allow_nil: true
    delegate :gitlab_deploy_token, to: :project
    delegate :trigger_short_token, to: :trigger_request, allow_nil: true

    ##
    # The "environment" field for builds is a String, and is the unexpanded name!
    #
    def persisted_environment
      return unless has_environment?

      strong_memoize(:persisted_environment) do
        Environment.find_by(name: expanded_environment_name, project: project)
      end
    end

    serialize :options # rubocop:disable Cop/ActiveRecordSerialize
    serialize :yaml_variables, Gitlab::Serializer::Ci::Variables # rubocop:disable Cop/ActiveRecordSerialize

    delegate :name, to: :project, prefix: true

    validates :coverage, numericality: true, allow_blank: true
    validates :ref, presence: true

    scope :unstarted, ->() { where(runner_id: nil) }
    scope :ignore_failures, ->() { where(allow_failure: false) }
    scope :with_artifacts_archive, ->() do
      where('(artifacts_file IS NOT NULL AND artifacts_file <> ?) OR EXISTS (?)',
        '', Ci::JobArtifact.select(1).where('ci_builds.id = ci_job_artifacts.job_id').archive)
    end

    scope :with_existing_job_artifacts, ->(query) do
      where('EXISTS (?)', ::Ci::JobArtifact.select(1).where('ci_builds.id = ci_job_artifacts.job_id').merge(query))
    end

    scope :with_archived_trace, ->() do
      with_existing_job_artifacts(Ci::JobArtifact.trace)
    end

    scope :without_archived_trace, ->() do
      where('NOT EXISTS (?)', Ci::JobArtifact.select(1).where('ci_builds.id = ci_job_artifacts.job_id').trace)
    end

    scope :with_test_reports, ->() do
      with_existing_job_artifacts(Ci::JobArtifact.test_reports)
        .eager_load_job_artifacts
    end

    scope :eager_load_job_artifacts, -> { includes(:job_artifacts) }

    scope :with_artifacts_stored_locally, -> { with_artifacts_archive.where(artifacts_file_store: [nil, LegacyArtifactUploader::Store::LOCAL]) }
    scope :with_archived_trace_stored_locally, -> { with_archived_trace.where(artifacts_file_store: [nil, LegacyArtifactUploader::Store::LOCAL]) }
    scope :with_artifacts_not_expired, ->() { with_artifacts_archive.where('artifacts_expire_at IS NULL OR artifacts_expire_at > ?', Time.now) }
    scope :with_expired_artifacts, ->() { with_artifacts_archive.where('artifacts_expire_at < ?', Time.now) }
    scope :last_month, ->() { where('created_at > ?', Date.today - 1.month) }
    scope :manual_actions, ->() { where(when: :manual, status: COMPLETED_STATUSES + %i[manual]) }
    scope :scheduled_actions, ->() { where(when: :delayed, status: COMPLETED_STATUSES + %i[scheduled]) }
    scope :ref_protected, -> { where(protected: true) }
    scope :with_live_trace, -> { where('EXISTS (?)', Ci::BuildTraceChunk.where('ci_builds.id = ci_build_trace_chunks.build_id').select(1)) }

    scope :matches_tag_ids, -> (tag_ids) do
      matcher = ::ActsAsTaggableOn::Tagging
        .where(taggable_type: CommitStatus.name)
        .where(context: 'tags')
        .where('taggable_id = ci_builds.id')
        .where.not(tag_id: tag_ids).select('1')

      where("NOT EXISTS (?)", matcher)
    end

    scope :with_any_tags, -> do
      matcher = ::ActsAsTaggableOn::Tagging
        .where(taggable_type: CommitStatus.name)
        .where(context: 'tags')
        .where('taggable_id = ci_builds.id').select('1')

      where("EXISTS (?)", matcher)
    end

    mount_uploader :legacy_artifacts_file, LegacyArtifactUploader, mount_on: :artifacts_file
    mount_uploader :legacy_artifacts_metadata, LegacyArtifactUploader, mount_on: :artifacts_metadata

    acts_as_taggable

    add_authentication_token_field :token, encrypted: true, fallback: true

    before_save :update_artifacts_size, if: :artifacts_file_changed?
    before_save :ensure_token
    before_destroy { unscoped_project }

    after_create unless: :importing? do |build|
      run_after_commit { BuildHooksWorker.perform_async(build.id) }
    end

    after_save :update_project_statistics_after_save, if: :artifacts_size_changed?
    after_destroy :update_project_statistics_after_destroy, unless: :project_destroyed?

    class << self
      # This is needed for url_for to work,
      # as the controller is JobsController
      def model_name
        ActiveModel::Name.new(self, nil, 'job')
      end

      def first_pending
        pending.unstarted.order('created_at ASC').first
      end

      def retry(build, current_user)
        # rubocop: disable CodeReuse/ServiceClass
        Ci::RetryBuildService
          .new(build.project, current_user)
          .execute(build)
        # rubocop: enable CodeReuse/ServiceClass
      end
    end

    state_machine :status do
      event :actionize do
        transition created: :manual
      end

      event :schedule do
        transition created: :scheduled
      end

      event :unschedule do
        transition scheduled: :manual
      end

      event :enqueue_scheduled do
        transition scheduled: :pending, if: ->(build) do
          build.scheduled_at && build.scheduled_at < Time.now
        end
      end

      before_transition scheduled: any do |build|
        build.scheduled_at = nil
      end

      before_transition created: :scheduled do |build|
        build.scheduled_at = build.options_scheduled_at
      end

      after_transition created: :scheduled do |build|
        build.run_after_commit do
          Ci::BuildScheduleWorker.perform_at(build.scheduled_at, build.id)
        end
      end

      after_transition any => [:pending] do |build|
        build.run_after_commit do
          BuildQueueWorker.perform_async(id)
        end
      end

      after_transition pending: :running do |build|
        build.deployment&.run

        build.run_after_commit do
          BuildHooksWorker.perform_async(id)
        end
      end

      after_transition any => [:success, :failed, :canceled] do |build|
        build.run_after_commit do
          BuildFinishedWorker.perform_async(id)
        end
      end

      after_transition any => [:success] do |build|
        build.deployment&.succeed

        build.run_after_commit do
          BuildSuccessWorker.perform_async(id)
          PagesWorker.perform_async(:deploy, id) if build.pages_generator?
        end
      end

      before_transition any => [:failed] do |build|
        next unless build.project
        next unless build.deployment

        begin
          build.deployment.drop!
        rescue => e
          Gitlab::Sentry.track_exception(e, extra: { build_id: build.id })
        end

        true
      end

      after_transition any => [:failed] do |build|
        next unless build.project

        if build.retry_failure?
          begin
            Ci::Build.retry(build, build.user)
          rescue Gitlab::Access::AccessDeniedError => ex
            Rails.logger.error "Unable to auto-retry job #{build.id}: #{ex}"
          end
        end
      end

      after_transition pending: :running do |build|
        build.ensure_metadata.update_timeout_state
      end

      after_transition running: any do |build|
        Ci::BuildRunnerSession.where(build: build).delete_all
      end

      after_transition any => [:skipped, :canceled] do |build|
        build.deployment&.cancel
      end
    end

    def detailed_status(current_user)
      Gitlab::Ci::Status::Build::Factory
        .new(self, current_user)
        .fabricate!
    end

    def other_manual_actions
      pipeline.manual_actions.where.not(name: name)
    end

    def other_scheduled_actions
      pipeline.scheduled_actions.where.not(name: name)
    end

    def pages_generator?
      Gitlab.config.pages.enabled &&
        self.name == 'pages'
    end

    def archived?
      return true if degenerated?

      archive_builds_older_than = Gitlab::CurrentSettings.current_application_settings.archive_builds_older_than
      archive_builds_older_than.present? && created_at < archive_builds_older_than
    end

    def playable?
      action? && !archived? && (manual? || scheduled? || retryable?)
    end

    def schedulable?
      self.when == 'delayed' && options[:start_in].present?
    end

    def options_scheduled_at
      ChronicDuration.parse(options[:start_in])&.seconds&.from_now
    end

    def action?
      %w[manual delayed].include?(self.when)
    end

    # rubocop: disable CodeReuse/ServiceClass
    def play(current_user)
      Ci::PlayBuildService
        .new(project, current_user)
        .execute(self)
    end
    # rubocop: enable CodeReuse/ServiceClass

    def cancelable?
      active? || created?
    end

    def retryable?
      !archived? && (success? || failed? || canceled?)
    end

    def retries_count
      pipeline.builds.retried.where(name: self.name).count
    end

    def retries_max
      normalized_retry.fetch(:max, 0)
    end

    def retry_when
      normalized_retry.fetch(:when, ['always'])
    end

    def retry_failure?
      return false if retries_max.zero? || retries_count >= retries_max

      retry_when.include?('always') || retry_when.include?(failure_reason.to_s)
    end

    def latest?
      !retried?
    end

    def expanded_environment_name
      return unless has_environment?

      strong_memoize(:expanded_environment_name) do
        ExpandVariables.expand(environment, simple_variables)
      end
    end

    def has_environment?
      environment.present?
    end

    def starts_environment?
      has_environment? && self.environment_action == 'start'
    end

    def stops_environment?
      has_environment? && self.environment_action == 'stop'
    end

    def environment_action
      self.options.fetch(:environment, {}).fetch(:action, 'start') if self.options
    end

    def has_deployment?
      !!self.deployment
    end

    def outdated_deployment?
      success? && !deployment.try(:last?)
    end

    def depends_on_builds
      # Get builds of the same type
      latest_builds = self.pipeline.builds.latest

      # Return builds from previous stages
      latest_builds.where('stage_idx < ?', stage_idx)
    end

    def triggered_by?(current_user)
      user == current_user
    end

    def on_stop
      options&.dig(:environment, :on_stop)
    end

    # A slugified version of the build ref, suitable for inclusion in URLs and
    # domain names. Rules:
    #
    #   * Lowercased
    #   * Anything not matching [a-z0-9-] is replaced with a -
    #   * Maximum length is 63 bytes
    #   * First/Last Character is not a hyphen
    def ref_slug
      Gitlab::Utils.slugify(ref.to_s)
    end

    ##
    # Variables in the environment name scope.
    #
    def scoped_variables(environment: expanded_environment_name)
      Gitlab::Ci::Variables::Collection.new.tap do |variables|
        variables.concat(predefined_variables)
        variables.concat(project.predefined_variables)
        variables.concat(pipeline.predefined_variables)
        variables.concat(runner.predefined_variables) if runner
        variables.concat(project.deployment_variables(environment: environment)) if environment
        variables.concat(yaml_variables)
        variables.concat(user_variables)
        variables.concat(secret_group_variables)
        variables.concat(secret_project_variables(environment: environment))
        variables.concat(trigger_request.user_variables) if trigger_request
        variables.concat(pipeline.variables)
        variables.concat(pipeline.pipeline_schedule.job_variables) if pipeline.pipeline_schedule
      end
    end

    ##
    # Variables that do not depend on the environment name.
    #
    def simple_variables
      strong_memoize(:simple_variables) do
        scoped_variables(environment: nil).to_runner_variables
      end
    end

    ##
    # All variables, including persisted environment variables.
    #
    def variables
      Gitlab::Ci::Variables::Collection.new
        .concat(persisted_variables)
        .concat(scoped_variables)
        .concat(persisted_environment_variables)
        .to_runner_variables
    end

    ##
    # Regular Ruby hash of scoped variables, without duplicates that are
    # possible to be present in an array of hashes returned from `variables`.
    #
    def scoped_variables_hash
      scoped_variables.to_hash
    end

    def features
      { trace_sections: true }
    end

    def merge_request
      return @merge_request if defined?(@merge_request)

      @merge_request ||=
        begin
          merge_requests = MergeRequest.includes(:latest_merge_request_diff)
            .where(source_branch: ref,
                   source_project: pipeline.project)
            .reorder(iid: :desc)

          merge_requests.find do |merge_request|
            merge_request.commit_shas.include?(pipeline.sha)
          end
        end
    end

    def repo_url
      return unless token

      auth = "gitlab-ci-token:#{token}@"
      project.http_url_to_repo.sub(%r{^https?://}) do |prefix|
        prefix + auth
      end
    end

    def allow_git_fetch
      project.build_allow_git_fetch
    end

    def update_coverage
      coverage = trace.extract_coverage(coverage_regex)
      update(coverage: coverage) if coverage.present?
    end

    # rubocop: disable CodeReuse/ServiceClass
    def parse_trace_sections!
      ExtractSectionsFromBuildTraceService.new(project, user).execute(self)
    end
    # rubocop: enable CodeReuse/ServiceClass

    def trace
      Gitlab::Ci::Trace.new(self)
    end

    def has_trace?
      trace.exist?
    end

    def has_job_artifacts?
      job_artifacts.any?
    end

    def has_old_trace?
      old_trace.present?
    end

    def trace=(data)
      raise NotImplementedError
    end

    def old_trace
      read_attribute(:trace)
    end

    def erase_old_trace!
      return unless has_old_trace?

      update_column(:trace, nil)
    end

    def needs_touch?
      Time.now - updated_at > 15.minutes.to_i
    end

    def valid_token?(token)
      self.token && ActiveSupport::SecurityUtils.variable_size_secure_compare(token, self.token)
    end

    def has_tags?
      tag_list.any?
    end

    def any_runners_online?
      project.any_runners? { |runner| runner.active? && runner.online? && runner.can_pick?(self) }
    end

    def stuck?
      pending? && !any_runners_online?
    end

    def execute_hooks
      return unless project

      build_data = Gitlab::DataBuilder::Build.build(self)
      project.execute_hooks(build_data.dup, :job_hooks)
      project.execute_services(build_data.dup, :job_hooks)
    end

    def browsable_artifacts?
      artifacts_metadata?
    end

    def artifacts_metadata_entry(path, **options)
      artifacts_metadata.open do |metadata_stream|
        metadata = Gitlab::Ci::Build::Artifacts::Metadata.new(
          metadata_stream,
          path,
          **options)

        metadata.to_entry
      end
    end

    # and use that for `ExpireBuildInstanceArtifactsWorker`?
    def erase_erasable_artifacts!
      job_artifacts.erasable.destroy_all # rubocop: disable DestroyAll
      erase_old_artifacts!
    end

    def erase(opts = {})
      return false unless erasable?

      job_artifacts.destroy_all # rubocop: disable DestroyAll
      erase_old_artifacts!
      erase_trace!
      update_erased!(opts[:erased_by])
    end

    def erasable?
      complete? && (artifacts? || has_job_artifacts? || has_trace?)
    end

    def erased?
      !self.erased_at.nil?
    end

    def artifacts_expired?
      artifacts_expire_at && artifacts_expire_at < Time.now
    end

    def artifacts_expire_in
      artifacts_expire_at - Time.now if artifacts_expire_at
    end

    def artifacts_expire_in=(value)
      self.artifacts_expire_at =
        if value
          ChronicDuration.parse(value)&.seconds&.from_now
        end
    end

    def has_expiring_artifacts?
      artifacts_expire_at.present? && artifacts_expire_at > Time.now
    end

    def keep_artifacts!
      self.update(artifacts_expire_at: nil)
      self.job_artifacts.update_all(expire_at: nil)
    end

    def artifacts_file_for_type(type)
      file = job_artifacts.find_by(file_type: Ci::JobArtifact.file_types[type])&.file
      # TODO: to be removed once legacy artifacts is removed
      file ||= legacy_artifacts_file if type == :archive
      file
    end

    def coverage_regex
      super || project.try(:build_coverage_regex)
    end

    def user_variables
      Gitlab::Ci::Variables::Collection.new.tap do |variables|
        break variables if user.blank?

        variables.append(key: 'GITLAB_USER_ID', value: user.id.to_s)
        variables.append(key: 'GITLAB_USER_EMAIL', value: user.email)
        variables.append(key: 'GITLAB_USER_LOGIN', value: user.username)
        variables.append(key: 'GITLAB_USER_NAME', value: user.name)
      end
    end

    def secret_group_variables
      return [] unless project.group

      project.group.ci_variables_for(git_ref, project)
    end

    def secret_project_variables(environment: persisted_environment)
      project.ci_variables_for(ref: git_ref, environment: environment)
    end

    def steps
      [Gitlab::Ci::Build::Step.from_commands(self),
       Gitlab::Ci::Build::Step.from_after_script(self)].compact
    end

    def image
      Gitlab::Ci::Build::Image.from_image(self)
    end

    def services
      Gitlab::Ci::Build::Image.from_services(self)
    end

    def cache
      cache = options[:cache]

      if cache && project.jobs_cache_index
        cache = cache.merge(
          key: "#{cache[:key]}-#{project.jobs_cache_index}")
      end

      [cache]
    end

    def credentials
      Gitlab::Ci::Build::Credentials::Factory.new(self).create!
    end

    def dependencies
      return [] if empty_dependencies?

      depended_jobs = depends_on_builds

      return depended_jobs unless options[:dependencies].present?

      depended_jobs.select do |job|
        options[:dependencies].include?(job.name)
      end
    end

    def empty_dependencies?
      options[:dependencies]&.empty?
    end

    def has_valid_build_dependencies?
      return true if Feature.enabled?('ci_disable_validates_dependencies')

      dependencies.all?(&:valid_dependency?)
    end

    def valid_dependency?
      return false if artifacts_expired?
      return false if erased?

      true
    end

    def runner_required_feature_names
      strong_memoize(:runner_required_feature_names) do
        RUNNER_FEATURES.select do |feature, method|
          method.call(self)
        end.keys
      end
    end

    def supported_runner?(features)
      runner_required_feature_names.all? do |feature_name|
        features&.dig(feature_name)
      end
    end

    def publishes_artifacts_reports?
      options&.dig(:artifacts, :reports)&.any?
    end

    def hide_secrets(trace)
      return unless trace

      trace = trace.dup
      Gitlab::Ci::MaskSecret.mask!(trace, project.runners_token) if project
      Gitlab::Ci::MaskSecret.mask!(trace, token) if token
      trace
    end

    def serializable_hash(options = {})
      super(options).merge(when: read_attribute(:when))
    end

    def has_terminal?
      running? && runner_session_url.present?
    end

    def collect_test_reports!(test_reports)
      test_reports.get_suite(group_name).tap do |test_suite|
        each_report(Ci::JobArtifact::TEST_REPORT_FILE_TYPES) do |file_type, blob|
          Gitlab::Ci::Parsers.fabricate!(file_type).parse!(blob, test_suite)
        end
      end
    end

    # Virtual deployment status depending on the environment status.
    def deployment_status
      return nil unless starts_environment?

      if success?
        return successful_deployment_status
      elsif failed?
        return :failed
      end

      :creating
    end

    private

    def erase_old_artifacts!
      # TODO: To be removed once we get rid of
      remove_artifacts_file!
      remove_artifacts_metadata!
      save
    end

    def successful_deployment_status
      if deployment&.last?
        :last
      else
        :out_of_date
      end
    end

    def each_report(report_types)
      job_artifacts_for_types(report_types).each do |report_artifact|
        report_artifact.each_blob do |blob|
          yield report_artifact.file_type, blob
        end
      end
    end

    def job_artifacts_for_types(report_types)
      # Use select to leverage cached associations and avoid N+1 queries
      job_artifacts.select { |artifact| artifact.file_type.in?(report_types) }
    end

    def update_artifacts_size
      self.artifacts_size = legacy_artifacts_file&.size
    end

    def erase_trace!
      trace.erase!
    end

    def update_erased!(user = nil)
      self.update(erased_by: user, erased_at: Time.now, artifacts_expire_at: nil)
    end

    def unscoped_project
      @unscoped_project ||= Project.unscoped.find_by(id: project_id)
    end

    CI_REGISTRY_USER = 'gitlab-ci-token'.freeze

    def persisted_variables
      Gitlab::Ci::Variables::Collection.new.tap do |variables|
        break variables unless persisted?

        variables
          .concat(pipeline.persisted_variables)
          .append(key: 'CI_JOB_ID', value: id.to_s)
          .append(key: 'CI_JOB_URL', value: Gitlab::Routing.url_helpers.project_job_url(project, self))
          .append(key: 'CI_JOB_TOKEN', value: token.to_s, public: false)
          .append(key: 'CI_BUILD_ID', value: id.to_s)
          .append(key: 'CI_BUILD_TOKEN', value: token.to_s, public: false)
          .append(key: 'CI_REGISTRY_USER', value: CI_REGISTRY_USER)
          .append(key: 'CI_REGISTRY_PASSWORD', value: token.to_s, public: false)
          .append(key: 'CI_REPOSITORY_URL', value: repo_url.to_s, public: false)
          .concat(deploy_token_variables)
      end
    end

    def predefined_variables # rubocop:disable Metrics/AbcSize
      Gitlab::Ci::Variables::Collection.new.tap do |variables|
        variables.append(key: 'CI', value: 'true')
        variables.append(key: 'GITLAB_CI', value: 'true')
        variables.append(key: 'GITLAB_FEATURES', value: project.licensed_features.join(','))
        variables.append(key: 'CI_SERVER_NAME', value: 'GitLab')
        variables.append(key: 'CI_SERVER_VERSION', value: Gitlab::VERSION)
        variables.append(key: 'CI_SERVER_VERSION_MAJOR', value: Gitlab.version_info.major.to_s)
        variables.append(key: 'CI_SERVER_VERSION_MINOR', value: Gitlab.version_info.minor.to_s)
        variables.append(key: 'CI_SERVER_VERSION_PATCH', value: Gitlab.version_info.patch.to_s)
        variables.append(key: 'CI_SERVER_REVISION', value: Gitlab.revision)
        variables.append(key: 'CI_JOB_NAME', value: name)
        variables.append(key: 'CI_JOB_STAGE', value: stage)
        variables.append(key: 'CI_COMMIT_SHA', value: sha)
        variables.append(key: 'CI_COMMIT_SHORT_SHA', value: short_sha)
        variables.append(key: 'CI_COMMIT_BEFORE_SHA', value: before_sha)
        variables.append(key: 'CI_COMMIT_REF_NAME', value: ref)
        variables.append(key: 'CI_COMMIT_REF_SLUG', value: ref_slug)
        variables.append(key: "CI_COMMIT_TAG", value: ref) if tag?
        variables.append(key: "CI_PIPELINE_TRIGGERED", value: 'true') if trigger_request
        variables.append(key: "CI_JOB_MANUAL", value: 'true') if action?
        variables.append(key: "CI_NODE_INDEX", value: self.options[:instance].to_s) if self.options&.include?(:instance)
        variables.append(key: "CI_NODE_TOTAL", value: (self.options&.dig(:parallel) || 1).to_s)
        variables.concat(legacy_variables)
      end
    end

    def legacy_variables
      Gitlab::Ci::Variables::Collection.new.tap do |variables|
        variables.append(key: 'CI_BUILD_REF', value: sha)
        variables.append(key: 'CI_BUILD_BEFORE_SHA', value: before_sha)
        variables.append(key: 'CI_BUILD_REF_NAME', value: ref)
        variables.append(key: 'CI_BUILD_REF_SLUG', value: ref_slug)
        variables.append(key: 'CI_BUILD_NAME', value: name)
        variables.append(key: 'CI_BUILD_STAGE', value: stage)
        variables.append(key: "CI_BUILD_TAG", value: ref) if tag?
        variables.append(key: "CI_BUILD_TRIGGERED", value: 'true') if trigger_request
        variables.append(key: "CI_BUILD_MANUAL", value: 'true') if action?
      end
    end

    def persisted_environment_variables
      Gitlab::Ci::Variables::Collection.new.tap do |variables|
        break variables unless persisted? && persisted_environment.present?

        variables.concat(persisted_environment.predefined_variables)

        # Here we're passing unexpanded environment_url for runner to expand,
        # and we need to make sure that CI_ENVIRONMENT_NAME and
        # CI_ENVIRONMENT_SLUG so on are available for the URL be expanded.
        variables.append(key: 'CI_ENVIRONMENT_URL', value: environment_url) if environment_url
      end
    end

    def deploy_token_variables
      Gitlab::Ci::Variables::Collection.new.tap do |variables|
        break variables unless gitlab_deploy_token

        variables.append(key: 'CI_DEPLOY_USER', value: gitlab_deploy_token.username)
        variables.append(key: 'CI_DEPLOY_PASSWORD', value: gitlab_deploy_token.token, public: false)
      end
    end

    def environment_url
      options&.dig(:environment, :url) || persisted_environment&.external_url
    end

    # The format of the retry option changed in GitLab 11.5: Before it was
    # integer only, after it is a hash. New builds are created with the new
    # format, but builds created before GitLab 11.5 and saved in database still
    # have the old integer only format. This method returns the retry option
    # normalized as a hash in 11.5+ format.
    def normalized_retry
      strong_memoize(:normalized_retry) do
        value = options&.dig(:retry)
        value = value.is_a?(Integer) ? { max: value } : value.to_h
        value.with_indifferent_access
      end
    end

    def build_attributes_from_config
      return {} unless pipeline.config_processor

      pipeline.config_processor.build_attributes(name)
    end

    def update_project_statistics_after_save
      update_project_statistics(read_attribute(:artifacts_size).to_i - artifacts_size_was.to_i)
    end

    def update_project_statistics_after_destroy
      update_project_statistics(-artifacts_size)
    end

    def update_project_statistics(difference)
      ProjectStatistics.increment_statistic(project_id, :build_artifacts_size, difference)
    end

    def project_destroyed?
      project.pending_delete?
    end
  end
end


How well can I see with them, you ask? Who cares.
deal with holding the rhinestones in place while the glue dries.
Start by gluing the rhinestones around the frame.
You wanna make sure that glue is touching every stone.
Finish by gluing the little bits to the outer circle and the straight piece.
below. These are the new designs of our company. If you are interested in them, Please contact us!
accessories, ribbon, and fringe. Welcome to visit our website or Alibaba Store!


the place for authentic Wing Chun of the Yip Man / Wang Kiu Lineage.
Are you looking for a realistic way to defend yourself? If so, SWK is the place to be. Then again, "defend" …..? Wing Chun chooses only the offence in a fight. The result of this is that the opponent will always be one step behind. Wing Chun approaches a fight in a theoretical manner. It searches for he most practical and logical applications. Besides techniques, both stress control, and the mentality which is required to not end up as a victim take a prominent place at SWK as well. Combine the effective approach of a fight with the relaxed atmosphere of our own training centre and you are guaranteed of developing quickly! Sign up now for free introduction class or just drop in to get acquainted with us. SWK guaranties a realistic approach to a fight.
Grand-Master Wang Kiu was one out of the 5 private students of GM Yip Man. He was a highly intelligent man who was able to very effectively gathered knowledge of Wing Chun. He was well respected by GM Yip Man and is often called "the fundament of all Wing Chun knowledge of the Yip Man Kung Fu system" (amongst others by private student Tsui Sheung Ting).


text:
Tag: Thomas
Carissimi: Today's Mass; St Thomas a Becket of Canterbury, Martyr
St Thomas a Becket, Archbishop of Canterbury and Martyr; Within the Octave of the Nativity: Missa "Gaudeámus omnes" Saint Thomas a Becket, son of an English nobleman, Gilbert Becket, was born on the day consecrated to the memory of Saint Thomas the Apostle, December 21, 1117, in Southwark, England. He was endowed by both nature and grace…
Carissimi; Sunday's Mass: Low Sunday
Dominica in Albis: Missa "Quasi modo" Station at the Church of St. Pancras in Rome. Low Sunday, so called in order to emphasize the contrast between the great Easter solemnity and the Sunday which ends the Octave, is also known as Quasimodo, from the first words of the Introit. (Not the hunchback of Notre Dame!) In…
Carissimi; Today's Mass: The Annunciation of the BVM
In Annuntiatione Beate Mariæ Virgine (holyday of obligation): Missa "Vultum Tuum" This feast, prepared by that of St. Gabriel, recalls the greatest event in history, the Incarnation of our Lord (Gospel) in the womb of a Virgin (Epistle). On this day the Word was made flesh, and united to itself for ever the humanity of…
Carissimi; Today's Mass: Feria VI Paschaltide II
Feria of Eastertide II: Missa "Quasi modo" The Church compares the Neophytes to newborn babes, and the milk she gives them to drink (Introit) is the faith in Christ which will enable them to overcome with Him the world. This faith has for its foundation the testimony of the Father, Who at the baptism of Christ…
Carissimi; Today's Mass: Feria V Paschaltide II
Carissimi; Today's Mass: Feria III Paschaltide II
(Transferred) In Annuntiatione Beate Mariæ Virgine (transferred): Missa "Vultum Tuum" This feast, prepared by that of St. Gabriel, recalls the greatest event in history, the Incarnation of our Lord (Gospel) in the womb of a Virgin (Epistle). On this day the Word was made flesh, and united to itself for ever the humanity of Jesus. March…
Dominica in Albis: Missa "Quasi modo" (St George's Feast Day is transferred to April 24 in 2017) Station at the Church of St. Pancras in Rome. Low Sunday, so called in order to emphasize the contrast between the great Easter solemnity and the Sunday which ends the Octave, is also known as Quasimodo, from the first…
In Annuntiatione Beate Mariæ Virgine (transferred): Missa "Vultum Tuum" This feast, prepared by that of St. Gabriel, recalls the greatest event in history, the Incarnation of our Lord (Gospel) in the womb of a Virgin (Epistle). On this day the Word was made flesh, and united to itself for ever the humanity of Jesus. March 25th…
Suppressed languages live on through Russian Orthodox ceremony -The Cordova Times paper.li/AbpJeromeOSJV/… #russian 55 minutes ago
CARITAS et TRADITIO is out! paper.li/AbpJeromeOSJV/… Stories via @OrthodoxNews2 @CatholicHerald #byzantine #iberian 55 minutes ago
Visit of the Patriarch of Alexandria to the Pope of the Coptic Orthodox Church of Alexandria orthodoxtimes.com/visit-of-the-p… 1 hour ago
facebook.com/story.php?stor… 3 hours ago
RT @BrightonHoveCC: Due to the very cold weather the city's emergency shelter is available tonight for all people who are rough sleeping in… 5 hours ago
Follow @AbpJeromeOSJV


text:
Defense minister meets brother of S. Korean official killed by N. Korea
By Yonhap
Lee Rae-jin, the elder brother of a South Korean official killed by North Korean soldiers while drifting in its waters in September, speaks to reporters at the defense ministry building in Seoul on Friday, before a closed-door meeting with Defense Minister Suh Wook. (Yonhap)
Defense minister Suh Wook on Friday met with the elder brother of a South Korean fisheries official killed by North Korea near the western sea border as the bereaved family raised doubts about the government's finding that the slain official attempted to defect to the North.
On Sept. 22, North Korea fatally shot the 47-year-old official, who was adrift on its side of the Yellow Sea, and burned his body, according to the South Korean military. He went missing the previous day while on duty near the western border island of Yeonpyeong.
Suh's meeting with Lee Rae-jin, the brother of the deceased official, came days after the ministry, citing confidentiality, rejected Lee's request for the disclosure of the audio file of a wiretapped conversation among North Korean troops during the incident.
Lee asked for such information, saying he could not believe his brother attempted to defect to the North.
"The defense minister expressed his deep condolences and consolation to the bereaved family over the incident," the ministry said in a statement.
After the 70-minute meeting, Lee said he became all the more confident his brother did not attempt to flee to the North, adding his attorney is preparing to again request the ministry disclose the information.
The ministry provided Lee with other requested information, including the location where his late brother was first spotted by the North and the content of communication that the South's military conducted during the incident.
But Lee called such a disclosure a "mere formality" that lacked key details, denouncing the government for failing to protect its citizen. (Yonhap)