text:
2022 Kia Rio is still one of the least expensive new cars on sale today
Kia's plucky little subcompact starts at just over $17,000.
Steven Ewing
Nov. 3, 2021 8:23 a.m. PT
Steven Ewing Former managing editor
Steven Ewing spent his childhood reading car magazines, making his career as an automotive journalist an absolute dream job. After getting his foot in the door at Automobile while he was still a teenager, Ewing found homes on the mastheads at Winding Road magazine, Autoblog and Motor1.com before joining the CNET team in 2018. He has also served on the World Car Awards jury. Ewing grew up ingrained in the car culture of Detroit -- the Motor City -- before eventually moving to Los Angeles. In his free time, Ewing loves to cook, binge trash TV and play the drums.
The Rio is available as a sedan or hatchback.
The average price of a new car is roughly $45,000 which, frankly, is insane. Thankfully, there are still plenty of solid, affordable cars out there for shoppers on a budget, and one of our favorites is the subcompact Kia Rio.
Kia confirmed pricing for its 2022 Rio lineup this week, and it continues to be one of the least-expensive new cars available today. The base price of a 2022 Rio LX is just $17,145, while the slightly more upscale Rio S comes in at $17,785. (Both prices include a $995 destination charge.) Kia offers the Rio as both a four-door sedan and five-door hatchback, and there's no price difference depending on body style.
The only big option is a technology package, only available on the Rio S. For an additional $1,800, this tech pack adds forward-collision warning, lane-keeping assist, lane-following assist, lane-departure warning, LED headlights, tire pressure monitoring, automatic climate control, pushbutton start, alloy wheels, rear disc brakes (instead of drums!) and more. This is definitely a worthwhile addition if you can swing it.
The Rio heads into 2022 with only a few small changes, the most notable of which is the fitment of Kia's new corporate logo. Both LX and S models are powered by a 1.6-liter I4 engine, making 120 horsepower and 112 pound-feet of torque. But what the Rio lacks in power it makes up for with great fuel efficiency; both the sedan and hatchback are estimated to return 33 mpg city, 41 mpg highway and 36 mpg combined.
Despite its ultra-low price, there are still several cars that slide in under the Rio's starting MSRP. The Mitsubishi Mirage G4 sedan comes in at $16,290 including destination, and the Nissan Versa undercuts that by a few hundred bucks, at $15,955. The cheapest new car in the US is Mitsubishi's five-door offering, the 2021 Mirage hatchback, priced from $15,290. The Rio's a much nicer car than all of these, though, and it's available to check out at Kia dealers now.
2022 Kia Rio is a solid, affordable subcompact


You know the old joke—I have a face made for radio and a voice made for print. But there are things I can do in the broadcast world—like write! And shoot! My first true broadcast experience was writing scripts for two syndicated radio programs, Our Ocean World and MicrobeWorld, produced by Finger Lakes Productions International in 2002.	I	would	love	to	do more.
In the past few years, I began to do a bit more work with video. Here I include some feature packages and short films I have put together.
I also have an old demo I made when I was looking for a radio job in 1987.
Fencing may not be a huge sport in Mechanicsville, Va., but the Mechanicsville Fencing Academy is producing world-class athletes. I created a multimedia package—story, photographs, and video—to tell the story on the Academy and two of its top members: Stefani Deschner, one of the top-ranked fencers in the under-17 age group in the United States, and Rhiannon Harvey, a promising college prospect.
When I enrolled in the Ph.D. program in Media, Art, and Text at Virginia Commonwealth University, I was determined to learn to tell stories using video. In the spring of 2011, I took a graduate course in multimedia journalism taught by Dr. Tim. Bajkiewicz—who became my Ph.D. advisor. I produced these two videos to accompany a story on drugstore soda fountains in Mechanicsville, Va.
Rarely I am called upon to be a source. Here, Ric Young—a colleague of mine at Virginia Commonwealth University—asked me to put on my scientist hat to discuss whether Hurricane Sandy was a harbinger of what we on the East Coast could expect from climate change.
Is Hurricane Sandy The Weather of The Future?
I appeared on C-SPAN's BookTV twice when promoting my first book, Upheaval from the Abyss: Ocean Floor Mapping and the Earth Science Revolution. Aside from looking scary as hell—like a human were-Wookie caught in transition—I seem to do OK on camera. At least I seemed to do OK on these two appearances.
My first appearance was on a panel with Daniel Lenihan on "Undersea Archaeology" at the Virginia Festival of the Book. It aired on March 22, 2002.
The second was an interview after my appearance at the Fall for the Book festival. It aired on October 3, 2002.
This is an old demo I made when I was looking for some a radio job -- actually any job -- in 1987. I had excellent help, Tom Michaels, a disc jockey in my home town of Shreveport, Louisiana. Unfortunately for his reputation, my initial attempts at reading a script weren't all that impressive.
You will need a media player, such as, QuickTime, Real Player, Winamp, or Windows Media Player to listen to the demo.


text:
Your first step is to establish a public repository from which i can pull your work into the master repository.

 1. Setup a GitHub account (http://github.com/), if you haven't yet
 2. Fork the BlockchainWalletApi repository (http://github.com/sandrokeil/BlockchainWalletApi)
 3. Clone your fork locally and enter it (use your own GitHub username in the statement below)

    ```sh
    % git clone git@github.com:<username>/BlockchainWalletApi.git
    % cd BlockchainWalletApi
    ```

 4. Add a remote to the canonical BlockchainWalletApi repository, so you can keep your fork
    up-to-date:

    ```sh
    % git remote add upstream https://github.com/sandrokeil/BlockchainWalletApi.git
    % git fetch upstream
    ```

## Keeping Up-to-Date

Periodically, you should update your fork to match the canonical BlockchainWalletApi repository. we have
added a remote to the BlockchainWalletApi repository, which allows you to do the following:

```sh
% git checkout master
% git pull upstream master
- OPTIONALLY, to keep your remote up-to-date -
% git push origin
```

If you're tracking other branches -- for example, the "develop" branch, where new feature development occurs --
you'll want to do the same operations for that branch; simply substitute  "develop" for "master".

## Working on BlockchainWalletApi

When working on BlockchainWalletApi, we recommend you do each new feature or bugfix in a new branch. This simplifies the
task of code review as well as of merging your changes into the canonical repository.

A typical work flow will then consist of the following:

 1. Create a new local branch based off your master branch.
 2. Switch to your new local branch. (This step can be combined with the previous step with the use of `git checkout -b`.)
 3. Do some work, commit, repeat as necessary.
 4. Push the local branch to your remote repository.
 5. Send a pull request.

The mechanics of this process are actually quite trivial. Below, we will create a branch for fixing an issue in the tracker.

```sh
% git checkout -b 3452
Switched to a new branch '3452'
```
... do some work ...

```sh
% git commit
```
... write your log message ...

```sh
% git push origin HEAD:3452
Counting objects: 38, done.
Delta compression using up to 2 threads.
Compression objects: 100% (18/18), done.
Writing objects: 100% (20/20), 8.19KiB, done.
Total 20 (delta 12), reused 0 (delta 0)
To ssh://git@github.com/sandrokeil/BlockchainWalletApi.git
   g5342..9k3532  HEAD -> master
```

You can do the pull request from github. Navigate to your repository, select the branch you just created, and then
select the "Pull Request" button in the upper right. Select the user "sandrokeil" as the recipient.

### What branch to issue the pull request against?

Which branch should you issue a pull request against?

- For fixes against the stable release, issue the pull request against the "master" branch.
- For new features, or fixes that introduce new elements to the public API
  (such as new public methods or properties), issue the pull request against the "develop" branch.

## Branch Cleanup

As you might imagine, if you are a frequent contributor, you'll start to get a ton of branches both locally and on
your remote.

Once you know that your changes have been accepted to the master repository, we suggest doing some cleanup of these
branches.

 -  Local branch cleanup

    ```sh
    % git branch -d <branchname>
    ```

 -  Remote branch removal

    ```sh
    % git push origin :<branchname>
    ```

## FEEDS AND EMAILS

RSS feeds may be found at:

`https://github.com/sandrokeil/BlockchainWalletApi/commits/<branch>.atom`

where <branch> is a branch in the repository.

To subscribe to git email notifications, simply watch or fork the BlockchainWalletApi repository on GitHub.

redpajama_set_name: RedPajamaGithub


Found a WHSmith voucher with your name on it?
The savings are a few clicks away.
Guide to find out how.The two most common voucher variations include: Get a percentage or cash amount off a specific product or range when you ku baby gifts apply your WHSmith discount code (Ex.Redeeming your WH smith discount code.At DailySelect, we offer various discount information including online coupons, promo codes and many special in-store offers.Apple's App Store, Google Play for Android or, microsoft's Windows store.Online vouchers redeemable at WHSmith online.And between the vouchers and the already-great discount offers available on the website, there's always a good deal to be had at WHSmith.Therefore, there are many invalid coupons floating around the web.Once you redeem the offer, it'll give you a unique code which you need to show on your smartphone in-store.WH Smith on Instagram : Get a feel for WHSmith's artistic side with these creative shots featuring WHSmith books and other products.We only help you find the best bargains by applying discount codes.
WH Smith on Google Plus : Watch videos, read book reviews and get enough book suggestions than you can read in a lifetime.Wait until you're at the checkout and have the item in your hand (so you know it's in stock) before selecting the 'use it now' option as your code will expire after two minutes.WH Smith on Pinterest : Art, books,"s and some sweet ideas on creating the most perfect reading space.Email: You can also reach WHSmith via their Facebook page by posting on their wall or contacting them through private message.It might be too late for you to get this deal, but you can get prepared for the next O2 Priority freebie.Practice your penmanship with a quality WH Smith pens or jot down your innermost feeling in your very own WH Smith diary.We would be very happy if the instructions above could be helpful to you.Simply show the code from the app to staff at the checkout.


text:
Вековищев Михайло Дмитрович (;  5 серпня 1998) — російський плавець.
Призер Чемпіонату світу з водних видів спорту 2017, 2019 років.
Чемпіон світу з плавання на короткій воді 2016, 2018 років.
Чемпіон Європи з водних видів спорту 2020 року, призер 2018 року.
Чемпіон Європи з плавання на короткій воді 2017, 2019 років.
Призер літньої Універсіади 2017 року.

Посилання
 Вековищев Михайло Дмитрович на Swimrankings.net

Примітки

Народились 1998
Призери Універсіад з плавання
Призери з плавання чемпіонатів світу з водних видів спорту
Російські плавці
Призери з плавання чемпіонатів Європи з водних видів спорту
Плавці та плавчині на літніх Олімпійських іграх 2020
Плавці вільним стилем

redpajama_set_name: RedPajamaWikipedia


We believe George Gershwin`s work and the example he set by his dedication to the piano and to music will continue to inspire a new genertaion. This is a wonderful, high-quality collection of his most famous and best-loved songs. Arranged for piano and voice with guitar chord symbols.
Eingetragen in der Kategorie Singstimme & Klavier; Stichwort(e): I.M.P., Klavier & Gesang & Gitarre mit Akkordsymbolen, PVG(S).


text:
Norfolk District Website
Mission Support Division
Engineering and Construction Division
Water Resources Division
Programs & Projects Division
Visit Fort Norfolk
Vendor Resource Links
Silver Jackets
Regulatory Branch
NatickLandSale
Military Construction
Interagency and International Support
Overseas Deployments
CorpsTalk
USACE Publications
Army Publications
Project and Study Vault
Norfolk District Directory
Home / Media / News Stories
Atlantic Intracoastal Waterway route closed for gate restoration
SOUTH MILLS, N.C. – Due to required maintenance, the Dismal Swamp Canal on the Atlantic Intracoastal Waterway between North Carolina and Virginia has been temporarily shut off to vessel traffic.
USACE to host careers open house for students, grads and professionals
Hampton Roads-area college students, recent graduates and career professionals are invited to the Norfolk District, U.S. Army Corps of Engineers' Federal Careers Open House from 9 a.m. to 2 p.m. on Jan. 8, in the district's headquarters building at 803 Front St. here.
Dredging to start in Norfolk Harbor inner channels
NORFOLK, Va. – The U.S. Army Corps of Engineers and Cottrell Contracting are set to begin dredging the Norfolk Harbor Inner Channel and channel to Newport News on Saturday.
Agencies to sign agreement at Nansemond project's next Restoration Advisory Board meeting
SUFFOLK, Va. — Federal, state and local agencies tackling restoration efforts at Former Nansemond Ordnance Depot will sign a memorandum of understanding at Thursday's quarterly Restoration Advisory Board meeting, officials announced.
Norfolk District and young scientists intersect during geotagging event
Students and teachers from Norfolk Christian Lower School geoprocessed data with employees from Norfolk District, U.S. Army Corps of Engineers to recognize GIS Day.
Work to resume on Virginia Beach oceanfront project
Norfolk District, U.S. Army Corps of Engineers and city of Virginia Beach officials said Great Lakes Dredge & Dock LLC, the Virginia Beach Hurricane and Storm Damage Reduction Project's contractor, intends to mobilize equipment at 68th Street and install submerged pipeline between 60th and 61st streets here this week.
Small business is big business for Norfolk District
In the last two years, Cherie Kunze met with over 200 firms, conducted numerous outreach events and used each of her 30 years of contracting experience. In 2019, it paid off. The Norfolk District Office of Small Business Programs deputy took the commander's program to record highs by far exceeding the district's small business goals.
Mosquito treatment set for Tuesday at Craney Island
NORFOLK, Va. – Norfolk District, U.S. Army Corps of Engineers will conduct another round of aerial mosquito treatment Tuesday over federal property on Craney Island.
Gathright Dam's final pulse release of 2019 set for Wednesday
COVINGTON, Va. – Gathright Dam operators are scheduled to carry out the year's sixth and final water-pulse release from Lake Moomaw on Wednesday. It will take place between 6 a.m. and 1:30 p.m.
USACE: Deep Creek Bridge Replacement Project continues to progress
NORFOLK, Va. – Norfolk District, U.S. Army Corps of Engineers is moving ahead with its state and city partners on the Deep Creek Bridge Replacement Project in Chesapeake, but ongoing real-estate acquisition challenges could have an impact on next year's solicitation and construction schedule.
Norfolk District reflects on strong year supporting state, national partners
As the fiscal calendar nears 2020, officials at Norfolk District, U.S. Army Corps of Engineers are working to close the books by month's end while taking a glimpse back at the past year's accomplishments.
Gathright Dam's next pulse release set for Wednesday
COVINGTON, Va. – Gathright Dam operators are scheduled to conduct the year's fifth water-pulse release from Lake Moomaw on Wednesday. It will take place between 6 a.m. and 1:30 p.m.
Corps planning for impacts to Atlantic Intracoastal Waterway as a result of Dorian
Norfolk District officials overseeing the Dismal Swamp and Chesapeake and Albemarle canals, are closely monitoring and preparing for potential impacts from Hurricane Dorian.
Norfolk District to conduct mosquito treatment Sept. 9
Weather permitting, the Norfolk District, U.S. Army Corps of Engineers will conduct aerial mosquito treatment over the federal property of Craney Island, Virginia, Sept. 9.
Virginia Beach project temporarily halted
Reinforcing nearly 75% of the oceanfront in roughly two months, the Virginia Beach Hurricane and Storm Damage Reduction Project has come to a halt.
District preps for Dorian, stands ready to respond if commonwealth impacted
In conjunction with Gov. Ralph Northam's state of emergency declaration for Virginia yesterday, the Norfolk District, U.S. Army Corps of Engineers (USACE) activated its Emergency Operations Center in Richmond to facilitate close coordination with state and federal agencies on pre- and post-storm activities.
Gathright Dam's fourth pulse release of 2019 set for Sept. 4
COVINGTON, Va. – Gathright Dam operators are scheduled to carry out the year's fourth water-pulse release from Lake Moomaw on Sept. 4. It will take place between 6 a.m. and 1:30 p.m.
From strangers to family
Thinking she was just going to perform a regular biological site survey, Carissa never suspected that one hour would end up changing the rest of her life. Carissa Agnese, Army Corps of Engineers Norfolk District planning department senior biologist, has what is called polycystic kidney disease. It's a hereditary disease that grows cysts on the kidney, eating away at the tissue until they can't function anymore.
USACE pushes ahead with Deep Creek Bridge Replacement Project
Norfolk District, U.S. Army Corps of Engineers has mapped out plans to replace the aging Deep Creek Bridge in Chesapeake, alongside its state and city partners.
Gathright Dam's third pulse release set for Aug. 14
Gathright Dam operators are scheduled to conduct the year's third water-pulse release from Lake Moomaw on Aug. 14.
About the Norfolk District Website
The official public website of Norfolk District, U.S. Army Corps of Engineers. For website corrections, please write to cenao-pa@usace.army.mil.

redpajama_set_name: RedPajamaCommonCrawl


text:
Q: How to bind primary key of a selected value from listBox? I am using listBox to show results of a searched value. I want that after searching a value,  user will select a value from searched results, its Id that is PK(Primaray Key) should pass to selected results instead of that selected item. http://i.stack.imgur.com/NaiK0.png For example in attached image I want that when user will click on "assignment7" its id value i.e 8 should pass to selected result field. How can i do it. Need your guidance. Thank You!
Here my code is:
    <ListBox Grid.Row="1" SelectionMode="Single" SelectionChanged="PrintText" Background="DarkGray" Visibility="Collapsed"  Height="Auto" HorizontalAlignment="Left" Margin="156,36,0,0" Name="listBox1" VerticalAlignment="Top" Width="191" UseLayoutRounding="True" />
  <Grid>
<TextBlock Grid.Row="1" HorizontalAlignment="Left" Margin="12,12,0,0" x:Name="textBlock1"  Text="For Search Type here" VerticalAlignment="Top" Height="auto" Width="auto" Foreground="White" />
        <TextBox Grid.Row="1" HorizontalAlignment="Left" Margin="156,12,0,246" x:Name="textBox1" Width="191" TextWrapping="NoWrap" TextChanged="textBox1_TextChanged" />
        <ListBox Foreground="White" Grid.Row="1" SelectionMode="Single" SelectionChanged="PrintText" Background="DarkGray" Visibility="Collapsed"  Height="Auto" HorizontalAlignment="Left" Margin="156,36,0,0" Name="listBox1" VerticalAlignment="Top" Width="191" UseLayoutRounding="True" />
        <TextBox Grid.Row="1" Height="16" HorizontalAlignment="Left" Margin="389,0,0,248" x:Name="txtSelectedItem" VerticalAlignment="Bottom" Width="91" Grid.ColumnSpan="2" />
    </Grid>

  private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
        {

  string typedstring= textBox1.Text;
List<string> autolist= new List<string>();
foreach(string b in al)
{
if(!string.IsNullOrEmpty(textBox1.Text))
{
if(b.StartsWith(typedstring))
{
autolist.Add(b);
}
}
}
if(autolist.Count>0)
{
    listBox1.ItemsSource = autolist;
    listBox1.Visibility = Visibility.Visible;

}
else if (textBox1.Text.Equals (""))
{

    listBox1.Visibility = Visibility.Collapsed;
    listBox1.ItemsSource = null;
}

else
{

    listBox1.Visibility = Visibility.Collapsed;
    listBox1.ItemsSource = null;
}

        }

        private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
             selectedItemsId = (int)listBox1.SelectedValue;
            if (listBox1.ItemsSource != null)
            {
                listBox1.Visibility = Visibility.Collapsed;
                textBox1.TextChanged += new TextChangedEventHandler(textBox1_TextChanged);
            }

            if (listBox1.SelectedIndex != -1)
            {
                textBox1.Text = listBox1.SelectedItem.ToString();
                textBox1.TextChanged += new TextChangedEventHandler(textBox1_TextChanged);
            }
        }
        void PrintText(object sender, SelectionChangedEventArgs args)
        {

             Window1 neww = null;
             neww = new Window1();
             neww.Title = selectedItemsId.ToString();
             neww.Show();
        }

        private void SetupListBox()
        {
            List<Assignment> lst = new List<Assignment>();

            listBox1.ItemsSource = lst;
            //This is what will be displayed
            listBox1.DisplayMemberPath = "assignment_title";
            //This is what will set the selected value to the property you want
            listBox1.SelectedValuePath = "assignment_id";
        }

A: Set selected value path to the PK field and then use selected value to get the current value
 class Example
    {
        public int id { get; set; }
        public string Name { get; set; }
    }

    private void SetupListBox()
    {
        List<Example> lst = new List<Example>();
        lst.Add(new Example { id = 1, Name = "First Item" });
        lst.Add(new Example { id = 2, Name = "Second Item" });
        lst.Add(new Example { id = 3, Name = "Third Item" });

        listBox1.ItemsSource = lst;
        //This is what will be displayed
        listBox1.DisplayMemberPath = "Name";
        //This is what will set the selected value to the property you want
        listBox1.SelectedValuePath = "id";
    }

    private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        //Get the selected Items id property
        int selectedItemsId = (int)listBox1.SelectedValue;
    }

redpajama_set_name: RedPajamaStackExchange


text:
Q: BLE emission when disconnected and waiting connection I'm working on a toy device that goes into an airplane. It is using a BLE device and yet my knowledge about is a quite limited.
If I understood correctly, usually in protocols: the device advertise, the central connects and communicate. But if a disconnection happens (for instance my phone goes into flight mode), is it possible to be sure that the device doesn't send any data?(no advertising)
And more important: since I've been connected once, can my device just passively wait some incoming data to reconnect ? (the landing is done, my phone is active again. Thus I want to reconnect to my device without pushing any button)
I couldn't find any flowchart explaining this situation. Maybe that are silly questions but I cannot find the answer clearly.
Thanks a lot!

A:
And more important: since I've been connected once, can my device just passively wait some incoming data to reconnect

Nope. A BTLE peripherial must advertize in order to be found and re-connected.
Thus your device needs an OFF switch for strict airplane compliance.


text:
T-Mobile USA Announces Major 4G Coverage Expansion in 14 Markets, Solavei MVNO Targets iPhone Users
Thursday December 20, 2012 10:27 am PST by Eric Slivka
T-Mobile USA today announced that it has made significant enhancements to its 4G network in 14 areas, signaling continued efforts to support the iPhone on its fastest 4G networks. T-Mobile has announced that it will officially begin offering the iPhone sometime next year.
Today, we're announcing technology advancements in 14 new metro areas to close out 2012, underscoring our rapid enhancements to the already powerful 4G experience we offer. This has been a busy year for T-Mobile's network — we announced a $4 billion plan to advance the network, secured vendors and quickly got to work installing new equipment across the country. Only 10 months after announcing our plans, we've already enhanced coverage for more than 100 million people!
Alongside T-Mobile's announcement, mobile virtual network operator (MVNO) Solavei, which operates using T-Mobile USA's network, has officially launched a major push to attract iPhone customers.
Launched on September 21, 2012, Solavei has already attracted more than 100,000 members nationwide to take advantage of the only mobile phone service offering a $49 per month unlimited voice, text and data plan, along with the unique opportunity to earn recurring monthly income by sharing with friends and family.
"The network enhancements give our current and future members the ability to use their unlocked iPhones and other AT&T/4G smartphones at the highest possible speeds in even more cities," said Ryan Wuerch, founder and CEO of Solavei. "The time is right for the more than 4 million AT&T iPhone customers who initially signed contracts in 2010 to cut their phone bills in half and gain the opportunity to earn income by sharing Solavei with their friends and family."
Solavei notes that T-Mobile's network enhancements now allow it to support the iPhone in 37 new markets.
The network enhancements allow Solavei members to use iPhones and other AT&T/4G smartphones to access its $49 per month unlimited voice, text and data in areas including New York City, Newark, Boston, Philadelphia, Detroit, Dallas, Fort Worth, Austin, San Antonio, Tampa, Baltimore, Houston, Kansas City, Las Vegas, Washington DC, Atlanta, Seattle, Minneapolis, Boston, Chicago, Los Angeles, Philadelphia, San Diego, Central and Southern Arizona, San Francisco Bay Area, Central Valley California and South Florida.
T-Mobile is the last of the four major U.S. carriers to officially offer the iPhone, and while T-Mobile itself will not begin offering the iPhone until next year, Solavei's announcement suggests that T-Mobile's 1900 MHz 4G buildout is far enough along to support a major rollout of iPhone service.
Chocolatemilty
instead of wasting time and resources for HSPA+ redeployment on 1900mhz, they should instead that towards deploying LTE band 4.
I'd hardly call rolling out the 1900 band for HSPA+ as a fallback for the eventual LTE rollout when they received $4 billion "wasting time and resources," not to mention the increased revenues from the MVNOs using their network and the expected increase of unlocked phone subscribers.
AAPL addict
So I'm in Austin and getting 3G data on my iPhone 4S with T-Mobile. However, my daughter with her iPhone 3GS (3G data turned on) still only shows EDGE. Does anyone know why?
You might want to contact T-Mobile tech support for this question. I find it interesting on all the T-Mobile press releases I've read as it relates to upgrading their data speeds to work with iPhone they consistently state up to 70% faster data speeds than AT&T when tested with the iPhone 4S. I have yet to see them mention any other iPhone models as it relates to this. It makes me want to think that the faster data speeds might not work for an iPhone 4 or iPhone 3GS but only guessing by reading their press releases.
Go T-Mobile go!
As a proud owner of an iPhone 4S, living in Dallas, stuck in an AT&T contract I cannot wait to finish my term and move to T-Mobile or a T-Mobile MVNO (i.e., reseller). I'll take the now availlable for iPhone T-Mobile 3G / 4G data speeds of 20 MB download which blow away the slow AT&T data speeds I get for my iPhone now (advertised by AT&T as 4G on my phone), get unlimited talk / text / data with T-Mobile and cut my monthly wireless bill in half. I for one would rather have unsubsidized wireless rates and pay full price for the iPhone. I think T-Mobile upgrading their technology to deliver 3G and 4G data speeds for iPhones and offering unsubsidized rates will play out big in 2013 and the years to come. Sorry AT&T but I foresee a lot of cost conscientious consumers completing their AT&T terms, unlocking their GSM iPhones and moving to T-Mobile.
winston1236
Now on to their 200mb of 4g speed...
OriginalMacRat
The 3GS doesn't support hspa+ which is what they're refarming....... So her 3GS won't do 3G on tmob only 4 and up
Incorrect. The 1900MHz refarm isn't limited to HSPA+.
And before you try to argue that it is, keep in mind that many iPhone 3GS users (myself included) are getting 3G on T-Mobile now.
dukebound85
Does Straight Talk have more coverage than TMO?
ST uses either ATT or Verizons network depending on the plan


Joseph Maxwell's emergence as one of Scotland's important contemporary painters had its unlikely genesis in Ordnance Survey and his wartime exploits as a young RAF airman.
Having had a variety of short-term jobs after leaving school, he trained as a cartographer and served with a photographic reconnaissance squadron, undertaking numerous recces in Mosquito aircraft ahead of bombing raids on Germany. Then, as the conflict drew to a close, he was one of those involved in the harrowing task of repatriating French inmates liberated from concentration camps, a horror that left an indelible impression on the flier who was then not yet out of his teens.
But amid the brutality of war and the dangerous missions to map out enemy terrain and targets, he had gained a reputation as an accomplished cartoonist, regularly providing witty drawings for the RAF magazine Air Clues. He had also taken up painting, producing sketches and portraits, and developing a talent that saw him sponsored, after demob, on a painting course at the Sir John Cass Art School in London (now simply The Cass and part of London Metropolitan University).
From there he went on to Edinburgh College of Art and became a teacher and lecturer while cementing a career as a distinguished artist. He was also a member of the Royal Scottish Society of Painters in Watercolour who exhibited at the Louvre, and met Picasso – whose abstract style failed to rub off on Maxwell, leaving the Scot to concentrate on the landscapes for which he is best known.
Maxwell was the eldest of three children of Railway Police sergeant William Maxwell and his wife Mary and was educated at Leith Academy, leaving school at 15 to join the Co-op where he was "the worst clerk they ever had". He then had brief spells in the police, the forestry business and Ordnance Survey before joining the RAF at the height of the Second World War, in 1943. He did his cartography training in Wales before being posted to 540 Squadron, which provided aerial photographic evidence before and after bombing raids on Germany.
In 1945, as the Allies advanced, the squadron moved to France and he was based in Coulommiers, near Paris, and crewed de Havilland Mosquitos on photographic reconnaissance missions, often supporting daylight raids by US Air Force bombers. After taking part in the distressing operation to return home those French nationals who had survived the Nazi concentrations camps, he was invalided out of the service by medics who deemed him too young to have witnessed such scenes.
However, out of that darkness came some good: during his time in France he was billeted with a family whose head was a major figure in the French resistance in Coulommiers and with whom Maxwell formed a close bond. That friendship endured for many decades after the end of the war, with the Frenchman often visiting Scotland.
Following Maxwell's year at The Cass, he returned to Edinburgh in 1947 where he studied at Edinburgh College of Art under Sir William Gillies who tried to turn him into a Colourist. Maxwell preferred the works of Paul Nash and Eric Ravilious, both war artists who also specialised in landscapes.
At art college he met his first wife, Sheena, whom he married in 1951, and after graduating the couple worked independently as artists for a short time, creating murals among other things. But he soon moved into teaching and taught throughout the 1950s at various Edinburgh schools, including the Royal High School and Ainslie Park Secondary. Latterly he was head of department at Firrhill High.
In 1957, he became a founder member and first president of the Holyrood Art Club, and was elected to the Royal Scottish Society of Painters in Watercolour in 1960.
Tragically, Sheena developed Hodgkin's disease (now more usually known as Hodgkin's lymphoma) and died in 1961, leaving him to care for their young children, a son and a daughter. He married for a second time the following year, to a fellow Firrhill teacher Christine and went on to have another daughter and son.
Shortly after their marriage Joseph and Christine moved to Dundee, where he joined the College of Education's art department, which he subsequently headed. Meanwhile, he continued to produce his own work, mainly muted and carefully composed landscapes displaying a love of line that he attributed to the precision of map-drawing, which he loved.
In the late 1970s he was awarded the Diploma of Dilan de L'Art Contemporain and was one of a select few British painters invited to exhibit at The Louvre in Paris.
Maxwell retired from teaching in his mid-50s, but continued to lecture for the Scottish Arts Council and at the universities of Edinburgh, Dundee, St Andrews and Warwick. He renovated an old farmhouse near Aberfeldy where he also ran adult painting classes.
In 2002, he held a solo exhibition, Light of Two Lands, focusing on works from his two favourite painting areas – the countryside around his Perthshire home and the Le Marche region of Italy where his daughter, Jane, had bought a house.
Maxwell – whose work is in public collections across the UK and in New York – enjoyed the fascinating contrast between the Scottish and Italian landscapes, but also occasionally produced large and complex still life compositions.
Beyond his painting, he was just as colourful and creative in his family life – an adventurer with a slapstick sense of fun. He acquired his pilot's licence while in Dundee, went tandem paragliding in Switzerland and snorkelling in the Red Sea in his 70s and, for one granddaughter's birthday, arranged a ride in a microlight to fly over her party, parachuting gifts into the garden. Then there was his frequent deployment of a whoopee cushion and, at one daughter's wedding reception, a device that enabled two angels to dispense wine through their waterworks.
He had a well-honed sense of the absurd and no airs or graces, an attribute that allowed him to connect with ease with all social strata from mixing with the aristocracy to blethering with an Italian farmer.
Maxwell is survived by Christine, his wife of almost 53 years, his children Jane, William, Marylouise and John and eight grandchildren.


text:
Script Store
Pantomime Store
One-Act Plays & Short Plays
Sketches & Monologues
Monologues for Auditions
Scripts for Young People
Plays for Radio
Licence to Perform Application
Script Submissions & Services
Bespoke Script Writing
Publicity Design
JAIL BIRDS
by Colin Barrow
A full length play in two acts. The action of the play takes place in the communal area of a prison. The female inmates are all of senior age and have all committed crimes to be imprisoned and cared for at the expense of the tax payer, rather than paying high residential home fees. Now imprisoned, they're still law breaking by scams, forgeries and producing illegal substances in the prison grounds. The prison staff, a younger section of cast, are kept on their toes with the luxury style of living the inmates all wish to receive. Although this play is a farcical comedy, the moves and action is suitable for a more senior cast. This comedy play is very tongue-in-cheek and is a farcical send up of the prison system. All of which gives great characters and rib tickling amusement to the audience. The final minutes of the play deliver unseen surprises for the final curtain.
F7 M3 Either 1
Emma……………………………………………………………………Prisoner, an artist
Jane…………………………………..Prisoner, money launderer and computer addict
Mary………………………………………………..Prisoner, crippled and never speaks
Lewis……………………………………………………………..Male prisoner, a burglar
Officer Parker………………………………………………………………..Prison Officer
Sandra……………………………………………..Prisoner, scientist and illegal distiller
Sonia………………………………………………………………..Prisoner, horticulturist
Jenny……………………………………………………..Prisoner, ran an illegal brothel
Angela………………………………………..Prisoner, wheel chair bound, seamstress
Governor………………………………………………………………….Prison Governor
Nurse Dawson……………………………………………………………….Prison Nurse
Preview available here
Please click the button to buy a copy of this script.
[purchase_link id="4764″ text="Purchase" style="button" color="blue"]
Select a category Uncategorised *Full Length Plays Tim Kenny Mrs Evelyn Cavendish *Pantomime Joshua Clarke Lewis Clarke Gavyn Lugsden Shirley Day Andrew Winfield *One-Act Plays & Short Plays John Collings *Musicals Darren Hughes Peter Nuttall Kevin Broughton *Sketches & Monologues Joe Laredo Clare George Jack Northcott Ian Guy Alan Huckle Les Jamieson Paul Smith Olivia Arieti Chris Shinn D Brent Holland Richard Crawley Ed Weston Maureen Kilgour Bernardine Artuso Wayne Roberts David J Bell *Monologues for Auditions Sally Gamgee Kieron Connolly Dave Jeanes Michele Winstanley Erik Bailey Anna Girolami Valerie Goodwin *Scripts for Young People Oliver Garwood Jonathan Edgington Kathy Rucker Andy Moseley Gurmeet Mattu Chrissy Evans Eddie Coleman Jane Sunderland Carole Dhu Katherine Luna Gate Denise O'Leary *Screenplays Richard Moore Jill Machin ian Watson Gareth Barsby Giles Armstrong Alex Grainger Richard Hills Francis Beckett Rafe Beckley Colin Barrow Judith Foot Brian Lawless Allison Savory Peter Appleton *Plays for Radio Gabriel Chanan David Hendon Archie Wilson Tom Kelly Adam Lock Jon W. Baker James MacVeigh Vince Jones NEW TITLES Christine Oliphant *Murder Mystery Rebecca Mills Gary Clapperton Tom Froy Laurence Sach Heaton Wilson Alan Dawson John Waterhouse Rory Kelly JJ Crossley Daniel Webster Garry Bailey Rod Dungate Patrick Blosse Dennis Diamond Dan Smith Claire Hughes Michael D Arrowsmith Julia Swain Geoff Rose-Michael Rebecca Capper Emma Price Tony Hunt Nicholas Green Barry Wood Holly Dalton Julie Balloo Nicolas Ridley David Bennett AUTHOR COLLECTIONS Nick Hibberd Andrew Hull maria evey Maria Edey Max Porter Paul O'Farrell Ben Smithard James Woolf Adam Varjak Russell Muir Geraldine Gavigan Shaun Blake Samatha Cartwright Emma Houldershaw Samantha Cartwright David Weir Matthew Filmore Scott Cartwright Steve Horne Sandy Truman
© 2019 by Smith Scripts | Privacy and Cookie Policy | Website by CFGD


text:
Tianhe-I, Tianhe-1 o TH-1 (天河一号) ( [tʰjɛ́nxɤ̌ íxɑ̂ʊ̯], pinyin: Tiānhé yīhào), en català, "Via Làctia (literalment, Riu del Cel) Número U", és un superordinador capaç de fer més de dos quatrilions i mig d'operacions de coma flotant per segon (vegeu FLOPS). Situat al Centre de Supercomputació Nacional de Tianjin, a la República Popular de la Xina, és un dels pocs superordinador de nivell petaFLOPS del món.

L'octubre de 2010, una versió actualitzada de la màquina (Tianhe-1A) sobrepassà el Jaguar del Laboratori Nacional d'Oak Ridge (ORNL) convertint-se en el superordinador més ràpid del món, amb un màxim de computació de 2.507 petaFLOPS.

Tant el Tianhe-1 original com el Tianhe-1A utilitzen Linux com a sistema operatiu.

Referències

Enllaços externs
 Sina English News - Defense university builds China's fastest supercomputer
 Xinhua News Agency - Defense university builds China's fastest supercomputer
 The New York Times -China Wrests Supercomputer Title From U.S.

Ordinadors


text:
Q: Get cluster assignments in Weka I have a CSV file as follows:
id,at1,at2,at3
1072,0.5,0.2,0.7
1092,0.2,0.5,0.7
...

I've loaded it in in Weka for clustering:
DataSource source = new DataSource("test.csv");
Instances data = source.getDataSet();
kmeans.buildClusterer(data);

Question #1: How do I set the first column as an ID? ie. ignoring the first column for clustering purposes.
I then try to print out the assignments:
int[] assignments = kmeans.getAssignments();
int i = 0;
for (int clusterNum : assignments) {
    System.out.printf("Instance %d -> Cluster %d \n", i, clusterNum);
    i++;
}

This prints:
Instance 1 -> Cluster 0
Instance 2 -> Cluster 2
...

Question #2: How do I refer to the ID when printing out the assignments? For example:
Instance 1072 -> Cluster 0
Instance 1092 -> Cluster 2

A: I realize this is an old question, but I came here looking for an answer as well, and then was able to figure it out myself, so putting my solution here for the next person with this problem. In my case, the clustering component is part of a Java application, so I don't have the option of using the Weka workbench. Here is what I did to pull out the id along with the cluster assignments.
int[] assignments = kmeans.getAssignments();
for (int i = 0; i < assignments.length; i++) {
  int id = (int) data.instance(i).value(0); // cast from double
  System.out.printf("ID %d -> Cluster %d \n", id, assignments[i]);
}

Unlike the OP, I did not build my Instances from DataSource.getDataSet(), I built this manually from a database table, but the id field was the first one in my case as well, so I think the code above should work. I had a custom distance function that skipped the id field when computing similarity.

A: Your life would be much easier if you use Windows version of Weka with GUI.
In cluster tab there is a button for ignoring attributes like ID.
And for Id to cluster assignments; after your are done with clustering algorithm you chose, right click the result on left of the screen, then visualize results and then save.


Nothing is permanent. Don't stress yourself too much because no matter how bad the situation is... It will change. Amen.
Nothing is permanent. Don't stress yourself too much because no matter how bad the situation is… It will change. Amen.
Previous articlePrayer is the bridge between panic and peace.
Next articleDon't mistake God's patience for his absence. His timing is perfect: And his presence is constant. He's always with you. Amen.


If you have seen online marketing options for your business, then you must have heard about PPC advertising methods. PPC stands for pay-per-click, it's a form of online advertising in which advertisers reduce costs when users click on their ads. The Advertisers bid on the keywords, platforms, and audiences at the estimated cost of clicks, in which they arise.
Advertising on the search engine is one of the most popular forms of PPC. This form of advertisement allows advertisers to bid for ad placement in a search engine's sponsored link when a user searching for a keyword related to their keyword on the search engine. For example, if we bid on the keyword "Digital Marketing," then our ad may appear in the top position on the Google results page.
Ad advertisement, known as the auction, is a completely automated process that Google and other major search engines use to determine the relevance and validity of the ads displayed on their SERP.
Paid search marketing: – It is one of the most common types of pay-per-click (PPC) advertising. The Advertisers like Google AdWords and Bing Network show your ad to users who search for some keywords.
Display advertising: – Display Advertising is advertising ads on websites, apps, or social media via banner or other ad formats made from text, images, flash, video, and audio. These types of ads generally return fewer click-through rates than search ads but can be useful for building brand awareness.
Social media advertising: – There are many users in social media platforms like Facebook, Twitter, Pinterest, and many more which can be your potential customers. PPC advertising on these platforms can help you get a high click-through rate and increase awareness of your product or services.
If you wish to improve your brand awareness among your target audience and to increase your business with PPC advertising are almost countless. It can help you in a better marketplace to help your business, increase your reach, increase online sales, generate new leads and drive huge targeted traffic to your website.
When creating strategies for campaigns, you need to identify the objectives of your individual company, and how they relate to PPC. A company is just looking for ways to get more eyes on its website and its content. While a big sale can push.
There are several ways to attract traffic to your site: content marketing, SEO, social media, webinar and many others. But in these strategies, it takes a lot of time to create significant amounts of traffic. PPC or pay-per-click, which is a very fast road to success. PPC is a form of the paid advertising model that provides immediate results and promotes traffic. It also improves your search results ranking because PPC ads generally appear at the top of search results.
PPC marketing campaigns are a great way to be aware of your company's services in targeted areas. If you run a business at a competitive location, it certainly makes sense to maximize your visibility from search results. It keeps your brand in the mind of consumers. After all, you can track impression, engagement, reach and frequency.
Businesses can not only rely on their existing customers to promote development, so there's a constant need of leads who will eventually convert into clients. PPC is one of the most effective advertising channels for online lead generation websites and companies. The key is for measuring users who descend on their website via PPC link, funnel them into some kind of conversion, and then apply a strategy to convert that lead into sales.
PPC generates traffic, which leads to conversion, which leads to sales. With PPC advertising, ads will be displayed on your website and whenever someone clicks on them, you will be paid. Many Companies are paying advertisers like Google (and other search engines) to advertise their ads through their ad network. The advantage of PPC ads is that they target those people who are already interested in your product. If generating revenue is one of those goals you want to use more specific, high-value words. Keep in mind that you can not put money on the problem, you need long-term planning and strategy in line with your specific market and budget.
You can do a lot of work to organize your site on Google and have a deep knowledge of how websites are kept together. If you are not a web expert and want to rank your site on Google to bring new traffic to your site, then you may have Google AdWords or pay-per-click (PPC) campaigns for you.
If you want to improve the effectiveness of your online campaigns and ROI, then first you have to understand how PPC works. Many businesses jump straight into making their PPC campaigns and then complain when they do not make their expected return. Understanding how PPC works, users get a better chance of making profits and having a successful campaign.
The paid search campaign has mainly three elements: keyword, ads, and landing page. By giving Google a list of keywords, which tells Google to display their ads on the results page when a user searching for those keywords, you will then show your ads for these ads, and your goal should be to create those ads Suitable for the target users and attractive enough to get the searchers to click on them. When a visitor clicks on your ads, ads direct them to your landing pages. The primary goal of your landing pages is to convert visitors into customers by buying your product, downloading your product, or subscription offers etc.
Google Ads uses an auction-style bidding system to determine its ads pricing. For any given keyword, you have to be the top bidder to your ads on top- Ex:- Suppose someone has bid $ 5 to click on your ad. Then you have the next highest bidder who can click on $ 4.50, the second cost is $ 3.75, the second is $ 3.00, and so on, the last person goes down who says he is on his ad for that keyword, one Assume Click Value, $ 2.25.
Quality Score is an algorithm that scores each of your PPC Campaign ads for relevance and sees how they relate to your ad, and how closely your ad relates to your landing page content. The Quality Score is measured on the scale of 1 to 10, 1 is the lowest rating and 10 is the highest. In other words, Google actually scans your landing pages to ensure that you are not only buying keywords and directing them to completely irrelevant pages.
Google's inspiration to include the quality scores in the evaluation of your keywords, Which determines that each keyword is a great user experience for their searchers. It was determined entirely by bids. Google gave the quality score to ensure that the ads were displayed were always relevant to the search terms, and to keep their advertisers in check.
Since there is an infinite number of keywords combination that people can actually search for one term. Google has three keyword match types that you can use to give you more specific instructions for displaying your ads. Here are: exact match, phrase match, and broad match.
It is most important to set goals for your PPC campaigns to start a business. Your advertising objective or marketing objective may be to increase brand awareness, increase lead generation traffic to your website, and increase your website sales. For each purpose, you need to prepare your advertising strategy, which helps you achieve your target goals.
Often customers want to increase revenue but do not want to increase the budget. If revenue growth is the first priority, then my priority strategy will focus on high-volume keywords and test new opportunities, which sacrifice skills and make budget short-lived. If the customer's first priority is to spend efficiently, the accounting focus will be reduced on new opportunities and existing operations will be more sophisticated to eliminate garbage expenses.
If you have ever considered running PPC Campaign for the first time for your online business, then there is a good chance that you were wondering which PPC channel to use. The right PPC can put a big difference for the agencies or home teams. However, choosing one can be overwhelming. There are various platforms for all your PPC needs, including Attribution, CRO, Social, and Reporting.
The cornerstone of any successful PPC campaign is keyword research. The relationship between keywords and search queries is the foundation for AdWords payment search marketing and organic SEO campaigns. Most keyword research articles focus primarily on finding keyword learning to optimize organic SEO. Choosing the best keywords to bid is likely to result in more clicks and conversions. Keyword research is part of science. It is about using many tools at your disposal, but it is also understanding your customers and predicting which words they are actually typing in the search box. The best way to ensure that your ads appear at the right time and in the right place.
Using a PPC keyword generator or keyword tool, you can help you research your PPC keyword and jumpstart the search process. But once you find the right initial keywords, you can expand to the most relevant long tail keywords for your ads and continue.
Whether you are trying to sell a specific product, Service or giving your business a complete advertisement, your PPC ads should highlight the characteristics of what you are selling.
There are several metrics that affect a PPC, The advertisers should always pay attention to ensuring strong ROI with their PPC Campaign. Click-through rate is the most important thing in PPC. An ad's CTR is the percentage of users who click on the ad when they are served based on the results of their search query. Unless your ads are attractive and well-written, your CTR will suffer and it will affect your Quality Score, Ad Ranking, Cost Per Click and Cost Per Conversion.
Some tips for writing an effective Ad Text.
Before you start writing, go to the target audience's mind.
Make your PPC ad copy for your audience, not for you.
When we talk about the paid advertisement, the title is the king. Your description line, display URL, and ad extensions are only available to complement the headlines. So you should write your title carefully and thoughtfully.
Describe how you're better than the competition, always research to find competing ads.
You need to use target keywords in your ad, usually in your first or second title.
If you feel that you have completed all the steps and create a great PPC AD, then it's always wise to make more ads, and then test them to see how they are performing.
If you are running a PPC campaign for your online Service or store, then there is a big chance that you are sending that traffic to the landing page. Customized landing pages are an essential element of online marketing and e-commerce. If your PPC ad campaign shows a different message to what can be found on your landing page, visitors, feel that they are on the wrong page.
You should always ensure that you are optimizing your PPC campaign landing page for conversion. If you do not do this, your landing page will never reach its highest potential.
A strong CTA provides a clear message that encourages your target audience to engage with your site and eventually converts into sales.
The first impression is always the most important, so keep your landing page design in a way that is visually attractive and easy to navigate, understand and read.
Test your PPC landing page speed, and make sure it loads faster. There are many tools available online that can help to diagnose, assess and improve the page speed and display the key areas of improvements.
Always make sure your PPC matches the landing page's message appropriately. Different messages cause confusion, thereby increasing the likelihood of potential customers tilted from your page and increase bounce rate.
Your PPC target should always provide clear value propositions and CTA to consumers who click on your PPC ads, so it is important to keep reading low.
Applying a successful PPC campaign strategy involves not only the keyword research, knowledge and experience of your team but it is also the monitoring of your competitors PPC campaign. Analyze the opponent's PPC campaign ads is a great way to extract data about how their PPC ads affect conversions. This is a way to analyze your ads to see what is missing.
Every business should see the competition to see what they are offering and promoting in the industry. There is often competitive analysis done at the beginning of any PPC campaign. Why is the monitoring case? Your marketing initiative can prove to be beneficial, like what your competition is doing, is predicting changes, and reviewing your business's potential risks, you can find new opportunities.
Often times in digital marketing, we learn most through A/B testing which helps us to identify winning strategies and eventually succeed in achieving our success.
Paid search is based on pay-per-click (PPC) model.
Account structure is important. Always organize your PPC campaigns, ad groups, keywords, and ad copy appropriately.
Keep goals for high-quality scores to increase the overall performance and reduce costs.
Focus on understanding inbound marketing before blogging, driving leads, search engine optimization etc. Find out which keywords are performing well & generating traffic for your site from organic search results, and use them as keywords for PPC campaign.
Always be optimizing! There is never a dearth of ways to improve your paid search campaign. Continue to improve so that you can increase your performance, reduce costs and ultimately run a successful PPC campaign.


text:
Q: Html media query load stylesheet for desktop when it's for mobile I have an issue with my stylesheets. One is for desktop, the other one for mobile. When I'm on mobile, I see that the stylesheet is loaded in network tab.
Here is the code :
Desktop :
<link rel="stylesheet" href="app__desktop.css" type="text/css" media="screen and (min-width: 1024px)">

Mobile :
<link rel="stylesheet" href="app__mobile.css" type="text/css" media="all">

Any idea ?

A: For the non-matching media queries stylesheets, browsers apply a lowest download priority.
This happens because users could resize their windows, print the document, or even switch resolutions (if they have a multiple screens setup), and they should have the different stylesheets for that —even if the media queries doesn't match.


text:
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.dvcs.ui;

import com.intellij.codeInsight.hint.HintManager;
import com.intellij.dvcs.DvcsRememberedInputs;
import com.intellij.dvcs.DvcsUtil;
import com.intellij.dvcs.hosting.RepositoryHostingService;
import com.intellij.dvcs.hosting.RepositoryListLoader;
import com.intellij.dvcs.hosting.RepositoryListLoadingException;
import com.intellij.ide.impl.ProjectUtil;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.IdeActions;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.event.DocumentListener;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.keymap.KeymapUtil;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.ui.ValidationInfo;
import com.intellij.openapi.ui.popup.Balloon;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.ui.*;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.ui.components.JBOptionButton;
import com.intellij.util.Alarm;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.progress.ComponentVisibilityProgressManager;
import com.intellij.util.ui.JBDimension;
import com.intellij.util.ui.JBUI;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLDecoder;
import java.nio.file.*;
import java.util.List;
import java.util.*;
import java.util.regex.Pattern;

import static com.intellij.util.ui.UI.PanelFactory;

public abstract class CloneDvcsDialog extends DialogWrapper {
  /**
   * The pattern for SSH URL-s in form [user@]host:path
   */
  private static final Pattern SSH_URL_PATTERN;

  static {
    // TODO make real URL pattern
    @NonNls final String ch = "[\\p{ASCII}&&[\\p{Graph}]&&[^@:/]]";
    @NonNls final String host = ch + "+(?:\\." + ch + "+)*";
    @NonNls final String path = "/?" + ch + "+(?:/" + ch + "+)*/?";
    @NonNls final String all = "(?:" + ch + "+@)?" + host + ":" + path;
    SSH_URL_PATTERN = Pattern.compile(all);
  }

  private ComboBox<String> myRepositoryUrlCombobox;
  private CollectionComboBoxModel<String> myRepositoryUrlComboboxModel;
  private TextFieldWithAutoCompletion<String> myRepositoryUrlField;
  private ComponentVisibilityProgressManager mySpinnerProgressManager;
  private JButton myTestButton; // test repository
  private MyTextFieldWithBrowseButton myDirectoryField;
  private LoginButtonComponent myLoginButtonComponent;

  @NotNull protected final Project myProject;
  @NotNull protected final String myVcsDirectoryName;

  @Nullable private ValidationInfo myCreateDirectoryValidationInfo;
  @Nullable private ValidationInfo myRepositoryTestValidationInfo;
  @Nullable private ProgressIndicator myRepositoryTestProgressIndicator;

  @NotNull private final List<String> myLoadedRepositoryHostingServicesNames;
  @Nullable private Alarm myRepositoryUrlAutoCompletionTooltipAlarm;
  @NotNull private final Set<String> myUniqueAvailableRepositories;
  @NotNull private List<ValidationInfo> myRepositoryListLoadingErrors = new ArrayList<>();

  public CloneDvcsDialog(@NotNull Project project, @NotNull String displayName, @NotNull String vcsDirectoryName) {
    this(project, displayName, vcsDirectoryName, null);
  }

  public CloneDvcsDialog(@NotNull Project project,
                         @NotNull String displayName,
                         @NotNull String vcsDirectoryName,
                         @Nullable String defaultUrl) {
    super(project, true);
    myProject = project;
    myVcsDirectoryName = vcsDirectoryName;
    myLoadedRepositoryHostingServicesNames = new ArrayList<>();
    myUniqueAvailableRepositories = new HashSet<>();

    initComponents(defaultUrl);
    Map<String, RepositoryListLoader> loadersToSchedule = initUrlAutocomplete();
    setTitle(DvcsBundle.getString("clone.title"));
    setOKButtonText(DvcsBundle.getString("clone.button"));
    init();
    scheduleLater(loadersToSchedule);
  }

  @Override
  protected void doOKAction() {
    String path = myDirectoryField.getText();
    new Task.Modal(myProject, "Creating Destination Directory", true) {
      private ValidationInfo error = null;

      @Override
      public void run(@NotNull ProgressIndicator indicator) {
        error = createDestination(path);
      }

      @Override
      public void onSuccess() {
        if (error == null) {
          CloneDvcsDialog.super.doOKAction();
        }
        else {
          myCreateDirectoryValidationInfo = error;
          startTrackingValidation();
        }
      }
    }.queue();
  }

  @Nullable
  private static ValidationInfo createDestination(@NotNull String path) {
    try {
      Path directoryPath = Paths.get(path);
      if (!Files.exists(directoryPath)) {
        Files.createDirectories(directoryPath);
      }
      else if (!Files.isDirectory(directoryPath) || !Files.isWritable(directoryPath)) {
        return new ValidationInfo(DvcsBundle.getString("clone.destination.directory.error.access")).withOKEnabled();
      }
      return null;
    }
    catch (InvalidPathException e) {
      return new ValidationInfo(DvcsBundle.getString("clone.destination.directory.error.invalid"));
    }
    catch (Exception e) {
      return new ValidationInfo(DvcsBundle.getString("clone.destination.directory.error.access")).withOKEnabled();
    }
  }

  @NotNull
  public String getSourceRepositoryURL() {
    return getCurrentUrlText();
  }

  @NotNull
  public String getParentDirectory() {
    Path parent = Paths.get(myDirectoryField.getText()).toAbsolutePath().getParent();
    return ObjectUtils.assertNotNull(parent).toAbsolutePath().toString();
  }

  @NotNull
  public String getDirectoryName() {
    return Paths.get(myDirectoryField.getText()).getFileName().toString();
  }

  private void initComponents(@Nullable String defaultUrl) {
    String parentDirectory = getRememberedInputs().getCloneParentDir();

    myRepositoryUrlComboboxModel = new CollectionComboBoxModel<>();
    myRepositoryUrlField = TextFieldWithAutoCompletion.create(myProject,
                                                              myRepositoryUrlComboboxModel.getItems(),
                                                              false,
                                                              "");

    JLabel repositoryUrlFieldSpinner = new JLabel(new AnimatedIcon.Default());
    repositoryUrlFieldSpinner.setVisible(false);

    mySpinnerProgressManager = new ComponentVisibilityProgressManager(repositoryUrlFieldSpinner);
    Disposer.register(getDisposable(), mySpinnerProgressManager);

    myRepositoryUrlCombobox = new ComboBox<>();
    myRepositoryUrlCombobox.setEditable(true);
    myRepositoryUrlCombobox.setEditor(ComboBoxCompositeEditor.withComponents(myRepositoryUrlField,
                                                                             repositoryUrlFieldSpinner));
    myRepositoryUrlCombobox.setModel(myRepositoryUrlComboboxModel);

    myRepositoryUrlField.addDocumentListener(new DocumentListener() {
      @Override
      public void documentChanged(@NotNull com.intellij.openapi.editor.event.DocumentEvent event) {
        myDirectoryField.trySetChildPath(defaultDirectoryName(myRepositoryUrlField.getText().trim()));
      }
    });
    myRepositoryUrlField.addDocumentListener(new DocumentListener() {
      @Override
      public void documentChanged(@NotNull com.intellij.openapi.editor.event.DocumentEvent event) {
        myRepositoryTestValidationInfo = null;
      }
    });

    myTestButton = new JButton(DvcsBundle.getString("clone.repository.url.test.label"));
    myTestButton.addActionListener(e -> test());

    FileChooserDescriptor fcd = FileChooserDescriptorFactory.createSingleFolderDescriptor();
    fcd.setShowFileSystemRoots(true);
    fcd.setHideIgnored(false);
    myDirectoryField = new MyTextFieldWithBrowseButton(StringUtil.isEmptyOrSpaces(parentDirectory)
                                                       ? ProjectUtil.getBaseDir()
                                                       : parentDirectory);
    myDirectoryField.addBrowseFolderListener(DvcsBundle.getString("clone.destination.directory.browser.title"),
                                             DvcsBundle.getString("clone.destination.directory.browser.description"),
                                             myProject,
                                             fcd);

    if (defaultUrl != null) {
      myRepositoryUrlField.setText(defaultUrl);
      myRepositoryUrlField.selectAll();
      myTestButton.setEnabled(true);
    }
  }

  /**
   * Initializes component structure for repository list loading
   *
   * @return already enabled loaders for pre-scheduling
   */
  private Map<String, RepositoryListLoader> initUrlAutocomplete() {
    Collection<RepositoryHostingService> repositoryHostingServices = getRepositoryHostingServices();
    if (repositoryHostingServices.size() > 1) {
      myRepositoryUrlAutoCompletionTooltipAlarm = new Alarm(getDisposable());
      myRepositoryUrlAutoCompletionTooltipAlarm.setActivationComponent(myRepositoryUrlCombobox);
    }

    List<Action> loginActions = new ArrayList<>();
    Map<String, RepositoryListLoader> enabledLoaders = new HashMap<>();
    for (RepositoryHostingService service: repositoryHostingServices) {
      String serviceDisplayName = service.getServiceDisplayName();
      RepositoryListLoader loader = service.getRepositoryListLoader(myProject);
      if (loader == null) continue;
      if (loader.isEnabled()) {
        enabledLoaders.put(serviceDisplayName, loader);
      }
      else {
        loginActions.add(new AbstractAction(DvcsBundle.message("clone.repository.url.autocomplete.login.text", serviceDisplayName)) {
          @Override
          public void actionPerformed(ActionEvent e) {
            if (loader.enable(myLoginButtonComponent.getPanel())) {
              myLoginButtonComponent.removeAction(this);
              schedule(serviceDisplayName, loader);
            }
          }
        });
      }
    }

    myRepositoryUrlField.addFocusListener(new FocusAdapter() {
      @Override
      public void focusGained(FocusEvent e) {
        showRepositoryUrlAutoCompletionTooltip();
      }
    });

    myLoginButtonComponent = new LoginButtonComponent(loginActions);
    return enabledLoaders;
  }

  @NotNull
  protected Collection<RepositoryHostingService> getRepositoryHostingServices() {
    return Collections.emptyList();
  }

  private void scheduleLater(@NotNull Map<String, RepositoryListLoader> loaders) {
    ApplicationManager.getApplication().invokeLater(() -> loaders.forEach(this::schedule), ModalityState.stateForComponent(getRootPane()));
  }

  private void schedule(@NotNull String serviceDisplayName, @NotNull RepositoryListLoader loader) {
    mySpinnerProgressManager.run(new Task.Backgroundable(myProject, "Not Visible") {
      private final List<String> myNewRepositories = new ArrayList<>();
      private final List<RepositoryListLoadingException> myErrors = new ArrayList<>();

      @Override
      public void run(@NotNull ProgressIndicator indicator) {
        RepositoryListLoader.Result loadingResult =
          loader.getAvailableRepositoriesFromMultipleSources(indicator);
        for (String repository: loadingResult.getUrls()) {
          if (myUniqueAvailableRepositories.add(repository)) {
            myNewRepositories.add(repository);
          }
        }
        myErrors.addAll(loadingResult.getErrors());
      }

      @Override
      public void onSuccess() {
        if (mySpinnerProgressManager.getDisposed()) return;
        if (!myNewRepositories.isEmpty()) {
          // otherwise editor content will be reset
          myRepositoryUrlCombobox.setSelectedItem(myRepositoryUrlField.getText());
          myRepositoryUrlComboboxModel.addAll(myRepositoryUrlComboboxModel.getSize(), myNewRepositories);
          myRepositoryUrlField.setVariants(myRepositoryUrlComboboxModel.getItems());
        }
        myLoadedRepositoryHostingServicesNames.add(serviceDisplayName);
        showRepositoryUrlAutoCompletionTooltip();
        if (!myErrors.isEmpty()) {
          for (RepositoryListLoadingException error: myErrors) {
            StringBuilder errorMessageBuilder = new StringBuilder();
            errorMessageBuilder.append(error.getMessage());
            Throwable cause = error.getCause();
            if (cause != null) errorMessageBuilder.append(": ").append(cause.getMessage());
            myRepositoryListLoadingErrors.add(new ValidationInfo(errorMessageBuilder.toString()).asWarning());
          }
          startTrackingValidation();
        }
      }
    });
  }

  private void showRepositoryUrlAutoCompletionTooltip() {
    if (myRepositoryUrlAutoCompletionTooltipAlarm == null) {
      showRepositoryUrlAutoCompletionTooltipNow();
    }
    else {
      myRepositoryUrlAutoCompletionTooltipAlarm.cancelAllRequests();
      myRepositoryUrlAutoCompletionTooltipAlarm.addComponentRequest(this::showRepositoryUrlAutoCompletionTooltipNow, 1);
    }
  }

  private void showRepositoryUrlAutoCompletionTooltipNow() {
    if (!hasErrors(myRepositoryUrlCombobox) && !myLoadedRepositoryHostingServicesNames.isEmpty()) {
      Editor editor = myRepositoryUrlField.getEditor();
      if (editor == null) return;
      String completionShortcutText =
        KeymapUtil.getFirstKeyboardShortcutText(ActionManager.getInstance().getAction(IdeActions.ACTION_CODE_COMPLETION));
      HintManager.getInstance().showInformationHint(editor,
                                                    DvcsBundle.message("clone.repository.url.autocomplete.hint",
                                                                       DvcsUtil.joinWithAnd(myLoadedRepositoryHostingServicesNames, 0),
                                                                       completionShortcutText));
    }
  }

  private void test() {
    String testUrl = getCurrentUrlText();
    if (myRepositoryTestProgressIndicator != null) {
      myRepositoryTestProgressIndicator.cancel();
      myRepositoryTestProgressIndicator = null;
    }
    myRepositoryTestProgressIndicator =
      mySpinnerProgressManager
        .run(new Task.Backgroundable(myProject, DvcsBundle.message("clone.repository.url.test.title", testUrl), true) {
          private TestResult myTestResult;

          @Override
          public void run(@NotNull ProgressIndicator indicator) {
            myTestResult = test(testUrl);
          }

          @Override
          public void onSuccess() {
            if (myTestResult.isSuccess()) {
              myRepositoryTestValidationInfo = null;
              Disposable dialogDisposable = getDisposable();
              if (Disposer.isDisposed(dialogDisposable)) return;
              JBPopupFactory.getInstance()
                            .createBalloonBuilder(new JLabel(DvcsBundle.getString("clone.repository.url.test.success.message")))
                            .setDisposable(dialogDisposable)
                            .createBalloon()
                            .show(new RelativePoint(myTestButton, new Point(myTestButton.getWidth() / 2,
                                                                            myTestButton.getHeight())),
                                  Balloon.Position.below);
            }
            else {
              myRepositoryTestValidationInfo =
                new ValidationInfo(DvcsBundle.message("clone.repository.url.test.failed.message", myTestResult.myErrorMessage),
                                   myRepositoryUrlCombobox);
              startTrackingValidation();
            }
            myRepositoryTestProgressIndicator = null;
          }
        });
  }

  @NotNull
  protected abstract TestResult test(@NotNull String url);

  @NotNull
  protected abstract DvcsRememberedInputs getRememberedInputs();

  @NotNull
  @Override
  protected List<ValidationInfo> doValidateAll() {
    ValidationInfo urlValidation = checkRepositoryURL();
    ValidationInfo directoryValidation = checkDirectory();

    myTestButton.setEnabled(urlValidation == null);

    List<ValidationInfo> infoList = new ArrayList<>();
    ContainerUtil.addIfNotNull(infoList, myRepositoryTestValidationInfo);
    ContainerUtil.addIfNotNull(infoList, myCreateDirectoryValidationInfo);
    ContainerUtil.addIfNotNull(infoList, urlValidation);
    ContainerUtil.addIfNotNull(infoList, directoryValidation);
    infoList.addAll(myRepositoryListLoadingErrors);
    return infoList;
  }

  /**
   * Check repository URL and set appropriate error text if there are problems
   *
   * @return null if repository URL is OK.
   */
  @Nullable
  private ValidationInfo checkRepositoryURL() {
    String repository = getCurrentUrlText();
    if (repository.length() == 0) {
      return new ValidationInfo(DvcsBundle.getString("clone.repository.url.error.empty"), myRepositoryUrlCombobox);
    }

    // Is it a proper URL?
    try {
      if (new URI(repository).isAbsolute()) {
        return null;
      }
    }
    catch (URISyntaxException urlExp) {
      // do nothing
    }

    // Is it SSH URL?
    if (SSH_URL_PATTERN.matcher(repository).matches()) {
      return null;
    }

    // Is it FS URL?
    try {
      Path path = Paths.get(repository);

      if (Files.exists(path)) {
        if (!Files.isDirectory(path)) {
          return new ValidationInfo(DvcsBundle.getString("clone.repository.url.error.not.directory"), myRepositoryUrlCombobox);
        }
        return null;
      }
    }
    catch (Exception fileExp) {
      // do nothing
    }

    return new ValidationInfo(DvcsBundle.getString("clone.repository.url.error.invalid"), myRepositoryUrlCombobox);
  }

  /**
   * Check destination directory and set appropriate error text if there are problems
   *
   * @return null if destination directory is OK.
   */
  @Nullable
  private ValidationInfo checkDirectory() {
    String directoryPath = myDirectoryField.getText();
    if (directoryPath.length() == 0) {
      return new ValidationInfo("");
    }

    try {
      Path path = Paths.get(directoryPath);
      if (!Files.exists(path)) {
        return null;
      }
      else if (!Files.isDirectory(path)) {
        return new ValidationInfo(DvcsBundle.getString("clone.destination.directory.error.not.directory"), myDirectoryField.getTextField());
      }
      else if (!isDirectoryEmpty(path)) {
        return new ValidationInfo(DvcsBundle.message("clone.destination.directory.error.exists"), myDirectoryField.getTextField());
      }
    }
    catch (InvalidPathException | IOException e) {
      return new ValidationInfo(DvcsBundle.getString("clone.destination.directory.error.invalid"), myDirectoryField.getTextField());
    }
    return null;
  }

  private static boolean isDirectoryEmpty(@NotNull Path directory) throws IOException {
    DirectoryStream<Path> directoryStream = Files.newDirectoryStream(directory);
    return !directoryStream.iterator().hasNext();
  }

  @NotNull
  private String getCurrentUrlText() {
    return FileUtil.expandUserHome(myRepositoryUrlField.getText().trim());
  }

  /**
   * @deprecated use {@link #getRepositoryHostingServices()}
   */
  @Deprecated
  public void prependToHistory(@NotNull final String item) {
    myRepositoryUrlComboboxModel.add(item);
  }

  public void rememberSettings() {
    final DvcsRememberedInputs rememberedInputs = getRememberedInputs();
    rememberedInputs.addUrl(getSourceRepositoryURL());
    rememberedInputs.setCloneParentDir(getParentDirectory());
  }

  @NotNull
  private static String safeUrlDecode(@NotNull String encoded) {
    try {
      return URLDecoder.decode(encoded, CharsetToolkit.UTF8);
    }
    catch (Exception e) {
      return encoded;
    }
  }

  /**
   * Get default name for checked out directory
   *
   * @param url an URL to checkout
   * @return a default repository name
   */
  @NotNull
  private String defaultDirectoryName(@NotNull final String url) {
    return stripSuffix(safeUrlDecode(getLastPathFragment(url)));
  }

  @NotNull
  private String stripSuffix(@NotNull String directoryName) {
    return directoryName.endsWith(myVcsDirectoryName)
           ? directoryName.substring(0, directoryName.length() - myVcsDirectoryName.length())
           : directoryName;
  }

  @NotNull
  private static String getLastPathFragment(@NotNull final String url) {
    // Suppose it's a URL
    int i = url.lastIndexOf('/');

    // No? Maybe win-style path?
    if (i == -1 && File.separatorChar != '/') i = url.lastIndexOf(File.separatorChar);

    if (i < 0) return "";

    if (i == url.length() - 1) return getLastPathFragment(url.substring(0, i));

    return url.substring(i + 1);
  }

  @Nullable
  @Override
  public JComponent getPreferredFocusedComponent() {
    return myRepositoryUrlField;
  }

  @NotNull
  @Override
  protected JPanel createSouthAdditionalPanel() {
    return myLoginButtonComponent.getPanel();
  }

  @Override
  @NotNull
  protected JComponent createCenterPanel() {
    JPanel panel = PanelFactory.grid()
                               .add(PanelFactory.panel(JBUI.Panels.simplePanel(UIUtil.DEFAULT_HGAP, UIUtil.DEFAULT_VGAP)
                                                                  .addToCenter(myRepositoryUrlCombobox)
                                                                  .addToRight(myTestButton))
                                                .withLabel(DvcsBundle.getString("clone.repository.url.label")))
                               .add(PanelFactory.panel(myDirectoryField)
                                                .withLabel(DvcsBundle.getString("clone.destination.directory.label")))
                               .createPanel();
    panel.setPreferredSize(new JBDimension(500, 50, true));
    return panel;
  }

  protected static class TestResult {
    @NotNull public static final TestResult SUCCESS = new TestResult(null);
    @Nullable private final String myErrorMessage;

    public TestResult(@Nullable String errorMessage) {
      myErrorMessage = errorMessage;
    }

    public boolean isSuccess() {
      return myErrorMessage == null;
    }

    @Nullable
    public String getError() {
      return myErrorMessage;
    }
  }

  private static class MyTextFieldWithBrowseButton extends TextFieldWithBrowseButton {
    @NotNull private final Path myDefaultParentPath;
    private boolean myModifiedByUser = false;

    private MyTextFieldWithBrowseButton(@NotNull String defaultParentPath) {
      myDefaultParentPath = Paths.get(defaultParentPath).toAbsolutePath();
      setText(myDefaultParentPath.toString());
      getTextField().getDocument().addDocumentListener(new DocumentAdapter() {
        @Override
        protected void textChanged(@NotNull DocumentEvent e) {
          myModifiedByUser = true;
        }
      });
    }

    public void trySetChildPath(@NotNull String child) {
      if (!myModifiedByUser) {
        try {
          setText(myDefaultParentPath.resolve(child).toString());
        }
        catch (InvalidPathException ignored) {
        }
        finally {
          myModifiedByUser = false;
        }
      }
    }
  }

  private static class LoginButtonComponent {
    @NotNull private final JBOptionButton myButton;
    @NotNull private final JPanel myPanel;
    @NotNull private final List<Action> myActions;

    LoginButtonComponent(@NotNull List<Action> actions) {
      myButton = new JBOptionButton(ContainerUtil.getFirstItem(actions), getActionsAfterFirst(actions));
      myPanel = PanelFactory.panel(myButton)
                            .withTooltip(DvcsBundle.getString("clone.repository.url.autocomplete.login.tooltip"))
                            .createPanel();
      myPanel.setVisible(!actions.isEmpty());
      myPanel.setBorder(JBUI.Borders.emptyRight(16));
      myActions = new ArrayList<>(actions);
    }

    void removeAction(@NotNull Action action) {
      if (myActions.remove(action)) {
        if (!myActions.isEmpty()) {
          myButton.setAction(ContainerUtil.getFirstItem(myActions));
          myButton.setOptions(getActionsAfterFirst(myActions));
        }
        else {
          myButton.setAction(null);
          myButton.setOptions(null);
          myPanel.setVisible(false);
        }
      }
    }

    @NotNull
    private static Action[] getActionsAfterFirst(@NotNull List<Action> actions) {
      if (actions.size() <= 1) {
        return new Action[0];
      }
      else {
        return actions.subList(1, actions.size()).toArray(new Action[actions.size() - 1]);
      }
    }

    @NotNull
    public JPanel getPanel() {
      return myPanel;
    }
  }
}


Earmarked Funds (a.k.a., Manual Reserves, Funds Commitments and Encumbrances) are created by departments in FIS to reserve available budget dollars for expenses that are not processed through HRIS (e.g., payroll) or Logistics (e.g., POs). They enable you to set aside/reserve budget dollars for future expenditures.
This workshop defines Earmarked Funds and demonstrates how to process and report on them in FIS.
Prior to attending this course, it is highly recommended that you complete the FIS Standard Curriculum.
E-Token – For this particular course the attendee should have an activated e-Token. If you do not have an e-Token assigned to you, please inform the instructor and someone will log you in when you arrive. Information on obtaining and activating an e-Token can be found at the following link.


Samsung in the Indian cellular market recognized for its contemporary designs and attributes. Presently the Samsung added 1 new revolutionary handset in its Android handsets portfolio i.e. Samsung I9000 Galaxy S. The Samsung I9000 Galaxy S carries a four inch super AMOLED display with the resolution of 480 x 800 pixels which allows viewing films and internet searching is an absolute pleasure on this high resolution screen.
The entry model of iPad two starts at 399 which is a lot lesser than the opening price of iPad 1, even the foundation design. It comes with truly smart addresses and these are essential as you would need these to protect your new gadget. These smart addresses will magnetically clip onto your devices face. So only the sensitive screen will get coated and the sleek lines of your tablet will be noticeable. These are available in desings that can fold up onto themselves in purchase to act as a stand. You can get these in a broad range of vibrant and thrilling colours.
Quitting Backround Apps In general, you require not be concerned about applications that are 'open'. Apple's iOS does a great job of letting apps enter a paused condition, so they are not impacting your battery lifestyle. With applications, it's not a 1 size matches all. Streaming applications like Pandora or navigation applications such as Navigon will work in the track record. That means they will continue to tap into your battery, despite not becoming in the forefront. Double click on to reveal the multitasking bar, then push and maintain on the application you'd like to terminate. Push the minus signal at the top still left of the app to quit the application.
BlackBerry 7 OS – It comes with BlackBerry 7 OS. It also comes with powerful revolutionary applications and new attributes. With its Near Area Conversation (NFC) function, you will be in a position to interact with the globe that surrounds you; you will appreciate augmented reality templates like never prior to. You can connect this handset with other NFC-enable gadgets and even intelligent tags.
There are many social sites at current, and they can be of help to you as much as advertising your function is worried. It is recommended to be a part of some well-liked sites like twitter and facebook. Nevertheless, you have to be cautious on how you go about marketing, since overdoing it can actually flip people off. It is advisable that your advertising on these websites does not appear as well obvious. Additionally, ensure your adverts go to the suitable viewers on twitter by utilizing hash tags.
The subsequent trailer shown was for new downloadable game by Sucker Punch known as Infamous Festival Of Blood. The game environment is vampires have infested the city and Cole has been bitten. He should kill the head vampire to save the metropolis. It will consist of 'hours of new gameplay" and a more dark tone.
If you adore the 9800, you will certainly adore this new smartphone even much more. The Blackberry Torch 9810 is a more powerful version of its predecessor.


Danang Fhome apartment is situated in Ly Thuong Kiet street, Hai Chau district, Danang, Vietnam. The luxurious apartment for rent has the best location of Fhome building. The apartment includes two bedrooms, usable area: 71 square meters, full furniture.
Danang Fhome apartment has the nice view toward the beach.
The apartment has the good position of four apartments in each floor of the building. Therefore, it has the wide usable area. The master bedroom could look at straight to Nguyen Tat Thanh beach.
The livingroom is pretty wide. However, it does not get much natural light. There are soft sofa, big television and central AC in the livingroom. Besides, there is a small space by the livingroom where could let the cool air come through inside.
There are two bedrooms in the apartment. In that, the master bedroom seems to be perfect because it has a nice window where you could enjoy the beachview. Two bedrooms have full good furniture to sleep such as: beds, mattresses and AC. There is a bathroom inside the master bedroom. The other one is by the main door.
Kitchen is on the same space to the livingroom. It has full things to cook such as: electric stove, fridge, microwave. In addition, there are a table and chairs where could seat for 6 people.
Danang Fhome apartment is a good place for experts to stay.
Fhome is a complex building which consists of full services. There is a pool on the fifth floor. But you should buy a private card. You could go to shopping center or the beach as well. The building has the pool on the fifth floor and big garage. The rental apartment has modern style and in a good view. So, it is a nice place to stay here. The rental US$950/month.


On Monday, mHealthWatch learned that UNICEF has begun inviting technology start-ups developing solutions with the potential to improve the lives of the world's most vulnerable children to apply for funding from its recently launched Innovation Fund.
Since it was founded in 2006, the partnership between Pampers and UNICEF to increase awareness for tetanus vaccines for newborns has increased considerably.
Nada Dugas, the communications director of baby care for the company, was interviewed recently by Adweek magazine about how the program, which has delivered over 300 million vaccines so far, has grown to include video and social sharing in order to deliver even more. Below are some excerpts from that interview.
SMS is changing life as we know it across the African continent.
U-Report is a free SMS-based reporting tool that allows Ugandan youth to communicate with their government and community leaders using their cell phones.
According to details shared in a press release, more than 240,000 young adults in Uganda have joined the program to date. UNICEF now receives an average of 170,000 text messages per month. Approximately 20,000 of these are unsolicited messages and initial analysis suggested that seven percent of these require immediate action from community leaders or the government.


Not every college can afford a 100,000 person arena. Learn which small colleges have the smallest stadiums and arenas here.
Everyone talks about the biggest venues in college sports. Topping that list are massive arenas like Michigan Stadium and Beaver Stadium. But have you ever wondered what the smallest venues are in college sports? This list includes some of the tiniest sports venues in the country, in Division I football, baseball, hockey, and basketball. Drumroll, please, as we count down the top (or bottom) five.
Have you ever wondered what the smallest venues are in college sports?
At 16,000, the Kibbie Dome is by far the smallest football stadium among the Bowl Subdivision. Florida International is apparently unhappy with its place on this list, and plans to expand FIU Stadium's capacity to 45,000 in 2013.
The smallest stadium in the Championship Subdivision is Georgetown University's Multi-Sport Field, which has a capacity of 2,500. Multi-Sport Field became the home of the Hoyas football team in 2003, and has been awaiting further construction since.
Baseball stadiums tend to be smaller than football and basketball stadiums, so it's to be expected that this list contains some of the smallest venues in all of college sports.
Sacred Heart has two rinks on this list: Wonderland of Ice is for the women's hockey team, and Milford Ice Pavilion is for the men's team. Similarly, OSU Ice Rink is for the Lady Buckeyes. The Ohio State men's hockey team plays at Value City Arena, which is actually the largest hockey arena in college sports.
Compared with massive venues like University of Kentucky's Rupp Arena, these arenas seem tiny. Not surprisingly, many of the smallest basketball venues are from small colleges and private schools.
Where Did Pro Baseball Players go to College?