What is a rich web application?
There can be a pretty big difference between a "web site" and a "rich web application" even though they both are accessed through a common medium: a web browser. A good example of a "web site" is CNN.com. This web site serves dynamic content from a database but offers little in the realm of user interactivity beyond paging through images, watching videos, and clicking on links.
In contrast, a good example of a "rich web application" as mentioned earlier is Facebook. This web application offers a high degree of interactivity with users for both content consumption, creation and general rich interactivity. Many business applications that may exist in a thick client would also fall into this category.
The scope of this post deals with "rich web applications" and not "web sites".
A perfect simple example of a "rich web application" can be demoed in the form of a todo list.
Before you read any more feel free to take a look at it in action here. The source will be very helpful to comprehension of this post and is available here.
In essence, the app has two "screens"; One for adding and deleting todo list owners, and then another for editing each owner's name and their todo list.
On the screenshot below, a user can view all the Todo lists that are registered in the application, edit, delete or add another list.
Once the user selects "Edit" or "Add", a side panel expands to the right that allows for the creation/deletion of Todo list items as well as editing owner information.
After a list is saved or a new list is added, the original screen is refreshed to reflect the changes and the side panel disappears.
If you looked at the demo, you've probably realized that this exact same todo list application has been created using ASP.NET MVC & jQuery and also in WebAPI & Angular.js. Lets explore the differences and see if we can uncover some useful information about the frameworks themselves.
jQuery burst onto the scene in late 2006 as a solution to the downright nasty code that used to be needed to create even the most basic hints of a good, rich user experience in the web.
jQuery UI allows for rapid implementation of common UX paradigms like modals, datepickers, sliders, etc.
jQuery provides many benefits. Without a doubt, you would have to be a glutton for pain to attempt a rich UX without at least considering it's use. jQuery is not without it's significant downfalls, however, which are discussed below and will be demonstrated in part by the todo application.
There are two main goals when developing an interactive application: content display and content creation. HTML in essence was not designed for creating dynamic views. It was designed to display "static" content and doesn't offer an efficient means for manipulation after initial rendering. jQuery doesn't effectively help with this shortcoming. It offers a way to manipulate the DOM but does not offer an easy way to write code against a changing model state, and then sync it back with the server again.
This is in part due to HTML's poor ability to organize complex, structured user input that will need to eventually be mapped back to some sort of an object graph for server side storage. Furthermore, DOM objects (as retrieved and manipulated by jQuery) do not offer an efficient means to code against to provide a dynamic user interface without creating complicated, abstract code.
One of the requirements for the TODO list app is to allow for the user to build a list of TODOs in the client. Once they click save, the list and owner information is persisted back to the server. This task, which may likely seem rather trivial to your business stakeholders, is actually a lot more complex than it should be due to the nuances of jQuery and MVC.
In order to create each TODO list row, we essentially need to loop over each TODO item in the list. This is handled just fine in a C# foreach loop on the server when the page is initially rendered, but we cannot use C# to loop out additional TODO list items added client side. (We could of course do a full POST back somehow notifying MVC to add an additional empty row on the next render, but this could introduce a full DOM refresh as well as undesired legginess and latency to the user/application).
data-val-number="The field Priority must be a number."
data-val-range="The field Priority must be between 1 and 10."
data-val-required="The Priority field is required."
The best solution I could muster for this was to use jQuery to clone the above template whenever an item is added. The index of the new item replaces the ### in the template above. Note that the name attribute convention is to comply with how the MVC model binder requires array items to be formatted. Also included is some unobtrusive validation attributes for MVC validation which introduces some verbosity as well.
//block click handler bubble, don't forget or this will cause the form to post!
The template that is cloned is free to get out of sync with what Razor will generate (It was initially copied from a rendered view to start with). We have essentially duplicated the TODO item markup and lost strong typing as a result. You must remember to change both if anything changes!
append a <span> to those items after setting the class of the <span> to "foo".
Manipulating a GUI's layout with code is and has always been cumbersome at best. This is why Silverlight and WPF took a 180 degree turn on the WinForms paradigm. However, at the heart of it, jQuery DOM manipulation for a dynamic UI looks far more like WinForms than it does like WPF/Silverlight.
Even worse, the tight coupling (and the lack of conspicuousness of this coupling) often means that if designers move some HTML around, or even add/remove a CSS class name (because CSS classes are often overriden to be used as jQuery selectors) it can have disastrous side effects that can render large portions of jQuery code useless. Worse yet, when the problem is discovered it can be very difficult to change and re-factor existing jQuery code to 'work' with a new layout.
Imagine if you were to create a C# application with no namespaces and no classes (and the scoping that classes can create). Sounds like a mess, right? Bingo! The above code turns into just that in no time! Just wait until someone in one part of the app defines another openWindow because they want to do it differently….
//the below closure is good because it creates "variable privacy"
Right away I can spot one blaring problem with the above code: what if an ID with "grid" exists anywhere else in the application, or heck, even on this page? This example is a bit contrived, but any time a jQuery selector is used it must be used very carefully and scoped appropriately, otherwise you may be effecting a whole different set of elements than you intended. For this reason, even well separated and best intentioned jQuery organization schemes quickly become cumbersome with even medium sized applications.
ASP.NET MVC is arguably the successor to ASP.NET Web Forms and most developers that have switched haven't looked back. It provides a strongly typed, testable, and a "simpler than Web Forms" way to create complex web sites.
Model binder and view engine provides a simply amazing way to strongly type your views to C# view models and move that data back and forth between the client and server with ease using common web paradigms such as form POSTs and GETs.
Provides a simple API that abstracts away the nuts and bolts of ASP.NET to allow for highly compartmentalized testable code.
Very customizable and extendable: do what you need to meet business requirements without creating a hacked, hard-to-maintain mess.
In addition to hacks to get a list to work with MVC, I ended up having to copy and paste the generated HTML output from the "TodoList.cshtml" file in order to allow for the model binder to work when adding items client side. Take a look at "Creating TODO list items" and "Deleting TODO list items" in the jQuery section above to see exactly what this looks like. Essentially, in order to prevent slow UX whenever a TODO list item is added, an HTML template is cloned client side and then the names of fields are filled in with their correct array index so that the model binder can pick it up on a POST. The huge down side of this is the complete duplication of code: a for-loop for rendering the list items on the server and then another for-loop for rendering on the client.
As we can probably agree at this point, using the DOM as a model for anything more complicated than a flat simple collection of a few input fields is not a good idea. Unfortunately, MVC is mostly designed and intended to be used with <form>s which means exactly this.
Forms are great for doing simple things with flat data. Unfortunately they are a hold over from a time when about as interactive as the web got was animated GIFs, image maps and guestbooks. The web has changed significantly since then and has arguably evolved into a first class application development platform that can compete with, and even beat traditional thick client applications in terms of ease of development AND user experience. The <form> was not intended to be used for creating rich, interactive applications in this manner.
doesn't allow for a thick client like experience as the developer cannot readily store data/state in memory on the client because the DOM keeps getting blown away. WebForms tried it's hand in fixing this with ViewState, one form per page (with lots of magic) and the POST-back but this resulted in lots of problems and complexity as we know.
As already discussed a <form> with its associated <input>s result in a very 'nasty' key-value structure that is difficult to parse into a rich object model. The MVC model binder does a good job for simple stuff but becomes unnecessarily complicated when you venture from the simple and flat.
At the heart of Angular.js and WebAPI's effectiveness at producing rich web applications are two things that plague jQuery and ASP.NET MVC: client side model representation and serialization.
Angular.js' approach looks and feels similar to what you may have seen using Silverlight or WPF with a few twists.
For the purposes of this post we won't cover a deep dive on what scope is but we will cover the basics: scope in Angular.js can be used a lot like a 2-way bound ViewModel.
Since Angular.js has a templating engine built in, there is no duplication of code: all rendering is done on the client as it is two-way bound to scope rather than duplicating rendering logic on both the client and server. Here is what the entire TODO detail edit view looks like as it is bound to the above model.
Not a whole lot more needs to be said about this if you have noted the above examples. Note that no DOM manipulation or even knowledge of the DOM is required: The 2-way model binding afforded by scope and the ability to run functions attached to scope makes DOM manipulation unnecessary. In fact any sort of DOM manipulation outside of directives is perhaps the #1 cardinal sin of Angular. Don't do it! It's pretty easy to not even be tempted since the 2-way model binding works so well with the suite of built in directives (ng-model is a directive for example). The community around Angular.js is so extensive that custom directives often only need to be hand-written for very domain specific problems in general.
//configure Angular.js before the app starts.
$scope.todoList = $stateParams.id === 'new' ?
Perhaps the first thing you think when you look at the above code is: why is everything in the same file? Angular.js is very flexible. Since this is a small application, I chose to put everything into a single file and use the fluent syntax to define my application. I could have just as easily split apart each 'dot' component of the application into separate files . Furthermore, you can even bundle components into modules. Note on line 1 that the application pulls a dependency on two other 3rd party modules that are free to define their own things. In this manner modules function in a very similar manner to namespaces or assemblies in C#.
At the heart of everything in Angular.js is dependency injection. Not only do explicit dependencies allow for ease of code comprehension and organization but they also allow Angular.js to be extremely unit testable. One way of injecting dependencies into Angular.js is to simply specify the dependency's name as the argumentName in which they are to be injected. This is a bit mind-blowing to see at first but there are many examples of this occurring above.
Factories are a way to instantiate types for consumption as downstream dependencies. Factories are also singletons and can be used as a way to share state between different things. Note that a factory is used to create a "resource" to interact with the WebAPI RESTful service for TODOs above.
A controller is a type of directive that is essentially a "scope container". In the TODO example app there is one controller per view; a common pattern in Angular.js development. The scope that is DI'ed into each controller is it's own separate, isolated "viewmodel" which can be used as a communication medium to the controller's underlying associated view. See "routing" below to see how the controllers and views are associated.
The router provided by angular-ui is nothing short of amazing in terms of simplicity and scalability. This app might only have two routes but you could easily make that number 200 with little loss in simplicity or comprehension ability. Routes are a way to tie a particular hash fragment URL (EX: #/todoLists) to the activation of a particular specified controller and an associated, bound view. Routes can also specify parameters which are parsed and passed into the activated controller (for example #/todoLists/TodoLists-1 informs the controller to load a TodoList with the ID "TodoLists-1"). Contrast the router to the method in which I hacked together "routing" with jQuery. It is not robust enough to be maintainable for much larger an app than this one.
Angular.js and it's "resource" plugin make interacting with RESTful APIs (that follow REST conventions) a snap. It is being used above. I can't readily think of a more concise abbreviated syntax in which to do it. Angular also has it's own AJAX wrapper, "$http" that can be DI'ed whenever you need it as you would expect.
Designed to make implementing RESTful APIs as easy as possible.
Designed around returning HttpResponseMessages or objects (as JSON by "default" or any way you want!) directly rather than rendering views. Removes a lot of AJAX/JSON pain that ASP.NET MVC has.
Has first class Async and OData support.
Looks a lot like ASP.NET MVC but everything lives in a different assembly/namespace.
I saved perhaps the most daunting one for last: Angular.js is complicated. This was my initial excuse to not learn it and I regret that immensely. I found Knockout.js + Durandal.js far easier to learn (coming from a Knockout .js and MVC background mind you) but it is the wrong approach in my opinion.
I've found though that once you invest the time to learn Angular.js and all of it's intricacies, it is definitely way more than worth it. The speed, ease of development, scalability, lack of code you have to write, and lack of complexity is simply amazing. Stuff just works, but it is going to take you a month or two to become extremely effective in the framework. Contrast this to something like ASP.NET MVC + jQuery or Durandal.js/Knockout.js: You can use the frameworks for a long time and become pretty proficient but your code will still be riddled with hacks, disorganization, complexity and WAY too much code if you are trying to create a rich web application.
I hope this post has made you think about Angular.js + WebAPI as being a more-than-viable replacement to jQuery + ASP.NET MVC development. Without a doubt the latter was one of the best stacks out there a few years ago, but as it always does, technology keeps improving! I have personally been using Angular.js + WebAPI for an ever-increasing-in-size complicated, interactive SPA and haven't looked back. There are plans to expand the app even more, and I have no doubt that it will be easy to extend with little to no added complexity since it was started with the right foundation.
Make sure to download the demo code or view the demo live if you haven't already. I hope this post was useful, leave any feedback below!
If your interested in finding out more about Angular and my experiences in it feel free to take a look at my personal blog. I am also working on an open source project, AngularAgility, which aims to make common UI paradigms even easier to implement in Angular.js such as rich client side validation with messages, notifications and more. For example AngularAgility Form Extensions is a DSL that allows you to create Twitter Bootstrap form fields with interactive client side validation and dirty tracking in one line of HTML! You can check out the project's source here and a demo here.
Please let ILM know if you are interested in hearing more about Angular + WebAPI, custom application development or to arrange for training. We would be more than happy to help!
Very good post. It cleared all my doubts about angular js usage. Thanks again!
Excellent work, this gives me background and motivation to get going on angular.
Great post! Where you able to create the Validation plugin?
Wow, the form extensions look really cool! I checked out the code and did some tests on the Live Demo and it looks exactly like what I was looking for.
Also we just got a request from a customer to use ASP.NET MVC for a new project and I was investigating wether going full API or not. To a point it seems like *some* work might be duplicated while using an API, but having this simplifies the process greatly.
I like the examples but i dont really agree with your pros and cons.
I think your cons against jquery are a bit harsh. Jquery certainly makes it easy to manipulate com and that is pretty much a requirement of almost every single page app. Just as it makes it easy though doesn't automatically make dom your model. Every framework that renders in the browser manipulates dom one way or another – so just because jquery is a lower level library than some other frameworks does it mean you shouldn't make a framework using jquery just as many of those others do? Personally I see a parallel between dom on a webpage and a memory mapped graphics or probably more closely a vector based graphics facility and if you choose to start at a low level of dom you can get fantastic results in a clean way if you build up your own libraries or framework on top.
I guess you chose to use dom as your model in your jquery example but in the real world that's ok if an extremely small program. With the separation of concerns exactly the same argument. As the developer of your todo list you can define your own concerns which are important for you to separate based on what you feel might best suit your apps future roadmap. Now imagine if you wrote a Toronto list class that had the option of rendering to a provided com element – that is one example of separation of concerns and it may even have a separate model if that is also important to you. Why a class? What if you want to programatically manipulate a todo list? Perhaps have a method to merge multiple of them? Or even display multiple on the one form? That decoupling of the todo logic certainly makes that easier.
ASP.net definitely has its fans but it is so full of restrictions it makes it hard to do anything really good but again it depends on if you go with its forced structure or break its rules and separate your concerns in your most appropriate way – just my way fights ASP.net's MVC a lot.
I agree on the JS+Ajax over forms as it gives you greatest flexibility.
AngularJS is interesting but also restrictive like Microsoft MVC and I really wouldn't call it an application framework but a step above (or aside) from JQuery. I am a fan of Jquery – although not perfect its pretty good for what its designed to do. Angular seems geared towards 90s style web apps with a cleaner codebase. Its binding works well but slowly it has scoping and a separation of concerns but their forced choice of concerns. Some features are useful sometimes but rather than making them totally optional they have encouraged their use (such as routing) making some apps annoying to develop in AngularJS. Noone should have to fight a framework.
My typical web app such as demonstrated here http://www.youtube.com/webrenovators is based on our own 'app framework' that only really depends on JQuery as a minimum because we like the way selectors work. Its an app framework because it has proper app facilities and services (we called the framework RapidOS though). Print services (direct to printer including thermal as well as remote printing even from a mobile device to a printer across the World) – single page and multiple page support even mixed in the same app – sdi and mdi – multitasking – multimonitor support (for operations bridge) – interprocess communication – API – security – and more importantly than anything else is its so easy to program with even high school students can create apps with it.
I really appreciate the comment! Just to give you a little more background on myself before I specifically address your concerns with Angular vs jQuery.
I've been using Angular for the past year in a lead-type role to develop multiple SPAs totaling a few hundred pages and this is what I've found: Unless I'm writing a DSL or trying to make a 'very re-usable component (like AngularAgility)' 95% of the time I don't even need to think about DOM nuances because an 'MVVM style' object model works absolutely perfect for what I'm trying to accomplish. Angular provides a very nice abstraction in this sense and avoids you having to know some pretty in-depth DOM manipulation rules (which I've seen JR and SR devs alike trip over).
What I've also found over the last year is I end up writing 5-10x less code than I would have written using jQuery to build a interactive application. Angular definitely has a learning curve but once you pick it up you really appreciate the "there is probably no way to make this code any more tearse" mentality that Angular provides. And you can always drop into jQuery *whenever* you want. Angular just forces you to do it in a little sandbox which is *really good* if you've seen the jQuery messes I have! I haven't taught Angular to anyone that has wanted to go back to jQuery or Knockout for that matter after using it and I think that says something.
Most people would always like to have less, easy to understand code (once you have Angular understanding) than have 5-10x more code that requires an entirely different set of domain knowledge. (5-10x more code and I've often seen jQuery apps become a tangled, unmaintainable mess unless you have extreme organization skills and/or use something like Backbone to help).
First, please excuse the typos in the original post, mobile devices love to think they know what you want to type and decide to screw it up… 'todos' = Toronto? 'dom' = com?
I looked at Angular Agility and it certainly reduces code in the examples, but… why would anyone want to write code as per the pre-reduced code in the first place? Why would they want to put logic in the HTML? And put so many static messages in the HTML like that? If you want to test your logic without the presence of Angular, how do you do it? How do you easily replace Angular when it comes to end of life and your code base is now half a million lines long?
I do actually like AngularJS in some ways, but not in others. It might in the end come down to which flavour of tomato sauce you like most, but I still found it inflexible for doing typical things. It seemed too 'html'-centric which is ok if you want to output html, but not giving you much flexibility when you don't want to. What if you choose now to render it on a canvas instead of html? or don't want to render anything at all, such as with a print spooler (where it might send a noficiation when complete)?
Writing less code is always good and i doubt anyone will dispute that – but the code will ideally be the least you need to write to keep it maintainable, understandable and actually achieve what you want to achieve. I found when playing with AngularJS, it was just too messy to create a proper MDI system that can fall back to SDI, the routes can work, but came down to creating custom routers that didn't have much to do with what AngularJS was trying to encourage you to do – although I'm unsure what they were thinking when they did it, how it's supposed to work in a typical MDI type environment? I guess rather than criticise AngularJS for what it doesn't provide, I should praise it for what it does – that is a clean way to create somewhat simple dynamic html (only) pages with not much code.
I'm not yet convinced with AngularJS, but I won't totally disregard it yet either – it's probably one of the 3 noteworthy frameworks outside of roll-your-own better one that I can think of. SomaJS, RappidJS (NOT related to RapidOS) and AngularJS in that order… (JQuery or Underscore to me aren't frameworks – but very good libraries).
I looked at the other frameworks you mentioned and they look interesting. Soma looks a lot like Angular minus directives, as much of a DOM abstraction and a little more verbose. Rappid looks like they were trying to pull off XAML in HTML without the awesome 2-way binding on POJOs that Angular has (which is one of the most important things with Angular for me). Everything else aside I would say the biggest issue with both of them for me is Angular has about 23,500 more stars on Github than either of them do and there are about 1000 articles/plugins to do anything with Angular that you can think of almost. Using a popular framework is a huge due-diligence consideration for me because you need to be able to hire people to work on things and also get answers to questions/issues online. Angular also has a team of 20 full time "google smart" people working on the project which also gives it a huge *unfair* advantage.
To date I haven't really met anyone that used Angular extensively and wanted to switch to anything else. (I'm sure this will change as time goes on but the only serious contender I've seen to Angular right now is Ember.js in my opinion but that's a whole different discussion) I've been around the framework block a few times on huge applications and still just love it. Build out a big app with it and see how it goes!
i am not using soma nor rappidjs but of all the frameworks ive looked at soma was one of the nice ones style wise and probably my first choice after jquery or rapidos. I like parts of rappidjs not including the templates and xaml. Actually meteor is one to follow also and is very automatic like angularjs although also restrictive in the same way but i think its early days still for meteor.
Even with rapidos there isn't a lot of dom manipulation code. Sure there is a bit but for an extremely complicated form it might be only 20 lines of code. Hardly worth worrying about and they are actually similar to the html directives of angularjs but done differently. Jquery i really am a fan but you can use it in many ways. I use it to create a vb6 like form structure in a few lines of code but more flexible and structured than vb6. Flexibility is important but just as important is the maintainibility and scalability. A good balance between them is important for a project with a long expected life.
I agree about the adoption of commonly used frameworks but only if they do something useful you need that you can save time using it than doing it yourself.
Slightly unfair to label standard server-side MVC plus jQuery as using the DOM to store the model. In the old days, this was true, but in the last few years i've been using json as the model, and driving the dome from that using templating (hidden dom templates) – as long as your json elements contains an indexer, then you don't need to worry about shuffling indexes in the dom.
I see what you are saying, I certainly wouldn't advocate for ASP.NET MVC use verbatim for most CRUD situations anymore. I think how you do it is a step in the right direction. I would say most people using ASP.NET MVC are probably using it verbatim however. Even in the manner you describe you might be 'fighting the framework' vs going an Angular route. The point of the post is the illustrate how you can have that example very easily using Angular.
Hi John, great article, really convinced me that angular if the way forward for rich client apps.
I have one concern though. Would it be difficult to implement authentication using angular with asp.net identity? Do you have any recommendations for this?
I like how you made the most pertinent question, regarding authentication which is an important step in Enterprise Applications but there's no mention or answer about it.
No problem using ASP.NET identity. AJAX works with cookies and you will likely be doing a bit of AJAX if you are building a SPA. You will want to make sure to authorize all actions on your server though (just cause the client sends a request w/ some data in it doesn't mean they are allowed to perform that action, make sure!) This is no different than how any app should be coded though.
Single page apps by nature run on the client rather than on the server so there aren't really any easy ways to prevent users from seeing JS code or HTML that they don't necessarily have access to unless you are dynamically loading all your HTML/JS (not recommended).
More likely what you really want is to make sure that users don't see data or are allowed to update data that they don't have access to. As is the case with any API interactions this sort of security should be handled on the server rather than on the client. I've talked about this sort of thing in a blog post here before: http://johnculviner.com/dont-trust-the-client/ Make sense?
Thanks for the brilliant article!
So, If i jump start with Angular.js + WebAPI, don't you think i may lose some background or valuable experience of using jQuery?. Perhaps something employers will look for if i am to seach job in the future?
PS . I know MVVM from WPF.
Thanks for the post, it was just the information I needed to learn to decide me for Angular+MVC. Great knowledge and communicative skills!
Thanks for a good "Break Down" and not simply a "How To". When looking at Angular demos, I too was drawn to the scope and the "strong objects". But this great writeup solidifies and bridges the gap in some stuff my rudimentary understanding was trying to make.
I would make a suggestion to make everything non ambiguous. The app.js setup is very hard to navigate with ambiguous names.
todoList and TodoList and todoLists shows up many times, and is difficult to navigate for a newbie because of the ambiguity.
You mentioned other alternatives. What are the alternatives that you would recommend?
use a partialview per row, and ajax-load it everytime someone wants to add a row. Don't do things clientside that MVC does best serverside.
simple do a post deleting that row (by id) and drop that part of the html.
MVC doesn't require full page loads or posts, neither does jquery.
I'm not saying angular is not better than jquery, just pointing out your MVC/jquery solution is suboptimal at least.
Which means, even if you don't think it's a half-baked language, you'll lack a lot of support you would get when programming in C#.
The article has some value butvis floored in comparing two different JS frameworks both written in JS then criticising one for not doing the same as the other. jQuery is an awesome lower level tool than AngularJS. Both serve a purpose but to say jQuery doesnt let you write nice code with separation of concerns (knowing that plain JS does – afterall even AngularJS is written in JS) just means whoever wrote the sloppy code with jQuery is a sloppy developer.
Reblogged this on Grey matter.
I have seen many implementations of e-commerce websites with angular go bad, because programmers think that a funnel equal is to an application and therefore they need angular.
Angular is slower to start a page than other frameworks, because it does not use the dom. every second slower is about 7% less conversion… so Angular costs your client money, often a lot of money. Amazon does not use angular, Google does not use angular (except one playstation 3 youtube site…) how many big ecommerce sites can you name with angular?
Angular performance is actually so bad that version 2 will be a complete rewrite, with mobile first.
Angular is worse, because online marketeers (you know, those people that need to work with the site after is is finished) cannot use the optimization tools they wants, because angular changes parts of the dom all the time, in ways that other tools cannot use. Only after more programming some things might work. bye bye flexibility and change to improve your site.
Building websites is not about how easy it is to program, it is about making money with the finished product. angular for ecommerce is not the best choice.
I can't really comment on using Angular for e-commerce websites since I haven't used it for that. Regardless I've seen some pretty awfully slow, horribly designed jQuery or Backbone e-commerce sites (you can make a crappy site regardless of what you are doing, I'd argue its easier to make less crappy sites w/ Angular). I've seen it work awesome for line of business applications using rich APIs which I think is it's bread and butter. Google actually uses it for many of their more line-of-business applications. I actually saw it in the wild quite recently because their entire MASSIVE google cloud manager application is built entirely in Angular. It sounds to me like you have a bone to pick against Angular also for a pretty narrow set of applications rather than it's utility across most other application types.
This is a good point, going fully client-side with Angular is not great for basic marketing websites (e-commerce or not, it doesn't matter) because you're going to be fighting SEO, conversion tracking, etc. etc. plus you're not going to be supporting those pesky consumers who refuse to upgrade their browsers and are still in the dark ages. Angular is great for rich single-page applications, but don't confuse it for the way to build full-blown marketing websites.
Thanks for this – confusingly your Angular demo has the same title as the Ajax one "Todo List – jQuery and ASP.NET MVC" – would be clearer if you correct the titles. Thanks.
Hi, you have save button to do bulk operation in . For this you dont need to depend on page submit and extract the value of the table from server side, you can use $each on the table and extract each row and build populate a json object and push that json object to json array and simply send the json array to server side using ajax . From server side u can convert this json to xml and send to db and using openxml extended stored procedure and cursor to do your bulk save . Your example doesnt prove use- case where angular should be used. Its just a two way binding , i think its an overkill . Plus for complex admin tool where you need lot of plugin support angular will be time consuming and overkill.


Lahore : Advisor Health Punjab Hanif Patafi during a surprise visit to Tehsil Headquarter Hospital Athara Hazari has suspended MS Dr. Zafar and Woman Medical Officer Dr. Safia Kausar for showing negligence and the sub-standard cleanliness condition of the hospital.
He also visits different wards of the hospital and reviewed the medical facilities being provided to the patients.
On this occasion, he said that surprise visits are being conducted to ensure the cleanliness arrangements and provision of medical facilities to the patients. He said that no compromise will be made on cleanliness and provision of best healthcare facilities to the patients in the public sector hospitals.
He said that PTI government by issuing Sehat Insaaf Card has provided relief to the people who were deceived by previous governments.


Neckwarmer scarf handmade from soft kid mohair, in hand-dyed ombre colours of rich charcoal and teal. This scarf is woven from kid mohair on hand operated knitting machines in Kathmandu, and then dip-dyed by hand to get the ombre effect. This tube scarf is wider at the bottom for a graduated style on shoulders.


Cloughmills Community Action Team (CCAT) has officially begun their energy saving crusade after completing step one of Quest. They are now closer to the £10,000 prize which they can use for renewable technology of their choice and other energy saving measures for their community.
Step one was a community meeting with their group mentor Neil Coleman. At this meeting they were given a presentation on the background to Power NI, the benefits of saving energy and what they can expect throughout the rest of the Quest competition.
Group mentor, Neil Coleman added; There was a great turn out for Cloughmills' first step. It was encouraging to see so many people supporting the group and their participation in the challenge as that is what Quest is all about. Their determination to succeed will make a vast difference within their community.'' Before moving on to step three, Cloughmills Community Action Team must complete 100 online Home Energy Checks.
To keep track of their progress and the rest of the Quest finalists visit www.powerni.co.uk/Quest or to take our home energy check visit www.powerni.co.uk/hec.
Picture : Cloughmills Community Action Team Chairman Patrick Frew pictured with group members at the community meeting held at the Old Mill.


The Wealth Manager's role involves working with clients to help them make the right decisions with their accounts and explain the financial services on offer to them.
The Wealth Manager is also expected to identify possible sales opportunities and generate new business for SIBTC.
Exploring new business opportunities as well as expand opportunities with existing clients. Analyze and assess clients offshore and onshore banking and investment needs.
Meet agreed team sales and income targets.
Identify and manage business risks indicators for clients of Stanbic IBTC by ensuring that products and service offering are packaged and structured to minimize risk to protect the interest of both parties. Have a thorough understanding and comply with relevant legislation and procedures.
Possession of exceptional selling skills to persuade clients to adopt the proposed wealth plans.
These skills are built over a long period (5-10 years) and are based on deep knowledge of products and experience (knowledge power), successful track record as trusted advisor, and social skill.
The WM needs to be of exceptional intellect, be socially adept, and be able to contextualise events in the political, economic, social, technological, legal end environmental arena.
Creative flair required when dealing with unique financial scenarios.
Vigilance of external factors such as fluctuating market conditions and applying the changes in these variables to hedge client's portfolio against potential losses.
Good working knowledge of regulatory requirements.
Ability to interpret financial statements, management accounts, budgets and cash flows for all types of legal entities.
Understanding of current business issues as well as the macro socio-political and economic environment both locally and abroad and their impact on the local market.
Always stay updated with the latest Job from Magicinfo.com.ng .You are welcome to This website Magicinfo.com.ng and feel free to comment, share and like our Facebook Page. May the good Lord Bless you!
Standard Bank Africa Derek Cooper Scholarship 2018/2019 for study in the UK (Fully Funded)- Apply Now!


La Cuisine's Round 10-inch Cast Iron Skillet is ideal for Spanish omelettes, pancakes, oven baked apple pies and also for searing meat to retain moisture and lock in flavor. The large radius corner inside this skillet is for ease of use and to help prevent food corner traps. The integrated cast iron handle plus distinctive easy-grip helper-handle disperses the weight of the pan and makes it suitable for both stove and oven use. La Cuisine's cast iron cookware is crafted using sand molds, which are used only once, forging a lighter product with a very fine enamel finish that is truly unique. Wonderfully versatile, La Cuisine's round fry pans are suited to all stovetops, including induction. The non-toxic, matte black enamel interior surface is scratch-resistant, stain-resistant, gives excellent food release that improves through continued use, and is simple to clean – just wash in warm water.
La Cuisine's Round 12-inch Cast Iron Grill Pan is perfect for when you are looking for that char-grilled smoky taste. Safe for dry cooking, use it for grilling all types of meat, fish and vegetables to cook excellent low-fat meals. Low-slung sides aid vapor escape and riveted stainless steel handle plus cast-iron helper-handle disperses the weight of the pan. La Cuisine's cast iron cookware is crafted using sand molds, which are used only once, forging a lighter product with a very fine enamel finish that is truly unique. Wonderfully versatile, La Cuisine's round grill pans are suited to all stovetops, including induction. The non-toxic, matte black enamel interior surface is scratch-resistant, stain-resistant, gives excellent food release that improves through continued use, and is simple to clean – just wash in warm water.
La Cuisine's Round 12-inch Cast Iron Grill Pan is perfect for when you are looking for that char-grilled smoky taste. Safe for dry cooking, use it for grilling all types of meat, fish and vegetables to cook excellent low-fat meals. Low-slung sides aid vapor escape and the riveted stainless steel handle plus cast-iron helper-handle disperses the weight of the pan. La Cuisine's cast iron cookware is crafted using sand molds, which are used only once, forging a lighter product with a very fine enamel finish that is truly unique. Wonderfully versatile, La Cuisine's round grill pans are suited to all stovetops, including induction. The non-toxic, matte black enamel interior surface is scratch-resistant, stain-resistant, gives excellent food release that improves through continued use, and is simple to clean – just wash in warm water.
La Cuisine's Round 12-inch Cast Iron Grill Pan is perfect for when you are looking for that char-grilled smoky taste. Safe for dry cooking, use it for grilling all types of meat, fish and vegetables to cook excellent low-fat meals. Low-slung sides aid vapor escape and the distinctive riveted stainless steel handle plus cast-iron helper-handle disperses the weight of the pan. La Cuisine's cast iron cookware is crafted using sand molds, which are used only once, forging a lighter product with a very fine enamel finish that is truly unique. Wonderfully versatile, La Cuisine's round grill pans are suited to all stovetops, including induction. The non-toxic, matte black enamel interior surface is scratch-resistant, stain-resistant, gives excellent food release that improves through continued use, and is simple to clean – just wash in warm water.
La Cuisine's 4 Pc. Round Cast Iron Casserole Set includes the 2.2-quart and 3.7-quart casseroles with lids. La Cuisine's cast iron cookware is crafted using sand molds, which are used only once, forging a lighter product with a very fine enamel finish that is truly unique. Wonderfully versatile, La Cuisine's round casseroles are suited to the oven and all cooktops, including induction. Food heats through evenly and remains hot until served. The non-toxic cream enamel interior surface gives excellent food release that improves through continued use, and is simple to clean – just wash in warm water. Whatever your skill level, La Cuisine is perfect for no-fuss, healthy cooking and looks great as it goes straight from cooking on the stovetop or in the oven to serving at the table or buffet (our trivets, sold separately, are recommended for table/buffet use).
Rustle up all sorts of mouth-watering dishes with La Cuisine's 5-piece enameled cast iron cookware set. This 5-piece set includes the 3.75 qt. covered saute with cream interior, 6.75 qt. covered oval casserole with cream interior, and 10" open skillet with matte black interior and cast iron handles. La Cuisine's cast iron cookware is crafted using sand molds, which are used only once, forging a lighter product with a very fine enamel finish that is truly unique. Wonderfully versatile, La Cuisine's cookware is suited to the oven and all cooktops, including induction. Food heats through evenly and remains hot until served. Whatever your skill level, La Cuisine is perfect for no-fuss, healthy cooking and looks great as it goes straight from stovetop or oven to serving at the table or buffet (our trivets, sold separately, are recommended for table/buffet use).
Rustle up all sorts of mouth-watering dishes with La Cuisine's 5-piece enameled cast iron cookware set. This 5-piece set includes the 3.75 qt. covered saute with cream interior, 6.5 qt. covered round casserole with cream interior and 10" open skillet with matte black interior and cast iron handles. La Cuisine's cast iron cookware is crafted using sand molds, which are used only once, forging a lighter product with a very fine enamel finish that is truly unique. Wonderfully versatile, La Cuisine cookware is suited to the oven and all cooktops, including induction. Food heats through evenly and remains hot until served. Whatever your skill level, La Cuisine is perfect for no-fuss, healthy cooking and looks great as it goes straight from stovetop or oven to serving at the table or buffet (our trivets, sold separately, are recommended for table/buffet use).
Rustle up all sorts of mouth-watering dishes with La Cuisine's PRO 5-piece enameled cast iron cookware set. This 5-piece set includes the 3.75 qt. covered saute, 6.5 qt. covered round casserole and 10" open skillet with cast iron handles. La Cuisine's PRO cast iron cookware is crafted using sand molds, which are used only once, forging a lighter product with a very fine enamel finish that is truly unique. Wonderfully versatile, La Cuisine PRO cookware is suited to the oven and all cooktops, including induction. Food heats through evenly and remains hot until served. The non-toxic, matte black enamel interior surface is scratch-resistant, stain-resistant, and is simple to clean – just wash in warm water. Whatever your skill level, La Cuisine PRO is perfect for no-fuss, healthy cooking and looks great as it goes straight from stovetop or oven to serving at the table or buffet (our trivets, sold separately, are recommended for table/buffet use).
Rustle up all sorts of mouth-watering dishes with La Cuisine's PRO 5-piece enameled cast iron cookware set. This 5-piece set includes the 3.75 qt. covered saute, 6.75 qt. covered oval casserole and 10" open skillet with cast iron handles. La Cuisine's PRO cast iron cookware is crafted using sand molds, which are used only once, forging a lighter product with a very fine enamel finish that is truly unique. Wonderfully versatile, La Cuisine PRO cookware is suited to the oven and all cooktops, including induction. Food heats through evenly and remains hot until served. The non-toxic, matte black enamel interior surface is scratch-resistant, stain-resistant, and is simple to clean – just wash in warm water. Whatever your skill level, La Cuisine PRO is perfect for no-fuss, healthy cooking and looks great as it goes straight from stovetop or oven to serving at the table or buffet (our trivets, sold separately, are recommended for table/buffet use).
La Cuisine's 6 Pc. Round Cast Iron Casserole Set includes the 2.2-quart, 3.7-quart and 5-quart casseroles with lids. La Cuisine's cast iron cookware is crafted using sand molds, which are used only once, forging a lighter product with a very fine enamel finish that is truly unique. Wonderfully versatile, La Cuisine's round casseroles are suited to the oven and all cooktops, including induction. Food heats through evenly and remains hot until served. The non-toxic cream enamel interior surface gives excellent food release that improves through continued use, and is simple to clean – just wash in warm water. Whatever your skill level, La Cuisine is perfect for no-fuss, healthy cooking and looks great as it goes straight from cooking on the stovetop or in the oven to serving at the table or buffet (our trivets, sold separately, are recommended for table/buffet use).
La Cuisine's 6 Pc. Round Cast Iron Casserole Set includes the 2.2-quart, 3.7-quart and 5-quart casseroles with lids. La Cuisine's cast iron cookware is crafted using sand molds, which are used only once, forging a lighter product with a high gloss enamel finish that is truly unique. Wonderfully versatile, La Cuisine's round casseroles are suited to the oven and all cooktops, including induction. Food heats through evenly and remains hot until served. The non-toxic cream enamel interior surface gives excellent food release that improves through continued use, and is simple to clean – just wash in warm water. Whatever your skill level, La Cuisine is perfect for no-fuss, healthy cooking and looks great as it goes straight from cooking on the stovetop or in the oven to serving at the table or buffet (our trivets, sold separately, are recommended for table/buffet use).
Rustle up all sorts of mouth-watering dishes with La Cuisine's 6-piece enameled cast iron cookware set. This 6-piece set includes the 3.75 qt. covered saute with cream interior, 6.75 qt. covered oval casserole with cream interior, 10" open skillet with matte black interior and cast iron handles, plus an oval trivet. La Cuisine's cast iron cookware is crafted using sand molds, which are used only once, forging a lighter product with a very fine enamel finish that is truly unique. Wonderfully versatile, La Cuisine's cookware is suited to the oven and all cooktops, including induction. Food heats through evenly and remains hot until served. Whatever your skill level, La Cuisine is perfect for no-fuss, healthy cooking and looks great as it goes straight from stovetop or oven to serving at the table or buffet.
Rustle up all sorts of mouth-watering dishes with La Cuisine's PRO 6-piece enameled cast iron cookware set. This 6-piece set includes the 3.75 qt. covered saute, 6.5 qt. covered round casserole, 10" open skillet with cast iron handles, and 7" round trivet. La Cuisine's PRO cast iron cookware is crafted using sand molds, which are used only once, forging a lighter product with a very fine enamel finish that is truly unique. Wonderfully versatile, La Cuisine PRO cookware is suited to the oven and all cooktops, including induction. Food heats through evenly and remains hot until served. The non-toxic, matte black enamel interior surface is scratch-resistant, stain-resistant, and is simple to clean – just wash in warm water. Whatever your skill level, La Cuisine PRO is perfect for no-fuss, healthy cooking and looks great as it goes straight from stovetop or oven to serving at the table or buffet.
La Cuisine's Round Cast Iron Trivet is an aesthetically beautiful solution for protecting your countertop, table or buffet from hot cookware. Three skid-resistant feet lifts hot cookware away from the countertop, table or buffet while the pitched trivet design reduces contact with cookware bases to prevent scratching during use. La Cuisine's sturdy and reliable cast iron trivets are crafted using sand molds, which are used only once, forging a lighter product with a very fine enamel finish that is truly unique. The stylish enamel finish not only prevents rust but food spills are simple to clean – just wash in warm water.
La Cuisine's Round Cast Iron Trivet, in cream, is an aesthetically beautiful solution for protecting your countertop, table or buffet from hot cookware. Three skid-resistant feet lifts hot cookware away from the countertop, table or buffet while the pitched trivet design reduces contact with cookware bases to prevent scratching during use. La Cuisine's sturdy and reliable cast iron trivets are crafted using sand molds, which are used only once, forging a lighter product with a very fine enamel finish that is truly unique. The stylish enamel finish not only prevents rust but food spills are simple to clean – just wash in warm water.
La Cuisine's Round Cast Iron Trivet is an aesthetically beautiful solution for protecting your countertop, table or buffet from hot cookware. Three skid-resistant feet lift hot cookware away from the countertop, table or buffet while the pitched trivet design reduces contact with cookware bases to prevent scratching during use. La Cuisine's sturdy and reliable cast iron trivets are crafted using sand molds, which are used only once, forging a lighter product with a high gloss enamel finish that is truly unique. The stylish enamel finish not only prevents rust but food spills are simple to clean – just wash in warm water.
La Cuisine's Large Deep Cast Iron Roasting Pan is great for all types of meat, vegetable and fish dishes as well as lasagnas, moussakas and pot pies. Excellent heat retention allows food to heat through evenly and the sure-grip, wide-angle wedge handles provide comfort and stability during transport from oven to table. La Cuisine's cast iron cookware is crafted using sand molds, which are used only once, forging a lighter product with a very fine enamel finish that is truly unique. Wonderfully versatile, La Cuisine's deep roasting pans are suited to the oven and all stovetops, including induction. The non-toxic cream enamel interior surface gives excellent food release that improves through continued use, and is simple to clean – just wash in warm water.
La Cuisine's Medium Deep Cast Iron Roasting Pan is great for all types of meat, vegetable and fish dishes as well as lasagnas, moussakas and pot pies. Excellent heat retention allows food to heat through evenly and the sure-grip, wide-angle wedge handles provide comfort and stability during transport from oven to table. La Cuisine's cast iron cookware is crafted using sand molds, which are used only once, forging a lighter product with a very fine enamel finish that is truly unique. Wonderfully versatile, La Cuisine's deep roasting pans are suited to the oven and all stovetops, including induction. The non-toxic cream enamel interior surface gives excellent food release that improves through continued use, and is simple to clean – just wash in warm water.


text:
Naked And Afraid Sex
In the popular television show on the discovery channel "Naked and Afraid," participants are placed in a remote location with no food, no water, and no clothes, completely naked. They must then rely on their survival skills to stay alive and claim the prize money.
While the premise of the show is certainly intriguing, many viewers are also curious about how the participants deal with the lack of clothing. After all, they are human beings with natural sexual desires.
So, what happens when two people are stranded in the wilderness with no clothes and no way to satisfy their sexual needs? In this blog post, we'll explore that question in detail.
What is Naked and Afraid
Naked and Afraid is a survival reality television series that airs on the Discovery Channel. The show features two survivalists who are left in a remote location with no food, water, or clothing and must survive for 21 days. The show has been criticized for its lack of safety precautions, but its producers have defended the show, saying that the survivalists are carefully selected and closely monitored.
Male and female participants are completely naked and don't have something to protect even a portion of their bodies. As the contestants progress, they can pick up or make DIY leaf clothes or whatever to hide their sexual body parts.
Surviving Naked and Afraid in the Wild
Have you ever seen the show Naked and Afraid? It's a reality TV show where two strangers are stuck in the wilderness with no clothes, food, or water. They have to try to survive for 21 days.
I've always been fascinated by the show, and I've often wondered what it would be like to try to survive in the wild with no clothes, food, or water. I'm not sure if I could do it, but it would definitely be a challenge.
In this blog post, I'm going to talk about what it would take to survive Naked and Afraid in the wild. I'll cover topics like finding food and water, building shelter, and avoiding dangerous animals.
Chances Of Sexual Activities in Naked and Afraid Contestants
Despite the fact that the Discovery Channel's "Naked and Afraid" features contestants who are, well, naked and afraid, the chances of sexual activities taking place are actually quite low.
For one thing, the focus of the show is on the challenges of surviving in a remote location with no food, water, or shelter, not on sex. Plus, the contestants are constantly being monitored by camera crews, so any funny business would likely be caught on tape. That said, there have been a few moments on the show that have raised eyebrows when it comes to sex.
In one episode, two contestants were caught on camera sharing a long, passionate kiss. And in another, a male contestant was caught masturbating. Steven lee hall, a contestant in the show, shared how sex is the only one other person can think of if you are dirty, tired, sleepy, and hungry. Not to mention how jake Nodar spoke of the possibility of doing sex with his fellow contestants.
So, while the chances of seeing any full-on sex on "Naked and Afraid" are pretty slim, there's always the possibility of a little something happening off-camera. The last thing you ever want is your sex video on the wild being leaked on various websites and platforms.
Naked and Afraid Behind the Scene 18+
Naked and Afraid is one of the most popular reality TV shows on cable. The show features two strangers who are stranded in a remote location with no clothes, food, or water. They must rely on their own survival skills to find food and shelter and stay alive for 21 days.
But what happens when the cameras stop rolling? What do the producers and crew do to make sure the contestants are safe and comfortable? Is there any sexual activity happening on the show? We are all curious to see men and women in their birthday suits, hungry and you're tired, without clothes, and close to sleep at night with each other.
Hookups involving Contestants
In 2014, the Discovery Channel aired a show called Naked and Afraid, in which two strangers were stranded in a remote location with no clothes and no food and had to survive for 21 days. The show was a hit and spawned several spin-offs.
One of the most popular aspects of the show is the "hookup" between the two contestants. In each episode, the two people are forced to work together in order to survive, and inevitably, they end up forming a close bond.
There have been a lot of rumors about the hookups that occur on the show and whether or not they are real. Some people say that the producers stage the hookups in order to create more drama for the show. Others say that the hookups are real and that the contestants are just taking advantage of the situation. So, what's the truth? Are the hookups on Naked and Afraid real or fake? Is it part of the participants dating life whatsoever?
Naked And Afraid XL
In the hit reality TV show, "Naked and Afraid," contestants are dropped into a remote location with nothing but their wits and a few supplies to help them survive for three weeks. But what happens when the stakes are raised, and the survivalists are left to fend for themselves for an entire season?
That's the premise of "Naked and Afraid XL," the latest addition to the "Naked and Afraid" franchise. Naked and afraid xl is an instant attraction for the production crew, as there are many naked contestants on the show. In terms of sexual activities, there is no evidence that it has happened before, so don't worry, but there is still a chance of sexual activities behind the scene.
Naked and afraid is a show that highlights nature and naked strangers doing challenges and keeping alive in the wild. The cast takes a course of training and preparation before taking the challenge necessarily.

redpajama_set_name: RedPajamaCommonCrawl


text:
Crystal Dynamics announces an end to Marvel's Avengers game
The multiplayer live-service game from Crystal Dynamics and Square Enix is shutting down in 2023.
Image: Crystal Dynamics / Square Enix
Marvel's Avengers, the online live-service multiplayer game developed by Crystal Dynamics and published by Square Enix, will officially come to an end in 2023. Crystal Dynamics announced plans to stop adding new content, and end all support for the game in a blog post. The news comes two and a half years after the game was first released, in August 2020.
The studio announced that new content and features will cease on 31 March 2023, following a long spree of regular updates that included weekly cosmetic items and new expansion content, featuring additional characters like Spider-Man and Black Panther.
All official support for the game will cease on 30 September 2023. At this point, the game will be removed from digital storefronts. Thankfully, it will continue to be playable in both single-player and multiplayer modes.
When the game's final patch is released on 31 March 2023, all of the game's cosmetic content will be made free for all players. Previously, these items had to be purchased with real-world and/or in-game currency, as well as through a battle-pass-style progression system.
'Gifting the full library of Marketplace cosmetic content is a way to thank our community by letting everyone experience the breadth and depth of content in Marvel's Avengers,' reads the Crystal Dynamics blog post.
Any player who still owns amounts of the game's real-world currency equivalent when Marvel's Avengers gets its final update on 31 March 2023 will have it converted to in-game resources.
frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen>
Marvel's Avengers features a robust single-player narrative adventure that revolves around Avengers fan Kamala Khan, her transformation into the superhero Ms Marvel, and her journey to reunite the titular superhero team after a catastrophe that scatters its members. Outside of this, the game also features a number of standalone missions that can be tackled with other players.
A constant battle for Marvel's Avengers
The fight for Marvel's Avengers has been a difficult one. Prior to the game's launch, its marketing campaign created much confusion over what the game was. Its live-service multiplayer aspects were rarely spoken about, and audiences were critical about the designs of each character.
Upon the game's release, it received a mixed critical reception from critics and audiences alike. The single-player campaign that followed Kamala Khan was received positively, but the game's integration of live-service mechanics – like multiple currencies, an assortment of different 'gear' for each character, and repeatable missions – did not go over as well.
While Crystal Dynamics continued to support the game post-launch to the best of its ability, Marvel's Avengers was regularly cited in Square Enix investor calls as 'disappointing', with the publisher at one point suggesting that Crystal Dynamics wasn't the right partner for a live-service game.
Read: Square Enix says it has a lot to learn from 'disappointing' Marvel's Avengers
It should be mentioned that Square Enix was equally critical of its other games from Western studios, including Eidos Montreal's Guardians of the Galaxy, despite that game being a critical success. Square Enix would later sell off its Western game development studios, including Crystal Dynamics, Eidos Montreal, and the now-defunct Square Enix Montreal, to Embracer Group.
The Crystal Dynamics blog post ends with an FAQ that leads with the following question:
"Who made the decision to end support for the game?
The decision was made in conjunction with our partners that now was the right time to make this change."
See Marvel's Avengers on Amazon
GamesHub has affiliate partnerships. These do not influence editorial content. GamesHub may earn a small percentage of commission for products purchased via affiliate links.
Edmond is the managing editor of GamesHub. He was previously at GameSpot for 13 years, where he was the Australian Editor and an award-winning video producer. You can follow him @EdmondTran


David was a four-year member of both the baseball and soccer teams. He was a part of the 1995 baseball team that won 20 straight games and captured the Northwest Conference and the Class M state championships. He was an All-Academic selection while participating in baseball.
It was soccer where David was considered one of the best players to come through Berlin. Among his many awards were the Offensive Player and Coach's Awards, as well as All-Academic status. He was an All-Northwest Conference player in his junior and senior seasons, and received All-State recognition as a senior. David set many school records during his career.
On the state level in 1995, he scored the most goals with 31, and was the top scorer with 80 total points (31 goals, 19 assists). He set the following Redcoat records during his tenure at Berlin High: most goals in a season (31), assists in a season (18), most goals in a game (5), most points in a game (11), most career goals (60), most career assists (41), and most career points (161).
David went on to graduate from Villanova University, where he was a member of the soccer team all four years. He was named the Rookie of the Year in both the Philadelphia Seven and Big East Conferences. Francalangia also received All-Academic and Player of the Week Awards while playing at Villanova. After graduation, he went on to play professionally for the Connecticut Wolves.
David was the boys' soccer coach at Berlin High from 2000 through the 2013 season, where he was also an educator, and chairman of the social studies department. His 2002 team captured the program's first Northwest Conference championship and the 2013 team claimed the program's first CCC South championship in 2013.
His team reached the Class L semifinals in 2010 for the first time in school history, and reached the Class L quarterfinals in 2011, 2012 and 2013.
During his tenure, David was named both the Northwest Conference and CCC Coach of the Year.
Francalangia is the athletic director at Lewis S. Mills High School in Burlington.
He lives in Berlin with his wife, Janis, and two sons, Tommy and Joey.


What's a New England December without flurries? As we move further in to December the expectation of snow becomes greater.
This week in our series, 5 Quick Questions, we're getting to know photographer and Copley Artist Joe Reardon!
We are always thrilled to host artist demonstrations at the Copley Society of Art.


text:
import React, { PropTypes } from 'react';
import Rodal from 'rodal';
import styles from './../../../assets/css/pages/settings.scss';
import CoverPhotoUpload from './../../../containers/settings/CoverUpload';
// include styles
// import 'rodal/lib/rodal.css';

class CoverImageModal extends React.Component {

    constructor(props) {
        super(props);
        super(props);
        this.props = props;
    }

    hide() {
        this.props.onToggleCoverModal(false);
    }

    render() {
        if(this.props.overlay.shouldShowCoverImageModal) {
            return (
                <Rodal
                  width={500}
                  height={300}
                  className={styles.modal}
                  visible={this.props.overlay.shouldShowCoverImageModal}
                  onClose={this.hide.bind(this)}>
                    <CoverPhotoUpload />
                </Rodal>
            );
        }
        return (

        );
    }
}

CoverImageModal.propTypes = {
    overlay: PropTypes.object,
    error: PropTypes.string,
    onToggleCoverModal: PropTypes.func,
};

export default CoverImageModal;

redpajama_set_name: RedPajamaGithub


text:
What To Know And Where To Go In Southeast Michigan
Submit An Idea To Daily Detroit
Get Your Daily Detroit Newsletter
Daily Detroit Podcast
MSU, U of M Rivalry Comes To Campus Martius For Big Game Rally And Tailgate
Sep 27, 2016 by Daily Detroit Staff
Campus Martius Park is the center square of the city (and some would say the entire region), and this event is for all you Michigan State and University of Michigan fans out there on multiple weekends in October.
October 12 Big Game Detroit Rally
The Big Game Detroit Rally gears up the rivalry match between the state's two nationally ranked powerhouses, Michigan State University and University of Michigan, at Campus Martius Park on Wednesday, October 12.
The lawn at the park will be done up in blue and green as it was last year with a day full of events for both alumni and fans. Activities, according to the Downtown Detroit Partnership, will include a pep rally with lunchtime field games, after work alumni flag football games, food and a beer tent.
As game day gets closer, the park will also be home to the Big Game Tailgate Party on Wednesday, October 26. The Big Game Detroit Rally and Tailgate Party are part of Quicken Loans Harvest Happenings, full-scale programming for the fall season at Campus Martius and other downtown parks.
"Last year's first-ever Big Game Detroit Rally at Campus Martius Park was a spirited event that brought many alumni and fans of both Michigan State University and University of Michigan out for some friendly competition," said Robert Gregory, chief planning and public spaces officer of the Downtown Detroit Partnership. "With an additional event day this year, we expect an even bigger turnout and a higher level of enthusiasm."
The Big Game Detroit Rally festivities officially kick-off with a pep rally and field games from 11 a.m. – 2 p.m. There will be cheerleaders and marching bands.
The field games give everyone a chance to play and compete for prizes in the Tug-of-War and Sack Race competitions. Those are open to all.
Now, there will also be alumni flag football games. Alumni from each university are invited to participate as team players with the public being invited to attend, cheer and enjoy the fun. Local sports media (to be announced) will serve as play-by-play announcers.
The Alumni Flag Football Games include a total of three rounds of competition with the final game producing the MSU vs. U-M alumni champion. Last year's victor was Michigan State University. All games and competitions are coordinated and refereed by Come Play Detroit and are free for participants and spectators.
Those interested in participating in the field games or the Alumni Flag Football Games need to sign up ahead of time at www.DowntownDetroitParks.com/TheBigGame .
Big Game Tailgate On October 26
On Wednesday, October 26 there's the Big Game Tailgate Party after work from 5 – 9 p.m. at Campus Martius Park.
More than a dozen restaurants from Detroit's popular dining scene will serve up tasty samplings of chili and mac & cheese as they compete for People's Choice Awards.
Additionally, there will be a beer garden featuring Atwater Brewery and cocktails available for purchase, and live music from 7 – 9 p.m. featuring The Randy Brock Group, on of Detroit's hardest working blues/rock bands.
Tickets are required for this event and are $15 in advance and $20 at the door. Admission includes a commemorative pint glass and keepsake photo. For more information and to purchase tickets, visit www.downtowndetroitparks.com. This event is 21+.
FacebookTweetLinkedInEmail
Filed Under: Things To Do
Try The Daily Detroit Podcast
Previous Post: « Spain Elementary, Once A Symbol Of Detroit's Troubles, Gets A Chance To Show Off
Next Post: Detroit Grooming Co. Debuts Pink Ribbon Soap To Support Karmanos Cancer Institute »
Your No NAIAS In January Autos Roundup With Eric Trytko
PODCAST: Michigan's Long-Term Substitute Teacher Crisis Plus 6 Things To Know Around Town
She's 100% That Reporter
No Website: The Throwback Approach Of Third Man Records' New Magazine, Maggot Brain
Where Auto Plants Close, Opioid Deaths Rise
10 Things To Know Around Metro Detroit Plus Food News
Candice Miller On The Green Ooze And How Drainage Makes It To The Great Lakes
Telling The Story Of An Often Secret Condition, Hidradenitis Suppurativa
Auto Sales Continued A Tear in 2019, Plus Blake Griffin News And Recycling In Detroit
Get our newsletter covering what to know & where to go in Metro Detroit in your inbox!
Belle Isle Brush Park Business Cars CBD City 5 City Of Detroit Corktown Crowdfunding Culture Development Doing Good Eastern Market East Riverfront Education Events Featured Ferndale Food + Drink Fun Green Hamtramck History Lifestyle Lists Macomb County Midtown Milwaukee Junction New Center News Newsflash Oakland County Opinion Podcasts Policy Royal Oak Shopping Southwest Detroit Sports Staff Picks Tech Things To Do Transit Video Wayne County
Third Man Records Partners Up With Bob Seger For Vinyl Reissue
That Jack White seems always up to something. This time, it's a Bob Seger reissue for Record Store Day on April 22. Here are the details. According to Third Man Records, this is the first vinyl reissue of Bob Seger System's "2+2=?" in nearly four decades. The limited edition yellow-colored vinyl record will be remastered …
Copyright © 2020 Daily Detroit · All Rights Reserved · Powered by Mai Theme


text:
Q: Get an array of select options as a string in ionic2 angular2 I am trying to get the values from select multiple of ionic2.
My html is
<ion-select name="days" [(ngModel)]="appointment.days" multiple="true">
    <ion-option value="mon" selected="true">Monday</ion-option>
    <ion-option value="tue">Tuedsay</ion-option>
    <ion-option value="wed">Wednesday</ion-option>
    <ion-option value="thu">Thursday</ion-option>
    <ion-option value="fri">Friday</ion-option>
</ion-select>

recurrence_days: this.appointment.days,
however above code output the value in the form of array. But I want log that value as text. Any idea ?
Array after executing my code.

A: Use join method,
let result = recurrence_days.join("\n")

redpajama_set_name: RedPajamaStackExchange


Myanmar has some of the world's most dangerous roads.
Trauma is a major killer of adults in Myanmar, with most trauma injuries caused by road traffic accidents. We are working in partnership with Yangon General Hospital, Myanmar and are collaborating with local partners to support improvements in trauma patient care. We work across trauma departments including pathology and trauma and orthopaedics.
Our trauma project has been funded by the UK Government's Health Partnership Scheme and is now in its second phase. Through our project we have delivered secondary trauma training to doctors, advanced trauma care training to nurses and training to improve quality control to pathologists and laboratory technicians. To ensure the sustainability of training, our volunteers have been training local faculty to deliver the training courses. Our volunteers and local faculty have co-delivered training to around 500 local healthcare professionals.
University Medicine 1 in Yangon is one of Myanmar's leading medical institutions, however trainee doctors did not have the opportunity to practice clinical skills prior to treating patients. Clinical skills training plays a vital role in the education of student doctors and nurses, to address this shortfall in training, we have been collaborating with University Medicine 1 and Brighter Futures Foundation to support the establishment of a clinical skills laboratory.
We have established a clinical skills laboratory, which will provide medical students and junior doctors with the opportunity to initially practice clinical techniques on simulators in a safe environment, without affecting the quality of patient care. The skills laboratory will support the building of a firm foundation for the next generation of Yangon General Hospital clinicians to practice best clinical care.
We are currently collaborating with University Medicine 1 to train educators in the use of simulators and medical manikins as well as working to develop a new curriculum for medical students, which will incorporate clinical skills training.


text:
Scarlett Johansson Talks Black Widow Film and Angelina Jolie and Other Woman Joining MCU
Posted on July 21, 2019 by Zed in Entertainment
The rumors are true: Scarlett Johansson will reprise her role as Black Widow in a standalone film, while a slew of other female celebs will portray prominent characters in the Marvel Cinematic Universe. And she says, it's about time.
On Saturday at Marvel Studio' presentation at Comic-Con 2019, it was confirmed that a standalone Black Widow movie is in the works, and will see the actress reprise the role of her Avengers character. Cate Shortland is directing the new film, which also stars Stranger Things' David Harbour, plus Florence Pugh, O-T Fagbenle, and Rachel Weisz.
"I'm very excited about it, and I have to say, I was nervous coming here because we're in the middle of shooting right now, so it's not a time that you could ever share anything with anybody on any side of the movie, particularly in this universe, where everything is just so huge and the pressure's on. But I'm really, really proud of what we showed today."
The new film is set before the first Avengers film and offers insights into Johansson's character Natasha Romanoff's past in Budapest.
Black Widow is part of Marvel's new slate of films, where the girl power is strong; Angelina Jolie made a surprise appearance at Marvel Studio's Comic-Con panel to confirm she has joined the MCU, and will star in the studio's upcoming ensemble film The Eternals. Salma Hayek is also starring in the movie.
In addition, it was revealed that Natalie Portman, who played Thor's love interest Jane Foster in the first two Thor films, will star as a female Thor in the upcoming fourth film, Thor: Love and Thunder. The movie will also see the return of Tessa Thompsonas Valkyrie, now confirmed to be the MCU's first LGBTQ superhero.
"It was amazing. I mean, there's a lot of women up there that I hugely admire—Angelina, Salma…Rachel, Tessa…Natalie," Johansson told E! News. "It's bananas. I think it's very exciting. I think it grounds the presence of the MCU in a way. It's very exciting to see such a diverse group of people. It's awesome. And it's about time."
The confirmed Black Widow film and the addition of more female superheroes to the MCU follows the massive box office successes of Marvel's first female-led superhero film, Captain Marvel, which was released in March, and competitor DC Entertainment's 2017 film Wonder Woman.
Black Widow is set for release in May 2020.
Full Story Source
Ronan Farrow Is Engaged to Pod Save America Host Jon Lovett
Caelynn Miller-Keyes Gushes About Adventurous Romance With Dean Unglert
Kourtney Kardashian Finds Out Who Stole $5,200 & Hacked Her on KUWTK
Ben Platt and Zoey Deutch's Yom Kippur Jingle Will Get You In the Spirit of Atoning
Lili Reinhart and Cole Sprouse Show PDA on Date and "Are in a Great Place"
Copyrights Reserved to Viral Zed 2019 | Your source for daily viral news


text:
#include <linux/console.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/proc_fs.h>
#include <linux/string.h>
#include <linux/uaccess.h>
#include <linux/io.h>

#ifdef CONFIG_ANDROID_RAM_CONSOLE_ERROR_CORRECTION
#include <linux/rslib.h>
#endif

struct ram_console_buffer {
	uint32_t    sig;
	uint32_t    start;
	uint32_t    size;
	uint8_t     data[0];
};

#define RAM_CONSOLE_SIG (0x43474244) /* DBGC */

#ifdef CONFIG_ANDROID_RAM_CONSOLE_EARLY_INIT
static char __initdata
	ram_console_old_log_init_buffer[CONFIG_ANDROID_RAM_CONSOLE_EARLY_SIZE];
#endif
static char *ram_console_old_log;
static size_t ram_console_old_log_size;

static struct ram_console_buffer *ram_console_buffer;
static size_t ram_console_buffer_size;
#ifdef CONFIG_ANDROID_RAM_CONSOLE_ERROR_CORRECTION
static char *ram_console_par_buffer;
static struct rs_control *ram_console_rs_decoder;
static int ram_console_corrected_bytes;
static int ram_console_bad_blocks;
#define ECC_BLOCK_SIZE CONFIG_ANDROID_RAM_CONSOLE_ERROR_CORRECTION_DATA_SIZE
#define ECC_SIZE CONFIG_ANDROID_RAM_CONSOLE_ERROR_CORRECTION_ECC_SIZE
#define ECC_SYMSIZE CONFIG_ANDROID_RAM_CONSOLE_ERROR_CORRECTION_SYMBOL_SIZE
#define ECC_POLY CONFIG_ANDROID_RAM_CONSOLE_ERROR_CORRECTION_POLYNOMIAL
#endif

#ifdef CONFIG_ANDROID_RAM_CONSOLE_ERROR_CORRECTION
static void ram_console_encode_rs8(uint8_t *data, size_t len, uint8_t *ecc)
{
	int i;
	uint16_t par[ECC_SIZE];
	/* Initialize the parity buffer */
	memset(par, 0, sizeof(par));
	encode_rs8(ram_console_rs_decoder, data, len, par, 0);
	for (i = 0; i < ECC_SIZE; i++)
		ecc[i] = par[i];
}

static int ram_console_decode_rs8(void *data, size_t len, uint8_t *ecc)
{
	int i;
	uint16_t par[ECC_SIZE];
	for (i = 0; i < ECC_SIZE; i++)
		par[i] = ecc[i];
	return decode_rs8(ram_console_rs_decoder, data, par, len,
				NULL, 0, NULL, 0, NULL);
}
#endif

static void ram_console_update(const char *s, unsigned int count)
{
	struct ram_console_buffer *buffer = ram_console_buffer;
#ifdef CONFIG_ANDROID_RAM_CONSOLE_ERROR_CORRECTION
	uint8_t *buffer_end = buffer->data + ram_console_buffer_size;
	uint8_t *block;
	uint8_t *par;
	int size = ECC_BLOCK_SIZE;
#endif
	memcpy(buffer->data + buffer->start, s, count);
#ifdef CONFIG_ANDROID_RAM_CONSOLE_ERROR_CORRECTION
	block = buffer->data + (buffer->start & ~(ECC_BLOCK_SIZE - 1));
	par = ram_console_par_buffer +
	      (buffer->start / ECC_BLOCK_SIZE) * ECC_SIZE;
	do {
		if (block + ECC_BLOCK_SIZE > buffer_end)
			size = buffer_end - block;
		ram_console_encode_rs8(block, size, par);
		block += ECC_BLOCK_SIZE;
		par += ECC_SIZE;
	} while (block < buffer->data + buffer->start + count);
#endif
}

static void ram_console_update_header(void)
{
#ifdef CONFIG_ANDROID_RAM_CONSOLE_ERROR_CORRECTION
	struct ram_console_buffer *buffer = ram_console_buffer;
	uint8_t *par;
	par = ram_console_par_buffer +
	      DIV_ROUND_UP(ram_console_buffer_size, ECC_BLOCK_SIZE) * ECC_SIZE;
	ram_console_encode_rs8((uint8_t *)buffer, sizeof(*buffer), par);
#endif
}

static void
ram_console_write(struct console *console, const char *s, unsigned int count)
{
	int rem;
	struct ram_console_buffer *buffer = ram_console_buffer;

	if (count > ram_console_buffer_size) {
		s += count - ram_console_buffer_size;
		count = ram_console_buffer_size;
	}
	rem = ram_console_buffer_size - buffer->start;
	if (rem < count) {
		ram_console_update(s, rem);
		s += rem;
		count -= rem;
		buffer->start = 0;
		buffer->size = ram_console_buffer_size;
	}
	ram_console_update(s, count);

	buffer->start += count;
	if (buffer->size < ram_console_buffer_size)
		buffer->size += count;
	ram_console_update_header();
}

static struct console ram_console = {
	.name	= "ram",
	.write	= ram_console_write,
	.flags	= CON_PRINTBUFFER | CON_ENABLED,
	.index	= -1,
};

static void __init
ram_console_save_old(struct ram_console_buffer *buffer, char *dest)
{
	size_t old_log_size = buffer->size;
#ifdef CONFIG_ANDROID_RAM_CONSOLE_ERROR_CORRECTION
	uint8_t *block;
	uint8_t *par;
	char strbuf[80];
	int strbuf_len;

	block = buffer->data;
	par = ram_console_par_buffer;
	while (block < buffer->data + buffer->size) {
		int numerr;
		int size = ECC_BLOCK_SIZE;
		if (block + size > buffer->data + ram_console_buffer_size)
			size = buffer->data + ram_console_buffer_size - block;
		numerr = ram_console_decode_rs8(block, size, par);
		if (numerr > 0) {
#if 0
			printk(KERN_INFO "ram_console: error in block %p, %d\n",
			       block, numerr);
#endif
			ram_console_corrected_bytes += numerr;
		} else if (numerr < 0) {
#if 0
			printk(KERN_INFO "ram_console: uncorrectable error in "
			       "block %p\n", block);
#endif
			ram_console_bad_blocks++;
		}
		block += ECC_BLOCK_SIZE;
		par += ECC_SIZE;
	}
	if (ram_console_corrected_bytes || ram_console_bad_blocks)
		strbuf_len = snprintf(strbuf, sizeof(strbuf),
			"\n%d Corrected bytes, %d unrecoverable blocks\n",
			ram_console_corrected_bytes, ram_console_bad_blocks);
	else
		strbuf_len = snprintf(strbuf, sizeof(strbuf),
				      "\nNo errors detected\n");
	if (strbuf_len >= sizeof(strbuf))
		strbuf_len = sizeof(strbuf) - 1;
	old_log_size += strbuf_len;
#endif

	if (dest == NULL) {
		dest = kmalloc(old_log_size, GFP_KERNEL);
		if (dest == NULL) {
			printk(KERN_ERR
			       "ram_console: failed to allocate buffer\n");
			return;
		}
	}

	ram_console_old_log = dest;
	ram_console_old_log_size = old_log_size;
	memcpy(ram_console_old_log,
	       &buffer->data[buffer->start], buffer->size - buffer->start);
	memcpy(ram_console_old_log + buffer->size - buffer->start,
	       &buffer->data[0], buffer->start);
#ifdef CONFIG_ANDROID_RAM_CONSOLE_ERROR_CORRECTION
	memcpy(ram_console_old_log + old_log_size - strbuf_len,
	       strbuf, strbuf_len);
#endif
}

static int __init ram_console_init(struct ram_console_buffer *buffer,
				   size_t buffer_size, char *old_buf)
{
#ifdef CONFIG_ANDROID_RAM_CONSOLE_ERROR_CORRECTION
	int numerr;
	uint8_t *par;
#endif
	ram_console_buffer = buffer;
	ram_console_buffer_size =
		buffer_size - sizeof(struct ram_console_buffer);

	if (ram_console_buffer_size > buffer_size) {
		pr_err("ram_console: buffer %p, invalid size %zu, "
		       "datasize %zu\n", buffer, buffer_size,
		       ram_console_buffer_size);
		return 0;
	}

#ifdef CONFIG_ANDROID_RAM_CONSOLE_ERROR_CORRECTION
	ram_console_buffer_size -= (DIV_ROUND_UP(ram_console_buffer_size,
						ECC_BLOCK_SIZE) + 1) * ECC_SIZE;

	if (ram_console_buffer_size > buffer_size) {
		pr_err("ram_console: buffer %p, invalid size %zu, "
		       "non-ecc datasize %zu\n",
		       buffer, buffer_size, ram_console_buffer_size);
		return 0;
	}

	ram_console_par_buffer = buffer->data + ram_console_buffer_size;

	/* first consecutive root is 0
	 * primitive element to generate roots = 1
	 */
	ram_console_rs_decoder = init_rs(ECC_SYMSIZE, ECC_POLY, 0, 1, ECC_SIZE);
	if (ram_console_rs_decoder == NULL) {
		printk(KERN_INFO "ram_console: init_rs failed\n");
		return 0;
	}

	ram_console_corrected_bytes = 0;
	ram_console_bad_blocks = 0;

	par = ram_console_par_buffer +
	      DIV_ROUND_UP(ram_console_buffer_size, ECC_BLOCK_SIZE) * ECC_SIZE;

	numerr = ram_console_decode_rs8(buffer, sizeof(*buffer), par);
	if (numerr > 0) {
		printk(KERN_INFO "ram_console: error in header, %d\n", numerr);
		ram_console_corrected_bytes += numerr;
	} else if (numerr < 0) {
		printk(KERN_INFO
		       "ram_console: uncorrectable error in header\n");
		ram_console_bad_blocks++;
	}
#endif

	if (buffer->sig == RAM_CONSOLE_SIG) {
		if (buffer->size > ram_console_buffer_size
		    || buffer->start > buffer->size)
			printk(KERN_INFO "ram_console: found existing invalid "
			       "buffer, size %d, start %d\n",
			       buffer->size, buffer->start);
		else {
			printk(KERN_INFO "ram_console: found existing buffer, "
			       "size %d, start %d\n",
			       buffer->size, buffer->start);
			ram_console_save_old(buffer, old_buf);
		}
	} else {
		printk(KERN_INFO "ram_console: no valid data in buffer "
		       "(sig = 0x%08x)\n", buffer->sig);
	}

	buffer->sig = RAM_CONSOLE_SIG;
	buffer->start = 0;
	buffer->size = 0;

	register_console(&ram_console);
#ifdef CONFIG_ANDROID_RAM_CONSOLE_ENABLE_VERBOSE
	console_verbose();
#endif
	return 0;
}

#ifdef CONFIG_ANDROID_RAM_CONSOLE_EARLY_INIT
static int __init ram_console_early_init(void)
{
	return ram_console_init((struct ram_console_buffer *)
		CONFIG_ANDROID_RAM_CONSOLE_EARLY_ADDR,
		CONFIG_ANDROID_RAM_CONSOLE_EARLY_SIZE,
		ram_console_old_log_init_buffer);
}
#else
static int ram_console_driver_probe(struct platform_device *pdev)
{
	struct resource *res = pdev->resource;
	size_t start;
	size_t buffer_size;
	void *buffer;

	if (res == NULL || pdev->num_resources != 1 ||
	    !(res->flags & IORESOURCE_MEM)) {
		printk(KERN_ERR "ram_console: invalid resource, %p %d flags "
		       "%lx\n", res, pdev->num_resources, res ? res->flags : 0);
		return -ENXIO;
	}
	buffer_size = res->end - res->start + 1;
	start = res->start;
	printk(KERN_INFO "ram_console: got buffer at %zx, size %zx\n",
	       start, buffer_size);
	buffer = ioremap(res->start, buffer_size);
	if (buffer == NULL) {
		printk(KERN_ERR "ram_console: failed to map memory\n");
		return -ENOMEM;
	}

	return ram_console_init(buffer, buffer_size, NULL/* allocate */);
}

static struct platform_driver ram_console_driver = {
	.probe = ram_console_driver_probe,
	.driver		= {
		.name	= "ram_console",
	},
};

static int __init ram_console_module_init(void)
{
	int err;
	err = platform_driver_register(&ram_console_driver);
	return err;
}
#endif

static ssize_t ram_console_read_old(struct file *file, char __user *buf,
				    size_t len, loff_t *offset)
{
	loff_t pos = *offset;
	ssize_t count;

	if (pos >= ram_console_old_log_size)
		return 0;

	count = min(len, (size_t)(ram_console_old_log_size - pos));
	if (copy_to_user(buf, ram_console_old_log + pos, count))
		return -EFAULT;

	*offset += count;
	return count;
}

static const struct file_operations ram_console_file_ops = {
	.owner = THIS_MODULE,
	.read = ram_console_read_old,
};

static int __init ram_console_late_init(void)
{
	struct proc_dir_entry *entry;

	if (ram_console_old_log == NULL)
		return 0;
#ifdef CONFIG_ANDROID_RAM_CONSOLE_EARLY_INIT
	ram_console_old_log = kmalloc(ram_console_old_log_size, GFP_KERNEL);
	if (ram_console_old_log == NULL) {
		printk(KERN_ERR
		       "ram_console: failed to allocate buffer for old log\n");
		ram_console_old_log_size = 0;
		return 0;
	}
	memcpy(ram_console_old_log,
	       ram_console_old_log_init_buffer, ram_console_old_log_size);
#endif
	entry = create_proc_entry("last_kmsg", S_IFREG | S_IRUGO, NULL);
	if (!entry) {
		printk(KERN_ERR "ram_console: failed to create proc entry\n");
		kfree(ram_console_old_log);
		ram_console_old_log = NULL;
		return 0;
	}

	entry->proc_fops = &ram_console_file_ops;
	entry->size = ram_console_old_log_size;
	return 0;
}

#ifdef CONFIG_ANDROID_RAM_CONSOLE_EARLY_INIT
console_initcall(ram_console_early_init);
#else
module_init(ram_console_module_init);
#endif
late_initcall(ram_console_late_init);


text:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/remote_noteset"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/remote_noteset"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>


Unterstützung von internationalen und komparativen Forschungsprojekten der Flüchtlingsforschung. Insbesondere Vernetzung zu Akteuren der Flüchtlingsforschung im globalen Kontext.
Global forced displacement has increased considerably in the last decade. The related social and economic challenges emerging from this movement of people seeking protection creates a need for solutions on a national and global level. The worldwide impact of these challenges, the lack of answers drawn from previous experience, and the lack of evidence-based knowledge in the refugee debate creates momentum for an international approach in refugee research. Forced migration studies cannot longer be bound to a national context and researchers need to understand the phenomena related to refugees and forced displacement in a transnational context.
As task force on global collaboration we plan to invite other networks and associations such as the International Association on Forced Migration Studies (IASFM) and the Canadian Association on Forced migration and Refugee Studies (CARFMS) for building strategic partnerships with the German network on refugee research. Through these partnerships we hope to foster international and comparative research in forced displacement. Furthermore, we aim to assess international networks and collaborations within the members of the network for refugee research in a short survey to provide access to these international contacts.
The considerable growth in refugee research and the specific vulnerability and marginalization of research participants highlights the need for a research ethic and a more sophisticated approach in ethical assessments. Given the differences in ethics assessment practice and expectations that are imposed on the ethical researcher in Europe, Canada, and North America it is not surprising that ethical evaluations differ substantially across cultures. Considering all these challenges implementing ethical research with refugees seems to be following different standards. In the absence of clear global guidelines or frameworks it leaves the ethical assessment up to the discretion of the researcher which is counter to the concept of global ethics standards.


❶This type of argument can be interesting because it suggests that the reader needs to think about the text very carefully and not take it at face value. There are special words and word combination used for analytical purposes which should be learned as well.
By Mark Carrigan It has now been a year and a half since the onset of the financial crisis, and the original dearth of literature…. Is English your native language? What is your profession? Student Teacher Writer Other. Academic Assignment Writing an Essay. Writing a Research Paper. Writing Guides for Students Writing a Memoir 2.
Creative Writing Guides Writing a Song 3. Writing a Letter Writing an Evaluation Letter 3. Analysis Essay Samples Analysis essays are one of the more difficult essays to work on due to their technical nature. Login Username Password or login with. Register Username Email Is English your native language? Yes No What is your profession? Student Teacher Writer Other or login with.
Username or Email or login with. Register Lost your password? Analysis means to break down and study the parts. Writing a critical paper requires two steps: Identify the author's thesis and purpose Analyze the structure of the passage by identifying all main ideas Consult a dictionary or encyclopedia to understand material that is unfamiliar to you Make an outline of the work or write a description of it Write a summary of the work Determine the purpose which could be To inform with factual material To persuade with appeal to reason or emotions To entertain to affect people's emotions Evaluate the means by which the author has accomplished his purpose If the purpose is to inform, has the material been presented clearly, accurately, with order and coherence?
If the purpose is to persuade, look for evidence, logical reasoning, contrary evidence If the purpose was to entertain, determine how emotions are affected: Why did it affect you? Consider the following questions: How is the material organized? Who is the intended audience? What are the writer's assumptions about the audience? What kind of language and imagery does the author use?
Background information to help your readers understand the nature of the work A. Information about the work 1. Statement of topic and purpose B. Thesis statement indicating writer's main reaction to the work II. Summary or description of the work III.