Can push technology / comet be faked? - comet

Client has a dating site and would like to have a popup (either a nice javascript overlay or a new browser window popup. we're flexible.) displayed to users when another user is visiting their page.
I'm familiar with push technology and Comet but it's quite challenging to implement this and may place serious strain on a server with over 100,000 unique visitors per day.
I'm wondering if there is a way of faking this, perhaps by not being accurate to the second. I can't really think of any way.
This is a classic LAMP environment.
Anyone?
EDIT: what about this: placing an iframe on the page that refreshes every few seconds and at each page load it checks in the db if a visitor has been logged on this profile page. if so, it shows a message. the message would be visible but the background of the iframe would blend in with the background of the site and be invisible. if the message fades in and out, it would look like a JS box "popping up".

The only way to "fake" comet is via polling of some sort, which is always a possibility. An iframe, xhr, or jsonp request are all possibilities for performing said polling.
You might be better off purchasing a pre-built comet server (I'll recommend, of course, the one I helped build, WebSync for IIS/ASP.NET). If you're worried about the load, you could check out our On-Demand version where we'll host it for you.
Regardless, WebSync (or whatever other pre-packaged product you might check out) would scale to a hundred thousand users a day without much of a problem, and would potentially be more efficient than polling, since it would only hit your database when new users arrived, rather than every couple seconds; that said, if you keep the "check for new users" query simple enough, and a few seconds of delay is OK, the polling idea would be the "simpler" solution.

Check out http://en.wikipedia.org/wiki/Web_Sockets if you want to do real push. This isn't widely supported in browsers yet, but there are plenty of JavaScript and Flash libraries that provide it already.
Or a cheaper way is to record in your DB each page view.
Then when any user makes a web request, check in the DB if anybody has visited their page since their last web request.
If so, pop up your dialog.
This second way wouldn't popup anything if the user just left their browser sitting there, but if they were actively interacting with the site, it would achieve your goals very easily.
I would start with this second simpler solution, which is very easy to implement. If your client wants it more interactive, you can provide solutions and tradeoffs/costs for various options.

Gather statistics as to how many visitors that user's website gets per day, and then subdivide that, so that it's a percentage chance that the user will be told there is a user on his site (even if there actually isn't), based within the timeframe he's at the part where he can receive the popup. I think this is the closest you are going to get without having some sort of notification being sent.
You could do this to minimize server usage if you wanted push:
When a user visits a website, check and see if the person who would be getting the notification is online and capable of being notified, and if so, THEN do all the push stuff, otherwise forget it.

Related

SQL drop down selections in HTML

I'm new to HTML and coding period. I've created a basic HTML page. In that page i want to create dropdown selections that produce outputs from my SQL database. MSSQL not MySQL.
EX: If I select a table or a column from dropdown one and then input a keyword for selection box 2. I want it to produce a table that shows the information in that table/column with that keyword.
If I select a medical name from dropdown and I want it to show only medical names that are equal to Diabetes. and then show me those rows from my database to a table. How would I show that in HTMl from connecting to the database, to creating the dropdown selection linked to the database, and then being able to select the criteria for what I want to be displayed. and then showing that in a table or list format.
Thank you in advance
OK, Facu Carbonel's answer is a bit... chaotic, so since this question (suprisingly) isn't closed yet, I'll write one myself and try to do better.
First of all - this is a VERY BROAD topic which I cannot answer directly. I could give a pile of code, but walking through it all would take pages of text and in the end you'd just have a solution for this one particular problem and could start from scratch with the next one.
So instead I'll take the same path that Factu Carbonel took and try to show some directions. I'll put keywords in bold that you can look up and research. They're all pieces of the puzzle. You don't need to understand each of them completely and thoroughly from the beginning, but be aware what they are and what they do, so that you can google finer details when you need them.
First of all, you need to understand the roles of the "server side" and "client side".
The client side is the browser (Chrome, Firefox, Internet Explorer, what have you). When you type an address in the address bar (or click a link or whatever), what the browser does is it parses the whole thing and extracts the domain name. For example, the link to this question is https://stackoverflow.com/questions/59903087/sql-drop-down-selections-in-html?noredirect=1#comment105933697_59903087 and the domain part of that is stackoverflow.com. The rest of this long jibberish (it's called an "URL" by the way) is also relevant, but later.
With the domain in hand the browser then uses the DNS system to convert that pretty name into an IP address. Then it connects via network to the computer (aka "server") designated by that IP address and issues a HTTP request (HTTP, not HTML - don't mix these up, they're not the same thing).
HTTP, by the way, is the protocol that is used on the web to communicate between the server and the browser. It's like a language that they both understand, so that the browser can tell the server hey, give me the page /questions/59903087/sql-drop-down-selections-in-html. And the server then returns the HTML for that page.
This, by the way, is another important point to understand about HTTP. First the browser makes its request, and the server listens. Then the server returns its response, and the browser listens. And then the connection is closed. There's no chit-chat back and forth. The browser can do another request immediately after that, but it will be a new request.
Now, the browser is actually pretty limited in what it can do. Through these HTTP requests it gets from the server the HTML code, the CSS code and the Javascript code. It also can get pictures, videos and sound files. And then it can display them according to the HTML and CSS. And Javascript code runs inside the browser and can manipulate the HTML and CSS as needed, to respond to the user's actions. But that's all.
It might seem that the Javascript code that runs inside the browser is all powerful, but that is only an illusion as well. It's actually quite limited, and on purpose. In order to prevent bad webpages from doing bad things, the Javascript in each page is essentially limited to that page only.
Note a few things that it CANNOT do:
It cannot connect to something that doesn't use HTTP. Like an SQL server.
It can make HTTP requests, but only to the same domain as the page (you can get around this via CORS, but that's advanced stuff you don't need to worry about)
It cannot access your hard drive (well, it can if the user explicitly selects a file, but that's it)
It cannot affect other open browser tabs
It cannot access anything in your computer outside the browser
This, by the way, is called "sandboxing" - like, the Javascript code in the browser is only allowed to play in its sandbox, which is the page in which it was loaded.
OK, so here we can see, that accessing your SQL server directly from HTML/CSS/Javascript is impossible.
Fortunately, we still need to talk about the other side of the equation - the web server which responded to the browser's requests and gave it the HTML to display.
It used to be, far back in the early days of the internet, that web servers only returned static files. Those days are long gone. Now we can make the webserver return -- whatever we want. We can write a program that inspects the incoming request from the browser, and then generates the HTML on the fly. Or Javascript. Or CSS. Or images. Or whatever. The good thing about the server side is - we have FULL CONTROL over it. There are no sandboxes, no limits, your program can do anything.
Of course, it can't affect anything directly in the browser - it can only respond to the browsers requests. So to make a useful application, you actually need to coordinate both sides. There's one program running in the browser and one program running on the web server. They talk through HTTP requests and together they accomplish what they need to do. The browser program makes sure to give the user a nice UI, and the server program talks to all the databases and whatnot.
Now, while in browser you're basically limited to just Javascript and the features the browser offers you, on the server side you can choose what web server software and what programming language you use. You can use the same Javascript, or you can go for something like PHP, Java (not the same as Javasctipt!), C#, Ruby, Python, and thousands of others. Each language is different and does things its own way, but at the end of the day what it will do is that it will receive the incoming requests from the browser and generate some sort of output that the browser expects.
So, I hope that this at least gives you some starting point and outlines where to go from here.
First of all there is something that you need to know to do this, and that is the difference between a front-end and a back-end.
Html is a front-end technology, they are called like that because that's what is shown to the user and the back-end it's all mechanisms that run behind the hood.
The thing is, in your front-end you can't do things of back-end, like do querys from a database, manage sessions and that kind of thing.
For that you need a back-end running behind, like php, ruby, node.js or some technology like that.
From the html you can only call functions on the server using things like <form action="/log" method="POST"> this wold call the action /log that you should have already program on your back-end. Don't get confuse with this, there is plenty of ways to sending request to your back-end and this is just one way to do it.
For your specific case I recommend you to look up for ajax, to do the query on your database with no need of the browser to refresh after the query is made.
Some topics you need to know to understand this is:
-what's front-end and back-end and their differences.
-what is client-server architecture
-ajax
-http requests
-how to work with a back-end, doing querys to the database, making routes, etc.
-and for last, wile your server it's not open to the world with your own domain name, what is localhost and how to use it.
I hope that this clarify a bit this, that is no easy thing, but with a bit of research and practice you will accomplish!

change webpage instantaneously on action off another person

I was wondering if it is (easily) possible to update a webpage when there is an action on another webpage.
Example: I check a checkbox and on another webpage, which is already open, there need to be a change. This must be done instantaneously and the time must be as small as possible.
I do not have any code written yet, so i can't show anything.
My first thought would be to put the result of the checkmark in a database with javascript and check the database with ajax every 10 ms on the other webpage.
But i know this will be too slow for me.
Is there a better way to do this (relatively easy)?
No, that is usually not possible without both websites coming from the same domain, and that domain establishing communication between the two Javascript sandboxes run in these two windows.
The point here is that what you describe would be called a cross-site-scripting attack (short XSS attack) and is the security nightmare of every browser developer and website admin.

Increasing Google Chrome's max-connections-per-server limit to more than 6

As far as I know, at the current moment, late 2011 the max-connections-per-server limit remains 6. Please correct me if I am wrong. This is bad that we cannot fix this easily as in Firefox. As far as I know this value is hardcoded.
One of the solutions is to download the Chromium's sources and rebuild them. Is there a more easy solution?
Is there any tricky way to hack this without creating a dozen of mirror-domains?
Why I'm asking the question: My task is to create a html-javascript slideshow that will run inside a fullscreened browser, and a huge monitor is hanging on the wall. The javascript is really complicated, it preloads photos and makes a lot of ajax calls to my web services. If WIFI connection is slow, if 6 photos are loading, the AJAX calls fail, the application runs bad. I want a fast solution based, on http or browser or ubuntu tweak something else, because rebuilding the javascript app will take days.
Offtopic: do you know any other things that can be tweaked in my concrete situation?
IE is even worse with 2 connection per domain limit. But I wouldn't rely on fixing client browsers. Even if you have control over them, browsers like chrome will auto update and a future release might behave differently than you expect. I'd focus on solving the problem within your system design.
Your choices are to:
Load the images in sequence so that only 1 or 2 XHR calls are active at a time (use the success event from the previous image to check if there are more images to download and start the next request).
Use sub-domains like serverA.myphotoserver.com and serverB.myphotoserver.com. Each sub domain will have its own pool for connection limits. This means you could have 2 requests going to 5 different sub-domains if you wanted to. The downfall is that the photos will be cached according to these sub-domains. BTW, these don't need to be "mirror" domains, you can just make additional DNS pointers to the exact same website/server. This means you don't have the headache of administrating many servers, just one server with many DNS records.
I don't know that you can do it in Chrome outside of Windows -- some Googling shows that Chrome (and therefore possibly Chromium) might respond well to a certain registry hack.
However, if you're just looking for a simple solution without modifying your code base, have you considered Firefox? In the about:config you can search for "network.http.max" and there are a few values in there that are definitely worth looking at.
Also, for a device that will not be moving (i.e. it is mounted in a fixed location) you should consider not using Wi-Fi (even a Home-Plug would be a step up as far as latency / stability / dropped connections go).
BTW, HTTP 1/1 specification (RFC2616) suggests no more than 2 connections per server.
Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. A proxy SHOULD use up to 2*N connections to another server or proxy, where N is the number of simultaneously active users. These guidelines are intended to improve HTTP response times and avoid congestion.
There doesn't appear to be an external way to hack the behaviour of the executables.
You could modify the Chrome(ium) executables as this information is obviously compiled in. That approach brings a lot of problems with support and automatic upgrades so you probably want to avoid doing that. You also need to understand how to make the changes to the binaries which is not something most people can pick up in a few days.
If you compile your own browser you are creating a support issue for yourself as you are stuck with a specific revision. If you want to get new features and bug fixes you will have to recompile. All of this involves tracking Chrome development for bugs and build breakages - not something that a web developer should have to do.
I'd follow #BenSwayne's advice for now, but it might be worth thinking about doing some of the work outside of the client (the web browser) and putting it in a background process running on the same or different machines. This process can handle many more connections and you are just responsible for getting the data back from it. Since it is local(ish) you'll get results back quickly even with minimal connections.

What turns away users/prospective users?

In your experience as a developer, what kinds of things have turned away users and prospective users from using your programs? Also, what kinds of things turn you away from using someone else's programs?
For example, one thing that really bugs me is when someone provides free software, but require you to enter your name and email address before you download it. Why do they need my name and email address? I just want to use the program! I understand that the developer(s) may want to get a feel for how many users they have, etc, but the extra work I have to do really makes me think twice about downloading their software, even if it does really great things.
Requiring lots of information when signing up -- name and email is bad enough, as you say, but some registration forms have many many fields. The fewer the better.
Charging money but refusing to disclose the price unless you speak to a sales rep
Having a web site that only works in certain browsers
No releases since 2003
No documentation
Support forum with many questions and no answers
Here are a few annoyances that I haven't seen anyone else mention:
Programs that auto-launch one or more processes at system startup that run constantly in the background (invisibly, in the clock tray, or otherwise).
While some of these are necessary, most would either be better implemented with a utility that runs periodically (use the system's task scheduler!) or don't need to be launched until the associated program is launched.
Dialog boxes that pop up on top of all open windows (even those of other applications).
This is even more annoying if you run full-screen apps.
Pop-up dialogs that won't let you switch to another app until they are dismissed make me want to throw something.
Stealing my file type associations or changing the icons associated with a MIME type when I already have that type assigned to another application. At an absolute minimum, ask me first.
Storing user data/documents in file types that can't be opened by other applications
The worst is when files are also bound to a specific version of the application
Automatically cluttering my desktop and quick launch menus with icons
Automatically adding a link to your crappy website into my web browser's bookmarks
Assuming I use Internet Explorer and launch it specifically instead of querying the system for the default browser (same goes for media player, email client, etc)
Failing to understand the difference between user-specific settings and system-wide settings
Re-mapping common, near-universal keyboard shortcuts (cut, paste, undo, print, refresh, etc) for no good reason
If you're going to re-map Ctrl+C from "copy" to "close without saving anything", at least pop up a dialog warning people when they use it
Requiring an exact version of a library or framework. I don't want to have to uninstall the .Net 2.0 framework and re-install 1.1 just to run your program.
Spelling, punctuation, or grammar errors in the user interface or documentation. If you can't be bothered to at run (at least) an automated spelling checker, then you probably also didn't bother testing your app properly.
Displaying error messages to the user in a way that isn't useful. I don't care if "unexpected error #3410 occurred", I want to know what on earth that means and what I should do about it.
If you thought the error was important enough to program in a unique error message, why did you instead program error-handling code that could gracefully handle the situation? Only let me know about an error if I caused it directly or if I can fix it.
On a related note, aren't all errors unexpected?
Sending me to a website when I click "Help" instead of including help files with the local installation. I don't mind if you periodically download updated help files from the web, but people still need documentation when an Internet connection isn't available.
Bulleted lists that are way too long.
Setup programs that come bundled with all sorts of freeware (even things like Google toolbar) that are selected by default. I just want the program I downloaded, not all sorts of other programs. I can understand that developers might get something in return for including these add-ons in their setups but I hate it when they are selected to be installed by default.
Automatic updates and "information" screens that pop up every single system startup.
Yes, you updated yourself good job but I don't care nor want to know that you have. Do I really have to click "No, I don't want to upgrade to the pricier version" every single time I start my computer?
Ad infections. You know the kind where if you scroll your mouse over the text your reading it'll pop up a thing so you can't read it anymore. And flash ads that have sound(especially that you can't turn off. this was the reason I installed adblock plus) and pop up windows that happen multiple times while your sitting on a page.
Also, pop ups telling me to join a sites news letter mailing list. (where the "no" button is very small)
I will rethink downloading something if I think they will start sending me SPAM if I give them my e-mail address.
At a previous employer we had a program I helped write that was online as a "free" download. They had to put something in for Name, address, phone, and e-mail. Oh, and no opt-out checkbox. It annoys me when other companies do this, but I didn't have any say in the matter.
The info needed for free things gets me too, but other than that:
Bundled software, most of the time adware or browser bars
Having to click too many times to do a simple action
Websites that advertise "Free Download!" for something that turns out to be a paid app. Wow, so generous to allow me to transfer data over the internet for free.
Putting an icon in the taskbar when I don't want it there.
I installed an app called Pamella that records Skype calls. I'm fine with 1 icon in the taskbar -- Skype's icon -- but Pamela adding a second just got me angry and I uninstalled it.
Ugly / unfit user-interface. For me, this is really important.
Having to register to download the program (specially if it's freeware)
Browser-specific / requiring special/other applications to work properly
Bloated applications that start with a few MBs and finally grow to 100's of MBs and huge mem consumption.
That'd be most of the things that turn me away from a program.
One of the things that bugs me the most (using, not downloading to try in the first place...):
I download or buy software it is because I want to USE it for something. If it is so friendly that it is 100% intuitive and needs no documentation before being useful, great! If it has comprehensive on-line or other help that answers all my questions as they come up, that's OK too.
However, if it has any kind of learning curve at all and nothing but my own persistent trial and error before I can do anything with it.... Off the drive it goes, within the first 5 minutes. Well, maybe I will use it if I am being paid to, but even in these cases I would probably recommend something else.
A user interface that is so simple that practically no documentation is required, or that has documentation that is accessible is a joy to use. If the program is complex and requires non-trivial documentation, that documentation should explain EVERYTHING a user might want to know, making no assumptions about his or her prior knowledge. That also puts my appreciation meter way up there.
Make your software actually do something people want done, and make it painless for them to do that with it, and you will have lots of satisfied users and word of mouth recommendations.
I left this on my list but it's a big enough annoyance that it probably stands on its own:
Software that requires users to pay for bug fixes, security patches, or critical updates.
If you have a patch that adds some new feature that I want, I don't mind paying for it. If you made a mistake and you are trying to get me to pay you to fix your mistake, then that's where we have a problem. Any physical product manufactured and sold would call this a "recall" and wouldn't dare charge customers to fix it.
In the past, some software products have shipped with known flaws to encourage users to buy the "critical updates subscription". This is downright evil.
How much pain am I going to endure to develop a conscious competence in using the program? Some computer games I tried to play but after a few hours if I haven't figured things out, I'll stop playing. If a program is hard to use and I don't have a really good motivation to resolve it, that will stop me right there.
How complicated is the installation process? How many minutes will I spend getting the basics of the program understood so I can be productive with it? How close to other programs is it, so that I can leverage how I use other programs to use this,e.g. if I've used Microsoft Office for years are the menus similar to that or is it someone else's idea of the ultimate menu system? Those are the questions I tend to wrestle with in a new program.
If something takes hours to install and then more hours to configure for my use, this really makes me question how useful is the software, really. I can understand the appeal of software that can be customized in a bazillion ways, but if I'm just getting used to the software, do I want these options at this point? To give an example of how absurd this would be in other situations, imagine if you had to list all the ingredients in a pizza or an automobile before getting to the options that mattered to you? You have to list everything in the pizza dough or car's body that most people don't think twice about what is there.

Make a web chat with twisted

I've made a chat that I can connect with Telnet to. My chat is currently implemented as a Twisted TCP Server. How do I transform it into a chat for the browser?
I suppose I should use a comet server (e.g. Orbited) to be able to serve static HTML and dynamic content simultaneously. Is such a comet server necessary for a fast and reliable chat?
Comet is the best option without using anything special (like Flash, see below). It's a proven technology and is used by many big sites, like Gmail's chat and Facebook's chat.
The only other option you have is polling, but that can sometimes get a bit intense on the server. You basically have to weigh server load against speed - if you poll often, you get a very responsive client, but you put a lot of load on your server. Poll too little and you keep the load light but clients can only receive messages every n seconds so it can seem slow.
If you decide to poll, you could always create a "back off" system. For example, the page checks every 2 seconds to see if there are any chat messages sent. It does this 5 times and if there is nothing, it increases the delay to 3 seconds. It does this 5 times and after nothing it goes to 4 seconds..etc. When a chat message is sent it goes back down to the shortest delay.
Another option to consider that is even better is using a Flex or Flash client. This way, you can just use TCP sockets which only send data if there is any. But that's only if you really want a Flash app on your site.
Yeah it is! Check www.meebo.com ! They use comet as their basic platform!