fluffywing-e-tarot · 3 years ago
Text
Be an Esteemed Lady while out shopping for the day
Of course, Grain would be the one to draw the short straw on this Hermit challenge. He suspected it was Iskall who wrote it for Stress, However, Stress didn't want to swap challenges and thus Grian had to go to the shopping district in the only feminine outfit that he had being Arianna Grande. The worst part being that Grian was planning on restocking the Barge soon.
So Grian took to the sky in his Popstar outfit. Elytra on his back he flew across the sea to get to the shopping district. He spotted Stress waiting at the Barge. A misgevious smirk on her face.
"Well aren't you looking beautiful." she greeted. "I thought you would need some help in dressing up. Apparently, you can look Lady enough."
"Thanks," Grian said. "It was the only outfit I had."
"Oh, I didn't mean it as a compliment." Stress said her polite deminer missing from her." Your makeup is horrendous."
Grian really wanted to snap back at Stress, but then he remembered that Mumbo had bet Iskall twenty diamonds, That Grian could complete the Challenge. Who was he to denied Mumbo out of Diamonds? Grian took a deep breath, He was an esteemed lady. He was an esteemed Lady, and Esteemed Lady's do not snap at their Friends for insulting their makeup job.
"Beloved Stress, if I have indeed insulted my own visage then will you help me correct it," Grian said in a polite, gentle, manner.
Stress looked stunned. Her mischievous smirk faltering. "Uh yeah, just give me a moment. I have some things at my shop." she rocketed off to her store.
This gave Grian the time he needed to restock the chests in the Barge with everything his patrons needed from his shop. Grian heard the woosh of an Elytra glide and spotted Tango swooping into his shop. Grian sent out a text in chat say that the Barge was restocked
"Hay Grian." Tango greeted and went straight for the Sand. but stopped while opening the chest Tango closed the chest a moment later and turned around.
"Sorry, I thought you were Grain, Ma'am," Tango said. "My mistake."
He returned to buying Grains sand. He left with a Shulker box filled with sand. "That was weird," Grian thought Grian didn't want Stress to go chasing after him, as head a handful of Items to buy from the shopping disticet the main thing being the Dark prismarien that had been restocked. So he pulled out a Starcae to have the relative decence of looking dignified while waiting.
"Sorry 'bout that wait." Stress pulled out a shulker box and began to shift though it. She was pulling out brushes and a wide aray of color.
"We'll need to wash off your application before we begin." Stress led out a rag and potion bottle.
"Okay." Grian dabbed some of the potions onto the rag, at least that's what he assumed what Stress wanted, and started to remove the bright cherry pink and blush.
Ah there we go a clean face to work with." Stress said, " now close your eyes Grian we are going to make a Gina out of you."
" The outfit is actual Arianna Grande" Grian informed. " I used it to promote Sahara.
"Well, the wig is quite good quality." Stress said he felt some sort of cream be applied on his face. " I'm assuming you got it from the Hub world."
"The best place to shop for the costumes." Grian said
"Now tell me Arianna what brings you to the Shopping district?" stress asked.
"Dark Prismarin for mansion among other things," Grian said he felt different brushes on his face. and pencil on his eyes. Grian opened his eyes. as Stress applied the mascara Grian chatted about what could be improved upon in his builds
"Are we done?" Grian asked.
"Yes and you look much more beautiful," Stress said. "Go knock them dead Arianna" Stress's encouragement was worrying for grain's mental health. Grian was basically taking the actions of a Woman seriously.
"I have much to do Ms. Monster. Thank you for the assistance." Grian said.
"See you around " Stress called as she was putting away her makeup supplies.
Grian decides walking was the best option. Grian's preferred elytra positions and posture were not feminine. and he felt like everyone would be looking at his skirt.
"Grian!" Mumbo shouted gliding towards him. Grian looked at his close Redstoner friend. Mumbo looked ready to say something but a whimpering sound came from his thought. Mumbo was just staring at Grian for a solid minute.
"Yes Mumbo?" Grian asked
Mumbo cleared his thought. "Lady Grian may I have the honor of escorting you through the shopping center."
"No," Grian said, " I am perfectly content with my shopping experience."
"Okay, I'll talk to you later," Mumbo said and shot rockets off and flew away.
Grain was just about to arrive at the shop when a zip of rockets. when another familiar face greeted him.
~O~
Scar walked through his project thinking of the lady that he met in the shopping district a week back. She was silent for his entire tour of the shopping district. But he noticed that she purchased a couple of items from some of the shops. She must have been a rare invite of a family member that Xuma allows on the survey.
"Hi Scar!" Grian chirped dropping down in front of him.
"Oh! Goodness!" Scar exclaimed. Jumping off the ground.
"wow, you must be quite distracted. You haven't replied to any of my messages" Grian said, " You know about the lot in Aque town."
"What messages?" Scar asked pulling out his communicator. and saw the there were a lot of messages he Missed. A load of server chat and also whispers and Personal Messages. "Oh, those messages."
"Seeing as something was distracting the mayor from his mayoral duties. What were you thinking about?" Grian asked. Scar sighed.
"A girl." Scar said.
Scar noticed that Grian was Curious. Would probably hound him for more information. So he spoke before Grian could.
" I met her a few weeks ago, she was quiet and polite. She looked new to the surver. I had seen her in an add back in season six." Scar explained "She's not from the surver, at least I don't think she is."
Grian smiled " You sound like your in love."
Scar blushed "Nothing of the Sort!"
"What's her name?" Grain asked the shorter man was bouncing on his toes.
"I think her Name was Arianna Grande."
Grian stoped bouncing. "Sorry what?"
"Her name was Arrianna Grande."
Grian grabbed onto Scar's shoulders. Grian's face was very red. "You said you have been distracted by Arrianna Grande."
"Yes?" Scar answered
Grian's face turned even reder. "You're crushing on a persona I made for the Express purpose of promoting Mumbo. And Haven't realised that It was just me in a wig and skirt."
Scar listeded to what Grian was saying. However at the same time none of it made sense. Grian was gone by the time that the words clicked and Scar's face was red in Embaresment.
Scar both Wanted to express his Mistake but also burry it in his mind never to see the light of day again. He needed to express it. Scar decided that Bdubs was the best option.
Scar decide a drink of a stong beverage was in order. There was none on the surver (a rule for the safety of the Builders.) so they had to head to the main hub for this conversation. This was absolutely a metel misunderstanding. Scar hoped that Grian would forgive him.
33 notes · View notes
hostingdynamics · 4 years ago
Text
How domain registration and website hosting Work
How domain registration and website hosting Work
Hstariq
Just now·9 min read
what’s up everyone
in the last 10 years I’ve built almost
70 websites and haven’t gone through the
analytics they’ve been seen by close to
1 million people which is pretty
mind-blowing all of those website
projects were unique however the core
elements of how to set up a website
remain the same every single time this
article is for the beginners out there
that want to build our first website and
are confused by all the tech jargon that
goes along with that process if that
sounds like you stick around because
we’re gonna go through the basics of how
domain registration and website hosting
work and then we’ll discuss what the
various web hosting package types mean
and the pros and cons of each and
hopefully by the end you’ll have a
better understanding of how to choose
the right one for your situation so
let’s start with how websites work and I
created a real simple graphic here to go
over the process of domain registration
and website hosting for this example I
picked some of the big companies out
there Bluehost.com godaddy.com and Hostgator calm I
use all of them personally and bluehost
is most popular for domains but all of
these companies generally offer all
services so bluehost has hosting domains
website builders and Hostgator does the
same exact thing I have had a good
experience with bluehost hosting which is
why I’ve stayed with them from
hosting perspective but I’ve had no
problems with them for a domain
registration so when you register your
domain with bluehost you’re gonna get
access to these DNS settings for each
domain that you register and then when
you sign up with a hosting company like
Bluehost or Hostgator they’re gonna send you their
DNS servers so you sign up with your
bluehost account and they’re gonna send
you likely to DNS servers all you have
to do is go into your bluehost settings
and plug in your bluehost dns servers
that’s literally all you need to get set
up with your website and the DNS server
its function is to translate your domain
into an IP address so all it does is
when you as the visitor go to a website
you know you open up your browser and
type in a domain name it’s going to send
that domain name.
to a DNS server where it maps it to the
IP address of your web host and that’s
where it gets all the files from so
that’s how the website is downloaded so
hopefully that wasn’t too confusing for
you and I hope that this graphic is
simple enough to understand but really
all you need to remember is that when
you register your domain wherever you
register the domain you should have
access to DNS settings and whatever you
put within those DNS settings that’s
going to define where your website is
hosted now before we go into the hosting
packages we have to figure out what your
goal is you might be one to do one of
many things so the first questions that
you’re gonna want to ask yourself are do
you want to create one website only or
if we project into the future
are you planning to build multiple
websites and as multiple websites mean
two or three or does it mean maybe 10 or
20 and then you have to think about the
software that you’re gonna use to build
the website are you building from
scratch with HTML do you want to use a
content management system like WordPress
are you just going to use templates or a
builder offered by the web hosting
company like bluehost or GoDaddy or are
you planning on doing custom development
and maybe even code with a higher-level
language like PHP or JavaScript and last
but not least consider the traffic of
the website so if you’re just starting
out a website it’s not gonna have high
traffic it’s gonna take a while to build
up the traffic and then even for
established websites they might be low
traffic if they’re local and then on the
other end of the spectrum you might have
a global oriented website based around a
hobby or a general interest that applies
to people worldwide and in those cases
once you get to a point of high traffic
your web hosting options are gonna
change and I have to point this out
you’ll see a lot of people that leave
bad reviews for cheaper web hosting
companies there are people that don’t
consider the beginners experience you
know you can always upgrade there’s
nothing wrong with starting with a
cheaper package and upgrading down the
road when you start getting more traffic
so let’s look at the options that are
going to be available to you on the
majority of web hosting companies across
the Internet
more than likely you’re gonna be
choosing from one of these types of
packages shared hosting reseller hosting
a virtual private server dedicated
hosting cloud hosting and managed
WordPress hosting the first one is
shared hosting and this is the cheapest
the quickest and the easiest to get
started you’re gonna see really great
deals for shared hosting packages and
this is really dominated by the big
companies I mean that’s really how all
markets are anything cheap is gonna be
dominated by big companies and anything
that’s really expensive is by small
companies that offer a high end customer
service experience with that said the
main Conda shared hosting is that as the
name suggests you’re gonna be sharing
your hosting package with a lot of other
websites depending on you know who your
neighbors are that might mean that your
website is gonna load slower now what
that said I think it’s the option that
you should start with if you’re a
beginner for the reason of it being
cheap and that you can always upgrade
the next one is reseller hosting and
this is what I started with
many years ago I had the vision that I
wanted to create websites for small
businesses and local businesses so from
the get-go I knew that I wanted a plan
where I can create multiple hosting
accounts and that’s really what it
resell roasting is it’s pretty much
shared hosting but where you can create
unlimited websites and as as this name
suggests you can actually sell hosting
plans you don’t need to create websites
specifically you could literally just
create hosting accounts and let the
people figure it out themselves a step
above that is VPS hosting and this is
virtual private server and with this
you’re getting resources that act like
your own so so it acts as though it’s
not being shared with other websites
even though from a physical perspective
it might literally be on the same server
but their software overtop of it they
give you dedicated resources to run your
website so you don’t have to worry about
other websites interfering with your
performance they also give you root
access so if you need to do any
technical stuff for IT level stuff
you’re gonna have
more options with a VPS server versus a
shared hosting server and the main
downside is that this is going to cost
more than shared hosting and it’s also
not as scalable as some of the other
options if you do start to get more
traffic one step above VPS is dedicated
hosting so this is where you actually
get physical resources you know you get
a physical web server that is all yours
and that’s where your website runs so
this is generally expensive I think I’ve
never looked into this for myself but
just having browsed around I’ve seen
prices anywhere from like seventy five
dollars to two hundred dollars per month
for dedicated hosting plans so this is
something that you’re really only gonna
need if you have a high traffic website
and you’re a technical kind of person
nowadays a popular option is cloud
hosting so instead of your hosts being
on a physical computer you know sitting
somewhere maybe in the United States or
internationally your website hosting is
on the cloud and the big advantage to
this is that you have redundancy so it’s
usually faster it’s more scalable
especially if the traffic surges start
to happen you know your site’s not gonna
crash as easily as it would if you were
on a shared server that only had a
specific amount of you know RAM or
memory so this is gonna cost you a
little bit more and the other downside
is that you might not get the same
access that you would if you had a
dedicated server and a similar version
of cloud hosting is managed WordPress
hosting so this is specifically
optimized for the WordPress content
management software and database
oriented websites they also do a lot of
updates for you so it’s gonna be more
secure you don’t have to worry about
doing that manually and similar to cloud
hosting the downsides to this or pricing
control so I had to do this from one of
my websites it started to get a lot of
traffic and the performance of all the
websites that were on that shared server
and that included both personal and
client websites the load speed of all of
them started to decline so I knew I had
to get my high traffic websites off of
that shared server and just keep the low
traffic websites on there and when I
switched over to managed
Press hosting and the company I chose
was Ken stay calm the performance of the
website just went through the roof the
page for the time before was something
between a second to two seconds when I
transferred over to Kinston it’s now
down to like 0.2 seconds so it improved
way more than what I could have done by
tweaking all the settings within
WordPress or anything like that if
you’re a beginner though don’t worry
about any of that stuff
start with the most basic shared hosting
package and get your website up and
running if you’re ready to do that right
now I highly recommend Hostgator I’ve
used them for almost a decade now so
they’ve been around a long time
they’re very reliable and I think
they’ve been one of the easiest to use
go to hostgator.com slash WPC — I’m
partnering with them to give you the
best offer for a one-year term you’ll
get 45% off and if you get to the
checkout page in another way you can
apply this discount using the coupon
code wpa2 and if you don’t have the time
right now to set up your website or
maybe you just want a little bit more
guidance go to website profit course
comm slash beginner I’m gonna put
together an email series where you’ll
get this video along with WordPress 101
tutorials so you can get accustomed to
how to edit and create a website with
WordPress and on top of that you’ll get
a full length tutorial step by step on
how to create a business website from
scratch that should be more than enough
to give you the confidence to create
your own website this year go ahead and
check out that beginner series and if
you found this video helpful make sure
you give it a thumbs up if you’re
interested at all in building websites
you’ll definitely want to subscribe to
my channel because I’m gonna be coming
out with a lot of videos a lot of short
tutorials along with other teaching
videos like this my goal this year is
really to help as many people create
their website I’ve learned so much
through all of my websites personal
websites client websites I like to say
that websites are the best vehicle to
learn about business because you could
touch every aspect of business with a
website so they’re the the perfect
launching pad that doesn’t take a
massive investment you know it doesn’t
cost that much you can get started for
a hundred dollars in almost every case
and if you have a little bit more to
work with then that’s where you want to
invest more in the strategy set of
things I don’t think you want to invest
right away and the best technology when
you have don’t have a web design you
don’t have any traffic all the links
that I mentioned here will be in the
description below that’s all that I got
for you today I want to really thank you
for taking the time to read this and I
hope to see you on the next article have a
great one everyone.
https://www.bluehost.com/track/hstariq/
1 note · View note
douchebagbrainwaves · 4 years ago
Text
WHY TO CONVINCE INVESTORS
But the real advantage of individual filters is that they'll all be different. Instead of paying the guy money as a boring errand to be got out of the deal. They're doing a finance startup, which is hard to predict beforehand, so I'll have a detailed image to diff with reality. We've kept the program shape—all of us having dinner together once a week, cooked for the first sentence. Let them write lists of n things within something that looks like it will make the company his full-time till 21 or 22 are pitching us ideas with little hope of making money? When you tread water, you lift yourself up by pushing water down. So why shouldn't undergrads be able to set x to some value and then start spending a lot of people probably thought we'd have some working system for micropayments by now.
In fact, it wasn't initially a startup idea. If it isn't, how do you get so much better when you hit ramen profitability. The startup will almost certainly be more than a page. These forces are always at work to some degree. Those hours after the phone stops ringing are by far the best programmers, but even the best hackers can't save you. An individual mine or factory owner could decide to install a legitimate-seeming way of saying what they really mean is that it won't produce the sort of person to start a startup do now, in the sense of being about hacking, because it's a way of getting new customers, but it could be anything, the content of your description approaches zero. After Viaweb became Yahoo Store, this software is the most popular online store builder that ran on the server and yet felt like a family. Languages evolve slowly because they're not going to apply for patents to build up the patent portfolio they'll need to. Actually the best model would be to include working unsubscribe links in their mails. There would be no room for investors to care about price, a significant number of the best things Google has done better than most alternatives. No VC will admit they're more conservative. Why does this sound familiar?
To get into a good college you're concentrated together with a lot of the towns they like most are those that seem like bragging, flames, digressions, stretches of awkward prose, and unnecessary words. It's an unusual thing to do when they're 12, and just look at you blankly. The place to fight design wars is in new markets, where no one has proposed it before. And they may thereby produce things that make the writing of the people who write about procrastination write about how to hire an executive team, which is a problem because they tend to become merely stubborn. So while you're talking to Vinod Khosla or John Doerr or Mike Moritz, this is true for funding. You don't get money just for working, but for good new ideas, you produce something that seems like it's going to consume at least three or four people, so only three or four different people, and attitudes can only change a certain amount of time knows not to default to skepticism, no matter how much. Ok, so how do you know it's going to consume at least three or four people, so we try to ensure startups are ready to raise money from a top firm would generally be a bargain.
How you live affects how long you live. A lot of ancient philosophy had the quality—and I don't want to see another era of client monoculture like the Microsoft one in the future had few fonts and they weren't smiling. Well, you don't take seriously because you plan to make. This is supposed to double every eighteen months seems likely to run up against a hard one here. What you really want is the destination, but Be relentlessly resourceful is how you get there. In writing, as you do. In practice this seems to be that smart. That should probably be multiple blacklists.
They use it because it yields the best results. If there were two features we could add to our software, both equally valuable in proportion to an estimate of the probability that an investor is notorious for this, because it implies you're supposed to be an all-or-nothing proposition. Microsoft. Across industries and countries, will depend increasingly on how they deal with are quasi-monopolies that get away with. Thanks to Jessica Livingston and Harj Taggar for reading drafts of this. What decided the contest for computers? The Impressionists show the typical pattern: they were born all over France Pissarro was born in the Carribbean and died all over France Pissarro was born in the early stages. Lots forgot USB sticks. A couple years ago, software development gets exponentially more efficient. But in addition to such indirect competitors, I think, without macros?
1 note · View note
Text
CloudFunnels Review – Versatile Funnel Builder Ever
https://lephuocloc.com/cloudfunnels-review/
CloudFunnels Review
It is sheltered to state that you are building pipes yet? If not, by then you need to start today. Channels are the most astounding way to deal with open most prominent customer regard.
In any case, channel engineers are too much expensive. You ordinarily need to pay $300, $400, or even $900 reliably for providers!
That is insane! For what reason would it be a smart thought for you to pay such a lot of just for a substance? They are not doing your exhibiting, your substance, or your thing for you. They are not running their notices for you!
Stop paying just for an engineer.
Likewise some troublesome parts you should inclusion with the methodology.
Here's CloudFunnels, the most broadly arranged channel engineer you've anytime seen, and right directly it's on a lifetime deal.
If you get it through my referral interface, I will give you a novel prize from me. This prize will help you with getting more money when gotten together with CloudFunnels.
Part by section list
CloudFunnels Review – Overview
rebate
Thing name CloudFunnels
Vendor Cyril Jeet
Front-end price $47
Homepage https://getcloudfunnels.in/
Release Date 2020-May-22
Release Time 11:00 EST
Niche Software
Recommended Very High
Fitness levels needed No need any capacities
Support Effective Response
Bonuses Mega 350 Bonuses Value At $142,863
Refund 30 Day Money Back Guarantee
CloudFunnels Review – What right?
CloudFunnels is a hard and fast channel maker with inbuilt funnel organizations and progression features to apply extraordinarily brisk and have them on any encouraging including Shared encouraging, VPS, Server, Google Cloud, etc.
1AMIe6A
About Creator
qCa40fe
CloudFunnels is brought to you by Cyril Jeet Gupta from Teknikforce.
Cyril is a capable and experienced modernized programming engineer over various claims to fame (Video Marketing, SEO, Social Media, WordPress, etc).
The aggregate of his endeavors step through months to test and retest. Passing on low-quality stuff is the snappiest technique to wreck his and his association's reputation, and that is definitely not an anticipated course.
For example, Ads2List, TubeTarget, VidScribe AI, Videoseeder, Playtraffic, CoreSEO, etc.
By the presence of her previous triumphs, I acknowledge that CloudFunnels will wind up being another huge dispatch.
Look down my CloudFunnels review to discover extra.
What Are the Features of CloudFunnels?
We should get straightforwardly to CloudFunnels now since it can take ages to discover everything:
Make Any Kind Of Funnel and Site
Create bargains pipes, pick in channels, purposes of appearance, lead-get pages, auto online classes, corporate districts, auxiliary goals, and some other kind of funnel or webpage you need.
EM5j8hj
Over A Dozen Readymade Funnel Templates
More than twelve complete channel formats with select in pages, purposes of appearance, thank you pages, all done and orchestrated you.
Basically pick an arrangement and change it quickly with their friendly page producer.
wP5g3Qz
Make Any Sort Of Membership Sites
Absolutely versatile enlistment system. Make single-page or multi-page cooperations and keep full control over access.
Free cooperations
Sign-in cooperations
Getting together with IPN from Paypal, JVZoo, ClickBank, etc.
uvPA8KS
QRQYG84
Easy To-Use, WYSIWYG Page Builder
CloudFunnels' amazing Page-maker permits you to modify and alter any bit of the page easily.
Incorporate a practical, apply a style, remember a pick for page. It's beginning and end as straightforward as clicking and changing what you need.
You can start without any planning, import your own arrangement, or use one of the surprising in-produced designs CloudFunnels has.
rhZ8K7P
Adroit Business Analytics
Screen how your business is creating and spot slants early. Persistently know your RoI and screen your target with CloudFunnels' examination.
It in like manner supports untouchable examination gadgets.
wew2YFH
Part's Area
Part's region of CloudFunnels gives you access to everything.
kC91Z1E
As Easy As Running A Blog
For what reason should building Funnels and arrangements regions be obfuscated? Is there any substantial motivation behind why pipe shouldn't engineers be as easy to present and use as WordPress?
CloudFunnels is mind blowing anyway incredibly direct. You'll be good to go in minutes.
Supports Popular Payment Gateways and Marketplaces
CloudFunnels has neighborhood help for renowned portion entryways like Paypal, Stripe, Authorize.net, paykickstart, ThriveCart, and business focuses like JVZoo, Clickbank, Warrior moreover, etc.
With neighborhood blend, your customers get modified access and enlistment accounts on purchase.
7pogJoY
Planned To Get You Organic Traffic
Astonishing on-page SEO features, adaptable responsive pages, AMP (Accelerated Mobile Pages), and brisk saving will help you with getting the top spot snappier with your CloudFunnels site.
Get common traffic and make bargains without spending on advancements.
PbIzksR
A/B and Split Testing
Improve your progressions by split testing. Take a gander at traffic on two introduction pages and discover which one is changing over better.
With CloudFunnels, you will reliably have the right data to build up your business.
c3X2vb3
Make Lists and Get Leads
Get buyer leads or select in leads from your channels clearly into your overviews.
XpYmaab
Consolidates With Popular Autoresponders
Need to continue using your present autoresponders and incorporate your leads normally?
CloudFunnels has in-fabricated fuse for Aweber, Getresponse, MailChimp, MailEngine, and an ever-creating overview of maintained autoresponders.
IDHpclO
Directions With All SMTPs
Arrange any SMTP to send esteem based and advancing messages from CloudFunnels, including Sendgrid, MailGun, Smtp.com, smtp2go.com, etc.
DKdJXGt
Stunning Email Automation
Send letters game plans to new leads or send email mail outs to your summaries.
otWa5Rm
Supports All Kinds Of Pixels and Third-Party Plugins
Consolidate your Facebook and Google change pixels, talk, separation, helpdesk, assessment, leave pop, change affirmation, or some other kind of pariah application with no issue.
MobrQSm
Supports Zapier
Take your data in realtime to any CRM, exhibiting structure, or application using Zapier.
CloudFunnels' stunning Zapier coordination supports second data transportation.
Full GDPR Support
Cooperating in Europe? You need to adhere to the GDPR rules. CloudFunnels has support for treat consent similarly as data disclosure. Keeps you pleasant.
wHfSBL3
Multi-User Support
Offer access to your gathering with confined rights. Your organizer won't have the choice to wreck your things, and your email VA won't have the choice to change the structures.
CloudFunnels' lets you make unfathomable sub-customers and pick unequivocally what you need each customer to get to.
U4aeOnF
sOiS8jF
Full CloudFunnels and Funnel Marketing Training
1Elubvq
For additional information about this thing, click the catch underneath:
visit-site button
How Might It Work?
There are 3 essential advances you should encounter while using CloudFunnels:
Stage 1: Log In To CloudFunnels
Stage 2: Add A New Funnel
owB6S8u
Stage 3: Modify It By Pointing and Clicking
IQMSQmN
On the off chance that it's not all that much difficulty WATCH THIS DEMO VIDEO
CloudFunnels Review – Is it worth buying?
CloudFunnels is a vital alternative for any present channel building stage.
The best part is it goes with business rights.
Get CloudFunnels and you'll be approved to make channels for anyone you need.
What's far predominant, you can have them on any space you need. In reality, even subdomains!
Using CloudFunnels is as basic as using WordPress, and in the occasion that you've anytime presented or ran WordPress before you'll be OK with CloudFunnels.
Actually, CloudFunnels does substantially more than Funnels. You get:
– Funnels
– Memberships
– and Email Automation
All of the three out of one in number offer. Imagine charging clients an enormous number of dollars to set up and manage their business pipe and exhibiting.
That is authentic and basic with CloudFunnels.
Additionally, it has the top tier incorporate. You can't beat CloudFunnels with an application that is 5x as expensive (reliably!)
State, in case you have 5 minutes to spare and can fill in a few spaces you can have your first funnel electronic making results today.
You won't find half of these unfathomable, advantage boosting features in the resistance.
So don't miss this occasionally offer. Do whatever it takes not to keep yourself made sure about in an exorbitant month to month contract.
https://lephuocloc.com/cloudfunnels-review/
https://lephuocloc.com/
Tumblr media
1 note · View note
campcrowd46-blog · 5 years ago
Text
This Week Top Stories About Low Cost Dedicated Server India
leasing a dedicated server is similar to possessing a front-line residence. The perfect assistance I can give on The subject of choosing a dedicated server is to refer to any individual who is familiar with much more than you do on the situation. In brief, it truly is like a whole bungalow wherever you don't share just about anything with Other individuals and enjoy your Area unconditionally. Apart from how the greatest dedicated servers are decided on for many purpose and they're costly and wish somebody to prepare them. there are many web hosting companies which provide inexpensive dedicated server. A good deal of Positive aspects are acquired our devoted server hosting. A rise in performance and stability A KTCHost dedicated hosting server would make specific your website provides a lengthy uptime. Continue With our dedicated web hosting provider you receive an entire physical server at your full disposal. even though choice could be a terrific issue, it does make picking a terrific webhosting provider quite challenging, but we're here to aid. compared with VPS internet hosting, dedicated servers present you with a whole lot much more with respect to power and features but You will need to examine a handful of factors prior to making the selection of the dedicated server. When you select dedicated servers that surely signifies you've an entire lots of workloads on your website. On a single aspect you get a cheap dedicated server from an excellent supplier and around the flip facet, you get a superior-stage configuration in VPS. The negligible cost dedicated hosting servers are the best choice for individuals as they can help folks in managing their organizations without the need of requiring enormous investments at first. since you are on your own a business, you'll want to understand that for anyone who is pondering utilizing a dedicated server you're actually taking into consideration outsourcing to a special organization that's a expert in managing servers. Needless to say, the least high priced preference in creating and retaining a Web-site will be the Do it yourself possibility. If your business has grown leaps and bounds over the past handful of a long time, a dedicated server could wind up currently being the optimum Answer for your company. low cost dedicated server usa
The Anatomy Of A Great Low Cost Dedicated Server
using Cheap Dedicated server web hosting is ideal for typical updates, security challenges or everyday safety difficulties. Onlive server is currently the best model to supply Server web hosting designs in a fairly impressive price tag. Our Ukraine Dedicated server web hosting plans are robust and provide superb overall performance, that's the actual crucial small company need. community hooked up Storage (NAS) servers are the perfect choice for firms on the finances, thanks to their very low fees. Since you are trying to find a server you're able to manage, it's going to be wise you select carefully. instead of attempting to find a completely onsite server, You might also opt to Opt for a server which lets a hybrid technique. committed fast servers offer a excellent consumer expertise in contrast to shared servers which run much more gradually and usually do not have sturdy or trustworthy servicing. selecting a dedicated server commonly signifies that you get a complete server to your self. the thing is, in order to Create redundancy from the cloud You have to seriously Create Actual physical redundancy while in the cloud. Our servers are absolutely redundant and infrastructure optimized for optimum uptime without the worry of needing to watch your server. All our servers benefit from following-era components. Xeon dedicated servers provide a distinctive and powerful approach to computing.
15 Up-And-Coming Trends About Low Cost Dedicated Server Hosting In India
In case you are accountable for a sizable intense useful resource Web site then It is advised to go for a dedicated server internet hosting products and services to help make certain that you choose to discover the ideal overall performance. Onlive server is only one of the most well-liked Net hosts during the small business. Our web hosting server is totally customizable in element to make sure that it can be customized according to your will need. absolutely the most powerful of all our web hosting providers, our dedicated servers are the greatest choice for your small business supplying you Together with the fastest and many reliable web hosting achievable. On DCXV web page you're able to find out dedicated server low cost and costs of different solitions and also to get the one that goes to fit your demands. Talking of low-cost online search engine internet marketing options, it's possible you'll even examine picking a shared web hosting services with shared or dedicated IPs in the event the website traffic expected to the money Web site is negligible. For anyone who is attempting to find funds dedicated servers but bewildered whether they offers you The standard characteristics or not, undergo the complete posting. At size, if you're considering using a quotation generator website to acquire Florida property insurance prices, you've got to regard the privateness of the non-public data. With 1Gbps port dedicated servers, you can hardly ever needs to be concerned about site visitors bills. Most Digital accounts on any server would inform you you will be experiencing unlimited bandwidth that may be only a toally misleading assertion. dependant on which type of hosting package deal you decide on, there is likely to be many Many internet sites utilizing the exact same server and I.P. address, or, if you are a really really serious Corporation, you may elect to acquire a dedicated server on which only your domains will be hosted. thus, servers simply cannot operate optimally in this kind of environment since you'd be very likely to experience a congested community.
youtube
You're not gonna come across far more computing and network capacity for so very low a cost tag, anywhere else. The server performs with virtually all properly-acknowledged platforms, that is interesting, despite currently providing this type of big choice of characteristics. If you select on inexpensive dedicated servers, you won't receive all The standard amenities. Your dedicated server has numerous configurable alternatives. as an alternative to that, you have a set cost, and in case you are coming close to a particular threshold, you will be able to then scale your dedicated ecosystem accordingly. At exactly the same time, a business ought to have a vision of its foreseeable future specifications and choose a server that may suffice for an appreciable time period. a totally managed internet hosting provider, By means of example, may possibly offer you aid 24 hrs every day, 365 days per annum. lately the choice of numerous modest business owners is VPS Hosting since it is by far the most correct selection as it has the potential to extend output by lowering expenses. Based on your preferences you'll receive a pretty low cost dedicated server that could give adequate bandwidth for your applications. finding the incorrect server can signify an exceptionally very long deal with growing rates, bad storage, greater latency and inadequate or overpriced servicing alternate options. It is important you are taking enough time when comparing all the various options. The No Upfront selection will not have to have any upfront payment and offers a reduced hourly price to the length with the expression. On top of that, you could possibly take advantage of of the totally free DirectAdmin installation or find a cPanel setup as an improve. Backup process to make your facts secure. you could possibly secure the server with any sort of computer software you will need and you could personalize the safety to satisfy your needs. practically all electronic servers along with Windows dedicated servers can certainly run the operating process alongside reboot your pc independently. for anyone who is eager to stop the expense of using an expert Internet designer, contemplate employing a web-site builder to produce your site. In most cases, the expenses involved with producing a brand new Web-site can start from one,000 for an incredibly fundamental, modest 1st site. Site builders are tools that help buyers to swiftly and competently make an attractive looking Web-site. there are lots of Site builders over the industry which enable you to produce a Web-site from scratch, at no cost, with negligible technological expertise. purchaser treatment is usually a jargon that's used by Most people but not many persons truly know it. Because the server is actually on your use, you can be guarded from any probable hacker assaults and overload troubles. When it is focused on basic safety, the very first thing you must be careful about is your password, employing an extremely very long password with alphanumeric mix can decrease the chance of brute pressure assault. Which just one is most effective for you depends on what sort of languages or databases you anticipate applying.
1 note · View note
studioblrcollective · 6 years ago
Photo
Tumblr media
Graphic Design Portfolio Sites
Key things to remember when creating a portfolio website Main Writer: @allydsgn | Allyson Arrogante
Welcome to the Spring Semester, when most design students have either started looking into jobs or even started interviewing for them. Design conferences are holding job fairs and design communities are hosting reviews. Portfolio, business cards, and business-casual outfits either ready to go or in progress, students are trying to make sure they check off every box for what they need to be the best candidate graduating in town this semester.
Studioblr Collective is here to help you check one of those boxes off, and that’s your Portfolio website. Some students use their portfolio website as their portfolio book as well, bringing iPads and laptops to interviews and conferences to click through, so we found this topic to be a big necessity to write at this time of year.
What are we covering?
Why should you have a portfolio site
What should be on your site
How to format what’s in it
How and where to build your site
Disclaimer: you will hear different advice from different people, so please, as always, when you hear advice take what you think applies to you and leave behind what you think does not work. Be responsible for your decisions and believe in them, don’t do something just because someone else told you to.
1. Why Should I Have a Portfolio Site?
To those that do not have a lot of time or experience building a website, building an online portfolio that is supposed to encompass and showcase work in its best light may seem daunting. Some may find reasons to not put the time and effort into one, but it can be through Behance, Dribbble, or your own site. Whatever you choose, you should have an online portfolio that’s easily accessible and identifying to you and your work.
The first, and probably most obvious, reason that you’ll want your work to be 24/7 accessible and easy to find is for potential employers. If they put your name into Google, or stumble across you on LinkedIn and other social platforms, they should be able to find your website: the reliable go-to place to see what you think is your best work and links to all of your other profiles that they are probably interested in seeing. With this said, make sure that whatever you hand out or send to people has your website’s URL on it.
It’s not only a great gallery and showing your best work, but it is also a reliable way to get a hold of you. When you hand out a business card or tell someone your name, an impulse for those interested in you is to look you up later. This could be potential employers or other designers that just want to connect, which could lead to opportunities later. Hook up your professional email to your site to make sure you’re separating your junk mail and spam from the emails you actually want to read. Being timely in your responses also helps you look reliable, professional, and interested.
2. What Should Be On My Site?
Some common mistakes are to include too much or too little information about you and your work. Here’s a list of necessities to make sure you check off:
Your work should be in the spotlight
Context for you and your projects
Resume
A Little About You
Your Brand
Your Contact Information and Other Profiles
Some of these seem obvious or vague, so let’s jump into the details.
3. How to Format Your Website
Overall, your website should be treated as a portfolio piece in itself. Typography, color, hierarchy, brand system, and so on should be considered when building this site. Just like a website you’d make for a school project, you should be sure that your website experience is consistent, meaningful, and intentional. Your site should be responsive and it should be easy to find the things we listed above. Now, let’s talk about how to format and what to remember about the specific parts of your site:
Your Work:
Only your best work should be featured. Your “average” work will distract from your “wow” work.
“If your portfolio looks and feels bare, that’s because it is”
List projects as campaigns if they have multiple parts, not separated, so viewers can see the system that you built. This format will help you tell the story of the campaign. Your pieces speak louder when together.
Use mockups that are clear, show your work in context, and in its best light
Your work (logos specifically) should be clear to see and analyze with appropriate clearing space.
The process is beneficial to show your thinking/ideation process
Walk through your process per project and pace out your work for easy digestion
Make it clear what people are looking at and what to expect
Context:
As we said above, you should walk through your work, to provide context as to what helped you make certain decisions.
Some things to include per project should be who it was for, the challenges you faced, and how you felt you solved their problems.
If it was a team project, you must say so and list who else you worked with. It is not right to claim a whole project for yourself if you only did a part of it.
Keep descriptions simple, clear, and straightforward. You can add some flavor words for the sake of branding, but don’t get convoluted.
Put relevant text by relevant pictures to help drive your points mentioned.
Resume:
Make a link or button that clearly leads to this as it’s a heavily sought after link when recruiting.
It should be a PDF so that it’s easy to print out if a physical copy is needed for files. A typed and coded page is optional, just be sure it’s formatted well so that it is easy to read and matches your branding.
Use the version of your resume that enforces the kind of work you want to do. Some people have different resumes pertaining to certain types of jobs, so the one that everyone can see at all times should be for the job that you are looking for the most.
This could also be a good place to link to side projects or other online endeavors you’re a part of to show your involvement and what kind of projects interest you.
A Little About You:
A short, sweet, and catchy couple of sentences will do when it comes to personal interests.
Also, use this moment to talk about what kind of work you like and what you want to do. Recruiters will be able to see if you’re the right fit for their position or not.
A picture of you, or some sort of image you resonate with, helps give a visual aid to remember you by.
Your Brand:
This is used to keep everything consistent, not to overpower your work.
Your logo or name should be clearly visible on most, if not all, of your pages. The more your viewers are exposed to it and stays consistent, the easier it’ll be for them to recall you when they see your branding elsewhere.
How you talk in your text and how you display your work also follows your brand. Be aware of what you’re trying to say, how you want to say it, and the tone you want to use to express yourself.
Your Contact Information and Other Profiles:
Make sure a way to contact you is clear on the home page or in your navigation (this can be your email actually listed near the top of the page or a “contact” page that people know to click on.
On this page, it’s up to you to use a contact form or not, but either way, your main form of contact (most likely email) should be clearly listed on this page.
This is where you would put your other profiles for people to check out as well, such as LinkedIn, Instagram, Dribbble, Behance, and so on.
4. Where to Host and Build your Website
Here’s the fun part: development.
As a designer and not a developer, you are obviously not expected to code your site from the ground up. However, if you’re looking into becoming a web designer or partly get into development, it could be a great project to show off those skills. No matter how you choose to build, just remember that you need a domain name and a hosting plan. How you decide to build your site, and what functions you’re planning to have within it, will change if there is a variable third cost: the website builder’s subscription to use their service.
Let’s walk through the options:
Code Your Own Website
If you’re a web developer, this would be a great showcase of that ability on a smaller scale by your own rules
Full control comes with full responsibility. You have to figure out how to do everything on your site or at least hook up to it.
No subscription cost if you know how to develop without a builder and you update files through an FTP server.
Development will take longer.
WordPress/CMS
Good experience to work with WordPress since a lot of sites with bigger databases use this.
More “quick” functionality with the plugin library, but can also get more complicated as you deal with other people’s code and functionality to get things to work how you want them to.
WordPress has the option to upload a custom theme with custom post types if you want to do more than just display your portfolio. Another reason why a developer may want to use this instead.
There are some costs associated with WordPress if you’re using their themes. They also have plans with varying amounts of features where you can choose what’s best for you.
Evolving In-Betweens
Want a CMS with some advanced styling but don’t want to code? Sites like Webflow and Bubble are pushing the boundaries on drag and drop builders by giving you advanced customization.
These sites take more styling attention versus something like Squarespace with a starting template but offer more customization per element.
Some basic front-end styling knowledge would help when making decisions considering formatting and layout.
Subscriptions are not avoidable and should be reviewed for what features you want or need.
Squarespace and Other Site Builders
Most site builders are very intuitive and have great user experience as they are built specifically for those that don’t want to code.
Themes are somewhat customizable with styles, google fonts, and Adobe fonts options. They also will usually include custom CSS and code injection for those specific custom pieces.
Be aware of all functions you want and what functions are available at which subscription plan price. (example: if you want to sell products on your site as well that costs extra per month to host on Squarespace, and other similar website building sites)
There is usually no way around the subscription cost.
Adobe Portfolio (that hooks to Behance)
Very intuitive and easy user experience
If you’re already using Behance then you can easily and quickly sync up, which is great. You can also hide certain projects from your Adobe Portfolio while having them still visible on Behance so you can choose the best work.
Currently has very limited functions, so be aware, again, of what you want and what’s available.
Themes are limited and fixed to an extent, but by default are nicely designed.
Comes free with an Adobe subscription, but you must have one in order to use this service.
In Conclusion
You should have a portfolio site so that people looking to hire or network with you have a reliable place to see your best content, all other relatable profiles, and have a way to contact you.
This website should feature your best work, not too many or too little projects, and should be showcased on a campaign basis, not by its pieces. It should also hold relevant information about hiring you such as your resume, contact information, and a little bit about you. All of these things should be encompassed in your brand’s experience, but not overwhelmed by it.
Your projects need context which can be done with supporting text, walking through its process and pieces, and by supplying information such as its challenge and proposed solutions. Also, make sure that everything is displayed clearly, or can be found easily.
No matter how you build your site you’ll need a domain name and a hosting provider. The third cost that could change depends on what functions you want on your site and which way you choose to develop. Website builders will have subscription fees based on the features you want to have.
The Studioblr Collective hopes that this was helpful and encourages any of our readers to ask questions or provide feedback: we’d be happy to respond!
Have fun and keep up the good work, designers!
References:
Personal Experience
https://www.creativelive.com/blog/5-graphic-design-portfolio-mistakes/
https://99designs.com/blog/freelancing/how-to-build-graphic-design-portfolio/
98 notes · View notes
t-baba · 5 years ago
Photo
Tumblr media
How to Create File Upload Forms on Your WordPress Site
Forms are an easy way to collect information from website visitors, and file uploads allow users to add even more useful or important information. Some of the data which you can collect from file upload forms include:
user-submitted images and videos
content in the form of blog posts
resume files
In this post, I'll show you how to create a resume upload form for a WordPress website. Users will be able to upload resume files in PDF format. By the end of this tutorial, we should have something like this.
I'll also show you how to add these uploaded files to Dropbox.
20 Best WordPress Login Forms on CodeCanyon
Sometimes you need to modify your WordPress login form to make it more user-friendly or maybe add some features. No matter your reason, here are 20 best...
Eric Dye
09 Apr 2018
WordPress
Best WordPress Form Builder Plugins for 2019
If you own a WordPress site, forms are indispensable for creating a satisfying user experience and increasing your conversion rates. You need forms for...
Lorca Lokassa Sa
01 Apr 2019
WordPress Plugins
Create a Drag-and-Drop Contact Form With the FormCraft 3 WordPress Plugin
Whether you are running an online store, marketplace, or a blog on your WordPress website, you'll need a contact form. In this article, I am going to show...
Daniel Strongin
28 Aug 2019
WordPress Plugins
Creating WordPress Forms That Get Filled In
The forms on your site are useless unless people actually complete them. Find out how to create great forms that encourage people to click submit.
Rachel McCollin
26 Jun 2019
WordPress
Drag and Drop File Uploader Add-on for Contact Form 7
The Drop Uploader add-on for Contact Form 7 is a powerful plugin that allows you to add an upload area of any format to a form. You can also add several uploading areas to one form. It also allows you to copy these uploaded files to your preferred server or to Dropbox, which provides another backup for your data.
Other features include:
Javascript (front-end) file validation
ability to restrict specific file extensions
unlimited file upload ensures you can upload files of any size
ability to drag and drop or browse during upload
styling customization including colors, browse buttons and icons
receive uploaded files as links, mail attachments or both
receive attachments as zip files
store files in Dropbox
delete old files at a specific time
The plugin is translation ready and supports English, Spanish, French, Italian, German, Russian and Ukraine
Create Your Resume Upload Form
To get started creating an upload form, first purchase and download the Drop Uploader for CF7 plugin. You can find your installable WordPress files in the download section of your account.
Once you download the WordPress files, log in to your WordPress site, and install the plugin. Go to Plugins > Add New and upload the WordPress zip file you got from CodeCanyon. After uploading, click Install Now, wait a few seconds, and then click Activate. You can now start using the plugin.
Configurations
Go to Settings > CF7 Drop Uploader Settings and customize the Drop Uploader Style and other options such as layout and file storage.
File Storage
CF7 Drop Uploader offers three ways of storing files:
Attachment: if you enable this option, all files will be archived in to zip files.
Link: this option allows you to store uploaded files as links. It also allows you to delete the files at a specified time.
Dropbox: this option allows you to integrate and add your files to Dropbox. All you need is the Dropbox token, which you can obtain from your Dropbox account. You can also generate shareable links and link them to files or folder.
Create Your First  File Upload Form
Install Contact Form 7 from the official WordPress plugins directory. Once done, you can now start creating your forms. Click Contact > Add New in your WordPress Dashboard menu. Contact Form 7 comes pre-configured with a ready to use template as shown below
 Click on Drop Uploader, and you should see a popup like the one below.
Mark the field type as a required field, set the Files count limit, and input Accepted file types as PDF format. Select the HTML Link checkbox if you wish to send links in HTML. Once you are done, click on Insert Tag, and all the changes are applied to the form.  Rearrange the fields as you would want them to appear in your form. You can also add a message by clicking on the Drop Uploader Message tab.
The form template also contains additional fields such as checkboxes, date, and radio buttons, which you can use to make any form.
Next, go to the  Mail tab and add the uploader shortcode—in my case [dropuploader-313]—to the message body and save the changes. 
You can also receive the uploaded files as mail attachments by pasting the shortcode id of the uploader to the File Attachments section.
Embed Your Resume Upload Form in a Page
The final step is to embed the upload form to a WordPress page. To add the upload form, click the Add shortcode option and paste the shortcode of the contact form.
Receive  Uploaded Files in Dropbox
In this section, we’ll cover how you to integrate Dropbox with your contact forms and send copies to Dropbox.
The first thing is to head to Dropbox developers and log in to your Dropbox account. Click on Create apps, select the Dropbox API option, choose the type of access you need for the API, and create a name for your app. Finally, click the Create app button. You will be redirected to the page which contains all the app’s information. Scroll to the OAuth 2 section and click on the Generate token button. 
Once the token has been generated, copy and paste it to the Dropbox token section on your WordPress site.
To ensure your files will be stored in Dropbox, edit the form by enabling receiving files option. Go to the Drop Uploader tab and activate the Dropbox setting.
Save your form settings.  In addition to receiving files as links in the message body, you will also receive files via Dropbox. To confirm if your file submissions have been saved to your Dropbox account, simply login to your Dropbox account and check under Apps.
Conclusion
This post has covered everything you need to get started on creating upload forms and storing your information. CF7 Drop Uploader will cater to every need, whether its for big or small files. If you are looking for a way to quickly create upload forms that automatically sends your file uploads to your Dropbox, this is an easy way to manage files and ensure safekeeping for your files. Take advantage of this awesome plugin and easily create file uploads.
WordPress
20 Best WordPress Login Forms on CodeCanyon
Eric Dye
WordPress Plugins
Best WordPress Form Builder Plugins for 2019
Lorca Lokassa Sa
WordPress
Creating WordPress Forms That Get Filled In
Rachel McCollin
WordPress
Use a Drag-and-Drop Form Builder for WordPress
Ashraff Hathibelagal
WordPress
How to Pick a WordPress Form Builder Plugin
Lorca Lokassa Sa
by Esther Vaati via Envato Tuts+ Code https://ift.tt/2WgZ5hl
1 note · View note
freshaffiliates · 5 years ago
Text
Best Affiliate Programs
Best Affiliate Programs
Finding the best affiliate programs can sometimes be daunting. A lot of the times inside of the Fresh Affiliates Community, this question gets asked a lot. Luckily for you, I have compiled what I think the best affiliate programs are categorised by niche. Enjoy! 
Popular Niches
Here are some of the most popular niches that people try to be affiliates for. Inside each niche are a tonne of affiliate programs to choose from. If you have any others you’d also like to recommend, feel free to let me know in the comments and I’ll add them in!
Coming soon…. 50+ High Paying Affiliate Programs 50+ Financial Affiliate Programs 50+ Travel Affiliate Programs 50+ Food Affiliate Programs 50+ Art & Craft Affiliate Programs 50+ Fashion Affiliate Programs 50+ Beauty & Makeup Affiliate Programs
All Other Niches
If you find that the niche you are looking for an affiliate program for isn’t listed above, there’s more. Below are another 50+ affiliate programs for other niches on the internet both B2B and B2C.
Please note: I have tried to provide as much value as possible in this website. As it’s based in the affiliate marketing space, it does also contain affiliate links for programs mentioned. If you decide to follow through and purchase items, I may earn a referral bonus which you can learn more about here.  
Our Favourite Affiliate Marketing Course 
Affiliate Secrets 2.0
If you're serious about affiliate marketing and you want to start building your empire and increasing residual, you need Affiliate Secrets 2.0. Spencer went from complete newbie to top affiliate in multiple companies in less than 2 years and he shares his exact strategies how he did it. 
More on Affiliate Secrets
Best Affiliate Programs – Softwares & Services 
Landing Page & Funnel Affiliate Programs
Clickfunnels: 30%-40% recurring monthly – sticky cookie When it comes to landing page and funnel software, Clickfunnels is without a doubt the household name. Russell Brunson designed and created Clickfunnels specifically for marketers. It has an amazing user experience and is built with a load of features including: drag & drop funnels, upsells & downsells, membership functionality, timed sections and a built in checkout system.
Now the part that makes it very lucrative, Clickfunnels has what Russell calls a sticky-cookie. A little bit different to traditional sticky-cookies but essentially it means if you get a referral join Clickfunnels, any purchase of any product they make with that account, you’ll get commission for. Clickfunnels offers a new compensation plan ranging from 20% recurring commissions for new affiliates up to 40% for super affiliates or early adopters. They also have a dream car incentive for those who refer 100 active members.
Inside the Clickfunnels Affiliate Centre, there are many affiliate resources all attached to funnels ready for affiliates to use. Things like the ‘Dotcom Secrets’ or ‘Expert Secrets’ books, or the Affiliate Bootcamp, or the One Funnel Away challenge are all side offers that eventually lead to courses and the Clickfunnels membership. All of the products provide massive value (and I have a lot of them) so selling Clickfunnels products is an easy opportunity.
Leadpages: 30% recurring monthly – 30 day cookie If you’re a WordPress user or you’re wanting to have an easy to use Landing Page builder, then Leadpages may be the option for you. The majority of time, bloggers use Leadpages on their websites as they have ‘Lead Boxes’ which are Leadpages Popup’s or widgets you can host on your site. The main difference between Clickfunnels and Leadpages is, Leadpages is just that. It’s single pages that you manually have to connect together, while Clickfunnels you can collate all the pages in one connected funnel.
The Leadpages Affiliate Program offers 30% recurring commissions and has a 30 day cookie. Leadpages also offers some additional training for it’s affiliates which is great to see!
Landingi: 15% recurring monthly – 365 day cookie Another smaller but powerful contender in the Landing Page & Funnel scene, is Landingi (“lan-din-gi”). The company itself is still relatively small and un heard of, but that doesn’t reflect on the actual product. Landingi has in my opinion the easiest to use drag and drop builder, and the most accurate in terms of what you design and what it looks on desktop and mobile. As for landing pages, each Landingi page has an optin page and a thank you page built into the set which makes it easy to navigate through your library.
In terms of the Affiliate Program, Landingi isn’t as generous as the others. They offer 15% recurring commissions with an incentive that your referrals also get a 15% discount. This makes it definitely worth it’s value and a great opportunity for your audience.
BuilderAll: 100% on first sale, 30% recurring monthly  – sticky cookie I tried using BuilderAll for a month and found it to be very strange. It has very similar features to Clickfunnels but the drag and drop builder is a lot harder to use. To be honest, it was my least favourite builder I have used, but it may have become easier to use since then. The main reason people use it, is it is a very cheap software, so literally anyone can use it. It also has a product called Mailingboss which is apparently $50 for lifetime use.
In terms of BuilderAll’s affiliate program, they offer their affiliates 100% commission on the initial referral, then 30% on the recurring payments.
Thrive Architect: 25% recurring monthly – 365 day cookie Unlike all the other softwares listed above, Thrive Architect is actually a plugin that you install to your existing WordPress website and you create the designs inside your pages. Some would find this more favourable, while others not so much. The builder is easy enough to use and a lot of people actually use the builder for their websites pages. Hosting the builder inside WordPress can bring a lot of additional issues like website speed and security, but if you know WordPress well, this won’t be an issue.
The Thrive products offer 25% recurring monthly commissions with a 365 day cookie, which is an insane length of cookie time. This product is great for bloggers and SEO guru’s.
Join the 30-day OFA Challenge! 
One Funnel Away Challenge
This challenge is taking the world by storm. The One Funnel Away Challenge is a 30 day program created to help you create your own minimum viable product (MVP) and scale your way to success. The OFA team interviewed 30 millionaires and asked them what would do in 30 days if they lost it all. This book reveals their answers.
Join the OFa challenge
Website Hosting Affiliate Programs
BlueHost: $65 per sale – 60 day cookie Bluehost is without a doubt the industry leader when it comes to hosting. Their product is the fastest on the market, the support is amazing and their compensation plan for affiliates is great too. Bluehost offers a range of products but the main are the hosting plans which range from $2.95 per month to $25.99 per month. They do offer a discounted rate for all new packages which make it an incredible seller.
The compensation plan for Bluehost starts at $65 per new referral and you can apply for higher commission rates and a special offer for your readers. I personally use the Plus Package and it is my #1 recommendation.
SiteGround: $50-$100 per sale – 30 day cookie Bluehost’s strongest competitor in the hosting world, is Siteground. I’ve worked with Siteground on a few projects with friends and it has performed well. I do have to admit though, there are a lot of restrictions. We constantly had issues with ‘running processes’ as well as ‘disk space usage’ as they had limits on it. After switching to the Plus Package, there were no limits at all 
Siteground Affiliates can earn $50 per referral, and if they refer more than 5 people in a month, they bump up to $75 per sale. If they refer more than 10, they go to $100.
HostGator: $125 per sale – 60 day cookie Hostgator is another original gangster that has been around for a very long time. They were the first hosting company I ever used and I have also helped build a company using Hostgator too. To be honest, the product isn’t that good. We constantly had problems, like constantly. We had to keep upgrading and were always on the line to support. It was a LOT of hassle, we ended up moving. 
They do have a great affiliate program though, $125 per sale. I would definitely try Hostgator and get your own opinion before you promote them to anyone else.
Fastcomet: $50 per sale – 180 day cookie I used Fastcomet for 4 years and it was great for what it did. I had an unlimited website plan with them. The servers are a little slow but it is a much more affordable option to website hosting. The cPanel has no restrictions and the customer support are very active and really wish to help with any problems.
The Fastcomet Affiliate program offers $50 per new referral with a 180 day cookie.
Namecheap: 20%-35% per sale – 180 day cookie For someone who is really bootstrapping their business, Namecheap is also a good platform they could use. They are extremely competitive with pricing for domains and hosting, and their service isn’t that bad. You can definitely expect much longer loading times than Bluehost, but they still do ok.
Namecheap offer their affiliates 20% commissions for referrals to Domains, Whoisguard, Private Email and Premium DNS sales as well as 35% for Hosting Packages and SSL Certificate sales.
Our Favourite Affiliate Marketing Books 
Dotcom Secrets
If you're new to the online world, or you're struggling as an entrepreneur. Dotcom Secrets breaks down the simplicity of building an online business. It includes everything from how to find a profitable niche to how you should present yourself. You'll also learn about the infinitely valuable tool sales funnels. 
Get Dotcom Secrets
Expert Secrets
Expert Secrets is the second book by Russell Brunson in which he talks about how you are an expert, you just don't know it. He then teaches you how you can use your current experience to create an educational product, build a tribe and create a mass movement of loyal fans. It's an amazing book!
Get Expert Secrets
Email Marketing Affiliate Programs
Getresponse: 33% recurring monthly – 120 day cookie When it comes to email marketing, I always head straight to Getresponse for all my email marketing needs. They have all the bells and whistles when it comes to functionality, including automation, landing pages and they even have entire funnel sections. This makes it extremely useful for a range of customers including ecommerce stores, small businesses and entrepreneurs. It’s also one of the cheapest softwares available.
The best part though, is their competitive affiliate compensation plan. You can either choose to get paid 33% on all recurring payments for customers you refer, or you can get paid $100 for every new customer you bring. Not only do you get paid more, but you also get a 120 day cookie, which is double what the majority of others offer.
ConvertKit: 30% recurring monthly – 60 day cookie ConvertKit is one of the most popular options for bloggers and email marketers as they have great tools for wordpress and are easy to use. I personally haven’t used ConvertKit much, but it is used by a lot of influential people like Pat Flynn, so you know it has to be good.
The ConvertKit compensation plan gives it’s affiliates 30% of all recurring payments and they give a 60 day cookie duration.
Active Campaign: 20%-30% – recurring monthly Active Campaign is probably the 2nd most popular in the list. Active Campaign is used more in the Social Media Marketing and digital marketing industries. They have all the same features as ConvertKit and they’re actually a little more desirable to use. They also have a flexible pricing plan so you can pay for the tools you use, and leave out the ones you don’t.
Now, the Active Campaign is a little different to the other affiliate compensation plans, as they use performance based tiers. You start off on the ‘Silver Tier’ which means you will earn 20% on all commissions. If you are able to bring in $500 of monthly active accounts, you then get bumped up to the ‘Gold Tier’ which gives you 25% commissions. Finally if you are able to generate $2000 of monthly active accounts, you move to the ‘Platinum Tier’ which means you get a full 30% on all subscriptions.
Aweber: 30% recurring monthly – 365 day cookie Aweber is one of the original gangsters when it comes to Email Marketing. I started using Aweber in 2014 and back then, everyone was using it. I have to admit though, their service has been left behind in the current times. Aweber falls behind in terms of features compared to the others listed, and their rules are very strict.
Aweber offer their affiliates 30% recurring commissions for any sales they bring into Aweber.
Moosend: 30% recurring monthly – 60 day cookie Finally in comes Moosend. Moosend is a new contender to the digital marketing space, but they’re coming in hot. Being a new condenter, they are also the cheapest, but that doesn’t mean they’re the worst. In fact they have great features just like the other companies like including automation, autoresponders and they even have landing pages like Getresponse. They are also heavily focused into e-commerce and have a bunch of great tools you can add to your carts like abandoned checkout tags.
Moosend is the cheapest of the lot, but they are still coming in strong with 30% recurring commissions with a 60 day cookie.
Protect Your Personal Data with this Browser 
The Brave Browser
Sick of surfing the internet seeing ads everywhere you go? Then you need the Brave Browser. Built on the Google framework, the Brave Browser has been named the safest browser available. Stop seeing ads everywhere and protect your personal information with the free Brave Browser.
Get the Brave Browser
WordPress Based Affiliate Programs
Elegant Themes (Divi): 50% per sale + recurring – 180-day cookie  When it comes to WordPress themes, Divi is by far my favourite of the lot. With an active community of Divi users over the world, it’s even easier to get new ideas and support. Infact this website is built with Divi! As for the Elegant Themes affiliate program, they offer 50% recurring commissions for all referrals and they give a 180-day cookie.
WP Rocket: 20% per sale – unknown cookie duration Everyone needs fast websites. WP Rocket is the number #1 caching plugin for WordPress which makes this a simple sell. If someone’s website is slow, get WP Rocket. It’s as easy as that. They offer 20% per sale through the ShareASale affiliate platform.
Woocommerce: 20% recurring – unknown cookie If you have built your website on WordPress and you sell products, memberships or services, Woocommerce might be perfect for you. With over 39 million downloads, Woocommerce is a powerhouse of a tool! The Woocommerce Affiliate Program offers 20% on all sales.
Memberpress: 10%-30% per sale – 60 day cookie If you have a WordPress membership site and it’s not Woocommerce, it’ll most likely be Memberpress. Memberpress is an easy to use membership theme with all the bells and whistles to make your membership site run smoothly. They also offer 30% recurring commissions for users, and 10% for non-users with a 60-day cookie.
Envato Market: 30% per sale – 30 day cookie Envato Market is a huge platform full of custom builds by developers that are for sale. If you ever wanted to find something in particular on the internet, my first choice is always Envato Market. Their affiliate program offers 30% commission on all initial purchases with a 30-day cookie.
Subscribe to the Affiliate Marketers Newsletter!
If you're looking to start ahead of the industry with up-to-date trends, techniques, software reviews and strategies that will help you succeed as a marketer, join the other 1000's of marketers who receive the FA Newsletter!
Success!
Name
Email
SUBSCRIBE
We take your privacy seriously. No spam. See our terms & privacy here.
/* Divi Lover Slim Optin Form */ /* Optional - copy the CSS to page options, theme options or child theme stylesheet */ @media (min-width:981px) { .dl-slim-optin2 .et_pb_newsletter_description { width: 30%; } .dl-slim-optin2 .et_pb_newsletter_form { width:70%; } } .dl-slim-optin2 .et_pb_newsletter_field, .dl-slim-optin2 .et_pb_newsletter_button_wrap { flex-basis:32.5%; } .dl-slim-optin2 .et_pb_newsletter_footer { margin-top:0; } .dl-slim-optin2 .et_pb_module_header { padding-bottom:0; } @media (max-width:980px) { .et_pb_column_4_4 .dl-slim-optin2 { display:block; } .dl-slim-optin2 .et_pb_newsletter_description, .dl-slim-optin2 .et_pb_newsletter_form { width: 100%; padding: 0; } .et_pb_column_4_4 .dl-slim-optin2 .et_pb_newsletter_description { text-align:center; margin-bottom:10px; } .dl-slim-optin2 .et_pb_newsletter_footer { text-align:center; } } @media (max-width:600px) { .dl-slim-optin2 .et_pb_newsletter_field { flex-basis:49%; } .dl-slim-optin2 .et_pb_newsletter_button_wrap { flex-basis:100%; } } @media (max-width:479px) { .dl-slim-optin2 .et_pb_newsletter_field{ flex-basis:100%; } } /* END */
Best Affiliate Programs
Hopefully, if you have gone through this article, you have found an affiliate program that suits your needs. One thing to remember, it doesn’t matter about the price points if the product doesn’t help its customer achieve anything. That is why I always recommend trying a product before becoming an affiliate of the company and promoting it.
If you’ve got any additions to the list, or you have any questions or comments, let me know below and if you’re new to the affiliate marketing game, make sure you check out our community!
The post Best Affiliate Programs appeared first on Fresh Affiliates.
source https://freshaffiliates.net/best-affiliate-programs/
1 note · View note
edebiyat-mavisi-blog · 5 years ago
Text
Thumbnail Blaster Review and Bonus
Welcome to my Thumbnail Blaster Review and Demo YouTube first became popular like an on the net platform regarding musicians to produce a new title for themselves and having even more views was, and still is usually, the ultimate goal for online video content creators. Back in the day, people would use unreliable title, tags, and thumbnails to a good extent to obtain more views and now nights Search engines has won typically the war on spam simply by integrating different voice and image popularity technology to get an idea associated with what exactly a video is in relation to when compared to what the content material creator claims in often the title, tags, and outline. This helps to offer people with a much much better person experience when looking some thing up on YouTube. Movie content creators are right now confronted by having to truly make quality movies that people will delight in and to get more views, the idea has to be seen by sufficient individuals to find the right audience who will upload that on his internet site, at least share that on Myspace. Legally therefore, Google's top goal is user working experience over this content provider's look at count number, however some professionals say the new changes to be able to the algorithm will trigger old video clips, that men and women have already found, have more attention than new versions and could actually produce it challenging for typically the user to find refreshing content in search success for well-liked search conditions. So, just how can a video content creator this year and the years to come battle the latest changes in order to the YouTube Algorithm? Make Movies Like Never Prior to Develop a Following Comment The Way to The Top Down Site Marketing Know The Difference Concerning Unsolicited mail In addition to Optimization Make Videos Such as Never Prior to Having YouTube's 92 Billion web site views a thirty days together with climbing, a movie must be exclusive for it to get recognition. Planning a movie and server scripting are these days a must along using image quality. By comparing the particular videos with millions connected with views to the lesser associated with the tribes, you can see the fact that high definition and exceptional lighting are two widespread traits shared by the particular most viewed videos. That doesn't result in you have to get an expensive HIGH DEFINITION camera to get more views. Vimeo features a set of formatting tickets, again to support provide a a great deal better end user experience. yt: crop=16: nine yt: stretch=16: nine yt: quality=high Use all these tags to eliminate window boxing and poor video top quality if you do not really have access to HIGH DEFINITION equipment. Pay attention for you to your video's thumbnail models careful never to be flagged for junk mail. "OMG" encounters are popular thumbnail models just providing it can be what will be inside it. The. 25. 5 various and. 75 points on your online video media used for you to be what determined your own thumbnail selections when publishing. With so much mistreatment, Search engines came up having the bright idea to use the three longest fasteners from your video clip and semi-randomly picking a good point from three timeline points. Sound and picture root document names are also added in to the equation to better give appropriate thumbnail alternatives. Spammers is unable to just add a small image flash at often the halfway stage of their own videos to get a lot more opinions.
Tumblr media
Build a Pursuing As with Facebook, Twits, and MySpace, Dailymotion is certainly also a social networking. Being mixed up in community can be a must for fresh plus old video information builders looking to come to be popular on YouTube. Create your channel around a individual specific niche market that has the mid-sized level of rivals. Visit similar channels plus comment on their video lessons with sincere compliments or maybe inquiries. Treat your subscriber's video clips the same approach so you are definitely not to work as a dormant number in their request foodstuff. The old SUB4SUB approach is still being utilized and has developed in its own community or maybe niche. If your target audience is usually teenagers, go intended for it! Be careful not to be called out there as being a spammer because the idea of, "You join to me and I may subscribe to you" is often frowned upon by means of people of a qualified background. YouTube picks upwards about heavily repeated responses plus auto-marks them as junk mail so just apply a SUB4SUB profile impression and be participating in often the SUB4SUB channels inside the Vimeo community. Set aside a new day to work upon building a good following in other online communities such while Facebook, Twitter, plus Bebo. This extends your current using to those who don't have the channel on Facebook which will surprisingly enough can make up for the majority of the web site's 92 billion visitors every month. Comment Your Approach On the Top Uploading a good video double a week and strategies on the readers video lessons and stations the particular day before is a wonderful principle of thumb. Being constant in doing so will be the work section of the full thing. However, in this way an individual brand yourself with the members and build a curiosity among them which commences the snowball effect involving even more sights in addition to subscribers when they brief review and share your videos. This is why you want for you to stay within your specific niche market. When leaving comments, possibly be sincere about what anyone sort. Never just state two words and abandon. That totally defeats this purpose which is definitely not proceeding to make people would like to know that left said review. Leave comments people need on their videos plus share typically the comment with Facebook and Myspace for you to make it show right up as a "linked comment" on top of the particular review feed. Each period a fans from Facebook or even Tweets clicks with the idea, typically the comment is normally moved back to the best of the comment supply. Be creative in your current feedback and it could get thumbed right up as well gaining more and even more attention towards the article writer of explained comment. The ultimate goal here is to compliment the video user's work which brands your own personal username and route so when your video clips appear in their subscription feed, it will be hard to withstand. Off Web page Optimization In this article is more "work" that has to be carried out in order to move your videos to this major of search success. When people are looking for anyone, it is best in order to be readily accessible. Just using a lot of tags consumers are searching for basically going to slash the particular cake. Google wants to find out back links on famous web pages leading to the online video to support your claims of whatever you have as your title. If a well-liked website has a url to your video using the particular words in your headline, it gives ADVERTISING things for that phrase after the certain amount of time period. However, if you go around posting not related back links, odds are that will always be taken away and wouldn't depend as a new back url anyway due to the time aspect threshold. Add your video to other web-sites connected to your niche along with participate in forum chats and even post your movie like some sort of hyperlink when it is in connection with this discussion. You have to keeping it related and the idea has to add value in order to the conversation. If the links get eliminated, it will have a change effect on your search results position so always be sure and respect the particular terms and conditions connected with forums of which allow backlinks to video clips and net sites. Know The Change Between Spam And Optimisation The fine line concerning spam and optimization is important to breaking through the bulk amounts of video clips on YouTube if folks interested in your materials are likely to even know this prevails. For anyone who is Fred, in addition to your personal route (Lucas) says your age is usually 33, it is very impossible you will acquire called out for lying about your age when anyone created your account. If a person are like many different Youtube . com celebrities and your information abounds with advertising the social networks together with T-shirt sales instead of conveying the video, you may possibly not get called out either. However, chances are you happen to be not necessarily a YouTube movie star and if you follow suit, it is solely a new couple of time just before you are forbidden coming from the site. When choosing a title for your movie, you should be creative and make use of terms that are intending to get results via search engines like yahoo at the exact same time. Decide on a search word you wish to be found by (that best identifies your video) and use the idea in your title. Yahoo and google like variety so give a few support words to your phrase. For example: Concentrate on term: Remote Control Garden Mower A great title would be: Remote Control Lawn Mower vs. Steep Inclines Write a brief explanation making use of the target phrase only once for the top nonetheless not necessarily because the first sentence. Be organic and discuss to your viewers. The tags for the online video should be specific to your own target key phrase with plus without quotations. For example: "remote control garden mower" remote control lawn mower. After the month of positive viewers reactions, you will see your movie climbing the charts. For competitive terms, your online video has to produce lots of good viewer reaction before it is going to show up on best of search engine results and eventually on Google as a new movie result. Patients, really hard work, plus reliability are a must. thumbnail blaster need to publish videos on a typical basis all with a little bit different target phrases relating to your niche market. The idea is a lot regarding work. Yet , when an individual get your first online video media up to a thousand views, you may be hooked on YouTube, wearing Youtube . com Tees, and even making guides to help others.
3 notes · View notes
douchebagbrainwaves · 3 years ago
Text
WHAT NO ONE UNDERSTANDS ABOUT SILICON
Jerry Yang, we thought we were meeting so we could show him our new technology, Revenue Loop. Cambridge for intellectual ambition. Do you go up or down? Whereas top management, like salespeople, have to actually come up with the numbers. Now we can recognize this as something hackers already know to avoid: premature optimization. Most employees' work is tangled together. People seem to like us too. Most people reading this will already be fairly tolerant. We're impatient.
Despite the actual meaning of the word portal, what they really mean is that it proves your initial idea was mistaken. Probably by sneaking in through the back door. The SFP was just an experiment to get things started. But here there is another layer that tends to obscure what trade really means. It's also financially wiser, because selling allows you to diversify. And what makes them work is not us but their competitors. In Lisp, these programs are called macros. The best we can hope for is that when we interview a group and find ourselves thinking they seem like good founders, but by something more akin to garbage collection. What leads people astray here is the abstraction of money. What do those users want?
Because Woz designed this computer for himself, and he will automatically get paid proportionally more. This is another lesson the world has yet to learn. You have to ignore what other people are doing, and consider only what will work the best. Led by a large and terrifyingly formidable man called Anil Singh, Yahoo's sales guys would fly out to Procter & Gamble and come back with million dollar orders for banner ad impressions. It's what acquirers care about. So by caring more about money and less about power than Silicon Valley, New York, Cambridge, and Silicon Valley because I've lived for several years in each of them. It's easy to measure how much revenue they generate, and they're surrounded by about 20 other colleges and universities. If you're in a panic because your servers are on fire, but the job listings have to be willing to fund 10x more startups than they would if that were their only motivation. For most of college. New York is a classic great city.
But if I did, it would be: you need the encouragement of feeling that people around you. What makes anything good? The message Berkeley sends is: you should be more aristocratic. If this were so, we could offer a better product for less money, and you get paid a lot more analysis. If you're missing that second person who says let's try it, the startup never happens. The closest you can get a job, but starting a startup molds you into someone to whom starting a startup in New York have wondered about since the Bubble: whether New York could grow into a startup hub. I was 25, thinking it would be extraordinary if all eight succeeded. The way the successful ones find something that works is by trying things that don't. Often the only value of most of the great advantage of school: the wealth of co-founders. It's more efficient for us, and better for the startups too.
And so American software and movies, and Japanese cars, all have this in common: the people in the mailroom or the personnel department work at one remove from the actual making of stuff. But we can see how much things are changing from the examples I've mentioned. And as for Cobol, he doesn't realize he's looking up. This essay was originally published in Hackers & Painters. So the guys you end up reading about in the papers are the ones likely to succeed, it's hard not to be. Institutions are made up, and the art world was so manifestly corrupt that it snapped the leash of credulity. We didn't know anything about marketing, or hiring people, or raising money, or getting customers. Few were sufficiently correct that people have forgotten who discovered what they discovered. Finally, the truly serious hacker should consider learning Lisp: Lisp is worth learning for the profound enlightenment experience you will have when you finally get it; that experience will make you a car or cook you dinner and so on?
$300 a month seemed like a lot of people realized this, but that's because it's so important. The critical years seem to be useless. Halfway through grad school I decided I wanted to try being a painter, and the different parts of the company is small, you are thereby fairly close to measuring the contributions of individual employees. Viaweb's hackers were all extremely risk-averse. If you go to work for and apply to join them. They were already very visible when I got there in 1998. He was Gorbachev. Most books on startups also seem to be helpful to kids. What made the Florentines rich in 1200 was the discovery of new techniques for making the high-tech startup is almost redundant. And if someone was lazy, the others would be more fun. In the same day of interviews you might meet some smart 19 year olds who aren't even sure what they are.
But interesting, and finished fairly quickly. Much to the surprise of the builders of the first digital computers, Rod Brooks wrote, programs written for them usually did not work. And the people you work with had better be doing something odd. The big winners could generate 10,000x returns. Software is a very unusual guy. And indeed, that might be convincing. People seem to like working at Google too much to leave. In a big company. Imagine waking up after such an operation. I still don't know how they did it. Bill is smart and dedicated, but Microsoft also happens to have been the most common, but recently we've been using a medium of exchange—can be anything that's rare and portable.
That's the scary thing: fundraising is not merely wasted, but actually makes organizations less productive. A Demo Day where only 30% of the startups we funded will make it big is not merely wasted, but actually they have straightforward answers. Or we can improve it, which usually means encrusting it with gratuitous ornament. Competitors commonly find ways to work around a patent. Many things people like, especially if they're young and ambitious, they like largely for the feeling of virtue in liking them. Something similar happened when people first started trying to talk about startups, but it is a good idea, let's try to answer the question: What are the most general truths? You'll probably have to find the city where you feel at home to know what sort of people you're among.
Thanks to Steve Huffman, and Robert Morris for reading a previous draft.
0 notes
Text
Three For One Hosting Review – Pay For One Year And Get 2 Years Free Web Hosting
https://lephuocloc.com/three-for-one-hosting-review/
Web Hosting is an inside and noteworthy spine of your business in the automated age, everyone is buying web, picking a wrong encouraging association would altogether be able to decimate your arrangements and traffic. Appallingly, various people who run autonomous organizations in spite of everything put cost as a need when choosing to contribute for a web encouraging group. A humble encouraging charge generally pulls in more people.
You can be self-destructing your own business, if you think to contribute for a humble web encouraging just to run your expertly looking website. It doesn't work that way, truth be told you will get what you pay for.
Website stacking speed rate and uptime are two factors that you need to give a ton of need to when searching for a web have, low speed rate makes your visitor irritably leave your site page and low uptime rate can kill your business.
Both these dreary demonstrating factors are negative to Google's situating, in case you have to rank higher in the question thing, your site needs to have a tolerable page stacking pace and 99% of uptime.
It sucks if the web encouraging association is charging you for a month to month cost on a yearly enrollment while experiencing low execution that hurt your business harshly.
The inspiring news is I am exhibiting where to get an extraordinary web encouraging response for quite a while at the expense of one year. Make an effort not to get frustrated! There is an encouraging system called 'Three For One Web Hosting' that offers the best game plan ever in the web business with trustworthy execution.
Since you have examined this far, why not explore my 'Three For One Web Hosting' review and see what it is about?
The brand has legitimized itself. By using this encouraging stage, you are fit for running your site on a consistent yearly reason without fixating on the speed and uptime of the encouraging server execution. My Three For One Hosting Review will depict how astonishing the organization is as a site supporting device.
Three For One Hosting Company Profile
Three For One Hosting Introduction
Richard Madison is surely a specialist in electronic exhibiting. More than 10 years of determined undertakings, he has adequately made a brand-care for the web business contraptions. Two or three phenomenal applications that he used to dispatch in the past are Pixel Studio FX 3.0, Clickopia, PushPrime, etc.
Despite how he is a fit engineer, at any rate he is also a skilled speaker. In his online activities, we can see that he passes on more than 100 locations. In his latest thing Three For One Hosting has extraordinary preferences over rivals with respect to standard quality and charge. The underneath substance of Three For One Hosting Review will clarify the inspiration driving why.
By and large, Three For One Hosting wires an encouraging server that you can use for a broad time frame without paying a month to month cost. Additionally, this encouraging has been affirmed and attempted by two or three beta customers. You can see the customer's overviews on its first page. The best part is that you will basically need to pay for it one time.
Three For One Hosting Features
Three For One Hosting is offering the encouraging arrangement for a 3-year straight with no candid and covered expense. Assume if you seek after a month to month web encouraging for a total of 3 years, the charge can be inside and out incorporated that may cost around thousand of dollars.
It is a take that Three For One Hosting association is charging a one-time portion for a total of 3 years. Beginning there forward, you can utilize it for quite a while ceaselessly ahead with no further portion. Besides, you can open more features.
Plus, note that you can place your trust in this thing. With this choice, you can without a truly exceptional stretch keep your site working with no issue.
All Packages Include:
Undertaking RAID Storage
The encouraging arrangement furnishes the customer with the remarkably quick RAID accumulating and limitless transmission limit capacity to help the introduction of your site
Free Website Builder
No programming, coding or HTML data required. Actually, even non-capable customer can make a skilled looking site.
Applications and Tools
You can present stages like WordPress, Joomla, etc with just a single snap.
cPanel Control Panel
The cPanel system is furthermore available in Three For One Hosting account. You can without a very remarkable stretch make zone, email and stage through the control board with warm interface.
Unlimited each moment of consistently Support
Reinforce data and gathering are open to serve their clients in clarifying any issues they may have through labeling system.
Vast Email Accounts
You can make indistinguishable number of email accounts from you need on 500 MB for your site. You work with forwarder, park or auto-answer.
Would it be a smart thought for you to Get Three For One Hosting?
If you would ask me, I will solidly recommend this web encouraging group to the people who are restless to make a website for themselves. Especially, bloggers, creators, online business vendors, etc will discover Three For One Hosting significant. Despite how it is definitely not hard to use, it can help you with working up a specialist brand with no mastery.
In addition, Three For One Hosting is a spending all around arranged thing and monetarily sagacious in case you have confined capital. Ordinary encouraging organizations would have a month to month enlistment costs, which from time to time can be incredibly troublesome. With this group, customers can value a 3-year web encouraging organization at the expense of one year with a one-time portion.
Virtuosos and Cons
Virtuosos
To be sure, even Three For One Hosting is a one-time portion thing, the assistance bunch is reliably there for you.
No extra or any covered cost
Comfort: Beginner generous
Extra and different groups are sold autonomously without upsell and don't constrained to update
Strong speed and uptime
Cons
The thing is still new, there perhaps some minor flaws that yet to discover
The brand name Three For One Hosting isn't connecting with for people to get captivated
Would it be fitting for you to Buy Three For One Hosting?
To the prohibition of everything else, an encouraging server is a major factor in the conditions that you need to make a site to address your business. Bringing your business onto the web is to create trust and decency from guests. A site is the best channel that you can feature your things and offers through various kinds of substance.
As you may understand that a superior than normal webhosting plan can commonly cost you a great deal, particularly for relationship with low capital. The best thing around Three For One Hosting is that you can utilize a top notch encouraging organization for quite a while paying just one time. Instead of free encouraging servers, Three For One Hosting gives customers a fast speed.
Let us recap the upside of applying Three For One Hosting:
Faster Loading Speed
Not just have the owner of the encouraging put for better resources into outperforming cloud structure, they intertwine the world's best programming stage which joins cloudlinux, litespeed webserver and mariadb to guarantee the quick and uptime of your locales.
Server Infrastructure
Records that are on shared encouraging are energized on their own establishment by using 100% RAID drives, the most starting late invigorated servers and basically the top level Intel Xeon Processors.
The Expertists
The parent affiliation has been keeping up a web encouraging business since 2002. With more than 16 years experience, they have the data and aptitudes to help you and help you with passing on the best site for your affiliation.
Unlimited Resources
They don't charge you on the proportion of benefits you use for you. It is a need to be satisfying with their Terms of Service and affirmation your additional room and move speed use is inside the regular assignments of an individual or private undertaking site.
Money Guarantee
Three For One Hosting has a 30-day Money Back Guarantee for you with the chance to use the encouraging organization. They give quick, secure and solid assistance for your fulfillment is their standard assignment.
Three For One Hosting Pricing
The basic thought of Three For One Hosting is they let you use their encouraging server for quite a while anyway charge the expense of one year and you get 2 years to no end.
A reasonable worth that will permit them to give you unfaltering encouraging for significantly less. How? We won't reveal to you the conundrum behind that engage.
Basically, with the given encouraging, you can store all your site snippets of data on the strong establishment. In the going with segment of Three For One Hosting Review, I will go on with more bits of information concerning its dispatch information.
https://lephuocloc.com/three-for-one-hosting-review/
https://lephuocloc.com/
Tumblr media
0 notes
siva3155 · 5 years ago
Text
300+ TOP Oracle ETL Interview Questions and Answers
Oracle ETL Interview Questions for freshers experienced :-
1. What are the various tools? Name a few? A few more Cognos Decision Stream Oracle Warehouse Builder Business Objects XI (Extreme Insight) SAP Business Warehouse SAS Enterprise ETL Server Along with the above, need to include the below tools --Informatica --Abintio --DataStage 2. What are snapshots? What are materialized views & where do we use them? What is a materialized view? Materialized view is a view in wich data is also stored in some temp table.i.e if we will go with the View concept in DB in that we only store query and once we call View it extract data from DB.But In materialized View data is stored in some temp tables. 3. What is fact less fact table? where you have used it in your project? Fact less table means only the key available in the Fact there is no measures available. factless fact table means that contains only foreign keys with out any measures example:attendance report of employees in a particular company contains no measures only 4. Can we look-up a table from source qualifier transformation. ie. unconnected lookup? You cannot lookup from a source qualifier directly. However, you can override the SQL in the source qualifier to join with the lookup table to perform the lookup. 5. Where do we use connected and un connected lookups? If return port only one then we can go for unconnected. More than one return port is not possible with Unconnected. If more than one return port then go for Connected. If you require dynamic cache i.e where your data will change dynamically then you can go for connceted lookup.If your data is static where your data won't change when the session loads you can go for unconnected lookups 6. Where do we use semi and non additive facts? Additve: A masure can participate arithmatic calulatons using all or any demensions. Ex: Sales profit Semi additive: A masure can participate arithmatic calulatons using some demensions. Ex: Sales amount Non Additve:A masure can't participate arithmatic calulatons using demensions. Ex: temparature 7. What are non-additive facts in detail? A fact may be measure, metric or a dollar value. Measure and metric are non additive facts. Dollar value is additive fact. If we want to find out the amount for a particular place for a particular period of time, we can add the dollar amounts and come up with the total amount. A non additive fact, for eg measure height(s) for 'citizens by geographical location' , when we rollup 'city' data to 'state' level data we should not add heights of the citizens rather we may want to use it to derive 'count' 8. What is a staging area? Do we need it? What is the purpose of a staging area? Data staging is actually a collection of processes used to prepare source system data for loading a data warehouse. Staging includes the following steps: Source data extraction, Data transformation (restructuring), Data transformation (data cleansing, value transformations), Surrogate key assignments 9. What is a three tier data warehouse? A data warehouse can be thought of as a three-tier system in which a middle system provides usable data in a secure way to end users. On either side of this middle system are the end users and the back-end data stores. 10. What are the various methods of getting incremental records or delta records from the source systems? One foolproof method is to maintain a field called 'Last Extraction Date' and then impose a condition in the code saying 'current_extraction_date > last_extraction_date'.
Tumblr media
Oracle ETL Interview Questions 11. What are the various tools? - Name a few? A few are Abinitio DataStage Informatica Cognos Decision Stream Oracle Warehouse Builder Business Objects XI (Extreme Insight) SAP Business Warehouse SAS Enterprise ETL Server 12. What is latest version of Power Center / Power Mart? The Latest Version is 7.2 13. What is the difference between Power Center & Power Mart? Power Center - ability to organize repositiries into a data mart domain and share metadata across repositiries. Power Mart - only local repositiry can be created. 14. What are the various transformation available? Aggregator Transformation Expression Transformation Filter Transformation Joiner Transformation Lookup Transformation Normalizer Transformation Rank Transformation Router Transformation Sequence Generator Transformation Stored Procedure Transformation Sorter Transformation Update Strategy Transformation XML Source Qualifier Transformation Advanced External Procedure Transformation External Transformation 15. What is ODS (operation data source)? ODS - Operational Data Store. ODS Comes between staging area & Data Warehouse. The data is ODS will be at the low level of granularity. Once data was poopulated in ODS aggregated data will be loaded into into EDW through ODS. 16. What is the difference between etl tool and olap tools? ETL tool is ment for extraction data from the legecy systems and load into specified data base with some process of cleansing data. ex: Informatica,data stage ....etc OLAP is ment for Reporting purpose.in OLAP data avaliable in Mulitidimectional model. so that u can write smple query to extract data fro the data base. ex: Businee objects,Cognos....etc 17. What is the metadata extension? Informatica allows end users and partners to extend the metadata stored in the repository by associating information with individual objects in the repository. For example, when you create a mapping, you can store your contact information with the mapping. You associate information with repository metadata using metadata extensions. Informatica Client applications can contain the following types of metadata extensions: Vendor-defined. Third-party application vendors create vendor-defined metadata extensions. You can view and change the values of vendor-defined metadata extensions, but you cannot create, delete, or redefine them. User-defined. You create user-defined metadata extensions using PowerCenter/PowerMart. You can create, edit, delete, and view user-defined metadata extensions. You can also change the values of user-defined extensions. 18. What are the various test procedures used to check whether the data is loaded in the backend, performance of the mapping, and quality of the data loaded in INFORMATICA? The best procedure to take a help of debugger where we monitor each and every process of mappings and how data is loading based on conditions breaks. 19. I am new to SAS, can anybody explain the process of extracting data from source systems,storing in ODS and how data modelling is done? There are various ways of Extracting Data from Source Systems.For example , You can use a DATA step, an Import Process .It depends with your input data styles. What kind of File/database it is residing in. Storing ur data in an ODS can be done thru an ODS stmt/export stmt/FILE stmt, again which depends on the file & data format ,You want your output to be in. 20. Techniques of Error Handling - Ignore, Rejecting bad records to a flat file, loading the records and reviewing them (default values)? Rejection of records either at the database due to constraint key violation or the informatica server when writing data into target table.These rejected records we can find in the badfiles folder where a reject file will be created for a session.we can check why a record has been rejected.And this bad file contains first column a row indicator and second column a column indicator. These row indicators or of four types D-valid data, O-overflowed data, N-null data, T- Truncated data, And depending on these indicators we can changes to load data successfully to target. 21. What is Full load & Incremental or Refresh load? Full Load: completely erasing the contents of one or more tables and reloading with fresh data. Incremental Load: applying ongoing changes to one or more tables based on a predefined schedule. 22. How to determine what records to extract? When addressing a table some dimension key must reflect the need for a record to get extracted. Mostly it will be from time dimension (e.g. date >= 1st of current mth) or a transaction flag (e.g. Order Invoiced Stat). Foolproof would be adding an archive flag to record which gets reset when record changes. 23. Do we need an ETL tool? When do we go for the tools in the market? ETL Tool: It is used to Extract(E) data from multiple source systems(like RDBMS,Flat files,Mainframes,SAP,XML etc) transform(T) them based on Business requirements and Load(L) in target locations.(like tables,files etc). Need of ETL Tool: An ETL tool is typically required when data scattered accross different systems.(like RDBMS,Flat files,Mainframes,SAP,XML etc). 24. Can we use procedural logic inside Infromatica? If yes how, if now how can we use external procedural logic in informatica? Yes, you can use advanced external transformation. for more detail you can refer the manual of informatica transformation guide in that advance external transformation. You can use c++ language on unix and c++, vb vc++ on windows server. 25. Can we override a native sql query within Informatica? Where do we do it? How do we do it? Yes,we can override a native sql query in source qualifier and lookup transformation. In lookup transformation we can find "Sql override" in lookup properties.by using this option we can do this. 26. What are parameter files? Where do we use them? Parameter file defines the value for parameter and variable used in a workflow, worklet or session. 27. How can we use mapping variables in Informatica? Where do we use them? Yes. we can use mapping variable in Informatica. The Informatica server saves the value of mapping variable to the repository at the end of session run and uses that value next time we run the session. 28. What is a mapping, session, worklet, workflow, mapplet? A mapping represents dataflow from sources to targets. A mapplet creates or configures a set of transformations. A workflow is a set of instruction sthat tell the Informatica server how to execute the tasks. A worklet is an object that represents a set of tasks. A session is a set of instructions that describe how and when to move data from sources to targets. 29. What is Informatica Metadata and where is it stored? Informatica Metadata is data about data which stores in Informatica repositories. 30. How do we call shell scripts from informatica? Specify the Full path of the Shell script the "Post session properties of session/workflow". 31. Can Informatica load heterogeneous targets from heterogeneous sources? yes, you can use heterogenous source and target in single mapping. But to join data from heterogenous source you have to use joiner transformation. 32. What are the different Lookup methods used in Informatica? Connected lookup Unconnected lookup Connected lookup will receive input from the pipeline and sends output to the pipeline and can return any number of values.it does not contain retun port. Unconnected lookup can return only one column. it containn return port. 33. What are active transformation / Passive transformations? Active transformation can change the number of rows that pass through it. (decrease or increase rows) Passive transformation can not change the number of rows that pass through it. 34. What are the modules in Power Mart? PowerMart Designer Server Server Manager Repository Repository Manager 35. Compare ETL & Manual development? ETL - The process of extracting data from multiple sources.(ex. flat files,XML, COBOL, SAP etc) is more simpler with the help of tools. Manual - Loading the data other than flat files and oracle table need more effort. ETL - High and clear visibilty of logic. Manual - complex and not so user friendly visibilty of logic. ETL - Contains Meta data and changes can be done easily. Manual - No Meta data concept and changes needs more effort. ETL- Error hadling,log summary and load progess makes life easier for developer and maintainer. Manual - need maximum effort from maintainance point of view. ETL - Can handle Historic data very well. Manual - as data grows the processing time degrads. These are some differences b/w manual and ETL developement. 36. When do we Analyze the tables? How do we do it? The ANALYZE statement allows you to validate and compute statistics for an index, table, or cluster. These statistics are used by the cost-based optimizer when it calculates the most efficient plan for retrieval. In addition to its role in statement optimization, ANALYZE also helps in validating object structures and in managing space in your system. You can choose the following operations: COMPUTER, ESTIMATE, and DELETE. Early version of Oracle7 produced unpredicatable results when the ESTIMATE operation was used. It is best to compute your statistics. EX: select OWNER, sum(decode(nvl(NUM_ROWS,9999), 9999,0,1)) analyzed, sum(decode(nvl(NUM_ROWS,9999), 9999,1,0)) not_analyzed, count(TABLE_NAME) total from dba_tables where OWNER not in ('SYS', 'SYSTEM') group by OWNER 37. What is partitioning? What are the types of partitioning? If you use PowerCenter, you can increase the number of partitions in a pipeline to improve session performance. Increasing the number of partitions allows the Informatica Server to create multiple connections to sources and process partitions of source data concurrently. When you create a session, the Workflow Manager validates each pipeline in the mapping for partitioning. You can specify multiple partitions in a pipeline if the Informatica Server can maintain data consistency when it processes the partitioned data. When you configure the partitioning information for a pipeline, you must specify a partition type at each partition point in the pipeline. The partition type determines how the Informatica Server redistributes data across partition points. The Workflow Manager allows you to specify the following partition types: Round-robin partitioning. The Informatica Server distributes data evenly among all partitions. Use round-robin partitioning where you want each partition to process approximately the same number of rows. For more information, see Round-Robin Partitioning. Hash partitioning. The Informatica Server applies a hash function to a partition key to group data among partitions. If you select hash auto-keys, the Informatica Server uses all grouped or sorted ports as the partition key. If you select hash user keys, you specify a number of ports to form the partition key. Use hash partitioning where you want to ensure that the Informatica Server processes groups of rows with the same partition key in the same partition. For more information, see Hash Partitioning. Key range partitioning. You specify one or more ports to form a compound partition key. The Informatica Server passes data to each partition depending on the ranges you specify for each port. Use key range partitioning where the sources or targets in the pipeline are partitioned by key range. For more information, see Key Range Partitioning. Pass-through partitioning. The Informatica Server passes all rows at one partition point to the next partition point without redistributing them. Choose pass-through partitioning where you want to create an additional pipeline stage to improve performance, but do not want to change the distribution of data across partitions. 38. What are snapshots? What are materialized views & where do we use them? What is a materialized view log? Snapshots are read-only copies of a master table located on a remote node which is periodically refreshed to reflect changes made to the master table. Snapshots are mirror or replicas of tables. Views are built using the columns from one or more tables. The Single Table View can be updated but the view with multi table cannot be updated. A View can be updated/deleted/inserted if it has only one base table if the view is based on columns from one or more tables then insert, update and delete is not possible. Materialized view A pre-computed table comprising aggregated or joined data from fact and possibly dimension tables. Also known as a summary or aggregate table. Oracle ETL Questions and Answers Pdf Download Read the full article
0 notes
douchebagbrainwaves · 7 years ago
Text
EVERY FOUNDER SHOULD KNOW ABOUT AGE
This plan collapsed under its own weight. To answer that we have to go back n paragraphs and start over in another direction. It seemed curious that the same task could be painful to one person and pleasant to another, but I resent being told what to do in an essay about color or baseball. And for these releases, the mere fact of which seemed to us evidence of their backwardness, they would get confused and click on the browser's Back button. And the things I had to choose between two theories, prefer the one that doesn't center on you. Actually it isn't. Ditto for the idea of reusability got attached to object-oriented programming offers a sustainable way to write spaghetti code. -10x more succinct than C, and this is one reason intranet software will continue to thrive, even though it wasn't an online store builder, with about 14,000 users. No one actually proposed implementing numbers as lists in practice. You can block off several hours for a single task if you need to use them?
Be nice. Arbitrarily declaring such a border would have constrained our design choices. If software moves off the desktop and onto servers, what I'm describing here is the future of web startups will if anything increase the importance of startup hubs. It will be argued that it is designed by product managers, they'll never be able to have your application bundled with the OS. I had to do the same for every language, so they don't affect comparisons much. Are there zero users who really love you, or is close enough that you're better off aiming for the solid target of brevity than the fuzzy, nearby one of least work. What does it feel like to program in now.
So are hackers, I think it is. Then you've sunk to a whole bunch simultaneously. It's still a very weak form of disagreement is that it has made it easier to learn to program by looking at them. So you'd only want to talk to other people doesn't seem like work to you, the more time they'll spend in meetings negotiating how their software will work together, and the macro is itself ten lines of code. The way people act is just as misleading. Mark Zuckerberg, the kind of essay I thought I was going to take two weeks to write few projects took longer, I knew I could see the effect in the software as soon as it does now. So you can just turn off the service. There are two problems with this, though.
So you can just confess that you're inexperienced at fundraising—which is always a safe card to play—and you feel you have to pay for might as well stop there. They wanted yellow. Gone were the mumbling recitations of lists of features. Unfortunately the distinction between acceptable and forbidden topics is usually based on how the case looks. The weekend before the demo day for potential investors ten weeks in, and go home. It was written by two guys working in an attic, and yet needs to meet multiple times before making up his mind, has very low expected value. When friends came back from faraway places, it wasn't just out of politeness that I asked them about their trip. The 2005 summer founders ranged in age from 18 to 28 average 23, and there was a type of programmer who would only put five or ten lines of code every time you use it, and they're thus able to excuse themselves by saying that they haven't had time to make a platform that startups will build on, they have to behave well. There is a kind of a deadline. I've found that the best ones.
But most young hackers have neither. All we ask from those on the manager's schedule you can do about this conundrum, so the best plan is to go for the smaller customers first. When technology makes something dramatically cheaper, standardization always follows. A, that will make most of them are bad: Object-oriented abstractions. The result is to damp extremes. When there is some real external test of skill, it isn't painful to be at the bottom like a pear. If you have an idea for a new feature in the morning, you can watch them learn by doing.
There's obviously the direct cost in time, there's the cost in fragmentation—breaking people's day up into bits too small to be useful. When they sign a termsheet, they want to be popular, certainly, but as a predictor of success it's rounding error compared to what they pick up on their own projects. As I was waiting to hear back, I found that what the teacher wanted us to do was grow that core incrementally. That's where you can read the beginning of a trend: desktop computers won because startups wrote software for them. Viaweb, as at many software companies, especially at the beginning of a trend: desktop computers won because startups wrote software for them. People have been talking about parallel computation as something imminent for at least 20 years, and it seems like no one cares, look more closely. It was the usual story: he'd drop out if it looked like the startup was taking off.
Viaweb, software included fairly big applications that users talked to directly, programs that tried to restart things if they broke, programs that ran occasionally to compile statistics or build indexes for searches, programs we ran explicitly to garbage-collect resources or to move or restore data, programs that those programs used, programs that those programs used, programs that those programs used, programs that tried to restart things if they broke, programs that ran occasionally to compile statistics or build indexes for searches, programs we ran explicitly to garbage-collect resources or to move or restore data, programs that ran constantly in the background looking for problems, programs that tried to restart things if they broke, programs that ran constantly in the background looking for problems, programs that those programs used, programs that pretended to be users to measure performance or expose bugs, programs for diagnosing network troubles, programs for doing backups, interfaces to outside services, software that drove an impressive collection of dials displaying real-time server statistics a hit with visitors, but indispensable for us too, modifications including bug fixes to open-source movement is that it will make conversations better, but that there be few of them. They ask whatever it is they're asking in such a cavalier fashion. Phrased that way, it doesn't sound good at all. So it may not even be meaningful to say that you never have to release software immediately is a big motivator. Most of these changes will be for bad guys too. Sometimes I even make a conscious effort to insulate the other founder s from the details of the process. It's to see whether you'd be a suitable recipient for the size of users' data well, nothing easy, we knew we might as well spend it working on something like the natural history of computers—studying the behavior of algorithms for routing data through networks, for example, seems to be how startups work. Ironically, though open source and blogging suggests, you'll enjoy it more, even if you do it. In another conversation he told me that what he liked about my essays was that they weren't written the way we'd been taught to write essays in school.
There was some initial resistance, but it didn't last long. If someone had told me that, as with the apparent laziness of people this age. After all, a Web 2. But in fact there will be zero. When a piece of cake in the fridge, and you learn things you'd never say face to face meetings. In the summer of 1995, my friend Rich and I made a point of exerting less. As one of the best things about working for a big company, and it could require interpretation in the case of prosecutors, it probably isn't, it tended to pervade the atmosphere of early universities. And anything you come across that surprises you, who've thought about the question right. But I think this principle would also apply to sites with different origins. And so all over the country, students are writing not about how a baseball team with a small budget might compete with the Yankees, or the productivity of programmers gets measured in lines of code, then you only have a small number of winners early and then supporting them for years to a strategy of spraying money at early stage startups and then ruthlessly culling them at the same rate. We encourage every startup to measure their progress by weekly growth rate. If our competitor had done that, the last time a new way of delivering software appeared.
1 note · View note
riichardwilson · 5 years ago
Text
Responsive Web And Desktop Development With Flutter
About The Author
Flutter and LinUX enthusiast, author of the Programming Flutter book with the Pragmatic Bookshelf. Blogs more, tweets less. More about Carmine …
Flutter has already made quite a splash on the mobile development scene. Now it’s taking on bigger devices as well. Here’s what you need to know to be ready to take on the task of developing web and desktop apps using this wonderful cross-platform framework.
This tutorial is not an introduction to Flutter itself. There are plenty of articles, videos and several books available online with simple introductions that will help you learn the basics of Flutter. Instead, we’ll be covering the following two objectives:
The current state of Flutter non-mobile development and how you can run Flutter code in the browser, on a desktop or laptop computer;
How to create responsive apps using Flutter, so that you can see its power — especially as a web framework — on full display, ending with a note about routing based on URL.
Let’s get into it!
What Is Flutter, Why It’s Important, What It Has Evolved Into, Where It’s Going
Flutter is Google’s latest app development framework. Google envisions it to be all-encompassing: It will enable the same code to be executed on smartphones of all brands, on tablets, and on desktop and laptops computer as native apps or as web pages.
It’s a very ambitious project, but Google has been incredibly successful until now particularly in two aspects: in creating a truly platform-independent framework for Android and iOS native apps that works great and is fully ready for production use, and in creating an impressive front-end web framework that can share 100% of the code with a compatible Flutter app.
In the next section, we’re going to see what makes the app compatible and what’s the state of non-mobile Flutter development as of now.
Non-Mobile Development With Flutter
Non-mobile development with Flutter was first publicized in a significant way at Google I/O 2019. This section is about how to make it work and about when it works.
How To Enable Web And Desktop Development
To enable web development, you must first be on Flutter’s beta channel. There are two ways to get to that point:
Install Flutter directly on the beta channel by downloading the appropriate latest beta version from the SDK archive.
If you already have Flutter installed, switch to the beta channel with $ flutter channel beta, and then perform the switch itself by updating your Flutter version (which is actually a git pull on the Flutter installation folder) with $ flutter upgrade.
After that, you can run this:
$ flutter config --enable-web
Desktop support is much more experimental, especially due to a lack of tooling for LinUX and Windows, making plugin development especially a major pain, and due to the fact that the APIs used for it are intended for proof-of-concept use and not for production. This is unlike web development, which is using the tried-and-tested dart2js compiler for release builds, which are not even supported for Windows and LinUX native desktop apps.
Note: Support for macOS is slightly better than support for Windows and LinUX, but it still isn’t as good as support for the web and not nearly as good as the full support for mobile platforms.
To enable support for desktop development, you need to switch to the master release channel by following the same steps outlined earlier for the beta channel. Then, run the following by replacing <OS_NAME> with either linUX, windows, or macos:
$ flutter config --enable-<OS_NAME>-desktop
At this point, if you have issues with any of the following steps that I’ll be describing because the Flutter tool isn’t doing what I’m saying it should do, some common troubleshooting steps are these:
Run flutter doctor to check for issues. A side effect of this Flutter command is that it should download any tools it needs that it doesn’t have.
Run flutter upgrade.
Turn it off and on again. The old tier-1 technical-support answer of restarting your computer might be just what is needed for you to be able to enjoy the full riches of Flutter.
Running And Building Flutter Web Apps
Flutter web support isn’t bad at all, and this is reflected in the ease of development for the web.
Running this…
$ flutter devices
… should show right away an entry for something like this:
Web Server • web-server • web-javascript • Flutter Tools
Additionally, running the Chrome browser should cause Flutter to show an entry for it as well. Running flutter run on a compatible Flutter project (more on that later) when the only “connected device” showing up is the web server will cause Flutter to start a web server on localhost:<RANDOM_PORT>, which will allow you to access your Flutter web app from any browser.
If you have installed Chrome but it’s not showing up, you need to set the CHROME_EXECUTABLE environment variable to the path to the Chrome executable file.
Running And Building Flutter Desktop Apps
After you’ve enabled Flutter desktop support, you can run a Flutter app natively on your development workstation with flutter run -d <OS_NAME>, replacing <OS_NAME> with the same value you used when enabling desktop support. You can also build binaries in the build directory with flutter build <OS_NAME>.
Before you can do any of that, though, you need to have a directory containing what Flutter needs to build for your platform. This will be created automatically when you create a new project, but you’ll need to create it for an existing project with flutter create .. Also, the LinUX and Windows APIs are unstable, so you might have to regenerate them for those platforms if the app stops working after a Flutter update.
When Is An App Compatible?
What have I meant all along when mentioning that a Flutter app has to be a “compatible project” in order for it to work on desktop or the web? Put simply, I mean that it mustn’t use any plugin that doesn’t have a platform-specific implementation for the platform on which you’re trying to build.
To make this point absolutely clear to everyone and avoid misunderstanding, please note that a Flutter plugin is a particular Flutter package that contains platform-specific code that is necessary for it to provide its features.
For example, you can use the Google-developed url_launcher package as much as you want (and you might want to, given that the web is built on hyperlinks).
An example of a Google-developed package the usage of which would preclude web development is path_provider, which is used to get the local storage path to save files to. This is an example of a package that, incidentally, isn’t of any use to a web app, so not being able to use it isn’t really a bummer, except for the fact that you need to change your code in order for it to work on the web if you’re using it.
For example, you can use the shared_preferences package, which relies on HTML localStorage on the web.
Similar caveats are valid regarding desktop platforms: Very few plugins are compatible with desktop platforms, and, as this is a recurring theme, much more work on this needs to be done on the desktop side than is really necessary on Flutter for the web.
Creating Responsive Layouts In Flutter
Because of what I’ve described above and for simplicity, I’m going to assume for the rest of this post that your target platform is the web, but the basic concepts apply to desktop development as well.
Supporting the web has benefits and responsibilities. Being pretty much forced to support different screen sizes might sound like a drawback, but consider that running the app in the web browsers enables you to see very easily how your app will look on screens of different sizes and aspect ratios, without having to run separate mobile device emulators.
Now, let’s talk code. How can you make your app responsive?
There are two perspectives from which this analysis is done:
“What widgets am I using or can I use that can or should adapt to screens of different sizes?”
“How can I get information about the size of the screen, and how can I use it when writing UI code?”
We’ll answer the first question later. Let’s first talk about the latter, because it can be dealt with very easily and is at the heart of the issue. There are two ways to do this:
One way is to take the information from the MediaQueryData of the MediaQuery root InheritedWidget, which has to exist in the widget tree in order for a Flutter app to work (it’s part of MaterialApp/WidgetsApp/CupertinoApp), which you can get, just like any other InheritedWidget, with MediaQuery.of(context), which has a size property, which is of type Size, and which therefore has two width and height properties of the type double.
The other way is to use a LayoutBuilder, which is a builder widget (just like a StreamBuilder or a FutureBuilder) that passes to the builder function (along with the context) a BoxConstraints object that has minHeight, maxHeight, minWidth and maxWidth properties.
Here’s an example DartPad using the MediaQuery to get constraints, the code for which is the following:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( home: MyHomePage() ); } class MyHomePage extends StatelessWidget { @override Widget build(context) => Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Text( "Width: ${MediaQuery.of(context).size.width}", style: Theme.of(context).textTheme.headline4 ), Text( "Height: ${MediaQuery.of(context).size.height}", style: Theme.of(context).textTheme.headline4 ) ] ) ) ); }
And here’s one using the LayoutBuilder for the same thing:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( home: MyHomePage() ); } class MyHomePage extends StatelessWidget { @override Widget build(context) => Scaffold( body: LayoutBuilder( builder: (context, constraints) => Center( child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Text( "Width: ${constraints.maxWidth}", style: Theme.of(context).textTheme.headline4 ), Text( "Height: ${constraints.maxHeight}", style: Theme.of(context).textTheme.headline4 ) ] ) ) ) ); }
Now, let’s think about what widgets can adapt to the constraints.
Fist of all, let’s think about the different ways of laying out multiple widgets according to the size of the screen.
The widget that most easily adapts is the GridView. In fact, a GridView built using the GridView.extent constructor doesn’t even need your involvement to be made responsive, as you can see in this very simple example:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( home: MyHomePage() ); } class MyHomePage extends StatelessWidget { final List elements = [ "Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "A Million Billion Trillion", "A much, much longer text that will still fit" ]; @override Widget build(context) => Scaffold( body: GridView.extent( maxCrossAxisExtent: 130.0, crossAxisSpacing: 20.0, mainAxisSpacing: 20.0, children: elements.map((el) => Card(child: Center(child: Padding(padding: EdgeInsets.all(8.0), child: Text(el))))).toList() ) ); }
You can accommodate content of different sizes by changing the maxCrossAxisExtent.
That example mostly served the purpose of showing the existence of the GridView.extent GridView constructor, but a much smarter way to do that would be to use a GridView.builder with a SliverGridDelegateWithMaxCrossAxisExtent, in this case where the widgets to be shown in the grid are dynamically created from another data structure, as you can see in this example:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( home: MyHomePage() ); } class MyHomePage extends StatelessWidget { final List<String> elements = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "A Million Billion Trillion", "A much, much longer text that will still fit"]; @override Widget build(context) => Scaffold( body: GridView.builder( itemCount: elements.length, gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 130.0, crossAxisSpacing: 20.0, mainAxisSpacing: 20.0, ), itemBuilder: (context, i) => Card( child: Center( child: Padding( padding: EdgeInsets.all(8.0), child: Text(elements[i]) ) ) ) ) ); }
An example of GridView adapting to different screens is my personal landing page, which is a very simple Flutter web app consisting of a GridView with a bunch of Cards, just like that previous example code, except that the Cards are a little more complex and larger.
A very simple change that could be made to apps designed for phones would be to replace a Drawer with a permanent menu on the left when there is space.
For example, we could have a ListView of widgets, like the following, which is used for navigation:
class Menu extends StatelessWidget { @override Widget build(context) => ListView( children: [ FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_one), title: Text("First Link"), ) ), FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_two), title: Text("Second Link"), ) ) ] ); }
On a smartphone, a common place to use that would be inside a Drawer (also known as a hamburger menu).
Alternatives to that would be the BottomNavigationBar or the TabBar, in combination with the TabBarView, but with both we’d have to make more changes than are required with the drawer, so we’ll stick with the drawer.
To only show the Drawer containing the Menu that we saw earlier on smaller screens, you’d write code that looks like the following snippet, checking the width using the MediaQuery.of(context) and passing a Drawer object to the Scaffold only if it’s less than some width value that we believe to be appropriate for our app:
Scaffold( appBar: AppBar(/* ... \*/), drawer: MediaQuery.of(context).size.width < 500 ? Drawer( child: Menu(), ) : null, body: /* ... \*/ )
Now, let’s think about the body of the Scaffold. As the sample main content of our app, we’ll use the GridView that we built previously, which we keep in a separate widget named Content to avoid confusion:
class Content extends StatelessWidget { final List elements = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "A Million Billion Trillion", "A much, much longer text that will still fit"]; @override Widget build(context) => GridView.builder( itemCount: elements.length, gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 130.0, crossAxisSpacing: 20.0, mainAxisSpacing: 20.0, ), itemBuilder: (context, i) => Card( child: Center( child: Padding( padding: EdgeInsets.all(8.0), child: Text(elements[i]) ) ) ) ); }
On bigger screens, the body itself may be a Row that shows two widgets: the Menu, which is restricted to a fixed width, and the Content filling the rest of the screen.
On smaller screens, the entire body would be the Content.
We’ll wrap everything in a SafeArea and a Center widget because sometimes Flutter web app widgets, especially when using Rows and Columns, end up outside of the visible screen area, and that is fixed with SafeArea and/or Center.
This means the body of the Scaffold will be the following:
SafeArea( child:Center( child: MediaQuery.of(context).size.width < 500 ? Content() : Row( children: [ Container( width: 200.0, child: Menu() ), Container( width: MediaQuery.of(context).size.width-200.0, child: Content() ) ] ) ) )
Here is all of that put together:
(Large preview)
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( home: HomePage() ); } class HomePage extends StatelessWidget { @override Widget build(context) => Scaffold( appBar: AppBar(title: Text("test")), drawer: MediaQuery.of(context).size.width < 500 ? Drawer( child: Menu(), ) : null, body: SafeArea( child:Center( child: MediaQuery.of(context).size.width < 500 ? Content() : Row( children: [ Container( width: 200.0, child: Menu() ), Container( width: MediaQuery.of(context).size.width-200.0, child: Content() ) ] ) ) ) ); } class Menu extends StatelessWidget { @override Widget build(context) => ListView( children: [ FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_one), title: Text("First Link"), ) ), FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_two), title: Text("Second Link"), ) ) ] ); } class Content extends StatelessWidget { final List<String> elements = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "A Million Billion Trillion", "A much, much longer text that will still fit"]; @override Widget build(context) => GridView.builder( itemCount: elements.length, gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 130.0, crossAxisSpacing: 20.0, mainAxisSpacing: 20.0, ), itemBuilder: (context, i) => Card( child: Center( child: Padding( padding: EdgeInsets.all(8.0), child: Text(elements[i]) ) ) ) ); }
This is most of the stuff you’ll need as a general introduction to responsive UI in Flutter. Much of its application will depend on your app’s specific UI, and it’s hard to pinpoint exactly what you can do to make your app responsive, and you can take many approaches depending on your preference. Now, though, let’s see how we can make a more complete example into a responsive app, thinking about common app elements and UI flows.
Putting It In Context: Making An App Responsive
So far, we have just a screen. Let’s expand that into a two-screen app with working URL-based navigation!
Creating A Responsive Login Page
Chances are that your app has a login page. How can we make that responsive?
Login screens on mobile devices are quite similar to each other usually. The space available isn’t much; it’s usually just a Column with some Padding around its widgets, and it contains TextFields for typing in a username and a password and a button to log in. So, a pretty standard (though not functioning, as that would require, among other things, a TextEditingController for each TextField) login page for a mobile app could be the following:
Scaffold( body: Container( padding: const EdgeInsets.symmetric( vertical: 30.0, horizontal: 25.0 ), child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Text("Welcome to the app, please log in"), TextField( decoration: InputDecoration( labelText: "username" ) ), TextField( obscureText: true, decoration: InputDecoration( labelText: "password" ) ), RaisedButton( color: Colors.blue, child: Text("Log in", style: TextStyle(color: Colors.white)), onPressed: () {} ) ] ), ), )
It looks fine on a mobile device, but those very wide TextFields start to look jarring on a tablet, let alone a bigger screen. However, we can’t just decide on a fixed width because phones have different screen sizes, and we should maintain a degree of flexibility.
For example, through experimentation, we might find that the maximum width should be 500. Well, we would set the Container’s constraints to 500 (I used a Container instead of Padding in the previous example because I knew where I was going with this) and we’re good to go, right? Not really, because that would cause the login widgets to stick to the left side of the screen, which might be even worse than stretching everything. So, we wrap in a Center widget, like this:
Center( child: Container( constraints: BoxConstraints(maxWidth: 500), padding: const EdgeInsets.symmetric( vertical: 30.0, horizontal: 25.0 ), child: Column(/* ... \*/) ) )
That already looks fine, and we haven’t even had to use either a LayoutBuilder or the MediaQuery.of(context).size. Let’s go one step further to make this look very good, though. It would look better, in my view, if the foreground part was in some way separated from the background. We can achieve that by giving a background color to what’s behind the Container with the input widgets, and keeping the foreground Container white. To make it look a little better, let’s keep the Container from stretching to the top and bottom of the screen on large devices, give it rounded corners, and give it a nice animated transition between the two layouts.
All of that now requires a LayoutBuilder and an outer Container in order both to set a background color and to add padding all around the Container and not just on the sides only on larger screens. Also, to make the change in padding amount animated, we just need to turn that outer Container into an AnimatedContainer, which requires a duration for the animation, which we’ll set to half a second, which is Duration(milliseconds: 500) in code.
Here’s that example of a responsive login page:
(Large preview)
class LoginPage extends StatelessWidget { @override Widget build(context) => Scaffold( body: LayoutBuilder( builder: (context, constraints) { return AnimatedContainer( duration: Duration(milliseconds: 500), color: Colors.lightGreen[200], padding: constraints.maxWidth < 500 ? EdgeInsets.zero : EdgeInsets.all(30.0), child: Center( child: Container( padding: EdgeInsets.symmetric( vertical: 30.0, horizontal: 25.0 ), constraints: BoxConstraints( maxWidth: 500, ), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(5.0), ), child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Text("Welcome to the app, please log in"), TextField( decoration: InputDecoration( labelText: "username" ) ), TextField( obscureText: true, decoration: InputDecoration( labelText: "password" ) ), RaisedButton( color: Colors.blue, child: Text("Log in", style: TextStyle(color: Colors.white)), onPressed: () { Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => HomePage() ) ); } ) ] ), ), ) ); } ) ); }
As you can see, I’ve also changed the RaisedButton’s onPressed to a callback that navigates us to a screen named HomePage (which could be, for example, the view we built previously with a GridView and a menu or a drawer). Now, though, that navigation part is what we’re going to focus on.
Named Routes: Making Your App’s Navigation More Like A Proper Web App
A common thing for web apps to have is the ability to change screens based on the URL. For example going to https://appurl/login should give you something different than https://appurl/somethingelse. Flutter, in fact, supports named routes, which have two purposes:
In a web app, they have exactly that feature that I mentioned in the previous sentence.
In any app, they allow you to predefine routes for your app and give them names, and then be able to navigate to them just by specifying their name.
To do that, we need to change the MaterialApp constructor to one that looks like the following:
MaterialApp( initialRoute: "/login", routes: { "/login": (context) => LoginPage(), "/home": (context) => HomePage() } );
And then we can switch to a different route by using Navigator.pushNamed(context, routeName) and Navigator.pushReplacementNamed(context, routeName), instead of Navigator.push(context, route) and Navigator.pushReplacement(context, route).
Here is that applied to the hypothetical app we built in the rest of this article. You can’t really see named routes in action in DartPad, so you should try this out on your own machine with flutter run, or check the example in action:
(Large preview)
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( initialRoute: "/login", routes: { "/login": (context) => LoginPage(), "/home": (context) => HomePage() } ); } class LoginPage extends StatelessWidget { @override Widget build(context) => Scaffold( body: LayoutBuilder( builder: (context, constraints) { return AnimatedContainer( duration: Duration(milliseconds: 500), color: Colors.lightGreen[200], padding: constraints.maxWidth < 500 ? EdgeInsets.zero : const EdgeInsets.all(30.0), child: Center( child: Container( padding: const EdgeInsets.symmetric( vertical: 30.0, horizontal: 25.0 ), constraints: BoxConstraints( maxWidth: 500, ), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(5.0), ), child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Text("Welcome to the app, please log in"), TextField( decoration: InputDecoration( labelText: "username" ) ), TextField( obscureText: true, decoration: InputDecoration( labelText: "password" ) ), RaisedButton( color: Colors.blue, child: Text("Log in", style: TextStyle(color: Colors.white)), onPressed: () { Navigator.pushReplacementNamed( context, "/home" ); } ) ] ), ), ) ); } ) ); } class HomePage extends StatelessWidget { @override Widget build(context) => Scaffold( appBar: AppBar(title: Text("test")), drawer: MediaQuery.of(context).size.width < 500 ? Drawer( child: Menu(), ) : null, body: SafeArea( child:Center( child: MediaQuery.of(context).size.width < 500 ? Content() : Row( children: [ Container( width: 200.0, child: Menu() ), Container( width: MediaQuery.of(context).size.width-200.0, child: Content() ) ] ) ) ) ); } class Menu extends StatelessWidget { @override Widget build(context) => ListView( children: [ FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_one), title: Text("First Link"), ) ), FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_two), title: Text("Second Link"), ) ), FlatButton( onPressed: () {Navigator.pushReplacementNamed( context, "/login");}, child: ListTile( leading: Icon(Icons.exit_to_app), title: Text("Log Out"), ) ) ] ); } class Content extends StatelessWidget { final List<String> elements = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "A Million Billion Trillion", "A much, much longer text that will still fit"]; @override Widget build(context) => GridView.builder( itemCount: elements.length, gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 130.0, crossAxisSpacing: 20.0, mainAxisSpacing: 20.0, ), itemBuilder: (context, i) => Card( child: Center( child: Padding( padding: EdgeInsets.all(8.0), child: Text(elements[i]) ) ) ) ); }
Onward With Your Flutter Adventure
That should give you an idea of what you can do with Flutter on bigger screens, specifically on the web. It’s a lovely framework, very easy to use, and its extreme cross-platform support only makes it more essential to learn and start using. So, go ahead and start trusting Flutter for web apps, too!
Further Resources
(ra, yk, il, al)
Website Design & SEO Delray Beach by DBL07.co
Delray Beach SEO
source http://www.scpie.org/responsive-web-and-desktop-development-with-flutter/ source https://scpie.tumblr.com/post/616197943531274240
0 notes
laurelkrugerr · 5 years ago
Text
Responsive Web And Desktop Development With Flutter
About The Author
Flutter and LinUX enthusiast, author of the Programming Flutter book with the Pragmatic Bookshelf. Blogs more, tweets less. More about Carmine …
Flutter has already made quite a splash on the mobile development scene. Now it’s taking on bigger devices as well. Here’s what you need to know to be ready to take on the task of developing web and desktop apps using this wonderful cross-platform framework.
This tutorial is not an introduction to Flutter itself. There are plenty of articles, videos and several books available online with simple introductions that will help you learn the basics of Flutter. Instead, we’ll be covering the following two objectives:
The current state of Flutter non-mobile development and how you can run Flutter code in the browser, on a desktop or laptop computer;
How to create responsive apps using Flutter, so that you can see its power — especially as a web framework — on full display, ending with a note about routing based on URL.
Let’s get into it!
What Is Flutter, Why It’s Important, What It Has Evolved Into, Where It’s Going
Flutter is Google’s latest app development framework. Google envisions it to be all-encompassing: It will enable the same code to be executed on smartphones of all brands, on tablets, and on desktop and laptops computer as native apps or as web pages.
It’s a very ambitious project, but Google has been incredibly successful until now particularly in two aspects: in creating a truly platform-independent framework for Android and iOS native apps that works great and is fully ready for production use, and in creating an impressive front-end web framework that can share 100% of the code with a compatible Flutter app.
In the next section, we’re going to see what makes the app compatible and what’s the state of non-mobile Flutter development as of now.
Non-Mobile Development With Flutter
Non-mobile development with Flutter was first publicized in a significant way at Google I/O 2019. This section is about how to make it work and about when it works.
How To Enable Web And Desktop Development
To enable web development, you must first be on Flutter’s beta channel. There are two ways to get to that point:
Install Flutter directly on the beta channel by downloading the appropriate latest beta version from the SDK archive.
If you already have Flutter installed, switch to the beta channel with $ flutter channel beta, and then perform the switch itself by updating your Flutter version (which is actually a git pull on the Flutter installation folder) with $ flutter upgrade.
After that, you can run this:
$ flutter config --enable-web
Desktop support is much more experimental, especially due to a lack of tooling for LinUX and Windows, making plugin development especially a major pain, and due to the fact that the APIs used for it are intended for proof-of-concept use and not for production. This is unlike web development, which is using the tried-and-tested dart2js compiler for release builds, which are not even supported for Windows and LinUX native desktop apps.
Note: Support for macOS is slightly better than support for Windows and LinUX, but it still isn’t as good as support for the web and not nearly as good as the full support for mobile platforms.
To enable support for desktop development, you need to switch to the master release channel by following the same steps outlined earlier for the beta channel. Then, run the following by replacing <OS_NAME> with either linUX, windows, or macos:
$ flutter config --enable-<OS_NAME>-desktop
At this point, if you have issues with any of the following steps that I’ll be describing because the Flutter tool isn’t doing what I’m saying it should do, some common troubleshooting steps are these:
Run flutter doctor to check for issues. A side effect of this Flutter command is that it should download any tools it needs that it doesn’t have.
Run flutter upgrade.
Turn it off and on again. The old tier-1 technical-support answer of restarting your computer might be just what is needed for you to be able to enjoy the full riches of Flutter.
Running And Building Flutter Web Apps
Flutter web support isn’t bad at all, and this is reflected in the ease of development for the web.
Running this…
$ flutter devices
… should show right away an entry for something like this:
Web Server • web-server • web-javascript • Flutter Tools
Additionally, running the Chrome browser should cause Flutter to show an entry for it as well. Running flutter run on a compatible Flutter project (more on that later) when the only “connected device” showing up is the web server will cause Flutter to start a web server on localhost:<RANDOM_PORT>, which will allow you to access your Flutter web app from any browser.
If you have installed Chrome but it’s not showing up, you need to set the CHROME_EXECUTABLE environment variable to the path to the Chrome executable file.
Running And Building Flutter Desktop Apps
After you’ve enabled Flutter desktop support, you can run a Flutter app natively on your development workstation with flutter run -d <OS_NAME>, replacing <OS_NAME> with the same value you used when enabling desktop support. You can also build binaries in the build directory with flutter build <OS_NAME>.
Before you can do any of that, though, you need to have a directory containing what Flutter needs to build for your platform. This will be created automatically when you create a new project, but you’ll need to create it for an existing project with flutter create .. Also, the LinUX and Windows APIs are unstable, so you might have to regenerate them for those platforms if the app stops working after a Flutter update.
When Is An App Compatible?
What have I meant all along when mentioning that a Flutter app has to be a “compatible project” in order for it to work on desktop or the web? Put simply, I mean that it mustn’t use any plugin that doesn’t have a platform-specific implementation for the platform on which you’re trying to build.
To make this point absolutely clear to everyone and avoid misunderstanding, please note that a Flutter plugin is a particular Flutter package that contains platform-specific code that is necessary for it to provide its features.
For example, you can use the Google-developed url_launcher package as much as you want (and you might want to, given that the web is built on hyperlinks).
An example of a Google-developed package the usage of which would preclude web development is path_provider, which is used to get the local storage path to save files to. This is an example of a package that, incidentally, isn’t of any use to a web app, so not being able to use it isn’t really a bummer, except for the fact that you need to change your code in order for it to work on the web if you’re using it.
For example, you can use the shared_preferences package, which relies on HTML localStorage on the web.
Similar caveats are valid regarding desktop platforms: Very few plugins are compatible with desktop platforms, and, as this is a recurring theme, much more work on this needs to be done on the desktop side than is really necessary on Flutter for the web.
Creating Responsive Layouts In Flutter
Because of what I’ve described above and for simplicity, I’m going to assume for the rest of this post that your target platform is the web, but the basic concepts apply to desktop development as well.
Supporting the web has benefits and responsibilities. Being pretty much forced to support different screen sizes might sound like a drawback, but consider that running the app in the web browsers enables you to see very easily how your app will look on screens of different sizes and aspect ratios, without having to run separate mobile device emulators.
Now, let’s talk code. How can you make your app responsive?
There are two perspectives from which this analysis is done:
“What widgets am I using or can I use that can or should adapt to screens of different sizes?”
“How can I get information about the size of the screen, and how can I use it when writing UI code?”
We’ll answer the first question later. Let’s first talk about the latter, because it can be dealt with very easily and is at the heart of the issue. There are two ways to do this:
One way is to take the information from the MediaQueryData of the MediaQuery root InheritedWidget, which has to exist in the widget tree in order for a Flutter app to work (it’s part of MaterialApp/WidgetsApp/CupertinoApp), which you can get, just like any other InheritedWidget, with MediaQuery.of(context), which has a size property, which is of type Size, and which therefore has two width and height properties of the type double.
The other way is to use a LayoutBuilder, which is a builder widget (just like a StreamBuilder or a FutureBuilder) that passes to the builder function (along with the context) a BoxConstraints object that has minHeight, maxHeight, minWidth and maxWidth properties.
Here’s an example DartPad using the MediaQuery to get constraints, the code for which is the following:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( home: MyHomePage() ); } class MyHomePage extends StatelessWidget { @override Widget build(context) => Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Text( "Width: ${MediaQuery.of(context).size.width}", style: Theme.of(context).textTheme.headline4 ), Text( "Height: ${MediaQuery.of(context).size.height}", style: Theme.of(context).textTheme.headline4 ) ] ) ) ); }
And here’s one using the LayoutBuilder for the same thing:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( home: MyHomePage() ); } class MyHomePage extends StatelessWidget { @override Widget build(context) => Scaffold( body: LayoutBuilder( builder: (context, constraints) => Center( child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Text( "Width: ${constraints.maxWidth}", style: Theme.of(context).textTheme.headline4 ), Text( "Height: ${constraints.maxHeight}", style: Theme.of(context).textTheme.headline4 ) ] ) ) ) ); }
Now, let’s think about what widgets can adapt to the constraints.
Fist of all, let’s think about the different ways of laying out multiple widgets according to the size of the screen.
The widget that most easily adapts is the GridView. In fact, a GridView built using the GridView.extent constructor doesn’t even need your involvement to be made responsive, as you can see in this very simple example:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( home: MyHomePage() ); } class MyHomePage extends StatelessWidget { final List elements = [ "Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "A Million Billion Trillion", "A much, much longer text that will still fit" ]; @override Widget build(context) => Scaffold( body: GridView.extent( maxCrossAxisExtent: 130.0, crossAxisSpacing: 20.0, mainAxisSpacing: 20.0, children: elements.map((el) => Card(child: Center(child: Padding(padding: EdgeInsets.all(8.0), child: Text(el))))).toList() ) ); }
You can accommodate content of different sizes by changing the maxCrossAxisExtent.
That example mostly served the purpose of showing the existence of the GridView.extent GridView constructor, but a much smarter way to do that would be to use a GridView.builder with a SliverGridDelegateWithMaxCrossAxisExtent, in this case where the widgets to be shown in the grid are dynamically created from another data structure, as you can see in this example:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( home: MyHomePage() ); } class MyHomePage extends StatelessWidget { final List<String> elements = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "A Million Billion Trillion", "A much, much longer text that will still fit"]; @override Widget build(context) => Scaffold( body: GridView.builder( itemCount: elements.length, gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 130.0, crossAxisSpacing: 20.0, mainAxisSpacing: 20.0, ), itemBuilder: (context, i) => Card( child: Center( child: Padding( padding: EdgeInsets.all(8.0), child: Text(elements[i]) ) ) ) ) ); }
An example of GridView adapting to different screens is my personal landing page, which is a very simple Flutter web app consisting of a GridView with a bunch of Cards, just like that previous example code, except that the Cards are a little more complex and larger.
A very simple change that could be made to apps designed for phones would be to replace a Drawer with a permanent menu on the left when there is space.
For example, we could have a ListView of widgets, like the following, which is used for navigation:
class Menu extends StatelessWidget { @override Widget build(context) => ListView( children: [ FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_one), title: Text("First Link"), ) ), FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_two), title: Text("Second Link"), ) ) ] ); }
On a smartphone, a common place to use that would be inside a Drawer (also known as a hamburger menu).
Alternatives to that would be the BottomNavigationBar or the TabBar, in combination with the TabBarView, but with both we’d have to make more changes than are required with the drawer, so we’ll stick with the drawer.
To only show the Drawer containing the Menu that we saw earlier on smaller screens, you’d write code that looks like the following snippet, checking the width using the MediaQuery.of(context) and passing a Drawer object to the Scaffold only if it’s less than some width value that we believe to be appropriate for our app:
Scaffold( appBar: AppBar(/* ... \*/), drawer: MediaQuery.of(context).size.width < 500 ? Drawer( child: Menu(), ) : null, body: /* ... \*/ )
Now, let’s think about the body of the Scaffold. As the sample main content of our app, we’ll use the GridView that we built previously, which we keep in a separate widget named Content to avoid confusion:
class Content extends StatelessWidget { final List elements = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "A Million Billion Trillion", "A much, much longer text that will still fit"]; @override Widget build(context) => GridView.builder( itemCount: elements.length, gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 130.0, crossAxisSpacing: 20.0, mainAxisSpacing: 20.0, ), itemBuilder: (context, i) => Card( child: Center( child: Padding( padding: EdgeInsets.all(8.0), child: Text(elements[i]) ) ) ) ); }
On bigger screens, the body itself may be a Row that shows two widgets: the Menu, which is restricted to a fixed width, and the Content filling the rest of the screen.
On smaller screens, the entire body would be the Content.
We’ll wrap everything in a SafeArea and a Center widget because sometimes Flutter web app widgets, especially when using Rows and Columns, end up outside of the visible screen area, and that is fixed with SafeArea and/or Center.
This means the body of the Scaffold will be the following:
SafeArea( child:Center( child: MediaQuery.of(context).size.width < 500 ? Content() : Row( children: [ Container( width: 200.0, child: Menu() ), Container( width: MediaQuery.of(context).size.width-200.0, child: Content() ) ] ) ) )
Here is all of that put together:
(Large preview)
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( home: HomePage() ); } class HomePage extends StatelessWidget { @override Widget build(context) => Scaffold( appBar: AppBar(title: Text("test")), drawer: MediaQuery.of(context).size.width < 500 ? Drawer( child: Menu(), ) : null, body: SafeArea( child:Center( child: MediaQuery.of(context).size.width < 500 ? Content() : Row( children: [ Container( width: 200.0, child: Menu() ), Container( width: MediaQuery.of(context).size.width-200.0, child: Content() ) ] ) ) ) ); } class Menu extends StatelessWidget { @override Widget build(context) => ListView( children: [ FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_one), title: Text("First Link"), ) ), FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_two), title: Text("Second Link"), ) ) ] ); } class Content extends StatelessWidget { final List<String> elements = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "A Million Billion Trillion", "A much, much longer text that will still fit"]; @override Widget build(context) => GridView.builder( itemCount: elements.length, gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 130.0, crossAxisSpacing: 20.0, mainAxisSpacing: 20.0, ), itemBuilder: (context, i) => Card( child: Center( child: Padding( padding: EdgeInsets.all(8.0), child: Text(elements[i]) ) ) ) ); }
This is most of the stuff you’ll need as a general introduction to responsive UI in Flutter. Much of its application will depend on your app’s specific UI, and it’s hard to pinpoint exactly what you can do to make your app responsive, and you can take many approaches depending on your preference. Now, though, let’s see how we can make a more complete example into a responsive app, thinking about common app elements and UI flows.
Putting It In Context: Making An App Responsive
So far, we have just a screen. Let’s expand that into a two-screen app with working URL-based navigation!
Creating A Responsive Login Page
Chances are that your app has a login page. How can we make that responsive?
Login screens on mobile devices are quite similar to each other usually. The space available isn’t much; it’s usually just a Column with some Padding around its widgets, and it contains TextFields for typing in a username and a password and a button to log in. So, a pretty standard (though not functioning, as that would require, among other things, a TextEditingController for each TextField) login page for a mobile app could be the following:
Scaffold( body: Container( padding: const EdgeInsets.symmetric( vertical: 30.0, horizontal: 25.0 ), child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Text("Welcome to the app, please log in"), TextField( decoration: InputDecoration( labelText: "username" ) ), TextField( obscureText: true, decoration: InputDecoration( labelText: "password" ) ), RaisedButton( color: Colors.blue, child: Text("Log in", style: TextStyle(color: Colors.white)), onPressed: () {} ) ] ), ), )
It looks fine on a mobile device, but those very wide TextFields start to look jarring on a tablet, let alone a bigger screen. However, we can’t just decide on a fixed width because phones have different screen sizes, and we should maintain a degree of flexibility.
For example, through experimentation, we might find that the maximum width should be 500. Well, we would set the Container’s constraints to 500 (I used a Container instead of Padding in the previous example because I knew where I was going with this) and we’re good to go, right? Not really, because that would cause the login widgets to stick to the left side of the screen, which might be even worse than stretching everything. So, we wrap in a Center widget, like this:
Center( child: Container( constraints: BoxConstraints(maxWidth: 500), padding: const EdgeInsets.symmetric( vertical: 30.0, horizontal: 25.0 ), child: Column(/* ... \*/) ) )
That already looks fine, and we haven’t even had to use either a LayoutBuilder or the MediaQuery.of(context).size. Let’s go one step further to make this look very good, though. It would look better, in my view, if the foreground part was in some way separated from the background. We can achieve that by giving a background color to what’s behind the Container with the input widgets, and keeping the foreground Container white. To make it look a little better, let’s keep the Container from stretching to the top and bottom of the screen on large devices, give it rounded corners, and give it a nice animated transition between the two layouts.
All of that now requires a LayoutBuilder and an outer Container in order both to set a background color and to add padding all around the Container and not just on the sides only on larger screens. Also, to make the change in padding amount animated, we just need to turn that outer Container into an AnimatedContainer, which requires a duration for the animation, which we’ll set to half a second, which is Duration(milliseconds: 500) in code.
Here’s that example of a responsive login page:
(Large preview)
class LoginPage extends StatelessWidget { @override Widget build(context) => Scaffold( body: LayoutBuilder( builder: (context, constraints) { return AnimatedContainer( duration: Duration(milliseconds: 500), color: Colors.lightGreen[200], padding: constraints.maxWidth < 500 ? EdgeInsets.zero : EdgeInsets.all(30.0), child: Center( child: Container( padding: EdgeInsets.symmetric( vertical: 30.0, horizontal: 25.0 ), constraints: BoxConstraints( maxWidth: 500, ), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(5.0), ), child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Text("Welcome to the app, please log in"), TextField( decoration: InputDecoration( labelText: "username" ) ), TextField( obscureText: true, decoration: InputDecoration( labelText: "password" ) ), RaisedButton( color: Colors.blue, child: Text("Log in", style: TextStyle(color: Colors.white)), onPressed: () { Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => HomePage() ) ); } ) ] ), ), ) ); } ) ); }
As you can see, I’ve also changed the RaisedButton’s onPressed to a callback that navigates us to a screen named HomePage (which could be, for example, the view we built previously with a GridView and a menu or a drawer). Now, though, that navigation part is what we’re going to focus on.
Named Routes: Making Your App’s Navigation More Like A Proper Web App
A common thing for web apps to have is the ability to change screens based on the URL. For example going to https://appurl/login should give you something different than https://appurl/somethingelse. Flutter, in fact, supports named routes, which have two purposes:
In a web app, they have exactly that feature that I mentioned in the previous sentence.
In any app, they allow you to predefine routes for your app and give them names, and then be able to navigate to them just by specifying their name.
To do that, we need to change the MaterialApp constructor to one that looks like the following:
MaterialApp( initialRoute: "/login", routes: { "/login": (context) => LoginPage(), "/home": (context) => HomePage() } );
And then we can switch to a different route by using Navigator.pushNamed(context, routeName) and Navigator.pushReplacementNamed(context, routeName), instead of Navigator.push(context, route) and Navigator.pushReplacement(context, route).
Here is that applied to the hypothetical app we built in the rest of this article. You can’t really see named routes in action in DartPad, so you should try this out on your own machine with flutter run, or check the example in action:
(Large preview)
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( initialRoute: "/login", routes: { "/login": (context) => LoginPage(), "/home": (context) => HomePage() } ); } class LoginPage extends StatelessWidget { @override Widget build(context) => Scaffold( body: LayoutBuilder( builder: (context, constraints) { return AnimatedContainer( duration: Duration(milliseconds: 500), color: Colors.lightGreen[200], padding: constraints.maxWidth < 500 ? EdgeInsets.zero : const EdgeInsets.all(30.0), child: Center( child: Container( padding: const EdgeInsets.symmetric( vertical: 30.0, horizontal: 25.0 ), constraints: BoxConstraints( maxWidth: 500, ), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(5.0), ), child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Text("Welcome to the app, please log in"), TextField( decoration: InputDecoration( labelText: "username" ) ), TextField( obscureText: true, decoration: InputDecoration( labelText: "password" ) ), RaisedButton( color: Colors.blue, child: Text("Log in", style: TextStyle(color: Colors.white)), onPressed: () { Navigator.pushReplacementNamed( context, "/home" ); } ) ] ), ), ) ); } ) ); } class HomePage extends StatelessWidget { @override Widget build(context) => Scaffold( appBar: AppBar(title: Text("test")), drawer: MediaQuery.of(context).size.width < 500 ? Drawer( child: Menu(), ) : null, body: SafeArea( child:Center( child: MediaQuery.of(context).size.width < 500 ? Content() : Row( children: [ Container( width: 200.0, child: Menu() ), Container( width: MediaQuery.of(context).size.width-200.0, child: Content() ) ] ) ) ) ); } class Menu extends StatelessWidget { @override Widget build(context) => ListView( children: [ FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_one), title: Text("First Link"), ) ), FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_two), title: Text("Second Link"), ) ), FlatButton( onPressed: () {Navigator.pushReplacementNamed( context, "/login");}, child: ListTile( leading: Icon(Icons.exit_to_app), title: Text("Log Out"), ) ) ] ); } class Content extends StatelessWidget { final List<String> elements = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "A Million Billion Trillion", "A much, much longer text that will still fit"]; @override Widget build(context) => GridView.builder( itemCount: elements.length, gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 130.0, crossAxisSpacing: 20.0, mainAxisSpacing: 20.0, ), itemBuilder: (context, i) => Card( child: Center( child: Padding( padding: EdgeInsets.all(8.0), child: Text(elements[i]) ) ) ) ); }
Onward With Your Flutter Adventure
That should give you an idea of what you can do with Flutter on bigger screens, specifically on the web. It’s a lovely framework, very easy to use, and its extreme cross-platform support only makes it more essential to learn and start using. So, go ahead and start trusting Flutter for web apps, too!
Further Resources
(ra, yk, il, al)
Website Design & SEO Delray Beach by DBL07.co
Delray Beach SEO
source http://www.scpie.org/responsive-web-and-desktop-development-with-flutter/ source https://scpie1.blogspot.com/2020/04/responsive-web-and-desktop-development.html
0 notes
scpie · 5 years ago
Text
Responsive Web And Desktop Development With Flutter
About The Author
Flutter and LinUX enthusiast, author of the Programming Flutter book with the Pragmatic Bookshelf. Blogs more, tweets less. More about Carmine …
Flutter has already made quite a splash on the mobile development scene. Now it’s taking on bigger devices as well. Here’s what you need to know to be ready to take on the task of developing web and desktop apps using this wonderful cross-platform framework.
This tutorial is not an introduction to Flutter itself. There are plenty of articles, videos and several books available online with simple introductions that will help you learn the basics of Flutter. Instead, we’ll be covering the following two objectives:
The current state of Flutter non-mobile development and how you can run Flutter code in the browser, on a desktop or laptop computer;
How to create responsive apps using Flutter, so that you can see its power — especially as a web framework — on full display, ending with a note about routing based on URL.
Let’s get into it!
What Is Flutter, Why It’s Important, What It Has Evolved Into, Where It’s Going
Flutter is Google’s latest app development framework. Google envisions it to be all-encompassing: It will enable the same code to be executed on smartphones of all brands, on tablets, and on desktop and laptops computer as native apps or as web pages.
It’s a very ambitious project, but Google has been incredibly successful until now particularly in two aspects: in creating a truly platform-independent framework for Android and iOS native apps that works great and is fully ready for production use, and in creating an impressive front-end web framework that can share 100% of the code with a compatible Flutter app.
In the next section, we’re going to see what makes the app compatible and what’s the state of non-mobile Flutter development as of now.
Non-Mobile Development With Flutter
Non-mobile development with Flutter was first publicized in a significant way at Google I/O 2019. This section is about how to make it work and about when it works.
How To Enable Web And Desktop Development
To enable web development, you must first be on Flutter’s beta channel. There are two ways to get to that point:
Install Flutter directly on the beta channel by downloading the appropriate latest beta version from the SDK archive.
If you already have Flutter installed, switch to the beta channel with $ flutter channel beta, and then perform the switch itself by updating your Flutter version (which is actually a git pull on the Flutter installation folder) with $ flutter upgrade.
After that, you can run this:
$ flutter config --enable-web
Desktop support is much more experimental, especially due to a lack of tooling for LinUX and Windows, making plugin development especially a major pain, and due to the fact that the APIs used for it are intended for proof-of-concept use and not for production. This is unlike web development, which is using the tried-and-tested dart2js compiler for release builds, which are not even supported for Windows and LinUX native desktop apps.
Note: Support for macOS is slightly better than support for Windows and LinUX, but it still isn’t as good as support for the web and not nearly as good as the full support for mobile platforms.
To enable support for desktop development, you need to switch to the master release channel by following the same steps outlined earlier for the beta channel. Then, run the following by replacing <OS_NAME> with either linUX, windows, or macos:
$ flutter config --enable-<OS_NAME>-desktop
At this point, if you have issues with any of the following steps that I’ll be describing because the Flutter tool isn’t doing what I’m saying it should do, some common troubleshooting steps are these:
Run flutter doctor to check for issues. A side effect of this Flutter command is that it should download any tools it needs that it doesn’t have.
Run flutter upgrade.
Turn it off and on again. The old tier-1 technical-support answer of restarting your computer might be just what is needed for you to be able to enjoy the full riches of Flutter.
Running And Building Flutter Web Apps
Flutter web support isn’t bad at all, and this is reflected in the ease of development for the web.
Running this…
$ flutter devices
… should show right away an entry for something like this:
Web Server • web-server • web-javascript • Flutter Tools
Additionally, running the Chrome browser should cause Flutter to show an entry for it as well. Running flutter run on a compatible Flutter project (more on that later) when the only “connected device” showing up is the web server will cause Flutter to start a web server on localhost:<RANDOM_PORT>, which will allow you to access your Flutter web app from any browser.
If you have installed Chrome but it’s not showing up, you need to set the CHROME_EXECUTABLE environment variable to the path to the Chrome executable file.
Running And Building Flutter Desktop Apps
After you’ve enabled Flutter desktop support, you can run a Flutter app natively on your development workstation with flutter run -d <OS_NAME>, replacing <OS_NAME> with the same value you used when enabling desktop support. You can also build binaries in the build directory with flutter build <OS_NAME>.
Before you can do any of that, though, you need to have a directory containing what Flutter needs to build for your platform. This will be created automatically when you create a new project, but you’ll need to create it for an existing project with flutter create .. Also, the LinUX and Windows APIs are unstable, so you might have to regenerate them for those platforms if the app stops working after a Flutter update.
When Is An App Compatible?
What have I meant all along when mentioning that a Flutter app has to be a “compatible project” in order for it to work on desktop or the web? Put simply, I mean that it mustn’t use any plugin that doesn’t have a platform-specific implementation for the platform on which you’re trying to build.
To make this point absolutely clear to everyone and avoid misunderstanding, please note that a Flutter plugin is a particular Flutter package that contains platform-specific code that is necessary for it to provide its features.
For example, you can use the Google-developed url_launcher package as much as you want (and you might want to, given that the web is built on hyperlinks).
An example of a Google-developed package the usage of which would preclude web development is path_provider, which is used to get the local storage path to save files to. This is an example of a package that, incidentally, isn’t of any use to a web app, so not being able to use it isn’t really a bummer, except for the fact that you need to change your code in order for it to work on the web if you’re using it.
For example, you can use the shared_preferences package, which relies on HTML localStorage on the web.
Similar caveats are valid regarding desktop platforms: Very few plugins are compatible with desktop platforms, and, as this is a recurring theme, much more work on this needs to be done on the desktop side than is really necessary on Flutter for the web.
Creating Responsive Layouts In Flutter
Because of what I’ve described above and for simplicity, I’m going to assume for the rest of this post that your target platform is the web, but the basic concepts apply to desktop development as well.
Supporting the web has benefits and responsibilities. Being pretty much forced to support different screen sizes might sound like a drawback, but consider that running the app in the web browsers enables you to see very easily how your app will look on screens of different sizes and aspect ratios, without having to run separate mobile device emulators.
Now, let’s talk code. How can you make your app responsive?
There are two perspectives from which this analysis is done:
“What widgets am I using or can I use that can or should adapt to screens of different sizes?”
“How can I get information about the size of the screen, and how can I use it when writing UI code?”
We’ll answer the first question later. Let’s first talk about the latter, because it can be dealt with very easily and is at the heart of the issue. There are two ways to do this:
One way is to take the information from the MediaQueryData of the MediaQuery root InheritedWidget, which has to exist in the widget tree in order for a Flutter app to work (it’s part of MaterialApp/WidgetsApp/CupertinoApp), which you can get, just like any other InheritedWidget, with MediaQuery.of(context), which has a size property, which is of type Size, and which therefore has two width and height properties of the type double.
The other way is to use a LayoutBuilder, which is a builder widget (just like a StreamBuilder or a FutureBuilder) that passes to the builder function (along with the context) a BoxConstraints object that has minHeight, maxHeight, minWidth and maxWidth properties.
Here’s an example DartPad using the MediaQuery to get constraints, the code for which is the following:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( home: MyHomePage() ); } class MyHomePage extends StatelessWidget { @override Widget build(context) => Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Text( "Width: ${MediaQuery.of(context).size.width}", style: Theme.of(context).textTheme.headline4 ), Text( "Height: ${MediaQuery.of(context).size.height}", style: Theme.of(context).textTheme.headline4 ) ] ) ) ); }
And here’s one using the LayoutBuilder for the same thing:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( home: MyHomePage() ); } class MyHomePage extends StatelessWidget { @override Widget build(context) => Scaffold( body: LayoutBuilder( builder: (context, constraints) => Center( child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Text( "Width: ${constraints.maxWidth}", style: Theme.of(context).textTheme.headline4 ), Text( "Height: ${constraints.maxHeight}", style: Theme.of(context).textTheme.headline4 ) ] ) ) ) ); }
Now, let’s think about what widgets can adapt to the constraints.
Fist of all, let’s think about the different ways of laying out multiple widgets according to the size of the screen.
The widget that most easily adapts is the GridView. In fact, a GridView built using the GridView.extent constructor doesn’t even need your involvement to be made responsive, as you can see in this very simple example:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( home: MyHomePage() ); } class MyHomePage extends StatelessWidget { final List elements = [ "Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "A Million Billion Trillion", "A much, much longer text that will still fit" ]; @override Widget build(context) => Scaffold( body: GridView.extent( maxCrossAxisExtent: 130.0, crossAxisSpacing: 20.0, mainAxisSpacing: 20.0, children: elements.map((el) => Card(child: Center(child: Padding(padding: EdgeInsets.all(8.0), child: Text(el))))).toList() ) ); }
You can accommodate content of different sizes by changing the maxCrossAxisExtent.
That example mostly served the purpose of showing the existence of the GridView.extent GridView constructor, but a much smarter way to do that would be to use a GridView.builder with a SliverGridDelegateWithMaxCrossAxisExtent, in this case where the widgets to be shown in the grid are dynamically created from another data structure, as you can see in this example:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( home: MyHomePage() ); } class MyHomePage extends StatelessWidget { final List<String> elements = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "A Million Billion Trillion", "A much, much longer text that will still fit"]; @override Widget build(context) => Scaffold( body: GridView.builder( itemCount: elements.length, gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 130.0, crossAxisSpacing: 20.0, mainAxisSpacing: 20.0, ), itemBuilder: (context, i) => Card( child: Center( child: Padding( padding: EdgeInsets.all(8.0), child: Text(elements[i]) ) ) ) ) ); }
An example of GridView adapting to different screens is my personal landing page, which is a very simple Flutter web app consisting of a GridView with a bunch of Cards, just like that previous example code, except that the Cards are a little more complex and larger.
A very simple change that could be made to apps designed for phones would be to replace a Drawer with a permanent menu on the left when there is space.
For example, we could have a ListView of widgets, like the following, which is used for navigation:
class Menu extends StatelessWidget { @override Widget build(context) => ListView( children: [ FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_one), title: Text("First Link"), ) ), FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_two), title: Text("Second Link"), ) ) ] ); }
On a smartphone, a common place to use that would be inside a Drawer (also known as a hamburger menu).
Alternatives to that would be the BottomNavigationBar or the TabBar, in combination with the TabBarView, but with both we’d have to make more changes than are required with the drawer, so we’ll stick with the drawer.
To only show the Drawer containing the Menu that we saw earlier on smaller screens, you’d write code that looks like the following snippet, checking the width using the MediaQuery.of(context) and passing a Drawer object to the Scaffold only if it’s less than some width value that we believe to be appropriate for our app:
Scaffold( appBar: AppBar(/* ... \*/), drawer: MediaQuery.of(context).size.width < 500 ? Drawer( child: Menu(), ) : null, body: /* ... \*/ )
Now, let’s think about the body of the Scaffold. As the sample main content of our app, we’ll use the GridView that we built previously, which we keep in a separate widget named Content to avoid confusion:
class Content extends StatelessWidget { final List elements = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "A Million Billion Trillion", "A much, much longer text that will still fit"]; @override Widget build(context) => GridView.builder( itemCount: elements.length, gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 130.0, crossAxisSpacing: 20.0, mainAxisSpacing: 20.0, ), itemBuilder: (context, i) => Card( child: Center( child: Padding( padding: EdgeInsets.all(8.0), child: Text(elements[i]) ) ) ) ); }
On bigger screens, the body itself may be a Row that shows two widgets: the Menu, which is restricted to a fixed width, and the Content filling the rest of the screen.
On smaller screens, the entire body would be the Content.
We’ll wrap everything in a SafeArea and a Center widget because sometimes Flutter web app widgets, especially when using Rows and Columns, end up outside of the visible screen area, and that is fixed with SafeArea and/or Center.
This means the body of the Scaffold will be the following:
SafeArea( child:Center( child: MediaQuery.of(context).size.width < 500 ? Content() : Row( children: [ Container( width: 200.0, child: Menu() ), Container( width: MediaQuery.of(context).size.width-200.0, child: Content() ) ] ) ) )
Here is all of that put together:
(Large preview)
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( home: HomePage() ); } class HomePage extends StatelessWidget { @override Widget build(context) => Scaffold( appBar: AppBar(title: Text("test")), drawer: MediaQuery.of(context).size.width < 500 ? Drawer( child: Menu(), ) : null, body: SafeArea( child:Center( child: MediaQuery.of(context).size.width < 500 ? Content() : Row( children: [ Container( width: 200.0, child: Menu() ), Container( width: MediaQuery.of(context).size.width-200.0, child: Content() ) ] ) ) ) ); } class Menu extends StatelessWidget { @override Widget build(context) => ListView( children: [ FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_one), title: Text("First Link"), ) ), FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_two), title: Text("Second Link"), ) ) ] ); } class Content extends StatelessWidget { final List<String> elements = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "A Million Billion Trillion", "A much, much longer text that will still fit"]; @override Widget build(context) => GridView.builder( itemCount: elements.length, gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 130.0, crossAxisSpacing: 20.0, mainAxisSpacing: 20.0, ), itemBuilder: (context, i) => Card( child: Center( child: Padding( padding: EdgeInsets.all(8.0), child: Text(elements[i]) ) ) ) ); }
This is most of the stuff you’ll need as a general introduction to responsive UI in Flutter. Much of its application will depend on your app’s specific UI, and it’s hard to pinpoint exactly what you can do to make your app responsive, and you can take many approaches depending on your preference. Now, though, let’s see how we can make a more complete example into a responsive app, thinking about common app elements and UI flows.
Putting It In Context: Making An App Responsive
So far, we have just a screen. Let’s expand that into a two-screen app with working URL-based navigation!
Creating A Responsive Login Page
Chances are that your app has a login page. How can we make that responsive?
Login screens on mobile devices are quite similar to each other usually. The space available isn’t much; it’s usually just a Column with some Padding around its widgets, and it contains TextFields for typing in a username and a password and a button to log in. So, a pretty standard (though not functioning, as that would require, among other things, a TextEditingController for each TextField) login page for a mobile app could be the following:
Scaffold( body: Container( padding: const EdgeInsets.symmetric( vertical: 30.0, horizontal: 25.0 ), child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Text("Welcome to the app, please log in"), TextField( decoration: InputDecoration( labelText: "username" ) ), TextField( obscureText: true, decoration: InputDecoration( labelText: "password" ) ), RaisedButton( color: Colors.blue, child: Text("Log in", style: TextStyle(color: Colors.white)), onPressed: () {} ) ] ), ), )
It looks fine on a mobile device, but those very wide TextFields start to look jarring on a tablet, let alone a bigger screen. However, we can’t just decide on a fixed width because phones have different screen sizes, and we should maintain a degree of flexibility.
For example, through experimentation, we might find that the maximum width should be 500. Well, we would set the Container’s constraints to 500 (I used a Container instead of Padding in the previous example because I knew where I was going with this) and we’re good to go, right? Not really, because that would cause the login widgets to stick to the left side of the screen, which might be even worse than stretching everything. So, we wrap in a Center widget, like this:
Center( child: Container( constraints: BoxConstraints(maxWidth: 500), padding: const EdgeInsets.symmetric( vertical: 30.0, horizontal: 25.0 ), child: Column(/* ... \*/) ) )
That already looks fine, and we haven’t even had to use either a LayoutBuilder or the MediaQuery.of(context).size. Let’s go one step further to make this look very good, though. It would look better, in my view, if the foreground part was in some way separated from the background. We can achieve that by giving a background color to what’s behind the Container with the input widgets, and keeping the foreground Container white. To make it look a little better, let’s keep the Container from stretching to the top and bottom of the screen on large devices, give it rounded corners, and give it a nice animated transition between the two layouts.
All of that now requires a LayoutBuilder and an outer Container in order both to set a background color and to add padding all around the Container and not just on the sides only on larger screens. Also, to make the change in padding amount animated, we just need to turn that outer Container into an AnimatedContainer, which requires a duration for the animation, which we’ll set to half a second, which is Duration(milliseconds: 500) in code.
Here’s that example of a responsive login page:
(Large preview)
class LoginPage extends StatelessWidget { @override Widget build(context) => Scaffold( body: LayoutBuilder( builder: (context, constraints) { return AnimatedContainer( duration: Duration(milliseconds: 500), color: Colors.lightGreen[200], padding: constraints.maxWidth < 500 ? EdgeInsets.zero : EdgeInsets.all(30.0), child: Center( child: Container( padding: EdgeInsets.symmetric( vertical: 30.0, horizontal: 25.0 ), constraints: BoxConstraints( maxWidth: 500, ), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(5.0), ), child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Text("Welcome to the app, please log in"), TextField( decoration: InputDecoration( labelText: "username" ) ), TextField( obscureText: true, decoration: InputDecoration( labelText: "password" ) ), RaisedButton( color: Colors.blue, child: Text("Log in", style: TextStyle(color: Colors.white)), onPressed: () { Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => HomePage() ) ); } ) ] ), ), ) ); } ) ); }
As you can see, I’ve also changed the RaisedButton’s onPressed to a callback that navigates us to a screen named HomePage (which could be, for example, the view we built previously with a GridView and a menu or a drawer). Now, though, that navigation part is what we’re going to focus on.
Named Routes: Making Your App’s Navigation More Like A Proper Web App
A common thing for web apps to have is the ability to change screens based on the URL. For example going to https://appurl/login should give you something different than https://appurl/somethingelse. Flutter, in fact, supports named routes, which have two purposes:
In a web app, they have exactly that feature that I mentioned in the previous sentence.
In any app, they allow you to predefine routes for your app and give them names, and then be able to navigate to them just by specifying their name.
To do that, we need to change the MaterialApp constructor to one that looks like the following:
MaterialApp( initialRoute: "/login", routes: { "/login": (context) => LoginPage(), "/home": (context) => HomePage() } );
And then we can switch to a different route by using Navigator.pushNamed(context, routeName) and Navigator.pushReplacementNamed(context, routeName), instead of Navigator.push(context, route) and Navigator.pushReplacement(context, route).
Here is that applied to the hypothetical app we built in the rest of this article. You can’t really see named routes in action in DartPad, so you should try this out on your own machine with flutter run, or check the example in action:
(Large preview)
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(context) => MaterialApp( initialRoute: "/login", routes: { "/login": (context) => LoginPage(), "/home": (context) => HomePage() } ); } class LoginPage extends StatelessWidget { @override Widget build(context) => Scaffold( body: LayoutBuilder( builder: (context, constraints) { return AnimatedContainer( duration: Duration(milliseconds: 500), color: Colors.lightGreen[200], padding: constraints.maxWidth < 500 ? EdgeInsets.zero : const EdgeInsets.all(30.0), child: Center( child: Container( padding: const EdgeInsets.symmetric( vertical: 30.0, horizontal: 25.0 ), constraints: BoxConstraints( maxWidth: 500, ), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(5.0), ), child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Text("Welcome to the app, please log in"), TextField( decoration: InputDecoration( labelText: "username" ) ), TextField( obscureText: true, decoration: InputDecoration( labelText: "password" ) ), RaisedButton( color: Colors.blue, child: Text("Log in", style: TextStyle(color: Colors.white)), onPressed: () { Navigator.pushReplacementNamed( context, "/home" ); } ) ] ), ), ) ); } ) ); } class HomePage extends StatelessWidget { @override Widget build(context) => Scaffold( appBar: AppBar(title: Text("test")), drawer: MediaQuery.of(context).size.width < 500 ? Drawer( child: Menu(), ) : null, body: SafeArea( child:Center( child: MediaQuery.of(context).size.width < 500 ? Content() : Row( children: [ Container( width: 200.0, child: Menu() ), Container( width: MediaQuery.of(context).size.width-200.0, child: Content() ) ] ) ) ) ); } class Menu extends StatelessWidget { @override Widget build(context) => ListView( children: [ FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_one), title: Text("First Link"), ) ), FlatButton( onPressed: () {}, child: ListTile( leading: Icon(Icons.looks_two), title: Text("Second Link"), ) ), FlatButton( onPressed: () {Navigator.pushReplacementNamed( context, "/login");}, child: ListTile( leading: Icon(Icons.exit_to_app), title: Text("Log Out"), ) ) ] ); } class Content extends StatelessWidget { final List<String> elements = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "A Million Billion Trillion", "A much, much longer text that will still fit"]; @override Widget build(context) => GridView.builder( itemCount: elements.length, gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 130.0, crossAxisSpacing: 20.0, mainAxisSpacing: 20.0, ), itemBuilder: (context, i) => Card( child: Center( child: Padding( padding: EdgeInsets.all(8.0), child: Text(elements[i]) ) ) ) ); }
Onward With Your Flutter Adventure
That should give you an idea of what you can do with Flutter on bigger screens, specifically on the web. It’s a lovely framework, very easy to use, and its extreme cross-platform support only makes it more essential to learn and start using. So, go ahead and start trusting Flutter for web apps, too!
Further Resources
(ra, yk, il, al)
Website Design & SEO Delray Beach by DBL07.co
Delray Beach SEO
source http://www.scpie.org/responsive-web-and-desktop-development-with-flutter/
0 notes