text:
Q: Find path to object in object nested array I have an object, of which parameters contain and array of object. I receive 1 object id and I need to find its position in that whole mess. With procedural programming I got it working with:
const opportunitiesById =  {
  1: [
    { id: 1, name: 'offer 1' },
    { id: 2, name: 'offer 1' }
  ],
  2: [
    { id: 3, name: 'offer 1' },
    { id: 4, name: 'offer 1' }
  ],
  3: [
    { id: 5, name: 'offer 1' },
    { id: 6, name: 'offer 1' }
  ]
};

const findObjectIdByOfferId = (offerId) => {
  let opportunityId;
  let offerPosition;
  const opportunities = Object.keys(opportunitiesById);

  opportunities.forEach(opportunity => {
    const offers = opportunitiesById[opportunity];

    offers.forEach((offer, index) => {
      if (offer.id === offerId) {
        opportunityId = Number(opportunity);
        offerPosition = index;
      }
    })
  });

return { offerPosition, opportunityId };
}

console.log(findObjectIdByOfferId(6)); // returns { offerPosition: 1, opportunityId: 3 }

However this is not pretty and I want to do that in a functional way.
I've looked into Ramda, and I can find an offer when I'm looking into a single array of offers, but I can't find a way to look through the entire object => each array to find the path to my offer.
R.findIndex(R.propEq('id', offerId))(opportunitiesById[1]);

The reason I need to know the path is because I then need tho modify that offer with new data and update it back where it is.
Thanks for any help

A: You could piece it together using lots of little functions but I want to show you how to encode your intentions in a more straightforward way. This program has an added benefit that it will return immediately. Ie, it will not continue to search thru additional key/value pairs after a match is found.
Here's a way you can do it using mutual recursion. First we write findPath -
const identity = x =>
  x

const findPath =
  ( f = identity
  , o = {}
  , path = []
  ) =>
    Object (o) === o
      ? f (o) === true
        ? path
        : findPath1 (f, Object .entries (o), path)
      : undefined

If the input is an object, we pass it to the user's search function f. If the user's search function returns true, a match has been found and we return the path. If there is not match, we search each key/value pair of the object using a helper function. Otherwise, if the input is not an object, there is no match and nothing left to search, so return undefined. We write the helper, findPath1 -
const None =
  Symbol ()

const findPath1 =
  ( f = identity
  , [ [ k, v ] = [ None, None ], ...more ]
  , path = []
  ) =>
    k === None
      ? undefined
      : findPath (f, v, [ ...path, k ])
        || findPath1 (f, more, path)

If the key/value pairs have been exhausted, there is nothing left to search so return undefined. Otherwise we have a key k and a value v; append k to the path and recursively search v for a match. If there is not a match, recursively search the remaining key/values, more, using the same path.
Note the simplicity of each function. There's nothing happening except for the absolute minimum number of steps to assemble a path to the matched object. You can use it like this -
const opportunitiesById =
  { 1:
      [ { id: 1, name: 'offer 1' }
      , { id: 2, name: 'offer 1' }
      ]
  , 2:
      [ { id: 3, name: 'offer 1' }
      , { id: 4, name: 'offer 1' }
      ]
  , 3:
      [ { id: 5, name: 'offer 1' }
      , { id: 6, name: 'offer 1' }
      ]
  }

findPath (offer => offer.id === 6, opportunitiesById)
// [ '3', '1' ]

The path returned leads us to the object we wanted to find -
opportunitiesById['3']['1']
// { id: 6, name: 'offer 1' }

We can specialize findPath to make an intuitive findByOfferId function -
const findByOfferId = (q = 0, data = {}) =>
  findPath (o => o.id === q, data)

findByOfferId (3, opportunitiesById)
// [ '2', '0' ]

opportunitiesById['2']['0']
// { id: 3, name: 'offer 1' }

Like Array.prototype.find, it returns undefined if a match is never found -
findByOfferId (99, opportunitiesById)
// undefined

Expand the snippet below to verify the results in your own browser -

const identity = x =>
  x

const None =
  Symbol ()

const findPath1 =
  ( f = identity
  , [ [ k, v ] = [ None, None ], ...more ]
  , path = []
  ) =>
    k === None
      ? undefined
      : findPath (f, v, [ ...path, k ])
        || findPath1 (f, more, path)

const findPath =
  ( f = identity
  , o = {}
  , path = []
  ) =>
    Object (o) === o
      ? f (o) === true
        ? path
        : findPath1 (f, Object .entries (o), path)
      : undefined

const findByOfferId = (q = 0, data = {}) =>
  findPath (o => o.id === q, data)

const opportunitiesById =
  { 1:
      [ { id: 1, name: 'offer 1' }
      , { id: 2, name: 'offer 1' }
      ]
  , 2:
      [ { id: 3, name: 'offer 1' }
      , { id: 4, name: 'offer 1' }
      ]
  , 3:
      [ { id: 5, name: 'offer 1' }
      , { id: 6, name: 'offer 1' }
      ]
  }

console .log (findByOfferId (3, opportunitiesById))
// [ '2', '0' ]

console .log (opportunitiesById['2']['0'])
// { id: 3, name: 'offer 1' }

console .log (findByOfferId (99, opportunitiesById))
// undefined

In this related Q&A, I demonstrate a recursive search function that returns the matched object, rather than the path to the match. There's other useful tidbits to go along with it so I'll recommend you to give it a look.

Scott's answer inspired me to attempt an implementation using generators. We start with findPathGen -
const identity = x =>
  x

const findPathGen = function*
( f = identity
, o = {}
, path = []
)
{ if (Object (o) === o)
    if (f (o) === true)
      yield path
    else
      yield* findPathGen1 (f, Object .entries (o), path)
}

And using mutual recursion like we did last time, we call on helper findPathGen1 -
const findPathGen1 = function*
( f = identity
, entries = []
, path = []
)
{ for (const [ k, v ] of entries)
    yield* findPathGen (f, v, [ ...path, k ])
}

Finally, we can implement findPath and the specialization findByOfferId -
const first = ([ a ] = []) =>
  a

const findPath = (f = identity, o = {}) =>
  first (findPathGen (f, o))

const findByOfferId = (q = 0, data = {}) =>
  findPath (o => o.id === q, data)

It works the same -
findPath (offer => offer.id === 3, opportunitiesById)
// [ '2', '0' ]

findPath (offer => offer.id === 99, opportunitiesById)
// undefined

findByOfferId (3, opportunitiesById)
// [ '2', '0' ]

findByOfferId (99, opportunitiesById)
// undefined

And as a bonus, we can implement findAllPaths easily using Array.from -
const findAllPaths = (f = identity, o = {}) =>
  Array .from (findPathGen (f, o))

findAllPaths (o => o.id === 3 || o.id === 6, opportunitiesById)
// [ [ '2', '0' ], [ '3', '1' ] ]

Verify the results by expanding the snippet below

const identity = x =>
  x

const findPathGen = function*
( f = identity
, o = {}
, path = []
)
{ if (Object (o) === o)
    if (f (o) === true)
      yield path
    else
      yield* findPathGen1 (f, Object .entries (o), path)
}

const findPathGen1 = function*
( f = identity
, entries = []
, path = []
)
{ for (const [ k, v ] of entries)
    yield* findPathGen (f, v, [ ...path, k ])
}

const first = ([ a ] = []) =>
  a

const findPath = (f = identity, o = {}) =>
  first (findPathGen (f, o))

const findByOfferId = (q = 0, data = {}) =>
  findPath (o => o.id === q, data)

const opportunitiesById =
  { 1:
      [ { id: 1, name: 'offer 1' }
      , { id: 2, name: 'offer 1' }
      ]
  , 2:
      [ { id: 3, name: 'offer 1' }
      , { id: 4, name: 'offer 1' }
      ]
  , 3:
      [ { id: 5, name: 'offer 1' }
      , { id: 6, name: 'offer 1' }
      ]
  }

console .log (findByOfferId (3, opportunitiesById))
// [ '2', '0' ]

console .log (findByOfferId (99, opportunitiesById))
// undefined

// --------------------------------------------------
const findAllPaths = (f = identity, o = {}) =>
  Array .from (findPathGen (f, o))

console .log (findAllPaths (o => o.id === 3 || o.id === 6, opportunitiesById))
// [ [ '2', '0' ], [ '3', '1' ] ]

A: I would transform your object into pairs.
So for example transforming this:
{ 1: [{id:10}, {id:20}],
  2: [{id:11}, {id:21}] }

into that:
[ [1, [{id:10}, {id:20}]],
  [2, [{id:11}, {id:21}]] ]

Then you can iterate over that array and reduce each array of offers to the index of the offer you're looking for. Say you're looking for offer #21, the above array would become:
[ [1, -1],
  [2,  1] ]

Then you return the first tuple which second element isn't equal to -1:
[2, 1]

Here's how I'd suggest doing this:

const opportunitiesById =  {
  1: [ { id: 10, name: 'offer 1' },
       { id: 20, name: 'offer 2' } ],
  2: [ { id: 11, name: 'offer 3' },
       { id: 21, name: 'offer 4' } ],
  3: [ { id: 12, name: 'offer 5' },
       { id: 22, name: 'offer 6' } ]
};

const findOfferPath = (id, offers) =>
  pipe(
    toPairs,
    transduce(
      compose(
        map(over(lensIndex(1), findIndex(propEq('id', id)))),
        reject(pathEq([1], -1)),
        take(1)),
      concat,
      []))
    (offers);

console.log(findOfferPath(21, opportunitiesById));
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
<script>const {pipe, transduce, compose, map, over, lensIndex, findIndex, propEq, reject, pathEq, take, concat, toPairs} = R;</script>

Then you can take that path to modify your offer as you see fit:

const opportunitiesById =  {
  1: [ { id: 10, name: 'offer 1' },
       { id: 20, name: 'offer 2' } ],
  2: [ { id: 11, name: 'offer 3' },
       { id: 21, name: 'offer 4' } ],
  3: [ { id: 12, name: 'offer 5' },
       { id: 22, name: 'offer 6' } ]
};

const updateOffer = (path, update, offers) =>
  over(lensPath(path), assoc('name', update), offers);

console.log(updateOffer(["2", 1], '', opportunitiesById));
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
<script>const {over, lensPath, assoc} = R;</script>

A: Here's another approach:
We start with this generator function:
function * getPaths(o, p = []) {
  yield p
  if (Object(o) === o)
    for (let k of Object .keys (o))
      yield * getPaths (o[k], [...p, k])
}

which can be used to find all the paths in an object:
const obj = {a: {x: 1, y: 3}, b: {c: 2, d: {x: 3}, e: {f: {x: 5, g: {x: 3}}}}}

;[...getPaths(obj)]
//~> [[], ["a"], ["a", "x"], ["a", "y"], ["b"], ["b", "c"], ["b", "d"],
//    ["b", "d", "x"], ["b", "e"], ["b", "e", "f"], ["b", "e", "f", "x"],
//    ["b", "e", "f", "g"], ["b", "e", "f", "g", "x"]]

and then, with this little helper function:
const path = (ps, o) => ps.reduce((o, p) => o[p] || {}, o)

we can write
const findPath = (predicate, o) =>
  [...getPaths(o)] .find (p => predicate (path (p, o) ) )

which we can call like
console.log(
  findPath (a => a.x == 3, obj)
) //~> ["b","d"]

We can then use these functions to write a simple version of your function:
const findByOfferId = (id, data) =>
  findPath (o => o.id === id, data)

const opportunitiesById =  {
  1: [ { id: 10, name: 'offer 1' }, { id: 20, name: 'offer 2' } ],
  2: [ { id: 11, name: 'offer 3' }, { id: 21, name: 'offer 4' } ],
  3: [ { id: 12, name: 'offer 5' }, { id: 22, name: 'offer 6' } ]
}

console.log(
  findByOfferId (22, opportunitiesById)
) //~> ["3", "1"]

console.log(
  findByOfferId (42, opportunitiesById)
) //~> undefined

It is trivial to extend this to get all paths for which the value satisfies the predicate, simply replacing find with filter:
const findAllPaths = (predicate, o) =>
  [...getPaths(o)] .filter (p => predicate (path(p, o) ) )

console.log(
  findAllPaths (a => a.x == 3, obj)
) //=> [["b","d"],["b","e","f","g"]]

There is a concern with all this, though.  Even though findPath only needs to find the first match, and even though getPaths is a generator and hence lazy, we force the full run of it with [...getPaths(o)].  So it might be worth using this uglier, more imperative version:
const findPath = (predicate, o) => {
  let it = getPaths(o)
  let res = it.next()
  while (!res.done) {
    if (predicate (path (res.value, o) ) )
      return res.value
    res = it.next()
  }
}

This is what it looks like all together:

function * getPaths(o, p = []) {
  yield p
  if (Object(o) === o)
    for (let k of Object .keys (o))
      yield * getPaths (o[k], [...p, k])
}

const path = (ps, o) => ps.reduce ((o, p) => o[p] || {}, o)

// const findPath = (pred, o) =>
//   [...getPaths(o)] .find (p => pred (path (p, o) ) )

const findPath = (predicate, o) => {
  let it = getPaths(o)
  let res = it.next()
  while (!res.done) {
    if (predicate (path (res.value, o) ) )
      return res.value
    res = it.next()
  }
}

const obj = {a: {x: 1, y: 3}, b: {c: 2, d: {x: 3}, e: {f: {x: 5, g: {x: 3}}}}}

console.log(
  findPath (a => a.x == 3, obj)
) //~> ["b","d"]

const findAllPaths = (pred, o) =>
  [...getPaths(o)] .filter (p => pred (path(p, o) ) )

console.log(
  findAllPaths (a => a.x == 3, obj)
) //~> [["b","d"],["b","e","f","g"]]

const findByOfferId = (id, data) =>
  findPath (o => o.id === id, data)

const opportunitiesById =  {
  1: [ { id: 10, name: 'offer 1' }, { id: 20, name: 'offer 2' } ],
  2: [ { id: 11, name: 'offer 3' }, { id: 21, name: 'offer 4' } ],
  3: [ { id: 12, name: 'offer 5' }, { id: 22, name: 'offer 6' } ]
}

console.log(
  findByOfferId (22, opportunitiesById)
) //~> ["3", "1"]

console.log(
  findByOfferId (42, opportunitiesById)
) //~> undefined

Another brief note: the order in which the paths are generated is only one possibility.  If you want to change from pre-order to post-order, you can move the yield p line in getPaths from the first line to the last one.

Finally, you asked about doing this with functional techniques, and mentioned Ramda.  As the solution from customcommander shows, you can do this with Ramda.  And the (excellent as always) answer from user633183 demonstrates, it's possible to do this with mainly functional techniques.
I still find this a somewhat simpler approach.  Kudos to customcommander for finding a Ramda version, because Ramda is not particularly well-suited for recursive tasks, but still the obvious approach to something that has to visit the nodes of a recursive structure like a JS object is to use a recursive algorithm.  I'm one of the authors of Ramda, and I haven't even tried to understand how that solution works.
Update
user633183 pointed out that this would be simpler, and still lazy:
const findPath = (predicate, o) => {
  for (const p of getPaths(o))
    if (predicate (path (p, o)) )
      return p
}

redpajama_set_name: RedPajamaStackExchange


text:
Q: not concave iterations on a zinb model my name is vincenzo and i have that type of problem with zinb that you intorduce in this discussion (ZIP converges but ZINB does not. Should I drop this model?): the iterations continues to be not concave. If I take out one variable from my model, the second iterationis ot concave, the third is "backed up", then the model run normally.
What is going on? can you help me please?
thank you in advance!
Regards,
Vincenzo

A: Assuming you use Stata (I base that assumption on your use of terminology) you can use your second model. It is important that the final iteration does not show such messages, but such messages in the middle of the iteration log are not a problem and not surprising for a zero-inflated negative binomial (zinb) model.
One thing you can do is make sure that the value 0 on all explanatory/independent/right-hand-side/x-variables are within or near the range of the data. For example, in most case you don't want to use year of birth, as the year 0 is usually way outside the range of your data. Instead you would create and use a different variable containing something like (year of birth - 1960). Also you want to scale your variables such that their effects are of the same order of magnitude. For example don't add annual income in euros, as a single euro increase in annual income isn't going to do much. Instead add annual income in 1000s of euros. Similarly, I usually enter year of birth measured in decades since 1960. Most of the time I do both because it makes the coefficients easier to interpret, but in complicated models like zinb it can actually help attain convergence.


text:
Rizeiella är ett släkte av nattsländor. Rizeiella ingår i familjen husmasknattsländor.

Kladogram enligt Catalogue of Life:

Källor

Husmasknattsländor
Rizeiella

redpajama_set_name: RedPajamaWikipedia


text:
Q: load and unload a message I create a message when a process starts (BOOL YES) and I am trying to make it go away when it ends (BOOL NO), debugging shows me stepping through the whole function both in the beginning and end, however the message is still there.
Where am I going wrong?  Thank you in advance
-(void) loadStillLoadingMessage:(BOOL)yesNo{
CGRect screenBound = [[UIScreen mainScreen] bounds];
CGSize screenSize = screenBound.size;
CGFloat screenWidth = screenSize.width;
CGFloat screenHeight = screenSize.height;
UILabel *loading = [[[UILabel alloc]initWithFrame:CGRectMake((screenWidth/2)-75,(screenHeight)-140,300,40)]autorelease];

loading.text = @"still loading";
loading.backgroundColor = [UIColor clearColor];
loading.textColor = [UIColor blueColor];
loadingLabel = loading;
[self.view addSubview:loadingLabel];
[loadingLabel setHidden:YES];
if (yesNo == YES) {
    [loadingLabel setHidden:NO];
}else if (yesNo ==NO){
    [loadingLabel setHidden:YES];
}

}

A: This method is creating a UIView whenever it is called. So the UIView you create and show on the first time is different to the UIView you create, show and then hide the second time. You need to look at instance variables (declaring a variable in the header file).

A: The problem you have is you didn't remove the old loading from the self.view.
-(void) loadStillLoadingMessage:(BOOL)yesNo{
    CGRect screenBound = [[UIScreen mainScreen] bounds];
    CGSize screenSize = screenBound.size;
    CGFloat screenWidth = screenSize.width;
    CGFloat screenHeight = screenSize.height;
    UILabel *loading = [[[UILabel alloc]initWithFrame:CGRectMake((screenWidth/2)-75,    (screenHeight)-140,300,40)]autorelease];

    loading.text = @"still loading";
    loading.backgroundColor = [UIColor clearColor];
    loading.textColor = [UIColor blueColor];
    loadingLabel = loading;

    //removing the previous label from the self.view if exist
    loadingLabel.tag = 999;
    [[self.view viewWithTag:999] removeFromSuperview];

    [self.view addSubview:loadingLabel];
    [loadingLabel setHidden:YES];
    if (yesNo == YES) {
         [loadingLabel setHidden:NO];
    }else if (yesNo ==NO){
      [loadingLabel setHidden:YES];
    }

}


text:
Q: magento 2.3.2 - tab not showing in product page because override Magento_PageBuilder magento 2.3.2 tab not showing in product page , because override Magento_PageBuilder. page layout . how to fix this ?

A: Simply change layout for product in the product edit page (Design section). Choose 3-columns (or 2-columns / 1-column) instead full-width.


Our mattress is made of 100% natural organic latex - tapped from organically-grown rubber trees free of pesticides and fertilisers, and made without any springs, synthetic foams or glue.
Our mattress is made of natural latex layers for superior comfort and progressive support, allowing your spine to be comforted in its natural alignment.
Apart from the latex core being naturally anti-dustmite & hypoallergenic, the cover can be removed and washed for extra hygiene.
We believe we have found the success recipe that suits every sleeper. Not satisfied with your mattress firmness?
Exchange to a different density within 100 days, on us!
Square Rooms: "There are plenty of options offered to homeowners where mattress shopping is concerned, but the best option available is a natural organic latex mattress."
Singapore Tatler: "Best of Singapore 2019 puts in your hands a curated compendium of merchants who are the finest in their class and we are glad to award European Bedding as the Best Bedding Store in Singapore."
We believe that working with eco-friendly and sustainable materials will bring a better future.


text:
Aladdin, The Lion King, and The Jungle Book Now Available to Play Online
By Liz Finnegan Legacy Author August 4, 2016
Three 16-bit Disney games "meticulously updated" for online play.
GOG.com has announced that it has teamed up with Disney to bring Disney Aladdin, Disney The Lion King, and Disney The Jungle Book to Windows, Mac, and Linux, and all three are available now.
"Previously unavailable to modern gamers, all three titles have been meticulously updated to be compatible with modern operating systems while preserving the original graphics, sound, and gameplay," a press release reads, adding that each game costs $9.99 – $8.99 with a launch discount – or as part of a bundle for $19.99.
"Developed during the golden age of platformers, Disney Aladdin, Disney The Lion King, and Disney The Jungle Book established themselves as hallmarks of the genre, earning the praise of fans and critics alike for over two decades," the release continues. "With the advent of Digicel technology, hand-drawn cels from Disney's animation team brought the characters to life with a level of vibrancy that was unparalleled at the time, and remains impressive today."
Now if you'll excuse me, I have a Genie level to repeatedly rage-quit.

redpajama_set_name: RedPajamaCommonCrawl


text:
Aviation Articles
MCAS New River
May 13, 2011 | Aviation Article
Author & photography: Ian French
The acquisition of land that was to become Marine Corps Air Station New River in North Carolina began in 1941. The first aircraft were based here in 1943. The area was placed under the command of nearby Marine Corps Base Camp Lejeune though with the end of the second world war the field was downgraded to caretaker status until it was reactiviated in 1951 becoming Marine Corps Air Facility Peterfield Point, Camp Lejeune and then Marine Corps Air Facility New River in 1952. Marine Aircraft Group 26 (MAG-26) moved in from MCAS Cherry Point in 1954. In 1966 the base was renamed as MCAS New River.
Today MCAS New River reports to the 2nd Marine Air Wing at MCAS Cherry Point and is home to MAG-26 and MAG-29. These two wings consist of the following units at MCAS New River:
HMLA-167 Warriors
HMM-261 Raging Bulls
HMM-264 Black Knights
VMM-266 Fighting Griffins
HMH-461 Iron Horse
VMMT-204 Raptors
AH-1W / UH-1N
CH-46E
HMLA-269 Gunrunners
HMM-162 Golden Eagles
HMHT-302 Phoenix
VMM-365 Blue Knights
HMH-464 Condors
VMM-263 Thunder Eagles
HMH-366 which operates the CH-53E at MCAS Cherry Point also reports to MAG-29.
Aviation Articles:
Tunisia – IADE 2020
Author & photographer: Ian French The first International Air and Defence Exhibition (IADE) in Tunisia was held at Djerba International Airport from 4th to 8th March 2020. The event had 111 exhibitors, 38 participating countries and 42 official delegations from...
Fuerza Aerea del Perú – Las Palmas – SEMAN
Author & photographers: Ian French & Jon Astley The Servicio de Mantenimiento de la Fuerza Aérea del Perú (Peruvian Air Force Maintenance Service), well known as SEMAN or SEMAN Peru, is a Peruvian aircraft manufacturer which was formed at Real Felipe Fortress...
Photo Reports:
Polish Air Force 100 Year Anniversary
The Polish Air Force celebrated its 100 year anniversary in late August 2018. Celebrations included a families open day at Dęblin-Irena followed by an airshow at Radom-Sadków. Ian French produced this photo report. All rights belong to Aviation Press Limited....
Nato Tiger Meet – Landivisiau 2017
Photographer: Ian French
Boeing Vertol CH-46E Sea Knight
A tandem rotor, medium utility transport helicopter designed in the 1950s and built in the 1960s, affectionately known as the Phrog, with over 600 seeing service. It is used by the USMC to provide all-weather, day-or-night assault transport of combat troops, supplies and equipment. Additional tasks include combat support, search and rescue (SAR), support for forward refueling and rearming points, CASEVAC and Tactical Recovery of Aircraft and Personnel (TRAP).
For a helicopter of such longevity there have been many upgrades and improved models. The original CH-46s were the A model and the first major improvement was the D model which started to be delivered in 1966. Its improvements included modified rotor blades and more powerful T58-GE-10 turboshaft engines rated at 1,400 shp each. The increased power allowed the D model to carry 25 troops or 3,180 kg of cargo.
The D model was quickly followed by the E model which features fiberglass rotor blades, airframe reinforcement and further uprated T58-GE-16 engines producing 1,870 shp each. The CH-46E has a maximum gross weight of 11,000 kg, a cruising speed of 155 mph and a range of 265 miles. It has a crew of 3 and can carry 17 troops.
The F model was produced from 1968 in small numbers and retained the D model's T58-GE-10 engines but had revised the avionics and included other modifications. The majority of models remaining in USMC service are the E.
This stalwart of the USMC is in its final years and is being replaced by the MV-22B Osprey.
Sikorsky CH-53E Super Stallion
The CH-53 is the USMC's heavy-lift transport helicopter. It began life in August 1962 when it was announced that the S-65A had been selected as a new ship-borne heavy assault transport for the USMC, with the military title CH-53A Sea Stallion. A prototype flew in October 1964, and delivery of the first CH-53A's began in September 1966 powered by two General Electric T64-GE-6 turboshaft engines with 2,850 shp and a light alloy six blade main rotor. It had rear-loading doors, and among the specified loads were a 105mm howitzer or 38 combat-equipped troops. The initial production version was the CH-53A, delivered from September 1966, but the CH-53D introduced in March 1969 had more powerful 3,925 shp T64-GE-413 engines. A total of 55 troops could be carried in a high-density arrangement. An integral cargo handling system made it possible for one man to load or unload 1 ton of palletised cargo a minute. The main rotor and tail pylon folded automatically for carrier stowage.
In 1974 the first CH-53E flew and featured three 4,380 shp General Electric T64-GE-416 engines and a strengthened transmission to withstand the increase in power. The CH-53E was named the Super Stallion. The fuselage is about two meters longer than that of the CH-53D and the tail pylon is canted to port. The main rotor has also been improved and has seven composite blades.
The CH-53E has a crew of five: 2 pilots, 1 crew chief/right gunner, 1 left gunner, 1 tail gunner (combat crew) and has a capacity for 37 troops (55 with centerline seats installed). The empty weight is 15,071 kg and the maximum takeoff weight is 33,300 kg. Cruise speed is 150 knots and its range is 540 nm.
The CH-53E is nearing the end of its life with the USMC and will be replaced by the CH-53K.
Bell UH-1N Iroquois
The Bell UH-1N Twin Huey is a twin-engine, twin rotor medium military helicopter based upon a stretched Bell 205A. A member of the numerous Huey family, it first flew in 1969. There was some controversy over this particular model, as the power plant was built in Canada, but eventually deliveries began in 1970.
The UH-1N is powered by two Pratt & Whitney Canada T400-CP-400 turboshaft engines that drive a single output shaft. They are capable of producing up to 1,800 shp. Should one engine fail the remaining engine can deliver 900 shp for 30 minutes or 765 shp enabling the UH-1N to maintain cruise performance at maximum weight.
The UH-1N has a crew of 4 (pilot, co-pilot, crew chief, gunner) and a capacity for 6-8 combat-equipped troops, or equivalent cargo. Its empty weight is 2,765 kg and its maximum takeoff weight is 4,763 kg. Cruise speed is 110 knots and its range is 248 nm.
This is another of the USMC's legacy aircraft that are being withdrawn from service in the near future. The UH-1N is being replaced by the UH-1Y Venom.
Bell AH-1W Super Cobra
The Bell AH-1 Super Cobra is a twin-engine, twin rotor attack helicopter based on the United States Army's single-engine AH-1G Cobra. It has evolved from the USMC's AH-1J and AH-1T versions.
Initially the AH-1J received a more powerful gun turret than the AH-1G and it featured a three barrel 20 mm XM197 cannon that was based on the six barrel M61 Vulcan cannon. The USMC requested greater load carrying capability in high temperatures for the Cobra in the 1970s. Bell used systems from its Model 309 to develop the AH-1T. This version had a lengthened tail boom and fuselage with an upgraded transmission and engines from the 309. Bell designed the AH-1T to be more reliable and easier to maintain in the field. The version was given full TOW missile capability with targeting system and other sensors.
In the early 1980s the USMC required a more powerful version of the AH-1T. Other changes included modified fire control systems to carry and fire AIM-9 Sidewinder and AGM-114 Hellfire missiles. The new version received the AH-1W designation.
The AH-1W has a crew of two: pilot, co-pilot/gunner, an empty weight of 4,630 kg and a maximum takeoff weight of 6,690 kg. It is powered by two General Electric T700-401 turboshaft engines which produce 1,690 shp each. The maximum speed is 190 knots and the range 317 nm.
The AH-1W though is all about armament:
– 20 mm (0.787 in) M197 3-barreled Gatling cannon in the A/A49E-7 turret (750 rounds ammo capacity);
– 2.75 in (70 mm) Hydra 70 or APKWS II rockets – Mounted in LAU-68C/A (7 shot) or LAU-61D/A (19 shot) launchers;
– 5 in (127 mm) Zuni rockets – 8 rockets in two 4-round LAU-10D/A launchers;
– TOW missiles – Up to 8 missiles mounted in two 4-round XM65 missile launchers, one on each outboard hardpoint;
– AGM-114 Hellfire missiles – Up to 8 missiles mounted in two 4-round M272 missile launchers, one on each outboard hardpoint;
– AIM-9 Sidewinder anti-aircraft missiles – 1 mounted on each outboard hardpoint (total of 2).
The AH-1W is also being withdrawn from service and is being replaced by the AH-1Z Viper.
Bell Boeing MV-22B Osprey
The MV-22B is a multi-mission, tiltrotor military aircraft with both vertical takeoff and landing (VTOL), and short takeoff and landing (STOL) capabilities. It is designed to combine the functionality of a conventional helicopter with the long-range, high-speed cruise performance of a turboprop aircraft. It is replacing all CH-46s in service. The design and build process for the revolutionary aircraft took 15 years and started in 1985. It was an expensive programme and the cutting edge nature of the concept and design lead to many crashes before the design was perfected. USMC crew training began in 2000 and the aircraft entered full service in 2007.
The MV-22B has a glass cockpit and has triple-redundant fly-by-wire flight control systems. The flight director panel of the Cockpit Management System (CMS) allows for fully coupled (autopilot) functions that take the aircraft from forward flight into a 50 ft (15 m) hover with no pilot interaction other than programming the system.
Like a helicopter the fuselage is not pressurised and personnel must wear on-board oxygen masks above 10,000 feet. The rotorwash usually prevents usage of the starboard door in hover and instead the rear ramp is used for rappelling and hoisting. The MV-22B has a crew of four: two pilots and two engineers/crew chiefs depending on the mission.
The aircraft has a maximum ceiling of 25,000 ft, a cruise speed of 241 kn and a range of 879 nm. The empty weight is 15,032 kg and the loaded weight 21,500 kg. The maximum rolling takeoff weight is 25,800 kg and the maximum vertical takes of weight is 23,810 kg. The power plant is two Rolls-Royce Allison T406/AE 1107C-Liberty turboshafts, producing 6,150 hp each. Either engine can power both proprotors through the wing driveshaft. However, the V-22 is generally not capable of hovering on one engine and if a proprotor gearbox fails then that proprotor cannot be feathered and both engines must be stopped before making an emergency landing.
Armament is a 7.62 mm (0.308 in) M240 machine gun or 12.7 mm (0.50 in) M2 Browning machine gun on the ramp or a 7.62 mm (.308 in) GAU-17 minigun, belly-mounted, retractable with video remote control in the Remote Guardian System.
Special thanks to Mark Forest, Jon Astley and the Public Affairs MCAS New River for their help in producing this article.
Aviation Press Limited owns the copyrights to this article & associated photographs.
165252 CH-53E UT00 HMHT302
160452 UH-1N TV01 HMLA167
160805 AH-1W TV33 HMLA167
161541 CH-53E CJ07 HMH461
162001 CH-53E EN48 HMH464
162526 CH-53E EM23 VMM266
165246 CH-53E 20 HMX1
165437 MV-22B T1 VMMT204
165846 MV-22B YS06 VMM162
166385 MV-22B GX13 VMMT204
166481 MV22B GX16 VMMT204
166492 MV-22B MV00 VMX22
166743 MV-22B EM01 VMM261
All content copyright © Aviation Press. All Rights Reserved. Website by LW Design


text:
Mysterious Pacific island burial site is older than thought, study says
By Rob Verger, ,
In the middle of the Pacific Ocean, there's a large, lush, verdant island called Pohnpei, where pigs are commonly raised by the locals and mangrove trees abound. On the coast of this island is an ancient burial site for chiefs who lived there hundreds and hundreds of years ago, and now, new research is shedding light on the history of this archaeological wonder.
The burial, ceremonial, and cultural site is called Nan Madol, and it dates back to about the year 1180, according to new research lead by Mark McCoy, an anthropologist and associate professor at Southern Methodist University in Texas. McCoy said that the site is at least 100 years older than similar ones in the Pacific islands.
"It now looks like Nan Madol represents a first in Pacific Island history," McCoy said in an email to FoxNews.com. "The tomb of the first chiefs of Pohnpei is a century older than similar monumental burials of leaders on other islands."
The pXRF was used on islets across the site of Nan Madol and intensively on the islet of Nandauwas. (Mark McCoy)
That makes the place a good location to study the beginnings of hierarchical societies, he added.
"To me, in its prime, Nan Madol was a capital," McCoy said. "It was the seat of political power, the center of the most important religious rituals, and the place where the former chiefs of the island were laid to rest."
The researchers dated the age of the coral used as part of constructing the site to find out a more precise date for when bulding it began, and specifically studied one tomb where chiefs were buried. They were also able to determine the origin of the big log-like volcanic rocks came from that the ancient people used to construct the site, which is on the water.
Bible breakthrough: Scientists unlock secrets of burned Hebrew scroll
Unlocking the Titanic: Hero's locker key up for auction in the UK
"The main finding here was the discovery of strong archaeological evidence of rise of the first chiefs to rule the island," McCoy said, "something that of course is described in Pohnpei's own oral histories, but with the results described in our new paper, can now be compared to other islands in the Pacific and societies around the world."
Pohnpei is part of the Federated States of Micronesia, and is a tall, rainy island roughly between Hawaii and the Philippines. The new research was published in the journal Quaternary Research.
Follow Rob Verger— who spent a semester teaching on Pohnpei— on Twitter: @robverger
https://www.foxnews.com/science/mysterious-pacific-island-burial-site-is-older-than-thought-study-says


Thanks to everyone who participated in Rootbeans: What's important? game at University of Brighton as part of Brighton Science Festival. The amount of interest and willing participation (no bribery needed stragely!) was amazing. Our initial players were the event organisers and staff who got straight into writing their important things on beans. We promised to give them back a new set of random 10 beans at the end in their own bags and this proved a popular approach- giving a bit of data back.
The event was attended by scientists, researchers and the general public. Many people passed by and curiosity overcame many. It wasn't hard to explain the general idea and we found that people would explain quite comfortably to each other.
On approaching one promotional table set up in the canteen, I found myself whisked into a debating room by enthusiastic Brighton Uni Professor Jackie Cassel who was exploring big data and how the medical profession needed to rethink it's approach and strategy to data collection practices to include more anonymous data from people. It was an impromptu moment and I presented the idea to a smiling crowd who quickly wrote a few beans each for our little data set of things that were important to them. Thanks Jackie for that! after the event we talked and planned how we might collaborate to use a game like Rootbeans to faciliate user engagement for her work in the field of epidemiology.
Playing the game – drawing the lines was another stage. It was a little trickier to explain especially about rolling the dice and what the choice and chance lines represented, but after drawing a couple of lines, people generally got it – and were quite pleased to tell each other what it meant. They liked the idea of leaving a mark and some felt the responsibility was too much at first – but then got down on the floor and drew the lines, some more wobbly and full of character than others.
This lovely mother and son team were amazing to be with and to watch – so enthusiastic about taking part, drawing the lines, discussing the random meanings. Particularly poignant was a random line they felt simply couldn't be ignored: to connect Science to Children. This challenge brought all of us together to trace a complex and long winding path from one bean to the other through the tightest spaces. Tanya created a breadcrumb of beans along the path so that Ewan could find his way with a think blue biro. At the end he was very pleased with himself.
Towards the end of the game things got tricky. We dreaded a random roll. Getting a five or a six was a tense moment and we quickly started to think of ways to 'deviate from the norm' and came up with a rule that would allow anyone else with a dice in hand to 'help' the person with by rolling the dice and hoping they too didn't get a five or six. If they could choose a line – we encouraged them to choose one that would get the player out of a tight fix – connecting the random bean so that effectively they would have to choose another one which would hopefully be better suited. It's possible that this slightly dodgy feeling practice might have the germ of corruption in it's function but we felt it was necessary to avoid 'destroying' beans by not being able to connect them. At the very end however circumstance did destroy a few.
Last updated by Maf'j Alvarez at March 4, 2014 .
← Rootbeans: What's important to you right now?


text:
Charles Asuquo Effiong
Scholar in Theatre and Media studies, and is currently a lecturer in the Department of Theatre, Film and Carnival Studies of the University of Calabar, Calabar in Nigeria. Before joining the University of Calabar, he worked as a Journalist writing feature reports for Nigerian Newsworld Magazine and Nigerian Pilot Newspaper in Abuja, Nigeria. He later left journalism and worked at the Department of Performing Arts in Akwa Ibom State University, also in Nigeria, as a lecturer for about four years, after completing a Ph.D degree 143 in Theatre and Media Studies. He has specific interest in critical theory and media aesthetics,in which his researches have been attempting to establish and espouse the importance of cultural values, and how theatre and media organs can make useful exploits of the dynamics based on global canons for the development and sustainability of the Nigerian cultural values and diplomacy.
Case Study on Indianization, Localization and Multiculturalism // Journal of Globalization Studies. Volume 9, Number 2 / November 2018


The ninety-third session of the Lookout Mountain Sacred Harp Singing Convention was held on the fourth Sunday and Saturday before in August at Pine Grove Church near Collinsville, Alabama. The class was called to order by Milton Oliver leading song on page 32t. The morning prayer was led by Lonnie Rogers. Leaders: S. T. Reed 82t; Randall Smith 36b, 137; Bud Oliver 145b; Lamar Smith 76b; Don Bowen 354t, 503b; Margie Smith 373; Thurman Nall 480; Judy Mincey 556; Dave Ressler 192; Hershell King 460, 112; Larry Ballinger 123t; Henry Johnson 73t.
The class was called to order by Milton Oliver leading song on page 40. A business session was held, and the following officers were elected to serve: Chairman—Milton Oliver; Vice Chairman—S. T. Reed; Secretary—Randall Smith; Arranging Committee—Bud Oliver; Memorial Committee—Alanna Blanks and Linda Thomas; Finance Committee—Lamar Smith and Scot Oliver. Leaders: B. M. Smith 475, 448b; Linton Ballinger 300; Boyd Scott 358; Jim Carnes 209; Edwin Ballinger 496; Martha Woodard 278t; Kat Kinkade 372, 542; Tommie Spurlock 430; Lonnie Rogers 225t; Michele Biery 163t, 163b; Mel Kersey 47t; Chris Ballinger 110; Aubrey Barfield 365, 283; Brenda Carroll.
The class resumed singing with Bud Oliver leading song on page 270. Leaders: Brad Oglesby 68b; Louis Hughes 306; Patricia Temple 85; Mary Wright 66; John Plunkett 535; Joan Aldridge 474; Lou Cotney 196; David Ballinger 111b; I. V. McWhorter 91; Ruth Walker 290; Shelton Williamson 222; Lomax Ballinger 168; Jonathan Blakely 77t.
S. T. Reed called the class to order leading song on page 32b. Leaders: Charlene Wallace 385b; Earl Ballinger 299; Rhoda Norris 316; Jeanette Lowry 216; Teresa Ballinger 361; John Etheridge 348b; Shelbie Sheppard 183; Don Clark 171; Charles Whitmer 218; Becky Browne 377; Gravis Ballinger 78; Jerry Enright 29t; Betty Sheppard 269; Roy Nelson 153; Anthony Reeves 150; Buell Cobb 440; Joyce Walton 455; Jewel Wootten 383; Ester Brown 426t.
The class was called to order by Bud Oliver leading song on page 145t. Leaders: Alice Edwards 73b; Elene Stovall 436; Syble Adams and Pam Wilkerson 441, 424; Jeff Sheppard 120; Mary Florence Smith 434; Leola Smith 220; Mary Ruth Stiefel 112; Tony Ivey 213 (t? b?); Mattie Lou Townsel 119; Alanna Blanks and Milton Oliver 405; Willie Mae Holt 224. Milton Oliver led song on page 46 as the closing song, and Hershell King dismissed the class with prayer.
The Convention was called to order by Milton Oliver leading song on page 82t. The morning prayer was led by Lamar Smith. Leaders: S. T. Reed 72b; James Bud Oliver 39b; Scot Oliver 176b; Lamar Smith 36b; Rodney Ivey 47t; Jackie Tanner 101t, 108t; Evelyn Harris 155, 159; Coy Ivey 73t, 63; Linda Thomas 39t; Rex Wilks 37b, 53; Boyd Scott 58, 127.
The class was called to order by S. T. Reed leading song on page 79. Leaders: Marlon Wootten 103, 49t; B. J. Harris 503, 452b; J. C. Smith and James Bud Oliver 480; Pearl Guier 59, 303; Ruth Brown 142, 335; J. C. Rutledge 490; Karen Travis 117; Phil Summerlin 277; Billy Williams 78, 297.
The class was called to order by Milton Oliver and Eric Blanks leading song on page 206. Leaders: Don Bowen 34b, 497; Hershell King 34t, 97; Stuart Ivey 182, 300; Mary Wright 148, 324; Myra Dalton and Christy Blevins 523, 448t; Richard Ivey 76b, 270; Cassie Franklin 217, 368; Dennis George 68b; Allison Ivey 134, 111b; Anthony Reeves 504; 378b.
James Bud Oliver and Rodney Ivey called the class to order leading song on page 48t. Leaders: Henry Guthery 151; David Ivey 336; Kat Kinkade 411; Leola Smith and Buddy Davis 166; Dave Ressler 430; Karen Ivey 475; Mark Brown 282; Cindy Franklin 269; Brad Oglesby 369; Patrica Temple 89.
A memorial lesson was held by Linda Thomas and Alanna Blanks. Linda Thomas read scripture from l Thessolonians 4:13-18, and Alanna Blanks read the names of the deceassed. Bud Oliver and Milton Oliver led song on page 452 in memory of Paul Wagner; David Ivey 48t in memory of Aunt Ester Reed; David Ivey led song on page 418 in memory of his uncle, Ed Latham, husband of Norma Latham, who passed away the previous week; Coy Ivey led "Trusting" in memory of the following: Colbie Allen, Fleecie Tucker, Joe Smith, Kelsey Wootten, Guy Parker, Luther Miller, Agnes Hocutt, Aver Crider, Floyd Stiefel, Andrew Stiefel, Tommy Creel, Hazel Cagle, Elder Cladis Moon, Evelyn Brown, and William Headrick. Bud Oliver led song on page 343 for the following sick and shut-ins: Barrett Ashley, Bonnie Ashley, Lawrence Underwood, Lula Underwood, Mary Stiefel, Vester Jones, Virgil Phillips, Ruby Phillips, Herbert Phillips, Lessie Reed, Bill Green, and from Missouri: Joyce Smith and Karen House.
"Happy Birthday" was sung for Aunt Woodie Walker. The memorial lesson was closed with prayer by Mark Brown.
Leaders: Betty Shepherd 216; Loyd Ivey 454; Michele Biery 189; Charles Whitmer 147t.
The class was called to order by Alanna Blanks leading song on page 405. Leaders: Becky Browne 203; Jim Carnes 146; Roy Nelson 456; Joan Aldridge 273; Jerry Enright 383 in honor of Barrett Ashley and Lawrence Underwood; Jeanette Lowry 314; Verlon Stiefel and Mary Ruth Stiefel 348 (t? b?); Shelbie Sheppard 106; Louis Hughes 410t; Wayne Wootten 276; B. M. Smith and Margie Smith 501; Ben Bridges 63; Elene Stovall 99; Kristy Finley and Nelda Tolbert 73t; Melvin Stiefel 512; Eloise Wootten 171; Jeff Sheppard 457; Willie Mae Holt 183. Milton Oliver called for a report from the Finance Committee. The Committee reported a collection of $207.00. Announcements were made. Milton Oliver, S. T. Reed, Lamar Smith, Bud Oliver and Wayne Reed led song on page 62 for the closing song, and all who wished, took the parting hand. The Convention was dismissed with prayer by B. J. Harris.


text:
F-350 Reviews
2015 Ford F-Series Super Duty Power Stroke First Drive
Steve Siler
Jul 29th 2014 at 11:58AM
Image Credit: Steve Siler
Vehicles most likely to hit 300,000 miles
Cars most likely to have major powertrain problems
Top 10 brands with the lowest average repair cost to fix a check engine light
Top 10 brands least likely to flash a check engine light
The least reliable cars in America
10 Best New Car Deals: August 2021
Turbo-Diesel 6.7L V8
440 HP / 860 LB-FT
6-Speed Auto
32,100 LBS (max)
As Tested Price
$70,000 (est)
What weighs 30,000 pounds? Big Ben's Westminster bell. A navy ship anchor. Or as we found out during our first drive program for the 2015 Ford F-Series Super Duty, seven pallets of cinder blocks loaded onto a dual-axle gooseneck trailer. The test was part of a raft of towing demonstrations that showcased the new Super Duty's impressive tug capacity, which maxes out at 32,100 pounds. That's 1,200 more than its nearest rival, the Ram 3500, when equipped with its upgraded 6.7-liter Power Stroke diesel V8. Such is the heavy-duty pickup truck business, a diesel-fueled game of one-upmanship with only three players: Ford, Chevrolet/ GMC and Ram. And in this game, the one with the most torque wins.
Until 2014, Ford was the one to beat, with its 6.7-liter Power Stroke diesel bringing 400 hp and a massive 800 lb-ft of torque to the table. Then last year, Ram did exactly that, serving Ford with a beefed-up Cummins turbodiesel inline-six in its freshened Ram Heavy Duty truck line with 385 hp and 850 lb-ft of torque, enabling it to tow up to 30,000 pounds. But Ford claims it had designed its engine to be relatively easy to upgrade when the time called for it, so for 2015, Ford bolted a larger turbo to the Power Stroke, bringing output to an insane 440 hp and 860 lb-ft of twist, all without reducing fuel efficiency. Maximum tow capacity rises from 24,700 lbs to an incredible 31,200 lbs for the F-450 dually.
As for GM's HDs? They lag behind the lot with their 6.6-liter Duramax V-8, producing 397 hp and 765 lb-ft of torque. Yeah, you know things are serious when the trucks with 765 lb-ft are the knock-kneed wimps of the lot.
Yet all this one-upmanship isn't as crystal-clear as the spec sheets would have you believe. Ford and Ram are currently involved in a pissing match over how these tow ratings are calculated, and the solution might not be arrived at without legal intervention. We prefer firsthand drive impressions over spec-sheet bench racing (towing?), so we headed to West Virginia to saddle up and ride.
The diesel's power upgrade comes courtesy of a larger turbocharger.
If you're looking at the pictures, trying to sniff out what's new compared to the 2014 models, don't bother; nothing has changed on the outside, save for commercial-grade 19.5-in wheels on the F-450 and some new paint colors for the King Ranch versions.
Indeed, the Super Duty itself hasn't changed much since its last redesign back in 2010, and most of what we said back then about the interior styling and such still applies, too, except that now it looks even more dated. Back in 2013, the Super Duty received the MyFord Touch screen-based infotainment system in its Platinum model, and that system is now available in other trims. Furthermore, a nice new leather treatment has appeared inside the fancy King Ranch model for 2015. Otherwise, it's the same solid truck it was before, offering such niceties as power telescoping trailering mirrors, a backup camera, dash-top storage, a lockable storage area under the rear seat, a clever integrated tailgate step with assist post, and unlike the GM trucks, a good, on-center driving position.
The Ford maintained highway speeds better than identically burdened Silverado and Ram HD models.
So this is, more than anything, a diesel story (Ford didn't even bother bringing its gas-powered 6.2-liter V8 Super Duty, which gets by with a comparatively paltry 385 hp and 405 lb-ft of torque). The diesel's power upgrade comes courtesy of a larger turbocharger tucked into the valley of the reverse-flow SOHC 32-valve engine, as well as new fuel injectors. The increased airflow also allows for improved exhaust braking, which is achieved through backpressure in the turbo, and is now selectable via a button to the right of the steering column. What's more, the amount of exhaust braking can be reduced if desired by steeping lightly on the accelerator pedal, a neat trick that is unique to the Power Stroke, says Ford.
So does it work? Of course it does. It's got 860 pound feet of twist, fer cryin' out loud. Ford structured a number of towing tests, including the aforementioned F-450 towing test, and similar tests for the three-quarter and one-ton models, each loaded up to its trailering max, or very close to it, and sent us on our way along a very steep, 4.6-mile grade with a 1,420-foot elevation change to see if they would perform as promised. Not surprisingly, the Fords did quite well, maintaining highway speeds better than identically burdened Chevrolet Silverado and Ram HD models, which huffed and puffed and lost more speed during ascent. The Ford's six-speed TorqShift transmission with manual gear selection on the gooseneck shifter and upper gear lockout likewise proved less prone to gear-hunt than the others.
Inside, the Super Duty feels ergonomically outdated and far more plasticky.
Unfortunately for the Blue Oval, the back-to-back comparisons also gave us a chance to appreciate the differences in cabin comfort and sense of interior quality among the three, and in this respect, the Ford feels ergonomically outdated and far more plasticky, despite offering a competitive suite of technologies. That said, in terms of seat comfort, the trophy goes to the F-Series, hands down.
Ford also allowed us to drive untethered F-250 4X4 models, one laden with 1000 pounds in back, and another empty. Two surprises here: 1) Regardless of payload (which admittedly was less than a third of those particular models' 3,250-lb payload max) we could feel virtually no difference between the two in terms of handling and braking; and 2) Both proved eminently drivable. Certainly, with that much torque heading to the rear wheels, some wheelspin is inevitable when hammering the throttle from a dead start, but we had to work a bit harder than we expected to in order to make that happen – that's a good thing. This isn't a Mustang, after all, and when it comes to three-ton-plus trucks, grip is more important than tire smoke.
The luxury rigs we sampled averaged about $70K, which might surprise the average car shopper, but won't alarm the towing/hauling crowd.
At speed, the unladed ride quality is also decent – at least in F-250 form – with less shivering and quaking over rough pavement and good body control in corners. Steering is direct, if slow, and feel through both the steering and brakes is pretty much nil, but that's to be expected in this class of vehicle. The emphases for heavy-duty trucks is and should be on stability and predictability, and the F-250 exhibits both, even from a seating position well above standing height if you're not Kareem Abdul Jabbar.
Prices for the 2015 Super Duty starts at $32,240, though the cheapest model with the Power Stroke is the base $40,720 XL grade. Most of the cushy King Ranch and Platinum-grade rigs we sampled averaged about $70K, which might surprise the average car shopper, but won't alarm the towing/hauling crowd. Besides, if that seems steep, just think about it from a torque-per-dollar standpoint, and it seems like a damn bargain.
Featured Gallery2015 Ford F-Series Super Duty Power Stroke: First Drive
Ford F-350 Information
More F-350 Information
Image Credit: Copyright 2014 Steve Siler / AOL
ford f-250 super duty
Autoblog accepts vehicle loans from auto manufacturers with a tank of gas and sometimes insurance for the purpose of evaluation and editorial content. Like most of the auto news industry, we also sometimes accept travel, lodging and event access for vehicle drive and news coverage opportunities. Our opinions and criticism remain our own — we do not accept sponsored editorial.


Here are twenty-one photos of people who took selfies for fun but ended up in a disaster. These selfies tell the tale of their last moments before tragedy struck.
Skydiving is one of the scariest activities, but not for this guy Matthew Powell. He jumped off from a plane, took a selfie, and was never found again.
Hanging feet photo is a trend that is going on for a while now. This Russian, however, took it to the next level by standing on a thin strip on the side of the building. He slipped and died.
A honeymoon turned deadly. This is James Crowlett just a few minutes before his leg is torn into pieces by the shark behind him. He never made it to the hospital.
A live alligator chomped down the head of Brian Peterson who posed sticking his head in the mouth of the predator.
In this picture was the Australian guy who loves extreme heights. He climbed this suspension bridge which is 150 feet above the ground. He slipped and died.


text:
Navigate to Prospect Medical Holdings, Inc. homepage
Activate for site search
Search through the site content
Home / News / Roger Williams Medical Center Opens Behavioral Health and Substance Use Emergency Treatment Unit in Rhode Island
Roger Williams Medical Center Opens Behavioral Health and Substance Use Emergency Treatment Unit in Rhode Island
Published: Mar. 25, 2021
(Pictured L to R): Dr. Daren Girard; Candy Wray, RN; Dr. Greg Allen; and CEO Jeffrey Liebman.
Roger Williams Medical Center has opened Rhode Island's first completely dedicated emergency treatment unit to treat mental health, drug and alcohol medical emergencies that features private rooms for comfort, safety and privacy. The new 9-bed unit is the second and final phase of the hospital's $18 million expansion and renovation of its emergency department, which treats approximately 25,000 patients each year.
The newly opened behavioral health and substance use emergency treatment unit will operate in the space formerly occupied by the hospital's old emergency department, which was replaced by a new 12,000 square foot addition in 2018. The specially designed locked unit includes 9 private treatment rooms and is staffed by personnel who are trained and experienced in treatment of mental health and substance use emergencies.
Direct care will be provided by emergency nurses and physicians in collaboration with mental health clinicians. The Detoxification service will continue to be available and will be overseen by a board-certified emergency medicine physician.
CharterCARE CEO Jeffrey Liebman said, "Our new behavioral health emergency treatment unit will be a vital resource in our state's continuing challenge from mental health and substance use. We have long specialized in addiction medicine and mental health, but too many patients die before they can access that level of care. It is our hope that this new unit will save hundreds of lives each year and become a gateway to specialized addiction and mental health care."
"The new unit at Roger Williams Medical Center will help to fill a tremendous need, providing treatment and hope for Rhode Islanders with mental health and substance use conditions," said Kathryn Power, director of the Rhode Island Department of Behavioral Healthcare, Developmental Disabilities and Hospitals. "It is gratifying to see this investment in behavioral health services, because we know it will result in greater access to care for individuals who need help and are seeking recovery."
CharterCARE through its two hospitals, Roger Williams Medical Center and Our Lady of Fatima Hospital, is one of the state's leading providers of behavioral health and addiction treatment services, including the state's only Level I designated inpatient unit for substance use care, adult and geriatric psychiatry units, specialty programs such as partial hospitalization and intensive outpatient.
"Community health and individual well-being are incredibly fragile right now. In this moment, more than ever, we need to respond to diseases of despair and prioritize behavioral health issues," said Providence Mayor Jorge Elorza. "I commend Roger Williams Medical Center and CharterCARE for their commitment to ensuring our neighbors with substance use disorders and those who experience mental health emergencies have access to comprehensive and compassionate crisis intervention care."
3415 S. Sepulveda Blvd.
© 2022 Prospect Medical Holdings, Inc.


Regulations concerning the activities of the Einsatzgruppen of the SS and SD, which enabled these murder squads to operate with relative freedom within the areas controlled by the army groups under the direct command of Reinhard Heydrich.
The curtailment of military jurisdiction (Die Einschränkung der Kriegsgerichtsbarkeit), which stipulated that guerrillas, and civilians suspected of assisting them, were to be shot by the army, and that in case no guilty party could be found, collective measures were to be taken against the civilian population in the area.
The Commissar Order, which called for the shooting of any Red Army political commissar captured by the troops.


text:
A EU ban on steel imports from Russia will hit Poland hard
The ban on steel imports from Russia, which the European Union intends to introduce in the next package of sanctions, means that Poland will have one of the most important roles to play in this economic battle. Because Poland is one of the five most important markets for Russian finished steel exports.
The ban on imports of Russian steel and iron was announced on Friday, 11 of March 11, Commission chairman Ursula von der Leyen. It is to be part of the next package of sanctions that the European Union will impose on Russia for its attack on Ukraine.
"We will prohibit the import of key goods in the iron and steel sector from the Russian Federation. This will hit the central sector of the Russian system, deprive it of billions of export revenues and prevent our citizens from subsidising Putin's war", the official statement of the European Commission published on Friday reads.
76 million tons of steel
Russia is currently the world's fifth largest steel producer. According to data from the World Steel Association, last year Russian mills produced about 76 million tons of this product, up 6 percent, more than a year ago.
How much of this steel goes into the world? Quite a lot. According to a 2019 report by the US Department of Commerce, Russia was the third largest steel exporter in the world before the pandemic, shipping around 33 million tonnes annually.
In 2017, Russia's exports accounted for around 7 percent. of all global steel exports. In terms of value, foreign sales of steel accounted for 4.4 percent the total value of Russian exports.
So much has changed since then that world steel prices are at historically high levels and the demand for the Russian product has increased in some countries. This allowed Russia to make up for the pandemic slowdown and improve the profitability of exports.
The data collected by the S&P Global Commodity Insights website shows that in 2021 Russia exported 15.9 million tons of steel semi-finished products and 16.8 million tons of finished steel. Which means that the export volume has returned to the pre-Covid-19 level.
Poland on the front line
However, for the effectiveness of Western sanctions, the most important thing is the geographical structure of foreign sales markets. And here Poland has a very important role to play.
According to S&P Global data, our country is in the top five most important markets for Russian finished steel, next to Turkey, Kazakhstan, Belarus and Uzbekistan. In total, Russia sells half of its exports to these five countries.
Another European Union country that will surely stand next to Poland on the front line of sanctions is Belgium. It is the leading European market for Russian steel semi-finished products. Russians send as much as 70 percent of their goods to Belgium, Mexico, Taiwan, Turkey and Kazakhstan. of its exports in this segment.
Steel imports grew
Was steel from Russia important for the Polish economy? Unfortunately, in recent years, Polish industry and construction have brought more and more of it.
Already in the above-mentioned report of the American administration, analysts of the Department of Commerce pointed to the sharp increase in steel sales to Poland between 2017 and 2018. Then, imports from Russia to Poland, increased by as much as 160 percent.
In 2021 it was not any better, which in turn is indicated by the information from the Central Statistical Office of Poland. According to official data, 1.4 million Russian steel and cast iron, worth 4.7 billion PLN, went to Poland. And it was twice as much as the year before.
Import from Russia accounted for about 10 percent. of all steel imports, and Russia was the second largest supplier to Polish companies, after Germany.
The EU embargo must therefore cause tensions on the Polish market, the more so as it will coincide with another serious problem: the war may also stop steel imports from Ukraine. And this, in turn, is the third most important supplier: last year we imported about 1.4 million tonnes from our eastern neighbours.
In total, imports from Russia and Ukraine accounted for as much as 20 percent. steel imports to Poland. And it was purchasing abroad that was one of the most important sources of supply in the previous year for the rapidly growing construction industry and the industry waking up after the pandemic 2020.
"For every 1000 tons of products used by the economy, as many as 800 came from abroad. Every third tonne coming from abroad comes from outside the European Union (…) We have to ask ourselves whether the Polish economy is safe with such supply chains?" said Stefan Dzienniak, President of the Metallurgical Chamber of Industry and Commerce, drew attention during last year's European Economic Congress .
Steel prices will go up
The war in Ukraine and its economic consequences – including the sanctions imposed on Russia – will therefore have a direct impact not only on the situation on the oil and gas markets, but also on the steel markets.
So, indirectly, also in industrial processing – for example, in the production of household appliances or in the automotive industry. And in construction. Even if there is no shortage of steel, because entrepreneurs will find other suppliers, it is likely that it will be more expensive.
Russian steel was distinguished by, among others, low price. Based on the data from the Central Statistical Office (GUS), it can be calculated that, on average, the tonne imported to Poland was the cheapest among the most important importers. Only the one bought from Belarus was cheaper.
Anyway, and without the embargo on Russia, world prices began to rise rapidly after the Russian invasion of Ukraine. Chinese steel is more expensive. According to data from China Global Commodity Insights, in the first ten days of the war, the increase was almost 12 percent.
Why? China is a world tycoon in terms of production volume, but it systematically reduces it. The official reason is the need to reduce CO2 emissions. In 2021, Chinese production fell by around 3%. and this trend is not expected to change. This means that it can be difficult to fill the losses of Russian (fifth in the world) and Ukrainian (fourteenth) steel.
Source: 300gospodarka
Previous articlePoland wants to replace Russia in the G20 group
Next articleThe EUR/PLN exchange rate will stay in the 4.7-4.8 range for some time
A sharp increase in revenues from the export of Polish food....
Poland is in the forefront of exporters to Germany. Has overtaken...
Gas is getting cheaper. Europe can survive this winter and the...


What is it like to work at Robins Donuts?
What are people saying about the leadership at Robins Donuts?
ProsWe did get a free meal and a drink on our shift within reason, the good bosses, staff and customers.
ConsThe customers that expected over the top service, kids running around making other customers uncomfortable.
What are people discussing at Robins Donuts?
How much does Robins Donuts pay their employees?
What jobs are available at Robins Donuts?


A Chicago lawyer defends her Hungarian immigrant father against accusations of heinous war crimes committed during WWII. *Artist: LANGE,JESSICA *Genre: Drama *Rating: PG13 *Release Date: 5-APR-2011.
UnbeatableSale.com offers the most incredible deals on the latest furniture, electronics, gifts, health, and baby items. When you purchase this MUSIC BOX BY LANGE,JESSICA (DVD), you can be confident that you've found the best deal available online. Right now, our everyday price of $12.00 is 5% off the list price - a savings of $0.60! Want to save even more? Look for items marked FREE SHIPPING for free shipping within the continental United States. UnbeatableSale.com uses Secure Socket Layer (SSL) technology to encrypt all of your personal information before it travels over the Internet, so your payment information is always 100% protected.


text:
Ad Examples
Snack Podcast – N. W. Ayer & Son (Episode 13)
by Andrei FloreaApril 8, 2016no comment
N. W. Ayer & Son
You may think that the diamond engagement ring is a timeless symbol of love, but it turns out, it's not.
It's just a huge advertising campaign and today we are going to meet it's creator.
Let's start by quoting Beyonce "If you like it put a ring on it". But have you ever wondered why we put diamond ring on things we like?
You may think that the diamond engagement ring is a timeless symbol of love, but it turns out, this so-called ancient tradition it was actually an advertising campaign created less than a century ago for the De Beers Diamond Corporation.
In order to understand how an advertising campaign can make something intrinsic worthless worth millions, we have to meet the team who created this jewel of a campaign. No pun intended.
Ayer and Son was an advertising agency established in Philadelphia, Pennsylvania in 1869. It called itself the oldest agency in the United States. Named after Francis Ayer's father N. W. Ayer, it ventured into advertising in 1884. This advertising agency made a lot of breakthroughs that shaped the advertising as we know it today. For example, the "open contract" method of billing became the industry standard through its revolutionary nature.
This is basically a contract the terms of which do not describe the entire agreement between the two parties involved, with clauses or provisions that can be modified without mutual consent (usually by the vendor). They are also the first advertising agency to have a copywriting department and have a full-time copywriter.
Over the years, they created some of the most famous slogans for big companies like Camel, AT&T, and of course, De Beers.
They also worked with the U.S. army and they created the well-known "I want you for the U.S. army" poster. The war poster shows Uncle Sam pointing his finger at the viewer in order to recruit soldiers for the American Army during World War. The poster helped Americans understand their relationship to the wartime government.
Some other slogans N. W. Ayer & Son created was the "I'd walk a mile for a Camel" advertising, of course, Camel, the "Reach out and touch someone" promoting long-distance telephone service for AT&T and the famous a diamond is forever.
Let's talk a little bit about that campaign.
Before the 1930's nobody exchanged diamond rings when they've got engaged. But in 1938, the De Beer Diamond Corporation launched a massive ad campaign claiming that the only way for a real man to show his love, is with an expensive piece of crystallized carbon, and boy we bought it.
In fact, every element of traditional American engagement was designed to make more money for De Beers.
Now you might say, still, the diamonds are worth something. I'm sorry to break it to you, but diamonds are basically worthless. If you don't believe me, believe Nicky Oppenheimer, De Beers Chairman who said, and I quote "Diamonds are intrinsically worthless."
The only reason why diamonds are expensive is because De Beers has a global monopoly on diamond mining and they artificially restrict the supply to increase the prices.
This prove us how a century of good advertising can embed an idea so deeply in our culture that even knowing the truth, still won't make you not buy an engagement ring.
The agency didn't last very long. Soon enough, after an army scandal and losing contracts with Burger King, AT&T and a few others, the agency's influence started to diminish. In 1996, Ayer became part of MacManus Group after merging with D'Arcy Masius Benton & Bowles.
In 2002, after multiple mergers, Ayer offices were closed by the Publicis Groupe in Paris who bought their assets.
That's all for today, guys.
Show us some love by subscribing to our Soundcloud and Itunes Channel.
Also, make sure you check out Bannersnack for more advertising and design goodies.
Keep being awesome!
advertisingN. W. Ayer & Sonsnack podcast
20 Creative Poster Design Ideas for When You Have Designer's Block
by Heleana Tiburca1 week agono comment
Google Responsive Display Ads 101 – Everything You Need to Know
by Heleana Tiburca4 weeks agono comment
© 2018 Bannersnack All rights reserved.
Stay one step ahead of the competition with our newsletter packed with industry news, studies, how-to articles and, from time to time, exclusive Bannersnack offers and product updates.


Truly Jewellery was created in 2008 by Elizabeth Hoye who spotted a gap in the marketplace for affordable and stylish fashion jewellery.
Elizabeth studied fashion and design at University and previously worked in the jewellery industry based in Birmingham's famous Jewellery Quarter.
With a new family on the way, she decided to branch out alone and develop her own brand, selling jewellery to retail customers and also setting up a jewellery concession service. Elizabeth and her team personally select the jewellery and take great pleasure in choosing highly original, contemporary and unique designs that change regularly with the moving trends.
The Truly Jewellery concession service is available for those hotels, salons and boutiques who want to sell elegant jewellery to their customers.
We currently work with 4 and 5 star hotels and a range of independent spa's and retail outlets where our range of striking jewellery is displayed in exclusive jewellery display cabinets.
Get 10% off items from the Inspire Me Collections.
Truly Jewellery are always looking for brand ambassadors and if you are a people person with a talent for selling and a passion for fabulous jewellery then this could be for you.
Our brand ambassadors earn money by social media promotions, attending events and hosting jewellery parties – please just contact us for more information.


text:
var cp = require('child_process');
var fs = require('fs');
var path = require('path');
var _ = require('underscore');

/***** Indexing *****/

/**
* Recursively traverse files and directories invoking the callback
* function on each element found.
*/
explore_recursive = function(dir, callback, context, base) {
  if( base==undefined ) base = path.basename(dir);
  _.map(fs.readdirSync(dir), function(file) {
    var f = path.join(dir, file); // this is the real file name on disk
    var n = path.join(base, file); // this is the file name in the archive
    var s = fs.lstatSync(f);
    if( s.isDirectory() ) {
      context = callback(n, 'D', f, context);
      explore_recursive(f, callback, context, n);
    } else if( s.isFile() ) {
      context = callback(n, 'F', f, context);
    } else if( s.isSymbolicLink() ) {
      context = callback(n, 'L', f, context);
    } else {
      throw new Error('File type not supported, ignoring: '+f);
    }
  });
  return context;
};

/**
* Return file stats (see return statement).
*/
get_element = function(file, full_name) {
  if( full_name==undefined ) full_name = file;
  var s = fs.lstatSync(file), hash;
  var ret = {
    full_name: full_name,
    base_name: path.basename(file),
    type: (s.isDirectory()?'D':(s.isSymbolicLink()?'L':(s.isFile()?'F':'O'))),
    mode: s.mode,
  };
  if( ret.type=='F' ) {
    // hashes are only computed for files
    // FIXME: make a better helper function
    var h = cp.spawnSync('md5',['-r',file]);
    if( h.status!=0 ) {
      throw new Error(file+': '+h.error);
    }
    ret.hash = String(h.stdout).split(' ')[0];

    // size is only computed for files
    ret.size = s.size;
  }
  if( ret.type=='L' ) {
    // destination is computed only for symbolic links
    ret.destination = fs.readlinkSync(file);
  }
  return ret;
};

/**
* Construct an index of files for the specified directory.
*/
construct_file_index = function(dir, base) {
  return explore_recursive(dir, function(name, type, file, index) {
    index[name] = get_element(file, name);
    return index;
  }, {}, base);
};

/**
* Construct an index of objects from the specified file index.
*/
construct_object_index = function(file_index) {
  var object_index = {};
  _.map(_.values(file_index), function(element) {
    if( element.type=='F')
    {
      // hashes are only computed for files
      if( _.has(object_index, element.hash) ) {
        object_index[element.hash].refs += 1;
        object_index[element.hash].files.push(element);
      } else {
        object_index[element.hash] = {
          refs: 1,
          files: [element],
        };
      }
    }
  });
  return object_index;
}

/**
* Construct a full index of files and objects.
*/
construct_index = function(file_index) {
  return {
    files: file_index,
    objects: construct_object_index(file_index)
  };
};

/***** Handling changes *****/

/**
* Dummy callback function which only print information to stdout.
*/
var dummy_callback = {
  new: function(new_element) { console.info('new: '+new_element.full_name); },
  rename: function(old_element,new_element) { console.info('rename: '+old_element.full_name+'->'+new_element.full_name); },
  copy: function(old_element,new_element) { console.info('copy: '+old_element.full_name+'->'+new_element.full_name); },
  modify: function(old_element,new_element) { console.info('modify: '+new_element.full_name+' ('+old_element.size+' bytes -> '+new_element.size+' bytes)'); },
  modify_instance: function(old_element,new_element) { console.info('modify one instance: '+new_element.full_name+' ('+old_element.size+' bytes -> '+new_element.size+' bytes)'); },
  chmod: function(old_element,new_element) { console.info('chmod: '+new_element.full_name+' ('+old_element.mode+'->'+new_element.mode+')'); },
  unchanged: function(old_element,new_element) { console.info('no change: '+new_element.full_name); },
  delete: function(old_element) { console.info('delete: '+old_element.full_name); },
  delete_instance: function(old_element) { console.info('delete one instance: '+old_element.full_name); },
};

/**
* Detect changes and launch the appropriate callback actions.
* This is the core function of arcsavvy!
*/
compute_changes = function(start_index, end_file_index, end_element, callback) {
  // TODO: function to refactor...
  if( callback==undefined ) callback = dummy_callback;
  if( start_index.seen==undefined ) start_index.seen = {};

  var start_element = start_index.files[end_element.full_name];
  if( end_file_index && end_file_index[end_element.full_name]==undefined ) {
    // not found in end index: deleted or renamed?
    var end_index = construct_index(end_file_index);
    var end_element2 = end_index.objects[end_element.hash];
    if( end_element2==undefined ) {
      // hash not found: deleted
      callback.delete(end_element);
    } else {
      // hash found: renamed
      if( end_element2.refs==1 ) {
        callback.rename(end_element,end_element2.files[0]);
      } else {
        console.warn("Warning: Ambiguous rename, I consider the file as being copy of: "+end_element2.files[0].full_name);
        callback.rename(end_element,end_element2.files[0]);
      }
    }
  } else if( start_element==undefined ) {
    // file not found in start index: new, renamed or copied?
    start_element = start_index.objects[end_element.hash];
    if( start_element==undefined ) {
      // hash not found: new
      callback.new(end_element);
    } else {
      // hash found: renamed or copied?
      if( start_element.refs==1 ) {
        start_element = start_element.files[0];
        // if end_file_index is available, then forward detection is possible
        // so we can directly rename the file, otherwise we will have to
        // first make a copy of it, and delete it later
        if( end_file_index && !_.has(end_file_index, start_element.full_name) ) {
          // file is not present anymore: renamed
          start_index.seen[start_element.hash] = true;
          callback.rename(start_element,end_element);
        } else {
          // file is still there: copied
          callback.copy(start_element,end_element);
        }
      } else {
        // FIXME: what is the appropriate behavior?
        // FIXME: can it be a rename? can end_file_index help us find out?

        // there are multiple references, consider as new and emit a warning
        // console.log("Warning: Ambiguous rename, I consider the file as being new")
        // callback.new(end_element);

        // there are multiple references, consider arbitrarily as a copy of first one
        start_element = start_element.files[0];
        console.warn("Warning: Ambiguous copy, I consider the file as being copy of: "+start_element.full_name);
        callback.copy(start_element,end_element);
      }
    }
  } else {
    // file found in start index: modified?
    start_element.seen = true;

    if( start_element.type!=end_element.type ) {
      // file types are different:
      if( start_element.type=='L' && end_element.type=='F' ) {
        callback.delete(start_element);
        callback.new(end_element);
      } else if( start_element.type=='F' && end_element.type=='L' ) {
        callback.delete(start_element);
        callback.new(end_element);
      } else {
        // FIXME
        throw new Error('unsupported type change '+start_element.type+' to '+end_element.type);
      }
    } else if( end_element.type=='F' ) {
      // detect file changes
      if( start_element.size!=end_element.size || start_element.hash!=end_element.hash ) {
        // different hash or size
        var start_hash = start_index.objects[start_element.hash];
        if( start_hash.refs==1 ) {
          callback.modify(start_element,end_element);
        } else {
          callback.modify_instance(start_element,end_element);
        }
      } else if( start_element.mode!=end_element.mode ) {
        // different mode
        callback.chmod(start_element,end_element);
      } else {
        // no change detected
        callback.unchanged(start_element,end_element);
      }
    } else if( end_element.type=='D' ) {
      // detect directory changes
      if( start_element.mode!=end_element.mode ) {
        // different mode
        callback.chmod(start_element,end_element);
      } else {
        // no change detected
        callback.unchanged(start_element,end_element);
      }
    } else if( end_element.type=='L' ) {
      // detect symlink changes
      if( start_element.destination!=end_element.destination ) {
        callback.delete(start_element);
        callback.new(end_element);
      } else if( start_element.mode!=end_element.mode ) {
        // different mode
        callback.chmod(start_element,end_element);
      } else {
        // no change detected
        callback.unchanged(start_element,end_element);
      }
    } else {
      throw new Error('unsupported type '+end_element.type+' for file: '+end_element.full_name);
    }
  }
  return start_index;
};

/**
* Compare indexes and launch the appropriate callback actions.
* Offline = end index is already available
* Online  = end index is computed on the fly
*/
compare_indexes = function(start_index, index_or_dir, callback) {
  if( callback==undefined ) callback = dummy_callback;
  var end_file_index;

  // look for new files, renamed files and changed files
  if( index_or_dir instanceof Object )
  {
    // offline mode: end index is already available
    // iterate over end_file_index
    end_file_index = index_or_dir;
    _.map( _.values(end_file_index), function(end_element) {
      start_index = compute_changes(start_index, end_file_index, end_element, callback);
    });
  }
  else
  {
    // online mode: end index is computed on the fly
    // recursively explore dir
    var dir = index_or_dir;
    end_file_index = explore_recursive(dir, function(name, type, file, index) {
      index[name] = get_element(file, name);
      start_index = compute_changes(start_index, undefined, index[name], callback);
      return index;
    }, {}, '');
  }

  // end index is now available
  var end_index = construct_index(end_file_index);

  // look for deleted (= unseen) files
  _.map( _.values(start_index.files), function(start_element) {
    if( !_.has(start_index.seen, start_element.hash) ) {
      var end_element = end_index.objects[start_element.hash];
      if( end_element==undefined ) {
        callback.delete(start_element);
      } else {
        callback.delete_instance(start_element);
      }
    }
  });

  return end_index;
};

/***** Archive/Check/Restore *****/

/**
* Base functions for manipulating plain obejct archives, to be extended to
* support more elaborate archive types: with compression, packing, encryption,
* remote access, etc.
* This is the key class of arcsavvy.
*/
var plain_object_callback = function(archive_dir, files_dir) { return {
  // attributes
  archive_dir: archive_dir,
  object_dir: path.join(archive_dir, 'objects'),
  files_dir: files_dir,

  // archive manipulation
  init: function(index) {
    // create missing directories
    if( !fs.existsSync(this.archive_dir) ) {
      fs.mkdirSync(this.archive_dir);
    }
    if( !fs.existsSync(this.object_dir) ) {
      fs.mkdirSync(this.object_dir);
    }
  },
  readIndex: function(index) {
    if( index==undefined ) index='index.json';
    var index_file = path.join(this.archive_dir, index);
    if( fs.existsSync(index_file) ) {
      file_index = JSON.parse(fs.readFileSync(index_file));
    } else {
      file_index = { };
    }
    return construct_index(file_index);
  },
  pushSnapshot: function(new_index) {
    var snap = (new Date()).toJSON();
    var snap_file = path.join(this.archive_dir,'index-snapshot-'+snap+'.json');
    var index_file = path.join(this.archive_dir,'index.json');
    fs.writeFileSync(snap_file, JSON.stringify(new_index.files), 'utf-8');
    // FIXME: better helper function
    cp.spawnSync('cp', [snap_file,index_file]);
  },
  listSnapshots: function() {
    var snapshots = [];
    _.map(fs.readdirSync(this.archive_dir), function(f) {
      if( /^index-snapshot.*\.json$/.test(f) ) {
        snapshots.push(f);
      }
    });
    snapshots.push('index.json'); // always check index.json last
    return snapshots;
  },
  addObject: function(new_element) {
    if( new_element.type=='F' ) {
      var fpath = path.join(this.files_dir, new_element.full_name);
      var opath = path.join(this.object_dir, new_element.hash);
      if( fs.existsSync(opath) ) {
        // FIXME: handle collisions
        console.error('Error: Collision detected, ignoring file: '+new_element.full_name+' '+new_element.hash);
      } else {
        // FIXME: better helper function
        cp.spawnSync('cp', [fpath,opath]);
      }
    }
  },
  rmObject: function(old_element) {
    if( old_element.type=='F' ) {
      var opath = path.join(this.object_dir, old_element.hash);
      // FIXME: better helper function
      cp.spawnSync('rm', [opath]);
    }
  },
  checkObject: function(element, deep) {
    if( element.type=='F' ) {
      var ofile = path.join(this.object_dir, element.hash);
      if( !fs.existsSync(ofile) ) {
        return 'Archive is corrupt: Missing object '+element.hash+' / '+element.full_name;
      }
      if( deep ) {
        var s = get_element(ofile);
        if( s.hash!=element.hash ) {
          return 'Archive is corrupt: Hash mismatch for object '+element.hash+' / '+element.full_name;
        }
        if( s.size!=element.size ) {
          return 'Archive is corrupt: Size mismatch for object '+element.hash+' / '+element.full_name;
        }
      }
    }
    return true; // all checks succeeded
  },

  // restore functions
  restoreFile: function(element) {
    var fpath = path.join(this.files_dir, element.full_name);
    var opath = path.join(this.object_dir, element.hash);
    cp.spawnSync('cp', [opath,fpath]);
  },
  restoreDirectory: function(element) {
    var fpath = path.join(this.files_dir, element.full_name);
    fs.mkdirSync(fpath);
  },
  restoreLink: function(element) {
    var fpath = path.join(this.files_dir, element.full_name);
    cp.spawnSync('ln', ['-s', element.destination, fpath]);
  },
  restoreMode: function(element) {
    var fpath = path.join(this.files_dir, element.full_name);
    if( element.type=='L') {
      fs.lchmodSync(fpath, element.mode);
    } else {
      fs.chmodSync(fpath, element.mode);
    }
  },
  restore: function(archive_index) {
    // create the target directory
    if( fs.existsSync(this.files_dir) ) {
      throw new Error('Target directory already exists, will not overwrite: '+files_dir);
    }
    fs.mkdirSync(this.files_dir);

    // restore the archive contents
    var status = { };
    for( var o in archive_index.files ) {
      var element = archive_index.files[o];
      if( element.type=='F' ) {
        this.restoreFile(element);
      } else if( element.type=='D' ) {
        this.restoreDirectory(element);
      } else if( element.type=='L' ) {
        this.restoreLink(element);
      } else {
        throw new Error("unsupported type: "+element.type);
      }
      this.restoreMode(element);
      status[element.full_name] = true;
    }
    return status;
  },

  // callback function
  new: function(new_element) {
    // add the new object
    this.addObject(new_element);
  },
  rename: function(old_element,new_element) {
    // no action required: object is already present and still in use
    // TODO: possible full check for changes
  },
  copy: function(old_element,new_element) {
    // no action required: the copy file will use the already existing object
    // TODO: possible full check for changes
  },
  modify: function(old_element,new_element) {
    // add the modified version to the repository
    this.addObject(new_element);
  },
  modify_instance: function(old_element,new_element) {
    // add the modified version to the repository
    this.addObject(new_element);
  },
  chmod: function(old_element,new_element) {
    // no action required: object is already present and still in use
    // TODO: possible full check for changes
  },
  unchanged: function(old_element,new_element) {
    // nothing to do: element has not changed
    // TODO: possible full check for changes
  },
  delete: function(old_element) {
    // no action required: object is kept and will be removed later if nedded
  },
  delete_instance: function(old_element) {
    // no action required: object is still in use
  },
};};

/**
* Add a new snapshot to the archive repository using the designated callback
* manipulation functions.
*/
snapshot_archive = function(archive_dir, files_dir, callback) {
  if( callback==undefined ) callback = plain_object_callback;
  var archive, archive_index, new_index;

  // initialize the archive and read the index
  archive = new callback(archive_dir, files_dir);
  archive.init();
  archive_index = archive.readIndex();

  // Take a snapshot:
  //   1. update the archive with new objects
  //   2. push the latest snapshot
  //   3. remove objects not needed anymore
  new_index = compare_indexes(archive_index, files_dir, archive);
  archive.pushSnapshot(new_index);
  // TODO: remove objects not needed anymore

  return new_index;
};

/**
* Check archive.
*/
check_archive = function(archive_dir, deep, callback)
{
  if( deep==undefined ) deep=false;
  if( callback==undefined ) callback = plain_object_callback;
  var archive, archive_index, archive_check;

  // initialize the archive and read the index
  archive = new callback(archive_dir, undefined);
  archive.init();

  // check all snapshots
  archive_check = { };
  _.map( archive.listSnapshots(), function(snapshot) {
    archive_index = archive.readIndex(snapshot);
    archive_check[snapshot] = _.mapObject(archive_index.files, function(element, name) {
      return archive.checkObject(element, deep);
    });
  });
  return archive_check;
};

/**
* Restore the archive from scratch
*/
restore_archive = function(archive_dir, target_dir, index_name, callback)
{
  if( callback==undefined ) callback = plain_object_callback;
  var archive, archive_index, status;

  // initialize the archive and read the index
  archive = new callback(archive_dir, target_dir);
  archive.init();
  archive_index = archive.readIndex(index_name);

  // restore the archive
  status = archive.restore(archive_index);

  return status;
};

/* TODO: test special cases of type changes) */
/* TODO: handle collisions */
/* TODO: forget history */
/* TODO: unit tests */
/* TODO: subdirectories */
/* TODO: command line tool */
/* TODO: fail on error/warning/... */
/* TODO: npm package */
/* TODO: documentation */
/* TODO: split hashes for large files */
/* TODO: detect collisions */
/* TODO: archive fast mode (using hashes) */
/* TODO: archive full mode */
/* TODO: archive full mode (local copy of remote) */
/* TODO: check archive */
/* TODO: restore archive */
/* TODO: archive snapshots */
/* TODO: archive packing */
/* TODO: archive compression */
/* TODO: archive encryption */
/* TODO: archive to remote via SSH */
/* TODO: archive manipulation (e.g. shell?) */

redpajama_set_name: RedPajamaGithub


Hi All, I use [coveo for sitecore 80 3.0 (1226)]. Sitecore version is 8.0 Update 5. I finished setting up coveo for sitecore, which points to remote coveo server. (On premises). Diagnostic page doesn't show any error every thing is in green. I rebuilt the sitecore items and the index got created successfully. But only sitecore's system fields have been crawled. the other custom fields created have not crawled. Posting a screenshot for reference. Also I haven't excluded any custom templates in searchprovider.config.
This is an old version! If you could use a newer version, I would encourage you to do so.
This said, I think this is an issue that affected a particular CES version. I have seen this before, long time ago, I'm trying to find where => Which CES version are you using?
Also, could you tell me if there are errors in your logs?
Yes, I think the issue was that all Sitecore custom fields were marked as "Display Field" to false in the CES fields set. So the fields values are indexed but never returned on search results for queries. It affected only a single release of Coveo for Sitecore 3.0. The solution is to upgrade to a newer version.
I have stumbled upon a similar issue where a configuration node was completely overriding the fieldMap node.
It happens when you define a fieldMap node in a specific index node (say, only in <index id="coveo_master_index>" node). The specific one does not merge the specific one with the defaultIndexConfiguration/fieldMap node, it completely overrides it.
Please validate with a ShowConfig file that you do not have such configuration node.