Using no-cost mobile phone reminders to improve attendance for HIV test results: a pilot study in rural Swaziland.
Kliner M, Knight A, Mamvura C, Wright J, Walley J.
Mobile technology has great potential to improve adherence and treatment outcomes in healthcare settings. However, text messaging and phone calls are unaffordable in many resource-limited areas. This study investigates the use of a no-costalternative mobile phone technology using missed calls ('buzzing') to act as a patient reminder. The use of missed calls as a patient reminder was evaluated for feasibility and effectiveness as an appointment reminder in the follow-up of newly-diagnosed human immunodeficiency virus (HIV) positive patients in an HIV testing and counselling department in rural Swaziland.
This pilot study uses a before-and-after operational research study design, with all patients with mobile phones being offered the intervention. The primary outcome was the rate of attendance at the HIV testing and counselling department for collection of results in those with mobile phones before and after the introduction of the intervention.
Over two-thirds, 71.8% (459/639), of patients had a mobile phone. All patients with a mobile phone consented to being buzzed. There was no difference in attendance for follow-up at the clinic before and after the intervention was implemented (80.1% versus 83.3%, p = 0.401), or after adjusting for confounding factors (OR 1.13, p = 0.662).
This pilot study illustrates that mobile technology may be feasible in rural, resource-poor settings as there are high rates of mobile phone ownership and the intervention had a 100% uptake rate, with positive feedback from staff and patients. In this particular setting, the intervention did not improve attendance rates. However, further research is planned to investigate the impact on adherence to appointments and medications in other settings, such as HIV chronic care follow-up and as part of an enhanced package to improve adherence.


text:
Extraterrestials
UFO Enthusiasts
Inside The Head Of Elon Musk – Is Space X Really An Outer Space Hope?
by All Project Stats | Feb 3, 2020 | All Project Stats, Resources | 0 comments
Elon Musk is one of the most mysterious millionaires in the world. His fortune and his capacity to awe the world with it are uncanny; he´s got a taste for challenges and has now turned his attention towards the final frontier: outer space. Whenever I see him talking to media, I tend to think that he is convinced he can pull it off and take human life where it has never gone before. Read on as I try to get into his mind and tell you what are the odds with his space odyssey.
Start The Journey With LilHumpers
LilHumpers – going the cosmic way with the young dudes.
How to start your cosmic journey? It's simple when you have access to LilHumpers and its fine selection of videos. The genre might be an awkward one, but if you are a guy in your relatively young age you will find it crazy fun. LilHumpers is all about young dudes pleasing their MILF partners in daily life situation that went… sexual.
Elon Musk Wants To Go To Mars
As if it was the sixties again, Elon Musk seems to be racing NASA to get to Mars before they do. His company, SpaceX has already successfully tried to put people outside of Earth in a private manner and it was the first time that happened in history. All previous missions were completely handled and financed by governments and although I don´t believe USA astronauts really stepped on the moon, the space station is a reality.
Musk is on a rush to attain interplanetary life through SpaceX
Musk, on his crusade is planning to make reusable rockets and making planetary travelling safe, private and possible. Watching an interview, he gave, he said that human kind is in the perfect moment to try to travel through the space because we have no limiting catastrophe on us right now. He stated that if the future is darker than the present (which is very likely), then human kind will have to focus on fixing that instead of looking up and try to conquer the space. This is why he is on a rush to attain interplanetary life through SpaceX.
The Real Chances Of Doing It
Although only time will tell if he can pull off what nobody before him could, I have faith that someone with his knowledge, financial backup and determination can achieve what governments full of bureaucracy, corruption and defects couldn´t. I mean, I was as excited as we all were with the images that the rover Opportunity sent to us in its endless stay on the Red Planet, but that is very far from putting actual people on the surface and even further from making it an inhabitable place.
As far as his sayings, it is hard not to be excited to be alive in this time and believe him, but on the other hand, no real progress has been shown so far.
Will we ever know if there is intelligent life in other planets? What NASA is saying about Mars, in the sense that it used to have water and be apt for life like Earth, gave me goose bumps. I hope we are coming close to a golden space age.
Choosing to be a believer or not makes a huge difference in this kind of topic. I choose to believe Elon Musk will take us to Mars, or at least, very close to it.
Copyright © 2017 All Project Stats. All Rights Reserved

redpajama_set_name: RedPajamaCommonCrawl


Cyncoed is home to the Cardiff School of Education & Social Policy and the Cardiff School of Sport & Health Sciences (Cyncoed).
It is a busy campus that offers on-site accommodation and a new purpose-built Campus Centre. The campus offers excellent sporting facilities, on-site shop, coffee bars and refectory. The campus also acts as the head office for the Students' and Athletics Union.
Cardiff benefits from a network of cycle routes, including many traffic-free cycle paths. To plan your journey by bicycle to Cyncoed campus, visit Cycle Streets. Cycle route maps are also available from reception at each Cardiff Metropolitan University campus.


On the web we face some typographic challenges and limitations, the typefaces, font smoothing, and control we have over all typographic elements is inconsistent at best. However that hasn't stopped several great designers from using typography as the only significant element of design on their websites. They found a way to create beautiful and stunning visuals with out complex graphics, shading, color changes, backgrounds, etc… they let the type speak and the results are amazing.
Did I miss any? Leave them in the comments and I will add them to the list.
This entry was posted in Misc, Strategy and Planning and tagged design, font, font face, gallery, showcase, type, typeface, typography. Bookmark the permalink.
Jon Tan [http://jontangerine.com/] has some extremely well researched, considered, and written articles on Typography. His site is also beautifully presented.
I thought about Jon Tan, he does have a great site and some wonderful typography. Ultimately I left it out because I wanted the sites to be have 99.99% of the focus on type and Jon's main photo seemed to take away from it feeling like an "all type" sort of site.
Great post. Upstart Blogger and Monty Lounge are the ones that stand out for me.
Thanks Hannah, your site looks like a great "typographic design" type of site as well. I will add it to the list later tonight.
Thanks! It's a work in progress modification of one of the Upstart Blogger wordpress themes.
Still a work in progress but thought I would share. Feel free to comment.
Nice list, thanks. Designing with just type is tough, great to see some examples of it done well.
SOFAMADE – Are you different?
@Peter – Your comment definitely made me chuckle up some coffee. Very funny discovery.
I am not sure why, but I have seen lots and lots of companies of all different types talk about "why they are different" in their marketing materials.
Great selection. I like http://andrewpendrick.co.uk for a lovely example of using typography.
Wow…great post! Very intesting websites using typography, creative as well. i love sites like this. They have a different approach to design.
Great colection. I love it.
Great collection. I love it.
What am I, chopped tofu?
I do like your site but the design has a heavy influence by your photographs does it not?
This was a reason I opted not to include Jason Santamaria's new site as well… Beautiful typography but it wasn't the only element used for design.
Modula (http://www.modula.fi) has also a text-only interface. The design is available as a free WordPress theme.
very nice thaxs, I wonder if some client will buy a site like that.. who knows.
what about one of the smallest website on the planet ?
Great idea make this list with webdesign who is create only with font.
Nice list, Ross. Unless you're opposed, I think I'll link to it from our daily Twitter stream, @Pinch_Bespoke. Well done. I've got a few more to add but will e-mail you directly.
I do occasionally post photographs, yes. Man does not live by words alone.
I see I made your obscure podcast.
Pingback: Creative Isn't an Adjective: The Viximo Blog » Blog Archive » Monday's Afternoon Delight, Typography Edition!
Segnalo anche questo, non male!
This one its not bad!
Upon reinspection, six of your 25 candidates use photography or illustration.
Awesome article! It gives me a lot of inspiration about how awesome web typography can be when executed properly!
This is my first visit to your website and looking on, I'm impressed! Great design! I like your content!
Nice, lovely design. Great collection.
Nice collection, All sites looking very nice.
Good article. All sites looking very nice and simple design .Thank you!
I've taken a lot of inspiration from these sites, and from your own, to create my new blog design. If you like classic British typography, particularly Gill Sans, then it may be worth a visit.
very great list you have. i like the monty lounge design, simple.
Thanks to adding up the list. Love it.. people now seems want another simple design list here.
We were looking for a copywriter and come across this guy – lovely simple site.


Oral at 2.30 in the morning.
that UNTAC was the target of the attack.
a school, medical facilities and CPP office were set on fire by the guerillas.
The injured Bulgarian soldiers were in good condition.
taken place in Kompong Speu.
who has suffered the loss of eight people in violent attacks the past month,"


Editor's note: Here's a look at the latest "Food Experiment," convivial cookoffs lead by Nick Suarez and Theo Peck. Get inspired for your own holiday cooking!
Many belts were unbuckled at last weekend's Holiday Food Experiment, another jam-packed cook-off by Nick Suarez and Theo Peck, where attendees always leave well fed.
How is "holiday food" defined? That was the question left to be interpreted by over twenty amateur contestants. The resulting dishes represented an equal split between sweet and savory bites.
The savory options included punny dishes such as "Rudolph's Last Ride," a venison stew over corn spoon bread topped with cranberry compote and the nostalgic "Mrs. Yelavich's Chicken Liver," contenstant Eric Zawacki's rendition of his grandmother's chicken liver dish, complete with photos of his grandma displayed on the table. My personal favorite was Erin Erinson's "God Jul Goat Kjottkaker," which were goat balls with dilled brunost cream, aquavit-mashed roots, lingonberry jam, and gingered rye farmbread crumble. (Erinson won runner-up in the Audience Award).
The sweet entrants featured everything from macaroons to cakes to cheesecake balls. Jennifer Lee's mint brownie bombs with almond milk mochi was aptly titled "Milk and Cookies." Roopa Marcello snagged a judge's award with her Frosty's Flipped Fruitcake (a comeback for the oft-ridiculed holiday dessert), a brandied candied fruit compote layered between gingerbread five-spice cake, topped with bourbon brown sugar buttercream and maple-candied pecans.
Suarez and Peck both insisted that this experiment was "the best yet." When I pointed out that they have said that at the past two experiments I have attended (taco and brunch), Suarez insisted, "It's true, though! They just keep getting better and better."
Much of the food was pretty ambitious, like the "Bacon and Black Truffle Greenbean Casse roll" that included greenbeans and caramelized onion in an herb cream sauce on a three mushroom roll topped with crispy bacon and grated black truffle.
Or the food from the first place Audience Award winners, a group of guys who call themselves Righteous Burn, with their "True South," a hand-cut Yukon Gold baked potato chip with a bourbon and maple syrup roasted butternut squash puree, topped with ten-hour, slow-roasted pernil and a pickled jalapeno. They said that their Southern holiday theme "came from the US (squash) and Colombia (pernil), where two of us are from." They have placed four times at these cook-offs, an impressive trend considering that their day jobs are far from culinary.
The Food Experiments have gained in popularity since Suarez and Peck's first in June of 2009, and at the Holiday Food Experiment, the duo announced that they will be taking their cook-offs on the road, for the National Experiment Tour, in 2011, sponsored by the Brooklyn Brewery.
Like each of the Experiments, light-hearted fun and camaraderie keep the competition from becoming mean-spirited. The attendees are hardly food snobs: young and hip, they were happy snacking while they drank their complimentary Brooklyn Brewery lager and jamming to the DJed music. The result is a relaxed environment where the innovative and delicious food can be enjoyed in it's natural environment: holiday cheer!
Chefs take a break from handing out their dish to enjoy the festive day.


A new case render has surfaced online today, offering another look at the Galaxy S10 lineup. Quite a few of these renders are floating around already so add this one to the list as well. We're likely going to see more of these in the days leading up to the launch.
As many of you will be aware, Samsung is going to release three variants of the Galaxy S10. The render shows off the Galaxy S10 E or Lite, Galaxy S10 and the Galaxy S10+. There's also going to be a fourth variant with a 6.7-inch display and 5G. It will be called the Galaxy S10 X.
The design cues in this case render are not all that different from what we have already seen. The 5.8-inch Galaxy S10 model will have a flat display and a dual rear camera. The 6.1-inch Galaxy S10 and 6.4-inch Galaxy S10+ both have curved displays and a triple rear camera. The latter also has a dual camera on the front.
All three handsets will have an Infinity-O display. It places the front camera in a cutout within the active display area. The 5.8-inch model will have a side-mounted fingerprint sensor while the other two models have an in-display sensor. The case render does show a larger cutout for the power button on this model compared to the other ones.
Expect more renders of the Galaxy S10 lineup to surface in the coming days. Samsung has confirmed that it will unveil the Galaxy S10 on February 20. It will release the handsets in March. The 5G variant will only be offered in select markets such as the United States and South Korea.
The post New case render offers another look at the Galaxy S10 lineup appeared first on Techevangelistseo.


text:
package uk.ac.ebi.spot.goci.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;

/**
 * Created by emma on 21/07/2015.
 *
 * @author emma
 *         <p>
 *         A model object representing a gene from Entrez database
 */
@Entity
public class EntrezGene {

    @Id
    @GeneratedValue
    private Long id;

    private String entrezGeneId;

    @ManyToOne
    @JoinTable(name = "GENE_ENTREZ_GENE",
               joinColumns = @JoinColumn(name = "ENTREZ_GENE_ID"),
               inverseJoinColumns = @JoinColumn(name = "GENE_ID"))
    private Gene gene;

    // JPA no-args constructor
    public EntrezGene() {
    }

    public EntrezGene(String entrezGeneId, Gene gene) {
        this.entrezGeneId = entrezGeneId;
        this.gene = gene;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getEntrezGeneId() {
        return entrezGeneId;
    }

    public void setEntrezGeneId(String entrezGeneId) {
        this.entrezGeneId = entrezGeneId;
    }

    public Gene getGene() {
        return gene;
    }

    public void setGene(Gene gene) {
        this.gene = gene;
    }
}

redpajama_set_name: RedPajamaGithub


Ellen Chang is a freelance journalist who is based in Houston. She writes articles for TheStreet, Reach Further and other publications. Chang focuses her articles on stocks, entrepreneurs, personal finance, energy and cyber security.


OptOutPrescreen.com is a centralized service to accept and process requests from consumers to "Opt-In" or "Opt-Out" of firm offers of credit or insurance.
OptOutPrescreen.com is a joint venture among Equifax, Experian, Inc., Innovis Data Solutions, Inc., and TransUnion, LLC, aka, Consumer Credit Reporting Companies.
The FCRA (Fair Credit Reporting Act) allows you the ability to "Opt-Out", which prevents Consumer Credit Reporting Companies from providing your credit file information for firm offers of credit or insurance that are not initiated by you.
What is Electronic Opt-Out for Five Years?
Opting-Out refers to the process for removing your name from lists supplied by the Consumer Credit Reporting Companies, Equifax, Experian, Innovis and TransUnion, to be used for firm (preapproved / prescreened) offers of credit or insurance. Your rights as a consumer under the Fair Credit Reporting Act (FCRA) include the right to "Opt-Out" for 5 years or permanently.
What is Permanent Opt-Out by Mail?
Opting-Out refers to the process for removing your name from lists supplied permanently.
At the time that you submit your electronic request, you will receive a confirmation that you should print along with the Permanent Opt-Out Election Form. You must return the signed Permanent Opt-Out Election form to Opt-Out. In the interim, the company will complete a 5 year Opt-Out request on your behalf within 5 business days. Your request will become permanent when they receive your signed Permanent Opt-Out Election form.


The Zero Angle was the only cantina of the Galactic Empire's Bright Jewel Oversector Flight Base. While other flight bases had separate bars for groundhogs (atmospheric pilots) and vac-heads (space pilots), both groups gathered at the Zero Angle, which sometimes led to friction. Around the time of the Battle of Yavin, the bar was tended by Florn, a former pilot who had been injured in a crash.


text:
<?php

namespace PureMachine\Bundle\SDKBundle\Tests\Service;

use PureMachine\Bundle\SDKBundle\Tests\Service\Exposed\ExposedBuildErrorResponseWebServiceClient;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

/**
 * @code
 * ./bin/phpunit -v -c app vendor/puremachine/sdk/src/PureMachine/Bundle/SDKBundle/Tests/Service/WebServiceClientTest.php
 * @endcode
 */
class WebServiceClientTest extends WebTestCase
{

    protected function mockTranslator()
    {
        return $this->getMockBuilder('\Symfony\Component\Translation\Translator')
            ->disableOriginalConstructor()
            ->getMock()
            ;
    }

    /**
     * @code
     * ./bin/phpunit -v --filter testBuildErrorResponse -c app vendor/puremachine/sdk/src/PureMachine/Bundle/SDKBundle/Tests/Service/WebServiceClientTest.php
     * @endcode
     */
    public function testBuildErrorResponse()
    {
        $client = static::createClient();
        $container = $client->getContainer();

        $webserviceClient = new ExposedBuildErrorResponseWebServiceClient();
        $webserviceClient->setContainer($container);

        $sampleException = new \Exception("Sample exception in english", -202);
        $responseStore = $webserviceClient->exposedBuildErrorResponse("SampleWebservice", "V1", $sampleException, "http://full-rul", false);

        $this->assertEquals($responseStore->getUrl(), "http://full-rul");
        $this->assertEquals("Sample exception in english", $responseStore->getAnswer()->getMessage());
        $this->assertEquals(-202, $responseStore->getAnswer()->getCode());
    }

    /**
     * @code
     * ./bin/phpunit -v --filter testTranslatedBuildErrorResponse -c app vendor/puremachine/sdk/src/PureMachine/Bundle/SDKBundle/Tests/Service/WebServiceClientTest.php
     * @endcode
     */
    public function testTranslatedBuildErrorResponse()
    {
        $mockedTranslator = $this->mockTranslator();

        $client = static::createClient();
        $container = $client->getContainer();

        $mockedTranslator->method("trans")->willReturn("ejemplo de excepción en español");

        $webserviceClient = new ExposedBuildErrorResponseWebServiceClient();
        $webserviceClient->setContainer($container);
        $webserviceClient->translator = $mockedTranslator;

        $sampleException = new \Exception("Sample exception in english", 1);
        $responseStore = $webserviceClient->exposedBuildErrorResponse("SampleWebservice", "V1", $sampleException, "http://full-rul", false);

        $this->assertEquals($responseStore->getUrl(), "http://full-rul");
        $this->assertEquals("ejemplo de excepción en español", $responseStore->getAnswer()->getMessage());
        $this->assertEquals(1, $responseStore->getAnswer()->getCode());
    }

}


When it's time to dress up your rendezvous wardrobe, you can't go wrong with a leather coat, jacket, or vest from Blue Creek Traders. Take a look at what's available in our hand-sewn collection, or call us to custom-design a piece that's personally yours.
Please note that prices listed can vary according to market prices of hides and furs, cost of tanning, size of garment, and so forth.
Our long, collared buffalo coats are made to order, so you know your buffalo robe will fit you (and your personality) to a T. These popular hand-sewn coats often feature elk antler buttons, wool trade cloth, and a tail, but we'll make it your way. This is a best seller for Blue Creek Traders–and for good reason.
All sewn up and ready to ship, this basic buffalo coat features red trade wool and the animal's tail. You'll be forever warm!
Wow! The photos say it all. These garment-tanned buffalo coats (hair on the inside) will keep you warm and make your friends green with envy. Choose from a traditional hand-painted geometric design, magpies, or another design.
If you're looking for an authentic-look antelope jacket in a Southwest design, this is it. Notice the antler buttons plus dark green trade cloth and fringe on this hand-sewn piece with lots of details.
This old-style frock coat in antelope leather features lots of fringe.
This smoked antelope leather coat features elk antler buttons, lots of twisted fringe, and gray wool accents. Pockets are a helpful addition.
To wear or not to wear may be the question with this decorative piece. Fringe, four bead strips, red wool trim, and numerous hand-painted images adorn the brain-tanned leather. This one has sold, but we can custom-make a similar one just for you.
German brain-tanned and smoked leather jacket in three-quarters length features antler buttons and horse-hair locks. Collared style provides a finished look.
Horses Running Over Mountains scene is hand-painted on this white elk leather frock coat with belt. Gorgeous piece.
Don't miss this smoked German brain-tanned leather coat. Functional pockets, bone buttons, and blue wool trade cloth dress it up nicely.
This natural-colored, red wool-wrapped elk vest features painted accents on the front corners, which provide a teaser for the full-size image on the back. This one has sold, but we can custom-make a similar one for you.
This hand-sewn vest of deer leather features trade wool and bullet holes.
Get yourself some tail–whitetail deer, that is–with this leather vest featuring pockets, wool-wrapped trim, and plenty of fringe.
This whitetail deer leather vest, sans pockets, turns its attention to the Plains Indian-style painting on the back. Lots of twisted fringe, too, makes this piece a real head-turner.
This vest features a bear motif on antelope leather with blue wool accent and black fringe. Unique piece! This one has sold, but we can custom-make a similar one just for you.
Lakota Sioux vest is completely covered with beadwork.


Cut the fish into 3-4cm pieces and toss with the lemon juice, salt and ginger. Cover and set aside for 5 minutes.
Heat the oil in a lidded frying pan and when hot quickly seal the fish pieces on all sides.
Add the Wattie's Butter Chicken Curry Sauce, cream or coconut cream and coriander or parsley. Cover and simmer for 7-8 minutes until the fish flakes easily and is cooked.
Really easy and tasted great. The only mistake I made was using snapper. I could of used a cheaper fish as it wouldn't of made any difference.
Absolutely delicious. My kids are not that keen on fish, but loved this one!!
Love it,my husband wouldn't eat anything that had the word curry in it but he loves this, I am cooking it again right now.
An absolute hit. Easy as to make and my husband went back for seconds and then bagsed the leftovers to take to work for lunch. I've had to promise to make it again some time.
This is nice and easy to make and the whole family loved it.


text:
Екатери́на (или Елизаве́та) Никола́евна Альмеди́нген () — российская детская писательница и переводчица XIX века. Писала свои произведения под псевдонимом Е. Александрова.

Биография
Родилась  года. Из дворян, сестра Алексея и Александра Альмедингенов. Её племянницы Александра Алексеевна и Наталья Алексеевна также стали писательницами.

Окончила курс в Нижегородской женской гимназии. Занималась преподаванием русского языка и истории.

Была постоянной сотрудницей детских журналов «Воспитание и обучение», «Родник» (редактором которых был её брат) и «Задушевное слово», в которых печатались её биографии и исторические и этнографические статьи, и помещала в 1883—1887 годах корреспонденции из Нижнего Новгорода, переводы и компиляции в газете «Новости». В «Воспитании и обучении» было напечатано в 1882 году «Из воспоминаний детства»; в «Роднике» в 1886 году — повесть «История маленькой швеи»; в «Задушевном слове» в 1883 году — стихотворения «По Волге», и «Проказы лешего», и «Очерк из сибирской жизни»; отдельно появились: «И. П. Кулибин, русский механик-самоучка», в 1882 году, и «Ф. Н. Слепушкин», рассказ, в 1885 году.

Скончалась в Петербурге  года. После смерти Альмединген были напечатаны в 8—10 книжках «Нови» за 1888 год её картинки семейной жизни «Ошиблись».

Примечания

Литература

Детские писатели по алфавиту
Детские писатели Российской империи
Детские писательницы Российской империи

redpajama_set_name: RedPajamaWikipedia


text:
Business Negotiations
Sales Negotiations
Conflict Negotiations
Procurement Negotiations
Alliance & Joint Venture Negotiations
Opportunity Negotiations
CEOs – Driving Performance
CSOs – Improving Sales Results
CLOs – Training with an ROI Focus
Project Managers – Project Delivery Success
Sellers and Sales Managers – Closing Deals
Lawyers – Improving Business Outcomes, Limiting Exposure
Procurement, Vendor Mgmt – More Value, Better Relationships
Other Professionals – Improving Outcomes
Why K&R Negotiations
9 Great Reasons to Use K&R Negotiations
Our Negotiation Philosophy
K&R By the Numbers
Client Results and Testimonials
K&R Clients
Michael Firlie
Michael Firlie serves as Business Development Executive for K&R's DACH (Germany, Austria, Switzerland) region. He has extensive senior leadership experience and expertise in global sourcing and supply chain management, SaaS, contract management solutions, international IT/telecom operations, including related business and operations strategy, and business development. Michael has strong private and public-sector experience.
Prior to joining K&R, Michael served as the Head of Software/Hardware/Networks sourcing for a private company advising a multinational bank based in Switzerland. Michael also was the GM/VP European Operations for Icertis, a market leader in cloud-based contract management software. In this role, he established European market leadership for Icertis in the contract management space. Michael also served as Head of Global IT & Telecom Sourcing Operations for ABB, where he was responsible for sourcing all IT products and services as part of the global Group Information Systems organization. This included all hardware, software and services for ABB globally covering over $2 billion in spend.
Michael is a retired Lieutenant Colonel, US Army, serving for 20 years and two combat deployments. He earned a B.S. in Accounting from Frostburg State University and an M.S. in Telecommunications from the University of Colorado. He is fluent in English and German. Michael and his wife and their two daughters reside in Zurich, Switzerland.
White Paper, Negotiation Principles
Negotiation Examples
Complimentary Resources
About K&R
K&R News
© K&R Negotiation Associates LLC
Nevenka Letina Vivek Rawat


text:
Q: Lead-acid battery screening options We have a situation where we have on-hand many tens of thousands of 12 V lead-acid AGM batteries. The vendor had production issues, and we've found around 5-10% of these have an unacceptably low capacity (like around 20% of the Ah they're supposed to have). Most are OK, some are excellent.
We have determined the reason is that the AGM material is either not being compressed enough or compressed too much in the bad ones. The vendor wasn't adequately controlling plate thicknesses. So when we get a unit with middle-of-the-road plates, it's fine. If there's one extraordinarily thin or thick plate, that's when there are problems. I'm not a chemist, but it does seem this is "the cause". In a pulse-test, there's plenty electrolyte at the plates to deliver the brief current pulse, but since ion flow is impeded by incorrect AGM contact pressure, a longer term load exhausts the material in direct contact with the plates and we see bad Ah as a result.
I can't crucify the vendor for internal political reasons, so making them eat the batteries isn't an option. (No, it's not my fault either ;)
My problem is that I need to try to find a method to identify these bad ones before they're packed and shipped to customers.  Unfortunately we have found "for sure" we can't use a common pulse test. I purchased about a dozen different models and we have a custom one we use on our lines; none of these are able to pick out the bad ones. These batteries, good or bad, don't show any variance in their open-circuit voltage measurements, so that's not a suitable path either.
I've only found two methods to identify them:

*

*Do a full load charge/discharge test. I run this 4 or 5 times, and the bad ones usually are easily found this way. Obviously though, that's impractical to actually implement.

*Send them to customers and see who complains.

Needless to say, option #2 isn't an acceptable method either. So I'm stuck with "no option" at present.
What I'm going to do is perform a load test on a couple hundred pieces, but not a brief pulse. Instead I'm planning on drawing about 20 A for a couple of minutes and record the voltage curve.  I'll also take impedance readings (standard 1 kHz test). Batteries will be top-charged prior to making the test.
The hope is that this longer duration load test will show some more significant voltage drop on "bad" units than on good ones.  After taking that data, I'll do the 4-5 full cycle test to positively identify good & bad. If the gods of statistics are on my side, I'll be able to identify bad ones with this heavy load test (or by simple impedance measurement). We can tolerate this 1 or 2 minute test on the line, I just can't accept a 3-day test.
So my question to the community:
Are there any OTHER lead-acid characteristics I could potentially measure and make a judgement with? I can only think of load and impedance.  I can't open the batteries (they're glued shut), so all I can do is probe the 2 connection points.
Fingers crossed somebody out there is more knowledgeable or more clever than me!

redpajama_set_name: RedPajamaStackExchange


Somos especializados Calças De Trabalho Zipper Heavy Duty fabricantes e fornecedores / fábrica da China. Calças De Trabalho Zipper Heavy Duty atacado com alta qualidade como preço baixo / barato, uma das Calças De Trabalho Zipper Heavy Duty marcas líderes da China, Greateagle Safety Products Co., Ltd..
Wholesale Calças De Trabalho Zipper Heavy Duty from China, Need to find cheap Calças De Trabalho Zipper Heavy Duty as low price but leading manufacturers. Just find high-quality brands on Calças De Trabalho Zipper Heavy Duty produce factory, You can also feedback about what you want, start saving and explore our Calças De Trabalho Zipper Heavy Duty, We'll reply you in fastest.


text:
package wxweb

import (
	"bytes"
	"encoding/json"
	"encoding/xml"
	"fmt"
	"io"
	"io/ioutil"
	"mime/multipart"
	"net/http"
	"net/http/cookiejar"
	"net/url"
	"regexp"
	"strconv"
	"strings"
	"sync/atomic"
	"time"

	"github.com/songtianyi/rrframework/config"
)

// JsLogin: jslogin api
func JsLogin(common *Common) (string, error) {
	km := url.Values{}
	km.Add("appid", common.AppId)
	km.Add("fun", "new")
	km.Add("lang", common.Lang)
	km.Add("redirect_uri", common.RedirectUri)
	km.Add("_", strconv.FormatInt(time.Now().Unix(), 10))
	uri := common.LoginUrl + "/jslogin?" + km.Encode()

	req, err := http.NewRequest("GET", uri, nil)
	req.Header.Add("User-Agent", common.UserAgent)

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	ss := strings.Split(string(body), "\"")
	if len(ss) < 2 {
		return "", fmt.Errorf("jslogin response invalid, %s", string(body))
	}
	return ss[1], nil
}

// QrCode: get qrcode
func QrCode(common *Common, uuid string) ([]byte, error) {
	km := url.Values{}
	km.Add("t", "webwx")
	km.Add("_", strconv.FormatInt(time.Now().Unix(), 10))
	uri := common.LoginUrl + "/qrcode/" + uuid + "?" + km.Encode()
	resp, err := http.Post(uri, "application/octet-stream", nil)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	return body, nil
}

// Login: login api
func Login(common *Common, uuid, tip string) (string, error) {
	km := url.Values{}
	km.Add("tip", tip)
	km.Add("uuid", uuid)
	km.Add("r", strconv.FormatInt(time.Now().Unix(), 10))
	km.Add("_", strconv.FormatInt(time.Now().Unix(), 10))
	uri := common.LoginUrl + "/cgi-bin/mmwebwx-bin/login?" + km.Encode()
	resp, err := http.Get(uri)
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	strb := string(body)
	if strings.Contains(strb, "window.code=200") &&
		strings.Contains(strb, "window.redirect_uri") {
		ss := strings.Split(strb, "\"")
		if len(ss) < 2 {
			return "", fmt.Errorf("parse redirect_uri fail, %s", strb)
		}
		return ss[1], nil
	}

	return "", fmt.Errorf("login response, %s", strb)
}

// WebNewLoginPage: webwxnewloginpage api
func WebNewLoginPage(common *Common, xc *XmlConfig, uri string) ([]*http.Cookie, error) {
	u, _ := url.Parse(uri)
	km := u.Query()
	km.Add("fun", "new")
	uri = common.CgiUrl + "/webwxnewloginpage?" + km.Encode()
	resp, err := http.Get(uri)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	if err := xml.Unmarshal(body, xc); err != nil {
		return nil, err
	}
	if xc.Ret != 0 {
		return nil, fmt.Errorf("xc.Ret != 0, %s", string(body))
	}
	return resp.Cookies(), nil
}

// WebWxInit: webwxinit api
func WebWxInit(common *Common, ce *XmlConfig) ([]byte, error) {
	km := url.Values{}
	km.Add("pass_ticket", ce.PassTicket)
	km.Add("skey", ce.Skey)
	km.Add("r", strconv.FormatInt(time.Now().Unix(), 10))

	uri := common.CgiUrl + "/webwxinit?" + km.Encode()

	js := InitReqBody{
		BaseRequest: &BaseRequest{
			ce.Wxuin,
			ce.Wxsid,
			ce.Skey,
			common.DeviceID,
		},
	}

	b, _ := json.Marshal(js)
	client := &http.Client{}
	req, err := http.NewRequest("POST", uri, bytes.NewReader(b))
	req.Header.Add("Content-Type", "application/json; charset=UTF-8")
	req.Header.Add("User-Agent", common.UserAgent)

	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	return body, nil
}

// SyncCheck: synccheck api
func SyncCheck(common *Common, ce *XmlConfig, cookies []*http.Cookie,
	server string, skl *SyncKeyList) (int, int, error) {
	km := url.Values{}
	km.Add("r", strconv.FormatInt(time.Now().Unix()*1000, 10))
	km.Add("sid", ce.Wxsid)
	km.Add("uin", ce.Wxuin)
	km.Add("skey", ce.Skey)
	km.Add("deviceid", common.DeviceID)
	km.Add("synckey", skl.String())
	km.Add("_", strconv.FormatInt(time.Now().Unix()*1000, 10))
	uri := "https://" + server + "/cgi-bin/mmwebwx-bin/synccheck?" + km.Encode()

	js := InitReqBody{
		BaseRequest: &BaseRequest{
			ce.Wxuin,
			ce.Wxsid,
			ce.Skey,
			common.DeviceID,
		},
	}

	b, _ := json.Marshal(js)
	jar, _ := cookiejar.New(nil)
	u, _ := url.Parse(uri)
	jar.SetCookies(u, cookies)
	var client *http.Client
	var req *http.Request
	var err error
	for i := 0; i <= 10; {
		client = &http.Client{Jar: jar, Timeout: time.Duration(30) * time.Second}
		req, err = http.NewRequest("GET", uri, bytes.NewReader(b))
		if err == nil {
			break
		}
		if err != nil && i >= 10 {
			return 0, 0, err
		}
		i++
	}

	req.Header.Add("Content-Type", "application/json; charset=UTF-8")
	req.Header.Add("User-Agent", common.UserAgent)
	var resp *http.Response
	for i := 0; i <= 10; {
		i++
		resp, err = client.Do(req)
		if err != nil && i >= 10 {
			return 0, 0, err
		}
		if err == nil {
			break
		}
	}

	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	strb := string(body)
	reg := regexp.MustCompile("window.synccheck={retcode:\"(\\d+)\",selector:\"(\\d+)\"}")
	sub := reg.FindStringSubmatch(strb)
	retcode, _ := strconv.Atoi(sub[1])
	selector, _ := strconv.Atoi(sub[2])
	return retcode, selector, nil
}

// WebWxSync: webwxsync api
func WebWxSync(common *Common, ce *XmlConfig, cookies []*http.Cookie, msg chan []byte, skl *SyncKeyList) ([]*http.Cookie, error) {

	km := url.Values{}
	km.Add("skey", ce.Skey)
	km.Add("sid", ce.Wxsid)
	km.Add("lang", common.Lang)
	km.Add("pass_ticket", ce.PassTicket)

	uri := common.CgiUrl + "/webwxsync?" + km.Encode()

	js := InitReqBody{
		BaseRequest: &BaseRequest{
			ce.Wxuin,
			ce.Wxsid,
			ce.Skey,
			common.DeviceID,
		},
		SyncKey: skl,
		rr:      ^int(time.Now().Unix()) + 1,
	}

	b, _ := json.Marshal(js)
	jar, _ := cookiejar.New(nil)
	u, _ := url.Parse(uri)
	jar.SetCookies(u, cookies)
	//client := &http.Client{Jar: jar, Timeout: time.Duration(10) * time.Second}
	client := &http.Client{Jar: jar} // 防止synccheck 产生 0 3错误
	req, err := http.NewRequest("POST", uri, bytes.NewReader(b))
	req.Header.Add("Content-Type", "application/json; charset=UTF-8")
	req.Header.Add("User-Agent", common.UserAgent)
	var resp *http.Response
	for i := 0; i <= 10; {
		i++
		resp, err = client.Do(req)
		if err != nil && i >= 10 {
			return nil, err
		}
		if err == nil {
			break
		}
	}

	defer resp.Body.Close()

	body, _ := ioutil.ReadAll(resp.Body)

	jc, err := rrconfig.LoadJsonConfigFromBytes(body)
	if err != nil {
		return nil, err
	}
	retcode, err := jc.GetInt("BaseResponse.Ret")
	if err != nil {
		return nil, err
	}
	if retcode != 0 {
		return nil, fmt.Errorf("BaseResponse.Ret %d", retcode)
	}

	msg <- body

	skl.List = skl.List[:0]
	skl1, _ := GetSyncKeyListFromJc(jc)
	skl.Count = skl1.Count
	skl.List = append(skl.List, skl1.List...)
	return resp.Cookies(), nil
}
func WebWxSyncFlushCookie(common *Common, ce *XmlConfig, cookies []*http.Cookie, skl *SyncKeyList) ([]*http.Cookie, error) {

	km := url.Values{}
	km.Add("skey", ce.Skey)
	km.Add("sid", ce.Wxsid)
	km.Add("lang", common.Lang)
	km.Add("pass_ticket", ce.PassTicket)

	uri := common.CgiUrl + "/webwxsync?" + km.Encode()

	js := InitReqBody{
		BaseRequest: &BaseRequest{
			ce.Wxuin,
			ce.Wxsid,
			ce.Skey,
			common.DeviceID,
		},
		SyncKey: skl,
		rr:      ^int(time.Now().Unix()) + 1,
	}

	b, _ := json.Marshal(js)
	jar, _ := cookiejar.New(nil)
	u, _ := url.Parse(uri)
	jar.SetCookies(u, cookies)
	//client := &http.Client{Jar: jar, Timeout: time.Duration(10) * time.Second}
	client := &http.Client{Jar: jar} // 防止synccheck 产生 0 3错误
	req, err := http.NewRequest("POST", uri, bytes.NewReader(b))
	req.Header.Add("Content-Type", "application/json; charset=UTF-8")
	req.Header.Add("User-Agent", common.UserAgent)

	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	body, _ := ioutil.ReadAll(resp.Body)

	jc, err := rrconfig.LoadJsonConfigFromBytes(body)
	if err != nil {
		return nil, err
	}
	retcode, err := jc.GetInt("BaseResponse.Ret")
	if err != nil {
		return nil, err
	}
	if retcode != 0 {
		return nil, fmt.Errorf("BaseResponse.Ret %d", retcode)
	}

	skl.List = skl.List[:0]
	skl1, _ := GetSyncKeyListFromJc(jc)
	skl.Count = skl1.Count
	skl.List = append(skl.List, skl1.List...)
	return resp.Cookies(), nil
}

// WebWxStatusNotify: webwxstatusnotify api
func WebWxStatusNotify(common *Common, ce *XmlConfig, bot *User) (int, error) {
	km := url.Values{}
	km.Add("pass_ticket", ce.PassTicket)
	km.Add("lang", common.Lang)
	uri := common.CgiUrl + "/webwxstatusnotify?" + km.Encode()

	js := InitReqBody{
		BaseRequest: &BaseRequest{
			ce.Wxuin,
			ce.Wxsid,
			ce.Skey,
			common.DeviceID,
		},
		Code:         3,
		FromUserName: bot.UserName,
		ToUserName:   bot.UserName,
		ClientMsgId:  int(time.Now().Unix()),
	}

	b, _ := json.Marshal(js)
	client := &http.Client{}
	req, err := http.NewRequest("POST", uri, bytes.NewReader(b))
	req.Header.Add("Content-Type", "application/json; charset=UTF-8")
	req.Header.Add("User-Agent", common.UserAgent)

	resp, err := client.Do(req)
	if err != nil {
		return -1, err
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	jc, _ := rrconfig.LoadJsonConfigFromBytes(body)
	ret, _ := jc.GetInt("BaseResponse.Ret")
	return ret, nil
}

// WebWxGetContact: webwxgetcontact api
func WebWxGetContact(common *Common, ce *XmlConfig, cookies []*http.Cookie) ([]byte, error) {
	km := url.Values{}
	km.Add("r", strconv.FormatInt(time.Now().Unix(), 10))
	km.Add("seq", "0")
	km.Add("skey", ce.Skey)
	uri := common.CgiUrl + "/webwxgetcontact?" + km.Encode()

	js := InitReqBody{
		BaseRequest: &BaseRequest{
			ce.Wxuin,
			ce.Wxsid,
			ce.Skey,
			common.DeviceID,
		},
	}

	b, _ := json.Marshal(js)
	req, err := http.NewRequest("POST", uri, bytes.NewReader(b))
	if err != nil {
		return nil, err
	}
	req.Header.Add("Content-Type", "application/json; charset=UTF-8")
	req.Header.Add("User-Agent", common.UserAgent)

	jar, _ := cookiejar.New(nil)
	u, _ := url.Parse(uri)
	jar.SetCookies(u, cookies)
	client := &http.Client{Jar: jar}
	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	return body, nil
}

// WebWxSendMsg: webwxsendmsg api
func WebWxSendMsg(common *Common, ce *XmlConfig, cookies []*http.Cookie,
	from, to string, msg string) ([]byte, error) {

	km := url.Values{}
	km.Add("pass_ticket", ce.PassTicket)

	uri := common.CgiUrl + "/webwxsendmsg?" + km.Encode()

	js := InitReqBody{
		BaseRequest: &BaseRequest{
			ce.Wxuin,
			ce.Wxsid,
			ce.Skey,
			common.DeviceID,
		},
		Msg: &TextMessage{
			Type:         1,
			Content:      msg,
			FromUserName: from,
			ToUserName:   to,
			LocalID:      int(time.Now().Unix() * 1e4),
			ClientMsgId:  int(time.Now().Unix() * 1e4),
		},
	}

	b, _ := json.Marshal(js)
	req, err := http.NewRequest("POST", uri, bytes.NewReader(b))
	if err != nil {
		return nil, err
	}
	req.Header.Add("Content-Type", "application/json; charset=UTF-8")
	req.Header.Add("User-Agent", common.UserAgent)

	jar, _ := cookiejar.New(nil)
	u, _ := url.Parse(uri)
	jar.SetCookies(u, cookies)
	client := &http.Client{Jar: jar}
	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	return body, nil
}

// WebWxUploadMedia: webwxuploadmedia api
func WebWxUploadMedia(common *Common, ce *XmlConfig, cookies []*http.Cookie,
	filename string, content []byte) (string, error) {

	var b bytes.Buffer
	w := multipart.NewWriter(&b)
	fw, _ := w.CreateFormFile("filename", filename)
	if _, err := io.Copy(fw, bytes.NewReader(content)); err != nil {
		return "", err
	}

	ss := strings.Split(filename, ".")
	if len(ss) != 2 {
		return "", fmt.Errorf("file type suffix not found")
	}
	suffix := ss[1]

	fw, _ = w.CreateFormField("id")
	fw.Write([]byte("WU_FILE_" + strconv.Itoa(int(common.MediaCount))))
	common.MediaCount = atomic.AddUint32(&common.MediaCount, 1)

	fw, _ = w.CreateFormField("name")
	fw.Write([]byte(filename))

	fw, _ = w.CreateFormField("type")
	if suffix == "gif" {
		fw.Write([]byte("image/gif"))
	} else {
		fw.Write([]byte("image/jpeg"))
	}

	fw, _ = w.CreateFormField("lastModifieDate")
	fw.Write([]byte("Mon Feb 13 2017 17:27:23 GMT+0800 (CST)"))

	fw, _ = w.CreateFormField("size")
	fw.Write([]byte(strconv.Itoa(len(content))))

	fw, _ = w.CreateFormField("mediatype")
	if suffix == "gif" {
		fw.Write([]byte("doc"))
	} else {
		fw.Write([]byte("pic"))
	}

	js := InitReqBody{
		BaseRequest: &BaseRequest{
			ce.Wxuin,
			ce.Wxsid,
			ce.Skey,
			common.DeviceID,
		},
		ClientMediaId: int(time.Now().Unix() * 1e4),
		TotalLen:      len(content),
		StartPos:      0,
		DataLen:       len(content),
		MediaType:     4,
	}

	jb, _ := json.Marshal(js)

	fw, _ = w.CreateFormField("uploadmediarequest")
	fw.Write(jb)

	fw, _ = w.CreateFormField("webwx_data_ticket")
	for _, v := range cookies {
		if strings.Contains(v.String(), "webwx_data_ticket") {
			fw.Write([]byte(strings.Split(v.String(), "=")[1]))
			break
		}
	}

	fw, _ = w.CreateFormField("pass_ticket")
	fw.Write([]byte(ce.PassTicket))
	w.Close()

	req, err := http.NewRequest("POST", common.UploadUrl, &b)
	if err != nil {
		return "", err
	}
	req.Header.Add("Content-Type", w.FormDataContentType())
	req.Header.Add("User-Agent", common.UserAgent)

	jar, _ := cookiejar.New(nil)
	u, _ := url.Parse(common.UploadUrl)
	jar.SetCookies(u, cookies)
	client := &http.Client{Jar: jar}
	resp, err := client.Do(req)
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	jc, err := rrconfig.LoadJsonConfigFromBytes(body)
	if err != nil {
		return "", err
	}
	ret, _ := jc.GetInt("BaseResponse.Ret")
	if ret != 0 {
		return "", fmt.Errorf("BaseResponse.Ret=%d", ret)
	}
	mediaId, _ := jc.GetString("MediaId")
	return mediaId, nil
}

// WebWxSendMsgImg: webwxsendmsgimg api
func WebWxSendMsgImg(common *Common, ce *XmlConfig, cookies []*http.Cookie,
	from, to, media string) (int, error) {

	km := url.Values{}
	km.Add("pass_ticket", ce.PassTicket)
	km.Add("fun", "async")
	km.Add("f", "json")
	km.Add("lang", common.Lang)

	uri := common.CgiUrl + "/webwxsendmsgimg?" + km.Encode()

	js := InitReqBody{
		BaseRequest: &BaseRequest{
			ce.Wxuin,
			ce.Wxsid,
			ce.Skey,
			common.DeviceID,
		},
		Msg: &MediaMessage{
			Type:         3,
			Content:      "",
			FromUserName: from,
			ToUserName:   to,
			LocalID:      int(time.Now().Unix() * 1e4),
			ClientMsgId:  int(time.Now().Unix() * 1e4),
			MediaId:      media,
		},
		Scene: 0,
	}

	b, _ := json.Marshal(js)
	req, err := http.NewRequest("POST", uri, bytes.NewReader(b))
	if err != nil {
		return -1, err
	}
	req.Header.Add("Content-Type", "application/json; charset=UTF-8")
	req.Header.Add("User-Agent", common.UserAgent)

	jar, _ := cookiejar.New(nil)
	u, _ := url.Parse(uri)
	jar.SetCookies(u, cookies)
	client := &http.Client{Jar: jar}
	resp, err := client.Do(req)
	if err != nil {
		return -1, err
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	jc, _ := rrconfig.LoadJsonConfigFromBytes(body)
	ret, _ := jc.GetInt("BaseResponse.Ret")
	return ret, nil
}

// WebWxGetMsgImg: webwxgetmsgimg api
func WebWxGetMsgImg(common *Common, ce *XmlConfig, cookies []*http.Cookie, msgId string) ([]byte, error) {
	km := url.Values{}
	km.Add("MsgID", msgId)
	km.Add("skey", ce.Skey)
	km.Add("type", "slave")

	uri := common.CgiUrl + "/webwxgetmsgimg?" + km.Encode()
	req, err := http.NewRequest("GET", uri, nil)
	if err != nil {
		return nil, err
	}
	req.Header.Add("Content-Type", "image/jpeg")
	req.Header.Add("User-Agent", common.UserAgent)

	jar, _ := cookiejar.New(nil)
	u, _ := url.Parse(uri)
	jar.SetCookies(u, cookies)
	client := &http.Client{Jar: jar}
	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	return body, nil
}

// WebWxSendEmoticon: webwxsendemoticon api
func WebWxSendEmoticon(common *Common, ce *XmlConfig, cookies []*http.Cookie,
	from, to, media string) (int, error) {

	km := url.Values{}
	km.Add("fun", "sys")
	km.Add("lang", common.Lang)

	uri := common.CgiUrl + "/webwxsendemoticon?" + km.Encode()

	js := InitReqBody{
		BaseRequest: &BaseRequest{
			ce.Wxuin,
			ce.Wxsid,
			ce.Skey,
			common.DeviceID,
		},
		Msg: &EmotionMessage{
			Type:         47,
			EmojiFlag:    2,
			FromUserName: from,
			ToUserName:   to,
			LocalID:      int(time.Now().Unix() * 1e4),
			ClientMsgId:  int(time.Now().Unix() * 1e4),
			MediaId:      media,
		},
		Scene: 0,
	}

	b, _ := json.Marshal(js)
	req, err := http.NewRequest("POST", uri, bytes.NewReader(b))
	if err != nil {
		return -1, err
	}
	req.Header.Add("Content-Type", "application/json; charset=UTF-8")
	req.Header.Add("User-Agent", common.UserAgent)

	jar, _ := cookiejar.New(nil)
	u, _ := url.Parse(uri)
	jar.SetCookies(u, cookies)
	client := &http.Client{Jar: jar}
	resp, err := client.Do(req)
	if err != nil {
		return -1, err
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	jc, _ := rrconfig.LoadJsonConfigFromBytes(body)
	ret, _ := jc.GetInt("BaseResponse.Ret")
	return ret, nil
}

// WebWxGetIcon: webwxgeticon api
func WebWxGetIcon(common *Common, ce *XmlConfig, cookies []*http.Cookie,
	username, chatroomid string) ([]byte, error) {
	km := url.Values{}
	km.Add("seq", "0")
	km.Add("username", username)
	if chatroomid != "" {
		km.Add("chatroomid", chatroomid)
	}
	km.Add("skey", ce.Skey)
	uri := common.CgiUrl + "/webwxgeticon?" + km.Encode()

	req, err := http.NewRequest("GET", uri, nil)
	if err != nil {
		return nil, err
	}
	req.Header.Add("Content-Type", "image/jpeg")
	req.Header.Add("User-Agent", common.UserAgent)

	jar, _ := cookiejar.New(nil)
	u, _ := url.Parse(uri)
	jar.SetCookies(u, cookies)
	client := &http.Client{Jar: jar}
	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	return body, nil
}

// WebWxGetIconByHeadImgUrl: get head img
func WebWxGetIconByHeadImgUrl(common *Common, ce *XmlConfig, cookies []*http.Cookie, headImgUrl string) ([]byte, error) {
	uri := common.CgiDomain + headImgUrl

	req, err := http.NewRequest("GET", uri, nil)
	if err != nil {
		return nil, err
	}
	req.Header.Add("Content-Type", "image/jpeg")
	req.Header.Add("User-Agent", common.UserAgent)

	jar, _ := cookiejar.New(nil)
	u, _ := url.Parse(uri)
	jar.SetCookies(u, cookies)
	client := &http.Client{Jar: jar}
	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	return body, nil
}

// WebWxBatchGetContact: webwxbatchgetcontact api
func WebWxBatchGetContact(common *Common, ce *XmlConfig, cookies []*http.Cookie, cl []*User) ([]byte, error) {
	km := url.Values{}
	km.Add("r", strconv.FormatInt(time.Now().Unix(), 10))
	km.Add("type", "ex")
	uri := common.CgiUrl + "/webwxbatchgetcontact?" + km.Encode()

	js := InitReqBody{
		BaseRequest: &BaseRequest{
			ce.Wxuin,
			ce.Wxsid,
			ce.Skey,
			common.DeviceID,
		},
		Count: len(cl),
		List:  cl,
	}

	b, _ := json.Marshal(js)
	req, err := http.NewRequest("POST", uri, bytes.NewReader(b))
	if err != nil {
		return nil, err
	}
	req.Header.Add("Content-Type", "application/json; charset=UTF-8")
	req.Header.Add("User-Agent", common.UserAgent)

	jar, _ := cookiejar.New(nil)
	u, _ := url.Parse(uri)
	jar.SetCookies(u, cookies)
	client := &http.Client{Jar: jar}
	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	return body, nil
}

// WebWxVerifyUser: webwxverifyuser api
func WebWxVerifyUser(common *Common, ce *XmlConfig, cookies []*http.Cookie, opcode int, verifyContent string, vul []*VerifyUser) ([]byte, error) {
	var body []byte
	i := 0
	for i++; i <= 10; {
		km := url.Values{}
		km.Add("r", strconv.FormatInt(time.Now().Unix(), 10))
		km.Add("pass_ticket", ce.PassTicket)

		uri := common.CgiUrl + "/webwxverifyuser?" + km.Encode()
		js := InitReqBody{
			BaseRequest: &BaseRequest{
				ce.Wxuin,
				ce.Wxsid,
				ce.Skey,
				common.DeviceID,
			},
			Opcode:             opcode,
			SceneList:          []int{33},
			SceneListCount:     1,
			VerifyContent:      verifyContent,
			VerifyUserList:     vul,
			VerifyUserListSize: len(vul),
			skey:               ce.Skey,
		}
		b, _ := json.Marshal(js)
		req, err := http.NewRequest("POST", uri, bytes.NewReader(b))
		if err != nil {
			if i >= 10 {
				return nil, err
			} else {
				continue
			}
		}
		req.Header.Add("Content-Type", "application/json; charset=UTF-8")
		req.Header.Add("User-Agent", common.UserAgent)

		jar, _ := cookiejar.New(nil)
		u, _ := url.Parse(uri)
		jar.SetCookies(u, cookies)
		client := &http.Client{Jar: jar}
		resp, err := client.Do(req)
		if err != nil {
			if i >= 10 {
				return nil, err
			} else {
				continue
			}
		}
		defer resp.Body.Close()
		body, _ = ioutil.ReadAll(resp.Body)
		break
	}
	return body, nil
}

// WebWxCreateChatroom: webwxcreatechatroom api
func WebWxCreateChatroom(common *Common, ce *XmlConfig, cookies []*http.Cookie, users []*User, topic string) (interface{}, error) {
	km := url.Values{}
	km.Add("r", strconv.FormatInt(time.Now().Unix(), 10))
	km.Add("pass_ticket", ce.PassTicket)

	uri := common.CgiUrl + "/webwxcreatechatroom?" + km.Encode()
	js := InitReqBody{
		BaseRequest: &BaseRequest{
			ce.Wxuin,
			ce.Wxsid,
			ce.Skey,
			common.DeviceID,
		},
		MemberCount: len(users),
		MemberList:  users,
		Topic:       topic,
	}
	b, _ := json.Marshal(js)
	req, err := http.NewRequest("POST", uri, bytes.NewReader(b))
	if err != nil {
		return nil, err
	}
	req.Header.Add("Content-Type", "application/json; charset=UTF-8")
	req.Header.Add("User-Agent", common.UserAgent)

	jar, _ := cookiejar.New(nil)
	u, _ := url.Parse(uri)
	jar.SetCookies(u, cookies)
	client := &http.Client{Jar: jar}
	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	return body, nil
}

// WebWxRevokeMsg: webwxrevokemsg api
func WebWxRevokeMsg(common *Common, ce *XmlConfig, cookies []*http.Cookie, clientMsgId, svrMsgId, toUserName string) error {
	km := url.Values{}
	km.Add("lang", common.Lang)

	uri := common.CgiUrl + "/webwxrevokemsg?" + km.Encode()
	js := RevokeReqBody{
		BaseRequest: &BaseRequest{
			ce.Wxuin,
			ce.Wxsid,
			ce.Skey,
			common.DeviceID,
		},
		ClientMsgId: clientMsgId,
		SvrMsgId:    svrMsgId,
		ToUserName:  toUserName,
	}
	b, _ := json.Marshal(js)
	req, err := http.NewRequest("POST", uri, bytes.NewReader(b))
	if err != nil {
		return err
	}
	req.Header.Add("Content-Type", "application/json; charset=UTF-8")
	req.Header.Add("User-Agent", common.UserAgent)

	jar, _ := cookiejar.New(nil)
	u, _ := url.Parse(uri)
	jar.SetCookies(u, cookies)
	client := &http.Client{Jar: jar}
	resp, err := client.Do(req)
	if err != nil {
		return err
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	jc, err := rrconfig.LoadJsonConfigFromBytes(body)
	if err != nil {
		return err
	}
	retcode, _ := jc.GetInt("BaseResponse.Ret")
	if retcode != 0 {
		return fmt.Errorf("BaseResponse.Ret %d", retcode)
	}
	return nil
}

// WebWxlogout: webwxlogout api
func WebWxLogout(common *Common, ce *XmlConfig, cookies []*http.Cookie) error {
	km := url.Values{}
	km.Add("redirect", "1")
	km.Add("type", "1")
	km.Add("skey", ce.Skey)

	uri := common.CgiUrl + "/webwxlogout?" + km.Encode()
	js := LogoutReqBody{
		uin: ce.Wxuin,
		sid: ce.Wxsid,
	}
	b, _ := json.Marshal(js)
	req, err := http.NewRequest("POST", uri, bytes.NewReader(b))
	if err != nil {
		return err
	}
	req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
	req.Header.Add("User-Agent", common.UserAgent)

	jar, _ := cookiejar.New(nil)
	u, _ := url.Parse(uri)
	jar.SetCookies(u, cookies)
	client := &http.Client{Jar: jar}
	_, err = client.Do(req)
	if err != nil {
		return err
	}
	return nil
}


As discussed briefly in my last blog post, there were populations of organisms from our own genus, Homo, that were so different from our ancestors that most scientists consider them their own species. These "people" lived long ago. However, the idea that they are their own species should be taken with a certain degree of criticism because of science's loose interpretation as to what exactly constitutes a "species." When discussing Neanderthals (Homo neanderthalensis), nobody can argue against the fact that they were fairly distinct from our ancestors (Homo sapiens). However, the extent of this distinction is worth discussing. For example, ancient Homo sapiens diverged from the Neanderthals at around the same approximate point in history in which western chimpanzees diverged from eastern chimpanzees (Prado-Martinez, et al. 2013). Despite this fact, we consider humans and Neanderthals different species, yet we consider eastern and western chimpanzees simply different subspecies.
As we know, all human life began in Africa. All scientific evidence points to this fact. Our people eventually migrated out of Africa, but it appears as though the Neanderthals did this before our ancestors did. In fact, the majority of skeletal remains found from the Neanderthals were located in Europe. When they split off from the ancient group that contained both our ancestors and their ancestors, they likely migrated out of Africa through the North Eastern regions of the continent. They then traveled to Europe where they were able to continue evolving and developing the traits that made them unique from our own species. The discovery of Neanderthals was a grand one in scientific history, but it appears as though they were not the only group of "Homo" in the world other than our own species.
In 2010, a discovery was made in the Altai Mountains of Siberia. Specifically, it was made in a cave known as the Denisova Cave. The remains consisted mainly of a finger bone and a few molars (teeth). Despite the fragmented remains coming from different individuals, scientists were able to discover that they came from a new species that lived approximately 41,000 years ago! This species is now aptly named the Denisovans.
One might now be wondering how it is possible to tell that this was another species with nothing more than a few teeth and a finger bone from 41,000 years ago. The process is not a simple one, but it involves the isolation and amplification of ancient DNA from these sample. The isolation is necessary because there is so much "other" DNA that mixes with the ancient DNA. For example, countless bacteria exist, live, and thrive in the Denisova Cave, just as they do on the rest of our planet. Luckily, we are able to differentiate Hominin and bacterial DNA through bioinformatic analyses fairly simply because the two differ greatly. Then you run into the issue of "human contamination," so you also need to separate the ancient DNA out from the highly similar human DNA that comes from the excavators and scientists working with the samples. Lastly, amplification is needed because only an extremely small amount of ancient DNA exists after 41,000 years. Amplification is done through a process known as polymerase chain reactions, AKA PCR, which takes a small amount of DNA and replicates it over and over again until you have enough to study. I will discuss this process further in a future blog post.
It is important to note that since these findings, there has also been evidence of other "ghost" hominin species similar to these ones. However, most of these were likely in Africa, where the hot humid climate is not conducive to the fossilization process. For example, there is evidence that another hominin species known as Homo erectus existed, but scientists have not yet been able to sequence DNA from the fossilized remains that were found.
In my next blog post, I will discuss how our ancestors mated with the Neanderthal and Denisovan people and the imprints that this left on our genetic signatures. Until next week, carry on with curiosity!
Prado-Martinez, J., Sudmant, P. H., Kidd, J. M., Li, H., Kelley, J. L., Lorente-Galdos, B., … & Cagan, A. (2013). Great ape genetic diversity and population history. Nature, 499(7459), 471-475.


This entry was posted on mars 19, 2015 at 6:56 and is filed under Carnet de vie, carnets de voyage, Croquis, DEPLIANT.	You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.


text:
New Yorkers are falling behind on their water bills, but the Hochul administration has not distributed any of the federal government's $70 million of federal water assistance. | Jack Chen
Julia Rock / October 26, 2021
The moratorium expires in December. But New York hasn't distributed a single dollar of the $70 million of federal water assistance.
A few winters ago, 69-year-old Mike Haury suffered a stroke and had to leave his job as a bus driver for six months. Unable to survive a Buffalo winter without gas and electricity, Haury decided he would stop paying his water bills.
"I bought four gallons of water a week to flush the toilet and do dishes," Haury told New York Focus. "I heated up a pot of water, I took a glass, and I would pour a glass over me and soap up, pour a couple of glasses over me to rinse off, and that was a shower."
Veolia, the private provider that manages Buffalo's water system, had offered Haury a payment plan—but he found even the reduced monthly payments to be unaffordable. He was one of over 2,500 households to face a water shutoff that year for nonpayment in Buffalo.
Haury lived without water for over a year until the pandemic hit in March 2020, when the city of Buffalo reconnected water for people who had been shut off. "It was so nice to be able to turn the shower on and just have it," Haury recalled.
That July, New York passed a utility shutoff moratorium, which not only prevented water utilities from enacting shutoffs, but also gave the state an unprecedented role in regulating water utilities through a number of consumer protection and affordability requirements.
But with less than two months until the moratorium ends on December 21 and mounting customer utility debt across the state, the vast majority of the state's water utilities are not complying with some of these requirements — and the agency tasked with implementing the law has not enforced them.
Meanwhile, the Hochul Administration, widely praised for speeding up the process of getting rental aid out the door, hasn't distributed a single dollar of the approximately $70 million of federal water bill assistance set aside by the American Rescue Plan.
If consumers who can't pay their bills submit a form certifying that they have lost income due to the Covid-19 pandemic, the law requires utilities to give them an additional 6 months before shutting off their water. But water affordability advocates say that many consumers haven't been informed of this right and so won't fill out the forms—which means that in the worst scenario, they could receive water shutoff notices this holiday season.
These advocates say the Hochul administration has done little to enforce a requirement that utilities inform consumers of their rights. "There's been an unwillingness on the part of the Department of Public Service (DPS) to take this enforcement responsibility seriously, and they could not be more aware of the consequences of their failure to do so because we've been barraging them with the consequences ever since the law was enacted," said Stephen Halpern, an attorney with the Western New York Law Center who represents clients facing shutoffs.
The DPS, the agency which oversees access to utilities, did not directly respond to questions about its lack of enforcement, but said that it lacks general regulatory authority over public water utilities and does not have data about water debt arrears.
"DPS has no knowledge of any entity planning on mass shutoffs," a DPS spokesperson told New York Focus, adding that "while existing state law gives municipalities the authority to shut off customers for nonpayment, there is little incentive to do so."
That sense that mass shutoffs are unlikely could help explain why the state doesn't plan to release any water bill aid until January 1, 2022 at the earliest, according to grant applications submitted to the federal government.
Advocates working on water-related issues are pushing the state to speed up that timeline and to release the funds before the moratorium expires in December.
"Governor Hochul made getting backlogged rental relief out the door one of her first priorities. We hope she'll now turn her attention to getting New Yorkers desperately-needed water bill relief," said Rob Hayes, the Director of Clean Water at the Environmental Advocates of New York. "It would be unconscionable to leave money sitting on the table while families are put at risk of losing their water or losing their home."
Mounting Debts
Until last year, New York's Public Service Commission (PSC), the entity within DPS that regulates energy utilities and private water utilities, had never taken a role in regulating the more than 1,000 public water utilities in the state.
But amid the public health and economic crisis of the pandemic, the utility shutoff moratorium passed by the state legislature assigned the PSC a greater role. That left the commission with a problem on its hands that had been growing for decades: the rising cost of water in New York.
The DPS does not collect any data on how many municipal water utilities conduct shutoffs for nonpayment, and utilities are not required to publish information online about whether they do so. While New York City doesn't shut off water for nonpayment, some of the state's other largest utilities — in Suffolk County, Erie County, Monroe County, and Onondaga County, and the city of Rochester — do, according to their websites or bylaws.
Local health codes in many cases protect tenants against having their water shut off due to landlord nonpayment, but the same protections don't apply to homeowners. The Suffolk County Water Authority, the second largest in the state, shut off 1 percent of its customers for nonpayment in 2016, the most recent year for which data is available.
Timothy Motz, spokesperson for the Suffolk County Water Authority, told New York Focus that it does not have plans to shut off people's water on December 21, the day that the moratorium ends. "It is certainly our goal to not have to resort to shutoffs" in the long term, Motz said.
But whether or not they conduct shutoffs, many utilities use other means to collect debt, including selling liens for unpaid water bills—that is, selling the water debt to investors who can then foreclose on the home to recover the debt.
In New York City, such lien sales have been criticized for worsening the housing affordability crisis. According to a recent report by city comptroller Scott Stringer, water debt arrears in the city increased by 26% between the beginning of the pandemic and March 2021. The report noted that in 2020, of the more than 3,000 properties on the city's lien sale list, 681 were listed solely because of water debt.
The state's current shutoff moratorium includes prohibitions on these water debt liens, but its expiration in December means that hundreds of homeowners behind on their water bills could face foreclosures next year.
While the DPS does not collect state-wide data on the total number of households with water debt, New York Focus previously reported that water debts in the state have been mounting since the beginning of the pandemic. As of March 2021, 32,789 residential water customers in Suffolk County—about 10 percent of the county utility's total customers—were behind on their bills and owed an average of $270. Motz, the Suffolk County utility's spokesperson, told New York Focus that 1,300 customers have entered into payment plans since the moratorium was enacted.
Energy debt can also be a useful proxy for water debt, and the data shows that those debts have continued to mount. According to an analysis by the Public Utility Law Project of New York, nearly 300,000 residential utility customers owed a total of $888 million more in bills this August than before the pandemic began. A total of nearly 1.2 million accounts are in arrears, amounting to $1.7 billion, according to the analysis.
In other words, more than one in three households in the state are behind on their energy bills.
The shutoff moratorium included provisions that water advocates say should be made permanent in order to tackle the ongoing affordability crisis.
That included three essential features: the right of customers to self-certify that they had lost income during the pandemic in order to have an extra six months to pay off their debts; the right of customers to enter into an affordable payment plan; and a mandate that utilities inform customers of the first two rights.
But most water utilities in the state have failed to comply with that third provision, obligating them to inform customers.
Only about 1 in 20 water utilities in the state filed a mandatory copy of the notice they provided to customers informing them of these rights with the DPS, according to an analysis provided to New York Focus by advocacy groups working on water affordability and access, including Hayes' organization, Food and Water Watch, the Western New York Law Center, the Public Utility Law Project of New York.
Of the utilities that did file such a notice, nearly half misstated the law, according to that analysis.
Richard Berkley, Executive Director of the Public Utility Law Project of New York, said the low compliance levels aren't surprising, and point to the need for state-level coordination. "These are a bunch of utilities that are new to the regulatory process," he said, referring to municipal water utilities.
The coalition has been pleading with the PSC to take a more active role in implementing the law — including by sending templates of compliant notices to utilities that may not realize they are in violation of the law — but they say they've been rebuffed.
Many of the small, private utilities, Berkeley said, don't even have a lawyer on staff and lack the funding and administrative capacity to implement affordability measures without help from the PSC.
"The small private utilities lack the financial resources to do what they are supposed to do. The state has known that for years but not taken definitive action to deal with it," he said.
The DPS spokesperson did not respond to questions about its approach to enforcing this provision.
Beyond urging utilities to inform customers of their rights under the moratorium, the Hochul administration has another tool at its disposal to ward off shutoffs and foreclosures: $70 million in federal relief to distribute for water bill payment.
But according to the "grant implementation plan" submitted by the administration to the federal Department of Health and Human Services for those funds, part of a new Low Income Household Water Assistance Program, aid won't start flowing until January 1 at the earliest.
Other states including California, Connecticut, Massachusetts and Texas indicated in their submitted plans that water relief funds would begin flowing this fall.
The state Office of Temporary and Disability Assistance (OTDA), tasked with distributing the aid, says it hopes to get the money out the door as soon as possible, but declined to provide specifics on the timeline. "We've never had a statewide water affordability program before, so we are starting from scratch," an OTDA spokesperson told New York Focus.
Hayes said it should be a priority to get that money out of the door before the moratorium ends.
But even if it was disbursed tomorrow, he said, $70 million isn't enough to relieve New Yorkers behind on their water bills given that with energy utility debt is over $1 billion.
Hochul could go further and allocate additional American Rescue Plan funds toward water assistance, Hayes said.
This summer, Buffalo Mayor Byron Brown did just that, announcing that the city would be providing amnesty for water bills using $13 million of its own ARP money. At the time of his announcement in July, over 30,000 households in the city were behind on their water bills. He also announced that the city would no longer shut off water for nonpayment.
Two winters ago, Haury, the Buffalo resident, was melting snow from his backyard to get a little bit of extra water.
"I'm 69 and a veteran of the US Navy, and nobody could help," he said. Now, he is now on a payment plan and could benefit from Buffalo's arrearage relief program, and doesn't have to worry about the threat of a shutoff.
Across the state, others might not be so lucky.


text:
// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the Apache License, Version 2.0.  See License.txt in the project root for license information.

using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Composition;
using System.Linq;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.CSharp.UseObjectInitializer;
using Microsoft.CodeAnalysis.UseCollectionInitializer;

namespace Microsoft.CodeAnalysis.CSharp.UseCollectionInitializer
{
    [ExportCodeFixProvider(LanguageNames.CSharp, Name = PredefinedCodeFixProviderNames.UseCollectionInitializer), Shared]
    internal class CSharpUseCollectionInitializerCodeFixProvider :
        AbstractUseCollectionInitializerCodeFixProvider<
            SyntaxKind,
            ExpressionSyntax,
            StatementSyntax,
            ObjectCreationExpressionSyntax,
            MemberAccessExpressionSyntax,
            InvocationExpressionSyntax,
            ExpressionStatementSyntax,
            VariableDeclaratorSyntax>
    {
        protected override StatementSyntax GetNewStatement(
            StatementSyntax statement,
            ObjectCreationExpressionSyntax objectCreation,
            ImmutableArray<ExpressionStatementSyntax> matches)
        {
            return statement.ReplaceNode(
                objectCreation,
                GetNewObjectCreation(objectCreation, matches));
        }

        private ObjectCreationExpressionSyntax GetNewObjectCreation(
            ObjectCreationExpressionSyntax objectCreation,
            ImmutableArray<ExpressionStatementSyntax> matches)
        {
            return UseInitializerHelpers.GetNewObjectCreation(
                objectCreation, CreateExpressions(matches));
        }

        private SeparatedSyntaxList<ExpressionSyntax> CreateExpressions(
            ImmutableArray<ExpressionStatementSyntax> matches)
        {
            var nodesAndTokens = new List<SyntaxNodeOrToken>();
            for (int i = 0; i < matches.Length; i++)
            {
                var expressionStatement = matches[i];

                var newExpression = ConvertExpression(expressionStatement.Expression)
                    .WithoutTrivia()
                    .WithLeadingTrivia(expressionStatement.GetLeadingTrivia());

                if (i < matches.Length - 1)
                {
                    nodesAndTokens.Add(newExpression);
                    var commaToken = SyntaxFactory.Token(SyntaxKind.CommaToken)
                        .WithTriviaFrom(expressionStatement.SemicolonToken);

                    nodesAndTokens.Add(commaToken);
                }
                else
                {
                    newExpression = newExpression.WithTrailingTrivia(
                        expressionStatement.GetTrailingTrivia());
                    nodesAndTokens.Add(newExpression);
                }
            }

            return SyntaxFactory.SeparatedList<ExpressionSyntax>(nodesAndTokens);
        }

        private static ExpressionSyntax ConvertExpression(ExpressionSyntax expression)
        {
            if (expression is InvocationExpressionSyntax invocation)
            {
                return ConvertInvocation(invocation);
            }
            else if (expression is AssignmentExpressionSyntax assignment)
            {
                return ConvertAssignment(assignment);
            }

            throw new InvalidOperationException();
        }

        private static ExpressionSyntax ConvertAssignment(AssignmentExpressionSyntax assignment)
        {
            var elementAccess = (ElementAccessExpressionSyntax)assignment.Left;
            return assignment.WithLeft(
                SyntaxFactory.ImplicitElementAccess(elementAccess.ArgumentList));
        }

        private static ExpressionSyntax ConvertInvocation(InvocationExpressionSyntax invocation)
        {
            var arguments = invocation.ArgumentList.Arguments;

            if (arguments.Count == 1)
            {
                // Assignment expressions in a collection initializer will cause the compiler to
                // report an error.  This is because { a = b } is teh form for an object initializer,
                // and the two forms are not allowed to mix/match.  Parenthesize the assignment to
                // avoid the ambiguity.
                var expression = arguments[0].Expression;
                return SyntaxFacts.IsAssignmentExpression(expression.Kind())
                    ? SyntaxFactory.ParenthesizedExpression(expression)
                    : expression;
            }

            return SyntaxFactory.InitializerExpression(
                SyntaxKind.ComplexElementInitializerExpression,
                SyntaxFactory.Token(SyntaxKind.OpenBraceToken).WithoutTrivia(),
                SyntaxFactory.SeparatedList(
                    arguments.Select(a => a.Expression),
                    arguments.GetSeparators()),
                SyntaxFactory.Token(SyntaxKind.CloseBraceToken).WithoutTrivia());
        }
    }
}


text:
"Our hospitals are being rimracked by these Medicare reimbursement reductions," he said.
Cue the laughter.
My former colleague at The Courier-Journal, Eric Crawford:
Republican activist Tres Watson:
And Glasgow lawyer John Rogers:
Rimracked, according to the web site Urban Dictionary, means ... Uh. .... Oh, go ahead and look it up yourself. But only if you don't embarrass too easily. And for gosh sakes, don't let your kids do it. Just don't.
Anyway, the late Justice Potter Stewart once said of obscenity, "I shall not today attempt further to define the kinds of material I understand to be embraced within that shorthand description; and perhaps I could never succeed in intelligibly doing so. But I know it when I see it."
He might see it in this word.
Joe Sonka, of Insider Louisville:
Wonkette reported that he used the word twice in a floor speech in 2004. "I was rim-racked -- rim-racked -- by the two big newspapers in my state," he said.
And there were memes.
But if you look a little deeper on the internet -- a lot deeper -- you'll find what the 72-year-old senator said wasn't so bad.
I found several references to the word that had absolutely nothing to do with sex -- but couldn't find a definition for it other than the Urban Dictionary's. Then I found a notation that suggested there might just be a definition for the word in the Dictionary of American Regional English, published by Harvard University Press.
The dictionary allows you to look things up online only if you pay a subscription fee. Just $5,500. I figured my boss would balk at my expense report.
The Louisville Free Public Library had a copy of the dictionary, so I stopped there on my way to the office. Darn it. It was missing the fourth, fifth and sixth volumes.
Next was the University of Louisville's Ekstrom Library, where they had volumes five through six.
Bingo. I had a friend on campus run over and look it up.
The dictionary says it comes from the words rim (of a wheel) and rack (to twist or strain) and it means "to damage or destroy, esp. by misuse," or "to ruin, cheat," or "ruined, worn out, rickety," or "a foul-up."
The word has been around since 1841, according to the dictionary. More recently, its come to be a fishing expression that is used when a fisherman's net gets snagged on rocks on the bottom of the water.
Nothing to get all a-titter about.


A recent report states close to 75% of the world's population owns or has access to a smart device.
That's 5.3 billion people who are potential targets of mobile fraud. That's a lot of private information to keep safe.
With a new way for fraudsters to scam you out of your hard earned cash every day, it's no surprise smart mobile use is such a popular topic these days.
You follow links to the website and make your selections then proceed to your cart to check out. You input your personal info, including your email, password, first and last name, mailing address and full credit card information and click 'Complete My Purchase'. You've saved yourself a little money on your lunch break so you decide to reward yourself with a larger-than-life chocolate chip cookie. You hop up to find your server—it'll only take a moment, right? Life is grand.
You've made a few dire mistakes which could cost you a lot of time and money in the long run.
While your sweet tooth had you hunting down a little gratification, you've left your personal belongings at the table and your mobile device unlocked, making it all too easy for someone so swipe. Even if they weren't interested in your personal information, mobile phones can be pretty costly to replace.
The funny thing is—or not-so-funny, in this case—you're not the only one that knows you've just purchased 3 bottles of Energizing Ginger body spray. While you've been happily shopping away, Mrs. Scam E. Fraudartist has hijacked your internet session and now knows a lot more about you than you really intended to share. Additionally, she could use this information to log in as you using unfortunately easy-to-find scamming tools and begin her new life—your life.
When connecting to a mobile hotspot, be sure you're only sending information to websites that are full encrypted. There are two ways to tell if the site is secure.
Never leave your computer, mobile phone or smart device unattended in a public place, especially while unlocked. The number one most common mistake made by a mobile user is bypassing the option to have a passcode/password on your device. Set one up as soon as you can, make it complex and DON'T share it.
After logging into sites like Facebook, FlexTeller and other sites you may have personal information stored, be sure to log out then close your browser session.
For every new way of protecting your information, it won't be long before scammers will develop a device or system to hacking those as well. The best thing you can do is be smart with your devices and follow your instincts—if something doesn't feel right, don't proceed. Log out and close the browser session. The worst you could lose is a little time logging in later using a more secure site.
Previous PostPrevious Meet MembersFirst… the credit union with simplicity in mind.
Next PostNext Online Banking and Bill Pay–it's just what the doctor ordered.


text:
Home Entertainment Plus Salma Hayek brings daughter Valentina, 14, to 'Eternals' premiere
Salma Hayek brings daughter Valentina, 14, to 'Eternals' premiere
Salma Hayek made the Eternals premiere a family night, bringing along daughter Valentina.
It was a rare red carpet appearance for mother and daughter. The actress, 55, held the hand of the 14-year-old as they walked the press line and posed for photographers at the El Capitan Theatre in Hollywood.
The ladies coordinated their looks — a low-cut black Gucci dress with a gold back and mega leg slit for the movie star and a black and white polka dot mini dress by Saint Laurent for her mini-me. (Hayek's husband and Valentina's dad, François-Henri Pinault, is chairman and CEO of luxury fashion group Kering which owns Gucci and Saint Laurent.)
Valentina Paloma Pinault and Salma Hayek arrive for the World Premiere of Marvel Studios' Eternals at the El Capitan Theatre in Hollywood on October 18, 2021. (Photo: Jon Kopaloff/Getty Images for Lexus)
On the carpet, Hayek talked to Entertainment Tonight about being a superhero in a Marvel movie in her mid-50s. She plays the soulful leader of the Eternals, Ajak, in the film, which is out Nov. 5.
"She's cool," Valentina told the outlet of her mom. "She's cool."
Hayek proved how cool she was on the carpet too, going over to the fan section for a photo op with two young girls dressed as her character.
It's been several years since the duo walked the red carpet together. Valentina was behind the scenes at the Wrinkle in Time premiere in 2018 to give Oprah Winfrey a hug. But the last true red carpet was at a 2015 screening of Kahlil Gibran's The Prophet.
Salma Hayek and Valentina Paloma Pinault arrive at a screening of Kahlil Gibran's The Prophet on July 29, 2015. (Photo: Steve Granitz/WireImage)
Salma Hayek, Valentina Paloma Pinault and Oprah Winfrey at the premiere of Disney's A Wrinkle in Time on Feburary 26, 2018. (Photo: Alberto E. Rodriguez/Getty Images for Disney)
Valentina does pop up on her proud mama's Instagram, including on Valentina's birthday last month. The Mexican star told her "precious girl" that she is "everything to me. Blessed be the day you came into my life to shine your radiant light."
Hayek told the Telegraph last year that the pandemic lockdown, which they spent in London. "was very difficult" for the teen. "My daughter Valentina was very independent and did her online schoolwork on her own, but she didn't enjoy it. she also really missed her friends."
Previous articleSteve Bannon not cooperating suggests Trump may have been 'personally involved in the planning and execution' of the January 6 insurrection, Liz Cheney says
Next articleJrue Holiday injury: Bucks point guard exits opening game vs. Nets with right heel contusion


MG is a name that evokes pride and nostalgia for many Britons although it is not one with which many Americans, aside from that select group of enthusiasts who continue to race and restore classic, pre-1980 MG cars. MG was founded in the 1920s as a sports car manufacturer of then-fashionable two seat, open air cars but later it would go on to produce saloons and coupes as well. Although MG Rover ceased production in 2005, the brand was later acquired by a Chinese company who launched the MG 6 in 2011. Only time will tell if the reorganized company will be able to recapture the glory of old but we certainly hope so and, for those of you who are restorers and restylers, we've got MG dash kits for your classic MGs.
Whether you're looking to restore the interior of your MGB or Midget, we've got the right dash kit for the job. Because automotive restoration is all about using the best materials to bring your MG back to its former glory we recommend only the best in artisanal dash kit manufacturing: DL Auto.
DL Auto has been manufacturing dash kits for over thirty years and were the first to bring real wood dash and genuine carbon fiber dash kits to the market. Based in Brooklyn NY, DL Auto is proud to be one of the last, American dash kit makers. Through the use of CAD designs to ensure a precision fit and laser cutting technology to cut through real carbon fiber weaves and other high quality materials, DL Auto is able to offer you carbon fiber dash kits which fit your MG like a glove. But, after the design and laser cutting there is still one more step: polyurethane doming to give your kit a high-gloss, protective lacquer. This poly resin is hand poured on each piece individually and then allowed to cure for 48 hours at which time your MG dash kit is shipped to your door.
When you receive your MG dash kit simply read the included directions and use the prep pads to prepare the surface for installation. When you have cleaned and prepped your dash and interior trim panels, remove the red liner from the VHB tape that is preinstalled on the back of your MG dash kit and stick in place. Within 24 hours the bond will be permanent and you'll have the look of a mint condition MGB or Midget thanks to your DL Auto dash kit.