Information behaviour research and information systems development: the SHAMAN project, an example of collaboration.
Goal. The aim of the paper is to demonstrate the role that information behaviour research may play in information system design.
Theory. The paper explores the value of use cases in defining information requirements and considers their wider application in information behaviour research.
Method. An analysis of the literature on long-term digital preservation systems (and, to a degree, digital libraries) is used as well as analysis of interviews undertaken in the course of the SHAMAN project. These interviews fall into the category of contextual inquiry as an explicit step for understanding who the customers really are and how they work on a day-to-day basis.
Results. Four broad categories of needs in long term preservation are identified in literature: society at large, which has requirements for long-term preservation; organizational requirements; organizational staff who must operate the preservation system, undertaking the functions of ingest, access and delivery to end-users; end-users who need to draw upon the digital resource to help them with their work, study or research. The Universal Modelling Language with stereotypical actors and use cases offers information behaviour researchers a way to engage with system developers in a creative synergy.
Long-term digital preservation is one of the highest priorities of many agencies supporting and funding research. One simply has to look at the abundance of projects on the topic conducted over the last ten years: to name just a few, PRESTO - Digital preservation technology (Wright 2001), Digital Preservation Europe (Digital… 2006); LIWA - Living Web Archives ( Living… 2008); PLANETS - Preservation and Long-term Access through Networked Services (PLANETS 2007); CASPAR - Cultural, Artistic and Scientific knowledge for Preservation, Access and Retrieval (CASPAR 2006); SHERPA - Digital Preservation: Creating a Persistent Preservation Environment for Institutional Repositories (SHERPA 2006); Digital Preservation Lifecycle Management: Building A Demonstration Prototype for the Preservation of Large Scale Multimedia Collections (Rajasekar n.d.). The agencies include the US Government, the European Union, the UK's Joint Information Systems Committee, and similar organization in other countries. Some of the projects concentrate on more general digital preservation theory and its technological implementation, others focus on certain domain areas, such as culture, art, heritage, research and education, industry, engineering, or publishing. or on certain types of institutions: memory institutions (archives, libraries and museums), producers of databases, large scientific organizations (like NASA), private companies or public departments facing the need to preserve data and documents.
The aim of this paper is to demonstrate the role that information behaviour research may play in information system design. As a result, our work is closer to the information requirements literature of information systems research than it is to information behaviour research. We would argue, however, that it is important for these fields to come together, particularly in the world of digital information resources. From the methodological point of view we explore the value of use cases in defining information requirements and consider their wider application in information behaviour research.
The paper draws upon two streams of data analysis: first, an analysis of the literature on long-term digital preservation systems (and, to a degree, digital libraries) and secondly, analysis of interviews undertaken in the course of the SHAMAN project.
The preservation of the cultural, organizational and even personal record has been, until the very recent past, concerned with books, unbound paper documents, film negatives, slides and prints, movie films, radiographic images, and a thousand and one other 'documentary' forms. The physical space requirements for the long-term preservation of these materials are enormous: for example, at the end of 2009, the British Library opened a new storage facility in Yorkshire with 262 kilometres of 'shelf space' (Pembrey 2009) and, in part, digital preservation of records of these kinds is seen as at least part of the solution to the increased demand for physical storage. We leave out of consideration here the need to preserve actual objects of culture, such as painting, sculptures, tools and archaeological artefacts, necessity to digitise images of these objects and also to take such accurate measurements that it is possible to reproduce physical objects such as sculptures (Digital… 2010). These data may be digitally preserved so that, if the object is lost, an exact copy can be automatically reproduced, potentially in the same material as the original.
In addition to the digitization of existing physical materials, there is the increasingly significant body of born-digital material, which covers not only such things as e-mail, word-processed documents and spreadsheets, but e-books, sound recordings, films, scientific data sets, social science data archives, health-related patient data and many more. To these we can add the entirety of the World Wide Web and, possibly, millions of organizational intranets. It has been claimed that there is now so much born digital material that it will be impossible to store it all: thus, in 2007 the amount of data produced more or less equalled the available storage capacity but production and storage capacity are diverging so rapidly that it was estimated that by 2011 'almost half of the digital universe will have no home' (IDC 2008: 2).
In this context, long-term digital preservation has particular problems: first, there is a proliferation of file formats for almost every kind of 'document', only some of which will survive into the future. Consequently, ways must be found to ensure that obsolete formats can be interpreted in the future. Secondly, the technology for producing, storing and reading digital files is changing constantly. The most obvious example is in portable storage: we have gone from 8 inch floppy discs, via 5¼ inch, to 3½ inch and on to zip drives and discs, CD-ROM, DVDs and, now, USB drives. Does anyone own an 8 inch floppy drive, or even a 5¼ inch drive? Such things are no longer installed in computers. The result is that files prepared for obsolete technology, may also be unreadable in the future. The best known example of this is the case of the BBC's Domesday Project (Finney 2009), which recorded information about British society in the 1980s, celebrating the original Domesday Book, which was compiled after the Norman invasion of Britain in 1066. The technology used for the project was the interactive videodisc, which rapidly proved not to be the technology of the future. A further project (CAMiLEON) was launched to retrieve the information from the videodiscs and a successful emulator was developed (Darlington et al. 2003) To date, however, no means has been found to make the project material generally available and, as it cannot be used, it is to all intents and purposes, still lost.
One of the projects funded by the European Union's Seventh Framework Programme, SHAMAN - Sustaining Heritage through Multivalent ArchiviNg, builds on many earlier technological developments and directs its efforts, "to supply a comprehensive, systematic and dynamic means for preserving any type of electronic record, free from dependence on any specific hardware and software" by integrating data grid, digital libraries and persistent archive technologies (Watry 2007: 41).
The development concentrates on building the prototypes for the institutions in three application domains: heritage preservation in memory institutions; industrial design and engineering data preservation in companies; preservation of scientific data collections in e-science area. A key element in the Project is the adoption of data grid technology to facilitate intercommunication among participating archives. To be accepted by the target communities the solutions provided by the research and development activities have to answer the existing needs and moreover to take into account the existing practice and legacy systems. The user communities targeted by the project are rather different from the point of view of the preservation activities carried out in them, the experience and understanding of preservation problems, and also by the previous investigations into their long-term preservation needs.
Authenticity, assertions about the provenance of the records.
Integrity, assertions about the management of the records.
and is in the process of developing tools for "analysing, ingesting, managing, accessing and reusing information objects and data" (SHAMAN 2007: 3). As part of the process, investigations have been carried out into the user, operator and organizational requirements for systems development, the results of which are reported here.
The kind of long-term digital preservation system proposed by SHAMAN is novel and, consequently, the literature available on the different kinds of requirements is rather limited. What we have attempted, therefore, is an analysis of the literature on digital libraries and digital preservation more generally, with the aim of arriving at a conceptual framework for research and proposals for further investigations.
From the literature, we can identify four broad categories: society at large, generating requirements for long-term preservation, which are often only implicit in papers on the general need to preserve a culture; organizational requirements, which will vary depending upon the nature of the organization, for example, whether it is a public sector organization like a local authority or a business firm; organizational staff who must operate the preservation system, undertaking the functions of ingest, access and delivery to end-users; and, finally, end-users in the normal definition of the term, i.e., members of the organization who need to draw upon the digital resource, or scholars, students and members of the general public who may need access to help them with their work, study or research.
We begin our analysis at the societal level, partly because it is in this area that the literature is so scarce, but also because the requirements set by society affect the requirements of the other actors. Generally, society's needs are usually spoken of in terms of the need to preserve the record of the society's culture over time; for example Drijfout (2001) notes that a failure to ensure long-term preservation, 'will damage future scholarship and weaken our scientific and cultural heritage'. Smith (2007) provides a more detailed analysis of the notion of the social value of preservation.
We can examine organizational needs from two perspectives: first, the requirements organizations have for long-term preservation systems; that is, what must such a system do in order to be useful to the organization? Secondly, we can consider what information an organization needs in order to make decisions about the choice of systems and in making policy decisions about long-term preservation in general. The literature on the first of these perspectives is much more extensive than on the second; in fact, our searches have produced no research papers that deal with the second issue. We can, however, make some reasonable guesses about what is needed.
The organizations with which we are chiefly concerned in the SHAMAN Project are those concerned with the preservation of the cultural record. Clearly, there is considerable overlap, in such cases, between the needs of the organization and the needs of society. 'Cultural memory' institutions are, in effect, the agencies tasked by society to deliver preservation of the cultural record.
A major project exploring the issue of choosing a preservation strategy has been the DELOS Project. This Project evolved a process for choosing a preservation strategy, using utility analysis (Rauch 2004), and proposed that organizational needs could be categorized under four headings: file characteristics, record characteristics, process characteristics, and costs (Strodle et al. 2006). To these, we would add a fifth, which often appears in such lists, the knowledge required by staff who operate or use the system. The four categories presented by Strodle, et al. are what they call 'top level' categories, which include much more specific elements: thus, in the case of file characteristics, the category includes appearance, content and structure and, at an even lower level, such matters as image resolution, macro support and embedded metadata. The significance of file type ought not to be underestimated: a study carried out at Göttingen University (Neuroth et al. 2006) revealed a total of ninety-six different file formats used by the staff of the university and, additionally, some proprietary formats were in use with specific software.
We have in mind here, the needs of those members of staff of the organization who manage and operate the long-term preservation system. We can group such staff into three categories, which we shall call, technical, management and service staff. Technical staff are responsible for the maintenance of the systems and any digitization that may be done, management staff are responsible for selecting and, in some cases, acquiring materials, allocation of metadata, ingesting (a term used by the preservation community to denote uploading) materials and other document management issues, and service staff are responsible for delivering service to users from the digital resource.
In other words, there are a number of different roles associated with digital preservation and, in its requirements study, the SHAMAN project has identified roles such as, preservation manager, collection manager, technology manager and auditor.
The literature on what organizational staff need of a system appears to be almost non-existent. The focus appears to be on the new skills that staff may need to function in the long-term digital preservation domain. For example, in the allied area of Web archiving Murray and Hsieh (2008) found that librarians were concerned about issues such as how to select material for digitization, how to assess the authenticity of materials, how to cope with the increased load of metadata production and cataloguing, and how best to provide access. We have been unable to locate an equivalent study for long-term preservation systems, but it seems likely that the same issues will arise.
Again, the very idea of long-term digital preservation systems is so new that the needs of the ultimate user, the scholar or citizen who needs access to the digital record, have not been explored. The closest we come to the digital archive user is the digital library user and we can imagine that the two will have at least closely associated needs. Even here, however, the literature on user needs is limited: much of the material found deals with issues such as search behaviour, or the design of personal access portals, or aspects of information retrieval, and other problems. In fact, we found only three papers that offered ideas that fit our conception of the notion of end-users' needs.
First, Xie (2008) sets out the criteria according to which users assess digital libraries (in this case the Library of Congress's American Memory site), listing interface usability, collection quality, service quality, system performance and user satisfaction. Within these categories one can find a number of finer-grained variables: for example, under collection quality we have scope, authority, accuracy, completeness, currency and copyright, all of which would apply to a long-term preservation system, but, in the case of the SHAMAN Project we would add, because of the need to migrate digital resources between different technologies, integrity, that is, the user will expect the original content of the document to be preserved as it was at the point of ingest to the original system.
Secondly, Inskip et al. (2008), after exploring the needs of users of a folk music collection, note that if the search process of a user is reflected in system design for a digital library then it would include the provision of background information to an item (and this may be as true for a memory institution's archive item as for a folk song), browsing capability, links between sources (again, true of much digital archive material) and links to other information sources.
Finally, Abdullah and Zainab (2007) point to more directly systems-oriented issues: registering and managing user information; creating reports and uploading digital objects (how far the latter would be allowed would be a matter for preservation policy); searching for and retrieving information; indexing digital resources (a long-term preservation system under the SHAMAN model would have metadata performing this role, but we can imagine a personal access system, perhaps based on the user's own server, which allowed tagging by the user); system network robustness (where the SHAMAN proposal for the use of grid technology would help); and the system operation schedule and the extent to which it managed and controlled access.
A composite set of these requirements together with those already developed for the SHAMAN Assessment Framework, constitutes, in our view, a valid framework for the analysis of users' needs.
The SHAMAN project may serve as an exemplary node of all the problems outlined above. It focuses on the development of the preservation technology, which, though building on earlier research and developments, has to meet the future requirements of long-term preservation of many interested parties. The problems faced by long-term preservation in the digital environment are quite well known and many of them have been decomposed into a variety of aspects and elements while looking for solutions as one sees from the literature analysis. Despite this, there are quite significant obscure areas, especially with regard to the future infrastructures, actors, policies and digital resources themselves.
Therefore, investigating these future requirements for the technologies that do not yet exist is a significant issue, even if system developers are used to defining system requirements. The difficulty, in this case, was recognized by the project partners at the very beginning and they began by collecting data about existing needs for long-term digital preservation and about the exploitation of existing systems of this type in working environments. We also used significant work done earlier in establishing the requirements for trusted repositories (TRAC) (RLG-NARA… 2007) and defining risks for long-term preservation of digital information (DRAMBORA 2008). In addition, a certain leap of imagination was allowed to fill in the gap between the known practices or expressed needs and the unknown future demands.
The nature of the SHAMAN framework itself also posed a number of difficulties - one of them was the need to take into account the requirements posed by system's end-users, i.e., librarians, curators, archivists, and also end-users of the preserved documents, for example, scholars, students and members of the public. There was also a group of the system users, less visible than the other two groups, that is, publishers, owners of intellectual property and producers of digital objects, who were submitting them for preservation. This group introduces problems of its own: it is interested in preservation of their products and in developing access services and, though not doing this itself, nevertheless wants to safeguard its interests and creates other requirements important to both processes (preservation and access).
Besides, the SHAMAN framework is intended to become a universal solution for long-term digital preservation. Therefore, the project addresses three quite different domains of focus that have become main sources of data collected for the development of system requirements.
The three domains of focus for the SHAMAN project are: memory institutions, which have been interested in the preservation of our documented heritage for a long time and have developed different approaches to restoration, conservation, and preservation of various collections of many different objects (written, visual, audio, natural and cultural objects); engineering and industrial design organizations, which have very different attitude towards digital preservation. They are commercial organizations and digital preservation has legal (e.g., contractual) and economic implications. For example, the re-use of designs may help saving development time and so reduce development costs. So far, however, little has been done in this area (Heutelbeck et al. 2009); and e-science groups and institutions, where we see increasing use of digital technologies in research work for processing huge amounts of digital data in natural and technical sciences generated by modern data collection technologies and where the actual digital preservation needs of researchers are actively supported by funding agencies and explored on different levels and in different contexts (see, for example, Lord and Macdonald 2003).
The differences between the domains are quite significant and this adds to the challenge of investigating the needs for long-term digital preservation.
The bulk of data collection for establishing the requirements for long-term preservation technology was done during the first year of the project (2008). However, it is regarded as an ongoing process affecting each stage of prototype development. Thus, the evaluation of the emerging technological solutions by the customer organizations and end users is regarded as further user requirements' data fed back into the process of research and development to guide the process.
The whole process of data collection and analysis for the project was also guided by the concept of the Open Archival Information System (OAIS), set out in 'Recommendations for an OAIS reference model' (CCSDS 2002).
The data used in this paper were collected during a qualitative stage involving semi-structured interviews with the actors in the organizations working in the three SHAMAN domains referred to above. Whenever possible, a semi-structured observation session was applied and additional documentation was collected on site. Three different interview schedules were developed for policy makers and managers, for end-users of the preservation system (such as data curators, IT staff) and consumers (users of preserved information). Twenty interviews were conducted in eleven organizations. A slightly different approach was taken in the domain of industrial design and engineering as there were no actors such as preservation managers or data curators and archivists because of the absence of preservation activities. Data were collected through prolonged observation and exploration of the practices in partner organizations and discussions with relevant persons.
The collected data was processed using the highly formalized Universal Modelling Language to extract abstract information about standard users, use cases and user scenarios. Both sets, i.e., the interview transcripts and the extracted information are used in the following part of the paper.
The interviews provided deep insight into the existing practices of archiving, storing and preserving different digital materials (texts, images, visual and audio recordings, data files of different formats) in a limited number of institutions in several countries. Some storage of digital objects was found to be present in all selected organizations. However, they were very different in maintaining and re-using the stored material.
the responsibilities of the preserving organization towards its partners.
Some scientific organizations and industrial design companies still do not make a clear difference between the archiving function and preservation and are not concerned about future re-use of their digital resources. Usually this may be associated with the policies of the parent organization and/or traditional practice.
The organizations with developed preservation policies usually also follow technical standards, procedures and rules in all work stages. They have good grasp of the arising technological problems and either have found, or are looking for, solutions. They usually plan to expand their preservation activities, some of which may be limited by existing resources or the lack of appropriate technologies to achieve the goal.
Fig 1: Concept map representing the actors identified in the preservation environment.
The actors (users, providers, employees or submitters) on the contextual map include not only human beings but also other entities, such as a system or legislation or an organization. All of them may interact with the system to access digital objects or metadata about them directly or through a mediator (Archivist).
The first step of this analysis led to the development of a number of primary system requirements and use scenarios.
The analysis of the data has produced eleven primary requirements for the system. Some of them, like automatic meta-data extraction or enhanced functions of document discovery, may also be found in other information systems. Others, such as scalable storage capacity or security and trust requirements, would be expected in relation to preservation. Memory institutions that are already working with archival systems need technology that is compatible with these systems and which allows access and use of the data preserved in them. We will have a closer look at several less predictable requirements.
The interviews show that there is a need for viewing data in obsolete formats without migrating it to a new format. This was expressed mainly in the form of complaints about cumbersome migration processes.
This requirement naturally includes the necessity to preserve and manage the provenance of digital data, which enables re-tracing of the preservation process. But it is not enough to capture the context of the document. The preservation system needs to capture the context of digital objects in production and working environments and their history. At present, much of this information is not embedded in the document itself, which creates a problem that may be addressed by developing policies and rules rather than technologies. Capturing the information about the preservation system and technology used at the time of the document creation or ingest would enable the maintenance of the document's authenticity and integrity in the future.
On the basis of the interviews a number of use cases were developed for each domain of focus: forty-one for memory institutions, thirty-nine for industrial design and engineering, and thirty-six for e-science.
A use case relates to some functionality performed by a system. Each use case constitutes a complete course of action initiated by an actor, and specifies the interaction that takes place between an actor and the system, indicates the goal of the action and identifies other actors involved. 'Actors' may be persons or 'abstract' actors such as other systems and/or sub-systems of the system under observation (Bittner and Spence 2003). The Universal Modelling Language has become the de facto standard for developing use cases.
Figure 2 below demonstrates the nature of the use case. In this example, two actors are seen: a human actor, the Collection Manager, and an abstract actor, the Import System. Five use cases are observed in the diagram (the blue shapes), with the lines and relationship statements indicating the connections between the cases and the actors. The diagram shows that the Collection Manager is responsible for organizing the separation of the data relating to a digital object from the delivery carrier (i.e., the bit stream that carries the data), as well as for managing the manual import, indexing and cataloguing, before the metadata and the digital object are imported (partly automatically) into the Import System (a sub-system of the preservation system). The term <extend> simply means that the actions of use case Separation from the delivery carrier are continued in use case Import and indexing. The term <include>' means that use case Cataloguing is included in use case Import and indexing, but can be separately distinguished from other operations there.
Brief description The new object is incorporated into the institutional catalogue.
Preconditions Initiated by the import routines (UC-DOF1-320).
Action Descriptive metadata fulfilling the catalogue schema of the memory institution is generated.
The use cases define both stereotypical actors (such as Collection Manager) and stereotypical activities (Cataloguing). From the point of view of system design, this is essential because of the need for general descriptions of behaviour. There will be individual exceptions in the way Jack or Jane or Sally function as Collection Managers, but systems have to be designed to cope with the generality of behaviour, not with the myriad exceptions.
Figure 3 shows another set of use cases associated with the Consumer (or end-user, as it would be termed in information behaviour research). Here, three of the use cases are associated with another use case, and all function within an abstract actor, the Access System. Again, we illustrate the content of a use case (Browse metadata catalogue) with Table 2.
Action The user browses the metadata catalogue in order to find metadata entries which describe digital objects he is interested in.
Note that in Table 2, there are no 'post-conditions', that is, nothing happens in the system as a result of the Consumer browsing the catalogue.
These two brief examples illustrate how the original interview data have been transformed by the Universal Modelling Language processes into descriptions of use cases involving both human and system actors.
One of the continuing debates within (and outside) the information behaviour research community is the relevance of such research for the development and design of information systems. In the case of the SHAMAN requirements definition process, we have seen collaboration between information behaviour researchers and information systems researchers in which the qualitative data from interviews has been employed to identify 'stereotypical' users and use cases. We suggest that this collaboration has been very fruitful, with the system designers being given much richer data on the behaviour of system actors than is normally the case.
The gap between information behaviour research and information systems design has been exacerbated by a focus, within the former, upon the behaviour of individuals. The concern has been to show how individuals differ in their behaviour and to elicit the reasons for these differences. Long-term preservation systems design and development, however, requires an understanding of the generality of actions performed in the preparation of the digital resource, its manipulation within the system and its use by system managers, operators and end-users.
We suggest that the apparent failure of information behaviour research to influence information systems design (including information retrieval systems) is not the result of some inherent flaw in research methodologies, but lies in the lack of interaction between information system designers and information behaviour researchers. Generally, information behaviour researchers will not be part of a system development team, rather, they will be pursuing some research topic independently. The value of the work reported here is that it demonstrates that information behaviour research can play a role in systems design and that, far from having their perspective rejected, information behaviour researchers are welcomed as full partners in the process with a great deal to offer in terms of methods and perspectives.
Virtually every civilization has assumed that the arrangements made for the preservation of its culture would survive into the indefinite future. At best, long-term preservation has been only partly achieved. For example, the rich culture of ancient Greece survives only partially; there are more lost dramatic works, for example, than those that survive. Similarly, the eruption of Vesuvius destroyed a number of libraries and, although modern technology may be able to revive some burnt papyrus rolls, it is unlikely that all will be recovered. The loss of the great library of Alexandria is well known, but less well known is the loss of the great library at Wearmouth, in the North of England (where the Venerable Bede wrote the first history of the British people) as a result of the Viking invasion of Britain. War and natural disasters have been the enemies of long-term preservation and, at this point in history, we do not know whether the arrangements now being made will enable preservation of the cultural record for another thousand years, or five hundred, or even a century.
Nevertheless, the effort has to be made and, as we have shown, there are many projects in progress and completed that have long-term preservation of digital resources as their focus. The aim of SHAMAN is ambitious: it is to develop a framework to enable the design and development of systems that will ensure that what is produced today, in digital form, can be re-used at any time in the future, whether or not the software and the hardware that enabled the digital production continue to exist or not. Thinking about the future needs of the operators, managers and users of such systems is an optimistic endeavour, since we cannot know the nature of future systems or the needs and behaviour of future users. However, the firmer the base upon which preservation systems can be built, the more likely it is that future archivists and users will be able to explore the digital record of today.
Our ability to develop such systems, however, depends crucially upon our understanding of human behaviour in relation to systems and upon being able to identify not only differences (that may explain system failures, for example) but also similarities and stereotypes. The Universal Modelling Language with stereotypical actors and use cases offers information behaviour researchers a way to engage with system developers in a creative synergy.
Abdullah, A. & Zainab, A.N. (2007). Collaborative digital library of historical resources: evaluation of first users. Malaysian Journal of Library and Information Science, 12(2), 99-122.
Bittner, K. & Spence, I. (2003). Use case modeling. Boston, MA: Addison-Wesley.
Darlington, J., Finney, A. & Pearce, A. (2003). Domesday redux: the rescue of the BBC Domesday Project videodiscs. Microform & Imaging Review, 32(4), 113-118.
Holtzblatt, K. (2001). Contextual design: experience in real life. In H. Oberquelle, R. Oppermann, J. Krause (Hrsg.). Mensch & Computer 2001: 1. Fachübergreifende Konferenz, (s. 19-22). Stuttgart: B.G. Teubner.
Inskip, C., Butterworth, R. & MacFarlane, A. (2008). A study of the information needs of the users of a folk music library and the implications for the design of a digital library system. Information Processing and Management, 44(2), 647-662.
Layder, D. (1998). Sociological practice: linking theory and research. London: Sage Publications.
Murray, K.R. & Hsieh, I.K. (2008). Archiving Web-published materials: a needs assessment of librarians, researchers, and content providers. Government Information Quarterly, 25(1), 66-89.
Neuroth, H., Strathmann, S. & Vlaeminck, S. (2006). Digital preservation needs of scientific communities: the example of Göttingen University. In B. Christensen-Dalsgaard, D. Castelli, B. Ammitzboll Jurik and J. Lippincott. (Eds.) Research and Advanced Technology for Digital Libraries 12th European Conference, ECDL 2008, Aarhus, Denmark, September 14-19, 2008. (pp. 450-452). Berlin: Springer Verlag.
SHAMAN Project. (2007). Seventh Framework Programme. Theme ICT -1-4.1 Digital libraries and technology-enhanced learning. Grant agreement for: Collaborative Project (IP). Annex I - Description of work.
SHAMAN Project (2009). D1.1 Survey of users and providers in Europe and SHAMAN usage scenarios and DP support Shaman.
Smith, A. (2007). Valuing preservation. Library Trends, 56(1), 4-25.
Strodl, S., Rauber, A., Rauch, C., Hofman, H., Debole, F. & Amato, G. (2006). The DELOS testbed for choosing a digital preservation strategy. In S. Sugimoto, J. Hunter, A. Rauber and A. Morishima. (Eds.). Digital libraries: achievements, challenges and opportunities. 9th International Conference on Asian Digial Libraries, ICADL 2006, Kyoto, Japan, November 27-30, 2006, Proceedings. (pp. 323-332). Berlin: Springer Verlag.
Watry P. (2007). Digital preservation theory and application: transcontinental persistent archives testbed activity. The International Journal of Digital Curation, 2(2), 41-68.
Xie, H.I. (2008). Users' evaluation of digital librearies (DLs): their uses, their criteria, and their assessment. Information Processing and Management, 44(3), 1346-1373.


text:
The Association's Bylaws and CC&Rs have been officially updated and recorded with the applicable authorities.
Learn More & Access Docs
River College Square Association
COVID Pool Reservations
Pool and Park Rules
Common Contacts
Dues Payments
Welcome to River College Square
Announcement: CC&R Updates - July 2022
RCSA Homeowners and Residents,
The Association's Bylaws and Covenants, Conditions, and Restrictions (CC&Rs) have been officially updated and recorded with the applicable authorities as of July 22, 2022. You can find the finalized documents below:
2022 Second Restated Bylaws
2022 Second Restated CC&Rs
Please make sure to share the word with your neighbors that these documents are available here on the website (www.rivercollegesquare.com), via email by contacting rcsa.board@outlook.com, or you can request a printed copy at your cost for approximately $25.00. To request a printed copy, please send a request to rcsa.board@outlook.com, and instructions will be sent back to you on how to submit payment.
If you have any questions, please feel free to contact the board, send us an email, or attend our monthly board meetings at the Pool Cabana on the second Tuesday of each month at 7:00 PM.
RCSA Board
The River College Square Association (RCSA) is a Streng Bros. Homes common interest community established in 1975. We are located in Sacramento, CA and are walking distance to American River College.
Our community includes access to the following private amenities: Playground with swings and slides, basketball court, 2 tennis courts, 2 full-size pools, and a picnic and barbecue area.
4733 River College Square, Sacramento CA 95841 • rcsa.board@outlook.com
Copyright © 2019-2020 · All Rights Reserved · RCSA

redpajama_set_name: RedPajamaCommonCrawl


text: * Make it more modular and split into different version and tools

redpajama_set_name: RedPajamaGithub


text:
Q: passing query parameter to graphicImage to prevent img caching I need to pass a query parameter to the graphicImage to prevent IE from using an old cached image.
I tried below and getting this error: File not found: /RES_NOT_FOUND
<h:graphicImage library="default" name="img/MSM_HeaderSplash.png?v=1.1"
    alt=" " width="487" height="68" />

Below works, but I really don't want to hardcode the resources path:
<h:graphicImage value="resources/default/1_0/img/MSM_HeaderSplash.png?v=1.1"
    alt=" " width="487" height="68" />

A: You can try this
Easiest would be to add the folder as a "virtual context" of the servletcontainer which you're using. It's unclear which one you're using. In Tomcat it's a matter of adding a new  to the server.xml
<Context docBase="/path/to/images" path="/images" />

and in Glassfish it's a matter of adding an alternatedocroot to the glassfish-web.xml
<property name="alternatedocroot_1" value="from=/images/* dir=/path/to" />

Refer the documentation of the servletcontainer for details. Ultimately they should be accessible by a normal URL so that you can just use for example:

A: I used below to resolve the issue.  It is not as intuitive as using the graphicImage's library and name attributes.  Please let me know if there is other work around.  Thanks
<h:graphicImage value="#{resource['default:img/MSM_HeaderSplash.png']}&v=1.0"  alt=" " width="487" height="68" />

A: The best option for your case seems to be to use HTML  tag. Surprisingly, most of image cache solutions are based in a random generated String, as there is no HTML standard way to achieve it. That will cheat the browser and force it to download it again.
There's no need to hardcode the image path more than once, just make use of <ui:param /> to keep variales in facelets.
<ui:param name="imageFolder" value="resources/images" />

Where #{currentDate} is a current Date instance. This can be implemented by adding a request scoped bean to your faces-config:
<managed-bean>
    <managed-bean-name>currentDate</managed-bean-name>
    <managed-bean-class>java.util.Date</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

That evaluates to kind of:

So your current image will be retrieved in each request.
Another choice is to disable the entire browser cache at web-filter level, despite this would affect your whole content.
See also:

*

*Display Current Date on JSF Page

*How to force a web browser NOT to cache images

*How to control web page caching, across all browsers?

redpajama_set_name: RedPajamaStackExchange


I was contacted by a bank saying my loan application was rejected. Will this negatively affect my credit score?
Nope. The email or letter you received is just routine and is called a "Notice of Adverse Action." Any time a lender reviews your credit information to determine whether to give you a loan offer (like they did when you checked your rate through pre-qualification), they are legally required to explain why they rejected you. That's why you're getting a notification. Your credit was NOT affected.


text:
Ron Paul Wins Straw Poll at CPAC
Fox News:
Ron Paul has ended Mitt Romney's three-year run as conservatives' favorite for president, taking 31 percent of the vote in the Conservative Political Action Conference's annual straw poll.
Paul, a Republican congressman from Texas known for his libertarian views, ran for president in 2008 but was never a serious contender for the GOP nomination.
Romney, former Massachusetts governor and also a 2008 GOP candidate, has won the last three presidential straw polls at the annual conference. This year, he came in second, with 22 percent.
Sarah Palin, who didn't attend the conference, was a distant third in the straw poll, with 7 percent, followed by Tim Pawlenty, the Minnesota governor, and Rep. Mike Pence of Indiana.
Thus ends any credibility of CPAC. They just put a crazy man on top. Good job, guys.
Hmmm, let me think:
Cast iron life preserver. Porcupine pillow. Rubber crutch. CPAC straw poll. What do these four have in common?
- cylarz | 02/21/2010 @ 00:06
I am so unhappy with that vote. Now the libs can counter all the good points made by Beck, Cheney, et. al. with "Those crazies voted for Ron freaking Paul!"
I mean really, it's like a "progressive" (spit) conference voting for Ralph Nader.
And Romney came in second? Looks like the crazies have a slim majority over the adults. But Paul's winning will certantly keep more rational adults from joining CPAC. I'm not going there to have a bunch of Paulbots spray spittle on me.
Pailn in third with seven percent? WTF is WRONG with these people?
I'm not happy at all with these people. They are like the leftists who keep pulling for their perfect communist world, damn the facts. CPAC does the same thing to the right.
- HoundOfDoom | 02/21/2010 @ 08:29


Discover Your Future Lifestyle...With Joyce!
Joyce has been a resident and avid promoter of St. Augustine for over 25 years. She loves sharing the unique history, wonderful white sand beaches and quality of life here with her clients.
With over 17 years as a Full-time Broker Associate Joyce has the resources, experience and expertise to fulfill your goals in home-buying or selling. As a Top Producer, and Certified Real Estate Negotiator, Joyce represents your best interests.
Selling your house? Joyce pledges to do her very best to achieve the highest price, in the least amount of time with minimal inconvenience to you!
Buyers, Joyce's knowledge of the market gets you the best home, best price and terms and takes you the whole way through the transaction, handing you your keys with a smile!
Joyce is a Senior Real Estate Specialist helping those loved ones with timely transitions from large home to more life-appropriate situations, including helping you network with Senior Care situations like Assisted Living or in-home care. She is sensitive to family crises and strives to be a great Listener, extending patient, caring practical solutions to you.
Joyce is also a Relocation Expert, helping with your transition either to or from our local area. She has a wide range of fellow professionals with whom she can help you coordinate a more stress-free transition!
Here's what one of Joyce's customers said recently: "Joyce was phenomenal. She had expert local knowledge that helped us find the perfect home in St. Augustine!"


Washing-machine science helps recover coal from .
Washing-machine science helps recover coal from . by mining executives has emptied one such pond near the small . Decanter Machine Inc. of Johnson City, .
This post is an update on the recovery of wildlife in and around the pond in 2013, together with an account of the year's maintenance issues.
crusher machines manufacturers in barodastone crusher machine manufacturer in baroda youtube. jul 22, 2015 machine recovered from the pond ball mill manufacturing .
The Foundry Rescue Mission Recovery Center in Holly Pond .
Find 1 listings related to The Foundry Rescue Mission Recovery Center in Holly Pond on YP. See reviews, photos, directions, phone numbers and more for The Foundry Rescue Mission Recovery Center locations in Holly Pond, AL.
When Cars Go Through Ice, Recovery's Costly, Dangerous .
Mar 15, 2013 · Brooklyn Park Drive-In Like A Time Machine TripPicture a . When Cars Go Through Ice, Recovery's Costly . But the key to recovery always depends .
Tjörnin | The Pond in Reykjavik Text by: . Very quickly, the species numbers began to recover, culminating in the rich and diverse ecosystem we see today.
frozen surface of the El Paso Solar Pond, while 7 feet below . Heat for separation of crude oil from brine in oil recovery opearions.
coal mine slurry pond accident – Morgantown WV .
Posts about coal mine slurry pond accident . on the slurry pond to serve as a platform for the recovery . form a perimeter around the machine.
JCB Backhoe Working on The Edge of Pond - JCB .
Mar 29, 2018 · JCB Backhoe Working on The Edge of Pond . Jcb 3dx Backhoe Loader Accident In Water Recovery By Tata . World's Amazing Machine Heavy Equipment .
Sixth body discovered in decades-old cars recovered .
Sep 18, 2013 · Sixth body discovered in decades-old cars recovered from Oklahoma lake .
Amelia Pond, commonly known as Amy Pond, . but he is interrupted by an alert from his time machine, . and knowing the Doctor cannot recover him, .
What Went Wrong at the Super Pond? . whose unit has been involved in high-profile missions such as the recovery of the space . Dog Days by Florence + The Machine.
Sep 30, 2009 · Simple Laundry Greywater System. . machine pump to . The great thing about this is that the water can safely be stored in a pond that has .
Jun 26, 2017 · Watch video · How to Control Lake, Pond and Lagoon Algae. Algae grow in ponds, lakes or lagoons. It's not only unsightly, it usually carries unruly odors. If left untreated, algae will create disturbances in the waters natural ecosystem.
MuckSuckers pumps the sediment out of your pond, removing those toxic gases and harmful nutrients. Your pond is left to its natural beauty!
Used Pond for sale. Freightliner equipment & more | .
Search for used pond. Find . 7 inches This machine is hydraulic and . Voltage: single phase 220 V, 50 Hz Detergent / recovery tank capacity: 25/70 .
Jun 12, 2018 · Mountain Retreat on Trout Pond Near Telluride. Situated on Hastings Mesa 25 minutes from Telluride at an elevation of about 9,000 feet, the 52 acre property.
Long Pond continues its recovery News . The hydro-rake machine at Long Pond which is removing invasive vegetation. (Paige Impink) Long Pond continues its recovery .
Contaminated equipment recovered from nuclear fuel . Pond has to be emptied carefully as part of a clean-up and decommissioning . Contaminated equipment recovered from nuclear fuel storage pond .
Pond Weed Control and Lake Weed Control | Pond .
Pond Weed and Algae Products We have specialized in controlling pond weeds and nuisance algae for over 40 years. Our pond weed and algae products were developed from a long history of treating ponds, knowing that our customers want recommendations for weed and algae control solutions that they can apply themselves.
Man's body recovered after . in the early hours of Saturday morning and ended up in the large mill pond behind . Machine Operator / Leading Hand .
Disaster Recovery Recover your systems and data quickly from a . Customer Engagement Use machine learning, . Pond already has around 6GB of data in .
Fish Pond Surgery Center . Really great people in the office surgery and recovery. . ey state on the machine that the on call Dr. will return call within 30 .
Energy and Environmental Profile of the U.S. Mining Industry . that were recovered in iron "pots" from leaching wood "ashes . pumped to an evaporation pond.


Welcome Direlco Packers and Movers in Baroda. Our Direlco Movers and Packers Vadodara Team are ready to assist you all time for packing moving, relocating. We are providing all services like household shifting, car transportation service, car carrier for all vehicles, bike transportation, office shifting, custom clearance for export or import, insurance, cargo and courier services, employee relocation, corporate relocation, commercial goods transportation, new furniture packing shipping, fine art packing and moving as well as wooden crates for all kind of delegate items. We are giving packing and moving service in local area in Parshuram nagar, Vishwamitri, Sandya nagar society, Kapdwanj, Mandvi, Arihant Society, Waghodia, Ghanghretia, Muj Mahuda, Hira nagar, Rajnagar Society, Jetalpur, Akota, Atladara, Jeevan Sagar Society, Bidc Gorwa Estate, Kunjvila, New Alkapuri, New IPCL Road and Sundaram nagar.
We are provide moving and shipping service in other cities near Vadodara like Anand, Nadiad, Nahapa, Khambhat, Dhandhuka, Godhra, Dabhoi, Karjan, Jambusar, Bodeli, Vejalpur, Dahod, Devgadh Baria, Jhabua, Kukshi and Chhota Udepur.


※ 선택분야의 정상판매 도서종수 : 총 831 종 입니다.
Two superstar talents in children's books come together and put a hilarious twist on the classic fable by Aesop, The Fox and the Grapes. Full color.
BRIGHT AND COLORFUL FIRST BOOKS, PERFECT FOR LITTLE ONES TO PICK UP AND TAKE WITH THEM WHEREVER THEY GO!
"New York Times"-bestselling Skippyjon Jones takes ancient Egypt by storm in this fun adventure. Full color. Pkg.
You are holding a book. What should you do with it? Open it, and you will find out.


text:
Q: How do I find the correct range to insert more sections into a UITableView? I realize that there is a different between a count and index in obj-c.
For this question and my issue to make sense, I will use the following examples to demonstrate.
My _data.count begins at 0.
After viewDidLoad, I fetch and insert sections where _data.count = 10
NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, _data.count)];
[self.tableView insertSections:set
              withRowAnimation:UITableViewRowAnimationFade];

This works as expected as I now have sections [0-9]. Later I add to the _data where _data.count = 12. Then I try to do a simple insert like before, but changing the starting index.
NSInteger sections = [self.tableView numberOfSections];
NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(sections, _data.count)];
[self.tableView insertSections:set
              withRowAnimation:UITableViewRowAnimationFade];

I would, maybe naively, expect this to insert the sections at [10-11]. The sections = 10, but my app crashes with the exception 'attempt to insert section 12 but there are only 12 sections after the update'

A: The problem was that I did not understand how NSRange works. Here is the struct for NSRange.
typedef struct _NSRange {
  NSUInteger location;
  NSUInteger length;
} NSRange;

I read about NSIndexSet and realized that it provides some helpers which I took advantage of to help figure out how I can correctly solve this.
Using the earlier example, this is what I learned about the ranges of the index set.
NSLog(@"first index %ld", (unsigned long)[set firstIndex]);
/* logs 10 */

NSLog(@"last index %ld", (unsigned long)[set lastIndex]);
/* logs 21 ? what the heck */

So with that information, I knew all I had to do was subtract the current section count from the update _data.count.
NSInteger sections = [self.tableView numberOfSections];
NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(sections, _data.count-sections)];
[self.tableView insertSections:set
              withRowAnimation:UITableViewRowAnimationFade];

Now that I understood what was wrong, I need to know how NSRange works. So I read about it and it became obvious why I was getting this error. The first number is the starting point, I.E. location and then the second number is the amount of places to move, I.E. length.


As a university student, I love being able to make food that doesn't take very long to cook and will always have leftovers I can keep in the fridge or freezer. This recipe is really simple, and if you make a big batch at the beginning of the week there's plenty for other meals, as well as some in the freezer for when I really can't be bothered to cook.
Firstly I added the chopped onion and crushed garlic cloves into a hot pan, with a little oil. I like to use to a fry light 1 cal oil spray, but it really doesn't matter. Once the onions were browned, I added the turkey mince until it was pretty much cooked, before adding the chopped up pepper. I waited until they had soften slightly before adding the jar of sauce and allowing to simmer and reduce down slightly. And that's it! It's such a simple sauce recipe that really doesn't take much time at all. I serve it with pasta, but this is also delicious with a sweet potato mash, rice noodles or as a pasta bake. Also because there is plenty to go in the fridge and freezer, I find these kinds of recipes perfect to make on a Sunday if I know I've got a busy week and doubt I'll want to cook much.


The Veer Loft's only Penthouse is now available. Veer is one of Vulcan's current projects transforming the South Lake Union district, set to emulate the Portland's popular Pearl District.
Located at 401 9th Ave North, Veer will be in the heart of the revitalized South Lake Union district, close to downtown and city-core amenities, and a block away from the new Street Car on Westlake Avenue.
For more information on the penthouse, please view the MLS listing report or feel free to contact us.
Images courtesy of Vulcan. Renderings are representative of full-loft units, not necessarily the Penthouse.


text:
Q: ssl_verify_client (system bus name :1.13917, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus) I set the flag ssl_verify_client to on in my configuration file in /etc/nginx/locations and I am getting the following error -
polkitd[1378]: Unregistered Authentication Agent for unix-process:150916:7856906  (system bus name :1.13917, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus).
Other than the above entry, I don't see anything else that gives more information and the nginx server doesn't restart. How do I rectify the error?

A: I found the issue, the file path mentioned in proxy_ssl_trusted_certificate property was improper.


Joe was born in Houston, TX and graduated from J. Frank Dobie High School. He completed his associates at San Jacinto College before transferring to Texas State University. He loves spending time with his beautiful family and watching all his Houston sports teams.
I only know how to tie my shoe one way – bunny ears.


Our skip hire company in Broomhill and Sharrow Vale Sheffield is one of the top organisations and are rated highly in the waste disposal industry. Skips are valuable and practical waste containers and are generally hired by organisations or householders for quicker facilitation of waste materials and general household junk. Any time you hire a Skip in Broomhill and Sharrow Vale Sheffield, it will make cleaning-out jobs a lot easier and more convenient. Also, it is more affordable to rent a skip for rubbish disposal, as skip hire Broomhill and Sharrow Vale Sheffield costs are generally very reasonable.
There are several skip hire companies in Broomhill and Sharrow Vale Sheffield who provide these services, and a lot of them have different sizes to suit their customers' needs. In case you have never ever hired a skip in Broomhill and Sharrow Vale Sheffield previously, you could be wondering where you can find a good skip company, well you have discovered us. Quite often than not, when you contact most companies, they assume you to already know the specifics, hence if you are not familiar with the terminologies as well as the jargon, it can be an overwhelming task.
What Size Skip Do You Need In The Broomhill and Sharrow Vale S10 2DG Area?
This is hard to understand in case you've never hired a skip previously. In the event you hire a skip that is very small, you could end up having to get a second skip to accommodate the waste type that you need to get rid of. If you hire a big skip, you might find yourself overpaying a little bit for the waste needs. The easiest method to understand skip sizes is to consider the type of waste material that you have got, if it's a dressing table for instance, could it be broken down into flat packs to let more room in the skip?
What sort of waste are you throwing out? If it's your garden waste, could it be cut up into tiny pieces so you could get more in the skip and eventually get more for your money? Or are they huge bulky items that cannot be broken down, therefore you may require a bigger skip. It's better to be safe and obtain a larger skip than it is to get a smaller skip and have to hire an additional one to accommodate your current waste collection needs.
Are you currently doing a building job? Are you just simply clearing out your home of unwanted junk? Are you currently carrying out garden work? These types of things do depend on the price nevertheless, we can accommodate for just about any type of waste. Simply let us know what kind of waste you want to do away with and we can provide you with a quote on that.
When you can keep it on your very own premises you can avoid the council charges for permits. If you can put it on your own front garden, that's wonderful. Having said that, we have to know how we could get our skip onto that front garden.
If there is a tiny wall we have to go over, or if there is a wide footway, the lorry that we make usage of to deliver the skips cannot get onto the footway. Driveways are the best option for this. However, consider if you are putting heavy goods into a large skip on the driveway and your drive is block paving or tarmac there might possibly be some kind of damage to your driveway due to the excess weight.
If you need it on the streets, honestly, that is not a problem, we can deal with the council and arrange council permits for you. The council do charge an additional fee for this and we will let you know the price should you give us a call . Please keep in mind that, even when it's not on the road and it is on the pavement it's still council property. It must be your exclusive property so we can deliver the skip without a permit. If you want it on the footpath or even a grass verge and it is not owned by you, we still have to obtain a Sheffield council permit in your case.


text:
require_dependency 'markdown_linker'
require_dependency 'email/message_builder'
require_dependency 'age_words'

class UserNotifications < ActionMailer::Base
  default charset: 'UTF-8'

  include Email::BuildEmailHelper

  def signup(user, opts={})
    build_email(user.email,
                template: "user_notifications.signup",
                email_token: opts[:email_token])
  end

  def signup_after_approval(user, opts={})
    build_email(user.email,
                template: 'user_notifications.signup_after_approval',
                email_token: opts[:email_token],
                new_user_tips: SiteContent.content_for(:usage_tips))
  end

  def authorize_email(user, opts={})
    build_email(user.email, template: "user_notifications.authorize_email", email_token: opts[:email_token])
  end

  def forgot_password(user, opts={})
    build_email(user.email, template: "user_notifications.forgot_password", email_token: opts[:email_token])
  end

  def digest(user, opts={})
    @user = user
    @base_url = Discourse.base_url

    min_date = opts[:since] || @user.last_emailed_at || @user.last_seen_at || 1.month.ago

    @site_name = SiteSetting.title

    @last_seen_at = I18n.l(@user.last_seen_at || @user.created_at, format: :short)

    # A list of topics to show the user
    @featured_topics = Topic.for_digest(user, min_date).to_a

    # Don't send email unless there is content in it
    if @featured_topics.present?
      @featured_topics, @new_topics = @featured_topics[0..4], @featured_topics[5..-1]

      # Sort the new topics by score
      @new_topics.sort! {|a, b| (b.score || 0) - (a.score || 0) } if @new_topics.present?

      @markdown_linker = MarkdownLinker.new(Discourse.base_url)

      build_email user.email,
                  from_alias: I18n.t('user_notifications.digest.from', site_name: SiteSetting.title),
                  subject: I18n.t('user_notifications.digest.subject_template',
                  site_name: @site_name,
                  date: I18n.l(Time.now, format: :short))
    end
  end

  def user_invited_to_private_message(user, opts)
    notification_email(user, opts)
  end

  def user_replied(user, opts)
    opts[:allow_reply_by_email] = true
    notification_email(user, opts)
  end

  def user_quoted(user, opts)
    opts[:allow_reply_by_email] = true
    notification_email(user, opts)
  end

  def user_mentioned(user, opts)
    opts[:allow_reply_by_email] = true
    notification_email(user, opts)
  end

  def user_posted(user, opts)
    opts[:allow_reply_by_email] = true
    notification_email(user, opts)
  end

  def user_private_message(user, opts)
    opts[:allow_reply_by_email] = true

    # We use the 'user_posted' event when you are emailed a post in a PM.
    opts[:notification_type] = 'posted'

    notification_email(user, opts)
  end

  protected

  def email_post_markdown(post)
    result = "[email-indent]\n"
    result << "#{post.raw}\n\n"
    result << "#{I18n.t('user_notifications.posted_by', username: post.username, post_date: post.created_at.strftime("%m/%d/%Y"))}\n\n"
    result << "[/email-indent]\n"
    result
  end

  class UserNotificationRenderer < ActionView::Base
    include UserNotificationsHelper
  end

  def notification_email(user, opts)
    return unless @notification = opts[:notification]
    return unless @post = opts[:post]

    username = @notification.data_hash[:display_username]
    notification_type = opts[:notification_type] || Notification.types[@notification.notification_type].to_s

    context = ""
    tu = TopicUser.get(@post.topic_id, user)

    context_posts = Post.where(topic_id: @post.topic_id)
                        .where("post_number < ?", @post.post_number)
                        .where(user_deleted: false)
                        .order('created_at desc')
                        .limit(SiteSetting.email_posts_context)

    if tu && tu.last_emailed_post_number
      context_posts = context_posts.where("post_number > ?", tu.last_emailed_post_number)
    end

    # make .present? cheaper
    context_posts = context_posts.to_a

    if context_posts.present?
      context << "---\n*#{I18n.t('user_notifications.previous_discussion')}*\n"
      context_posts.each do |cp|
        context << email_post_markdown(cp)
      end
    end

    html = UserNotificationRenderer.new(Rails.configuration.paths["app/views"]).render(
      template: 'email/notification',
      format: :html,
      locals: { context_posts: context_posts, post: @post }
    )

    if @post.topic.private_message?
      opts[:subject_prefix] = "[#{I18n.t('private_message_abbrev')}] "
    end

    email_opts = {
      topic_title: @notification.data_hash[:topic_title],
      message: email_post_markdown(@post),
      url: @post.url,
      post_id: @post.id,
      topic_id: @post.topic_id,
      context: context,
      username: username,
      add_unsubscribe_link: true,
      allow_reply_by_email: opts[:allow_reply_by_email],
      template: "user_notifications.user_#{notification_type}",
      html_override: html,
      style: :notification,
      subject_prefix: opts[:subject_prefix] || ''
    }

    # If we have a display name, change the from address
    if username.present?
      email_opts[:from_alias] = username
    end

    TopicUser.change(user.id, @post.topic_id, last_emailed_post_number: @post.post_number)

    build_email(user.email, email_opts)
  end

end


text:
import queue
import random
import time
from collections import defaultdict

import simplejson as json

from google.protobuf.json_format import MessageToJson
from pyqrllib.pyqrllib import bin2hstr, hstr2bin
from twisted.internet import reactor
from twisted.internet.protocol import ServerFactory

from qrl.core import config, logger, helper
from qrl.core.helper import json_bytestream_bk, json_bytestream
from qrl.core.p2pprotocol import P2PProtocol
from qrl.core.qrlnode import QRLNode
from qrl.crypto.misc import sha256
from qrl.generated import qrl_pb2

class P2PFactory(ServerFactory):
    protocol = P2PProtocol

    def __init__(self, chain, nodeState, node: QRLNode, pos=None):
        # FIXME: Constructor signature is not consistent with other factory classes
        self.master_mr = None
        self.pos = None
        self.chain = chain
        self.nodeState = nodeState
        self.stake = config.user.enable_auto_staking  # default to mining off as the wallet functions are not that responsive at present with it enabled..
        self.peers_blockheight = {}
        self.target_retry = defaultdict(int)
        self.target_peers = {}
        self.fork_target_peers = {}
        self.connections = 0
        self.buffer = ''
        self.sync = 0
        self.partial_sync = [0, 0]
        self.long_gap_block = 0
        self.mining = 0
        self.newblock = 0
        self.exit = 0
        self.genesis = 0
        self.missed_block = 0
        self.requested = [0, 0]
        self.ip_geotag = 1  # to be disabled in main release as reveals IP..
        self.last_reveal_one = None
        self.last_reveal_two = None
        self.last_reveal_three = None

        self.peer_connections = []

        self.node = node

        self.txn_processor_running = False

        self.bkmr_blocknumber = 0  # Blocknumber for which bkmr is being tracked
        self.bkmr_priorityq = queue.PriorityQueue()
        # Scheduled and cancel the call, just to initialize with IDelayedCall
        self.bkmr_processor = reactor.callLater(1, self.setPOS, pos=None)
        self.bkmr_processor.cancel()

    # factory network functions
    def setPOS(self, pos):
        self.pos = pos
        self.master_mr = self.pos.master_mr

    def RFM(self, data):
        """
        Request Full Message
        This function request for the full message against,
        the Message Receipt received.
        :return:
        """

        # FIXME: Again, breaking encasulation
        # FIXME: Huge amount of lookups in dictionaries

        msg_hash = data.hash

        if msg_hash in self.master_mr.hash_msg:
            if msg_hash in self.master_mr.requested_hash:
                del self.master_mr.requested_hash[msg_hash]
            return

        peers_list = self.master_mr.requested_hash[msg_hash].peers_connection_list
        message_request = self.master_mr.requested_hash[msg_hash]
        for peer in peers_list:
            if peer in message_request.already_requested_peers:
                continue
            message_request.already_requested_peers.append(peer)

            peer.transport.write(peer.wrap_message('SFM', MessageToJson(data)))
            call_later_obj = reactor.callLater(config.dev.message_receipt_timeout,
                                               self.RFM,
                                               data)
            message_request.callLater = call_later_obj
            return

        # If execution reach to this line, then it means no peer was able to provide
        # Full message for this hash thus the hash has to be deleted.
        # Moreover, negative points could be added to the peers, for this behavior
        if msg_hash in self.master_mr.requested_hash:
            del self.master_mr.requested_hash[msg_hash]

    def select_best_bkmr(self):
        block_chain_buffer = self.chain.block_chain_buffer
        blocknumber = self.bkmr_blocknumber
        try:
            score, hash = self.bkmr_priorityq.get_nowait()
            if blocknumber <= block_chain_buffer.height():
                oldscore = block_chain_buffer.get_block_n_score(blocknumber)
                if score > oldscore:
                    del self.bkmr_priorityq
                    self.bkmr_priorityq = queue.PriorityQueue()
                    return

            data = qrl_pb2.MR()

            data.hash = hash
            data.type = 'BK'

            self.RFM(data)
            self.bkmr_processor = reactor.callLater(5, self.select_best_bkmr)
        except queue.Empty:
            return
        except Exception as e:
            logger.error('select_best_bkmr Unexpected Exception')
            logger.error('%s', e)

    def connect_peers(self):
        """
        Will connect to all known peers. This is typically the entry point
        It does result in:
        - connectionMade in each protocol (session)
        - :py:meth:startedConnecting
        - :py:meth:clientConnectionFailed
        - :py:meth:clientConnectionLost
        :return:
        :rtype: None
        """
        logger.info('<<<Reconnecting to peer list: %s', self.node.peer_addresses)
        for peer_address in self.node.peer_addresses:
            # FIXME: Refactor search
            found = False
            for peer_conn in self.peer_connections:
                if peer_address == peer_conn.transport.getPeer().host:
                    found = True
                    break
            if found:
                continue
            reactor.connectTCP(peer_address, 9000, self)

    def get_block_a_to_b(self, a, b):
        logger.info('<<<Requested blocks: %s to %s from peers..', a, b)
        l = list(range(a, b))
        for peer in self.peer_connections:
            if len(l) > 0:
                peer.transport.write(self.protocol.wrap_message('BN', str(l.pop(0))))
            else:
                return

    def get_block_n_random_peer(self, n):
        logger.info('<<<Requested block: %s from random peer.', n)
        random.choice(self.peer_connections).get_block_n(n)
        return

    def get_block_n(self, n):
        logger.info('<<<Requested block: %s from peers.', n)
        for peer in self.peer_connections:
            peer.transport.write(self.protocol.wrap_message('BN', str(n)))
        return

    def get_m_blockheight_from_random_peer(self):
        logger.info('<<<Requested blockheight from random peer.')
        random.choice(self.peer_connections).get_m_blockheight_from_connection()
        return

    def get_blockheight_map_from_peers(self):
        logger.info('<<<Requested blockheight_map from peers.')
        for peer in self.peer_connections:
            peer.transport.write(self.protocol.wrap_message('BM'))
        return

    def get_m_blockheight_from_peers(self):
        for peer in self.peer_connections:
            peer.get_m_blockheight_from_connection()
        return

    def send_m_blockheight_to_peers(self):
        logger.info('<<<Sending blockheight to peers.')
        for peer in self.peer_connections:
            peer.send_m_blockheight_to_peer()
        return

    def send_st_to_peers(self, st):
        logger.info('<<<Transmitting ST: %s', st.epoch)
        self.register_and_broadcast('ST', st.get_message_hash(), st.to_json())
        return

    def send_tx_to_peers(self, tx):
        logger.info('<<<Transmitting TX: %s', bin2hstr(tx.txhash))
        self.register_and_broadcast('TX', tx.get_message_hash(), tx.to_json())
        return

    def send_reboot(self, json_hash):
        logger.info('<<<Transmitting Reboot Command')
        for peer in self.peer_connections:
            peer.transport.write(self.protocol.wrap_message('reboot', json_hash))
        return

    def ip_geotag_peers(self):
        logger.info('<<<IP geotag broadcast')
        for peer in self.peer_connections:
            peer.transport.write(self.protocol.wrap_message('IP'))
        return

    def ping_peers(self):
        logger.info('<<<Transmitting network PING')
        self.chain.last_ping = time.time()
        for peer in self.peer_connections:
            peer.transport.write(self.protocol.wrap_message('PING'))
        return

    # send POS block to peers..

    def send_stake_block(self, block_obj):
        logger.info('<<<Transmitting POS created block %s %s', str(block_obj.blockheader.blocknumber),
                    block_obj.blockheader.headerhash)
        for peer in self.peer_connections:
            peer.transport.write(self.protocol.wrap_message('S4', json_bytestream(block_obj)))
        return

    # send/relay block to peers

    def send_block_to_peers(self, block):
        # logger.info('<<<Transmitting block: ', block.blockheader.headerhash)
        data = qrl_pb2.MR()
        k = qrl_pb2.Transaction()
        data.stake_selector = block.transactions[0].addr_from
        data.block_number = block.blockheader.blocknumber
        data.prev_headerhash = bytes(block.blockheader.prev_blockheaderhash)

        if block.blockheader.blocknumber > 1:
            data.reveal_hash = block.blockheader.reveal_hash

        self.register_and_broadcast('BK',
                                    block.blockheader.headerhash,
                                    block.to_json(),
                                    data)
        return

    def register_and_broadcast(self, msg_type, msg_hash: bytes, msg_json, data=None):
        # FIXME: Try to keep parameters in the same order (consistency)
        self.master_mr.register(msg_hash, msg_json, msg_type)

        # FIXME: Clean
        if not data:
            data = qrl_pb2.MR()

        data.hash = msg_hash
        data.type = msg_type

        self.broadcast(msg_hash, msg_type, data)

    def broadcast(self, msg_hash: bytes, msg_type, data=None):  # Move to factory
        """
        Broadcast
        This function sends the Message Receipt to all connected peers.
        :return:
        """
        ignore_peers = []
        if msg_hash in self.master_mr.requested_hash:
            ignore_peers = self.master_mr.requested_hash[msg_hash].peers_connection_list

        if not data:
            data = qrl_pb2.MR()
            data.hash = msg_hash
            data.type = msg_type

        for peer in self.peer_connections:
            if peer in ignore_peers:
                continue
            peer.transport.write(self.protocol.wrap_message('MR', MessageToJson(data)))

    # request transaction_pool from peers

    def get_tx_pool_from_peers(self):
        logger.info('<<<Requesting TX pool from peers..')
        for peer in self.peer_connections:
            peer.transport.write(self.protocol.wrap_message('RT'))
        return

    # connection functions

    def reset_processor_flag(self, _):
        self.txn_processor_running = False

    def reset_processor_flag_with_err(self, msg):
        logger.error('Exception in txn task')
        logger.error('%s', msg)
        self.txn_processor_running = False

    # Event handlers
    # noinspection PyMethodMayBeStatic
    def clientConnectionLost(self, connector, reason):
        logger.debug('connection lost: %s', reason)
        # TODO: Reconnect has been disabled
        # connector.connect()

    # noinspection PyMethodMayBeStatic
    def clientConnectionFailed(self, connector, reason):
        logger.debug('connection failed: %s', reason)

    # noinspection PyMethodMayBeStatic
    def startedConnecting(self, connector):
        logger.debug('Started connecting: %s', connector)


The last 4 days have been well sort of taxing on my heart 💜!
Friday my dad went into the hospital due to many concerns….and they discovered there was water on the heart. There is a multitude of things causing it.
Tests were done extensively on Saturday and Sunday. Still no answers.
Yesterday: they discovered it wa a replay of several years ago where a stint needed to be placed to secure one of his arteries.
My father has been challenged with high blood pressure and heart health concerns for years!!!!
So when I opened my email this morning and saw today's BOGO I laughed and said: ok God you knew my dad needed this AND I needed this!
Turmeric and Lavender are both super good for supporting our heart health! Relieving anxiety, reducing inflammation, and creating a calm!
So I'm using lots of turmeric and lavender today! Over my heart and in my tea!!!
What do you do to create space for calm in your life for your whole health?!
🙌🙌🙌….they pair beautifully with yesterday's BOGO!!!! You did nab it right 😬😉🤗😘?!?


"This week's show narrowly avoids an arse crisis as we fall into the loving arms of the Manchester Punk Festival. Get ready for 9 great tracks from The Living Daylights, Grand Collapse, Mighty Midgets, Faintest Idea, The Fall, Maid Of Ace, Larrakia, The Domestics and Sweet Empire.
Do you know the way to Lincoln?, Manchester Punk Festival, I Don't Know What They're Singing, Smash Hits, Comedy Suburbs, Tony has your Facebook comments, we talk about last week, dentist fun, Wonk Unit gig, half pint pub crawl, From the Vaults, someone else's life long fall fan, Tony's International Gig Guide, Mariah Carey…, Tony's band, Tony's hunting for a bassist, back to the dentist, Paul's having a quiet week, toad in the hole, Izzatwat, InsaneStar, knicker express, arse crisis and we remind you of the stations which carry the show!
Download via http://www.punkyradio.com at iTunes, most podcatchers or listen online via Radia Andra, Podunk or TBFM.
Punky! 4/4/16 – Record Breakers!
"As the Manchester Punk Festival creeps closer, we celebrate another free compilation from TNS featuring nine great tracks from Negative Nancys, John Player Specials, Break Ups, SN Dubstation, Tiger, Chase Walker Band, Faintest idea, Revenge Of The Psychotronic Man and Flaccid.
Comedy Suburbs, Stockholm, Manchester Punk Festival vol 8, Tony has your Facebook comments, longest running podcast?, Daily Source Code, 555 on the 5/5, Sound Food and Drink news, the Catmilker is back, Paul's purple lounge, Cricket, From the Vaults: Tiger!, Tony's International Gig Guide, end of the tax year…, Paul talks about the new comedian of the year comp, Oslo, no Izzatwat this week, a brilliant April Fool press release and we play some Flaccid!
Download via http://www.punkyradio.com , at iTunes, podcatchers or listen online at TBFM, Podunk or Radio Andra.


text:
XR Unchained 3
XR Unchained – Where today we bring you a photo montage bursting at the seams with inspiring rebelliousness! So, how does it make me feel, as a 16-year-old? Being told that in my lifetime tens of millions of human lives could be lost to this crisis, and countless vital species could be sacrificed to extinction because of the inaction of our leaders? It makes me feel terrified, and angry, and I can't understand why our governments could possibly have allowed this to happen". Photo by Karen Brown Rebels carrying on their day job in the middle of Trafalgar…
London Rebellion: Day 3
In a grim metaphor for the ongoing extermination and extinction of so much of our planet's natural life, the police are picking rebels off the street with steady assurance – 92 year-olds and Pink Octopi alike have been removed. And they do it with the authority of laws not designed to protect the wellbeing of citizens, but to protect an insatiable growth-based status quo. Arrests (600 and counting) were very much expected. More of a surprise is the new tactic of forcefully confiscating shelter, food and water, and anything that might allow disabled people to conveniently participate.
After Monday's exhilaration, today we've been pushing down roots and getting used to life in the capital. As we found in April, there comes a point at which it seems almost natural that we would be here in the roads. Natural, but also nicer: instead of car engines, choirs and samba bands; instead of throngs of busy strangers, free food and open dialogue (not least from incorrigible truth-teller Jonathan Pie!) Not everyone seems to agree with the improvement: the Met have been making their usual efforts to dislodge these implausible utopias. The arrest count continues to climb –…
XR Unchained: Day 2 of Rebellion
XR is more Unchained than ever. The sheer scope of creative, ingenious and courageous actions all over the globe is no longer something we can even attempt to keep up with. But rather than leaving so much unrecorded, we thought we'd give you our readers the chance to succeed where we can't: so below, you'll find a messy, beautiful, and quite possibly overwhelming scrapbook of everything that's come to our attention in the past 24 hours. We can't guarantee the dates or other details which you might find – we don't have time to check it all! What we can…
Rebel Daily 2: The Rebellion Takes Root
(Sign up to the international newsletter here) The seeds have been sewn. Compassion; awareness; courage. They landed in cities, suburbs and farmland; in hearts and in minds, taking no account of age or occupation or background. And now we're growing: taking root. In some cities we're established on the roads and growing stronger by the day. Tents are assembled, flags are dangled, kitchens put together. In other places we're meeting, painting, blocking: making our mark in other ways. Rebel campers make it through the first night of Rebellion. But the deeper growth is…
BBC, we talked about this: so why are you still letting vested interests undermine peaceful movements?
In August, Extinction Rebellion met with the BBC to discuss its approach to reporting on the crisis and how it can lead the way with an appropriate and urgent response.
Rebel Daily 1: The Sun Rises on a New Wave of Rebellion
International Rebellion is here. And it's bigger and more beautiful than we dared to imagine. This is what mass civil disobedience looks like. It's happening. It can't be ignored. It's only growing stronger. It's a rebellion. We're back on the roads – with as much joy, fear, love and courage as ever. We're shutting down cities – not because it's fun (though it can be), but because it's our last option for stopping this toxic system in its tracks. Our world is dying; to save it, we'll need everyone – wherever and whoever you are – to do your bit.
London is alive with Rebellion
Introduction They may have pre-emptively taken away our infrastructure and cushions, they may have confiscated our tents and displays over a largely cold, overcast, and drizzly day, and they may have arrested over 270 of us, but tonight the police can still only look on as rebel sites circle the capital. We built a bedded-in fortress around Westminster, the house of a government that is still not telling the truth about the urgency of the climate crisis, still not doing nearly enough to halt biodiversity loss or reduce greenhouse gases, and refuses to be led by Parliament, let alone by…
XR Unchained: Aaaand we're off! International
Kiwi Kick-Off 7 OCT | Wellington, New Zealand Aotearoa rebels kicked off the International Rebellion by shutting down their capital, Wellington. Rising early, they seized and held the Ministry of Business, Innovation & Employment (AKA Ministry for Oil, Gas and Minerals) all day, blocking all entrances with glued hands and "climate crime scene" tape. The street was blocked off on either end with a pink wheel-less car and the now iconic pink boat, each vehicle encircled by undetachable activists. Meanwhile, growing numbers of rebels started a blockade to keep the authorities on their toes and block one of the main…
Rebellion Needs (UK)
October 06, 2019 By Rebel Writers
This Rebellion needs all hands on deck. ACTION SCHEDULE – Thursday and Friday XR Professionals THURSDAY: 5.30pm @ Trafalgar Sq Please come and join protesting professionals in your work attire / with a white sash / a placard stating your profession / job/ vocation / caregiving role. 🥜🥗🌯🌮🥙🥜🥗🌯🌮🥙 Also in Trafalgar Square… Performance Art: Human Connection🕰 5.30pm🏛 Trafalgar Square A mass human performance art to demonstrate the power of human connection through Reconciliation* In this moment of intensity, may we come together to remember our humanity and unite in togetherness. This is not a…


text:
Q: How to stop redirect from partial page after form submit Having an issue, I have a partialview named Manage, I load the partial in:
Controller AdminPanel, View AdminProfile like so:

                               @{Html.RenderPartial("~/Views/Account/Manage.cshtml");
                               }

When I click on save changes I get redirected to /Account/Manage, it should be /AdminPanel/AdminProfile?

Not sure if controller is returning the correct redirect or information for the json if I try to use a ajax script:
    public ActionResult Manage(ManageMessageId? message)
    {
        ViewBag.StatusMessage =
            message == ManageMessageId.ChangePasswordSuccess ? "Your password has been changed."
            : message == ManageMessageId.SetPasswordSuccess ? "Your password has been set."
            : message == ManageMessageId.RemoveLoginSuccess ? "The external login was removed."
            : "";
        ViewBag.HasLocalPassword = OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name));
        ViewBag.ReturnUrl = Url.Action("Manage");
        return View();
    }
public ActionResult Manage(LocalPasswordModel model)
{
    bool hasLocalAccount = OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name));
    ViewBag.HasLocalPassword = hasLocalAccount;

            ViewBag.ReturnUrl = Url.Action("AdminProfile", "AdminPanel");
        //ViewBag.ReturnUrl = Url.Action("Manage");

    if (hasLocalAccount)
    {
        if (ModelState.IsValid)
        {
            // ChangePassword will throw an exception rather than return false in certain failure scenarios.
            bool changePasswordSucceeded;
            try
            {
                changePasswordSucceeded = WebSecurity.ChangePassword(User.Identity.Name, model.OldPassword, model.NewPassword);
            }
            catch (Exception)
            {
                changePasswordSucceeded = false;
            }

            if (changePasswordSucceeded)
            {
                    return RedirectToAction("AdminProfile", "AdminPanel", new { Message = ManageMessageId.ChangePasswordSuccess });

            }
            else
            {
                ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
            }
        }
    }
    else
    {
        // User does not have a local password so remove any validation errors caused by a missing
        // OldPassword field
        ModelState state = ModelState["OldPassword"];
        if (state != null)
        {
            state.Errors.Clear();
        }

        if (ModelState.IsValid)
        {
            try
            {
                WebSecurity.CreateAccount(User.Identity.Name, model.NewPassword);
                return RedirectToAction("AdminProfile", "AdminPanel", new { Message = ManageMessageId.ChangePasswordSuccess });
            }
            catch (Exception)
            {
                ModelState.AddModelError("", String.Format("Unable to create local account. An account with the name \"{0}\" may already exist.", User.Identity.Name));
            }
        }
    }

    // If we got this far, something failed, redisplay form
    //return PartialView("Manage", model);
    return Json(new { redirectTo = Url.Action("AdminProfile", "AdminPanel") });
}

This is the partial page that is loaded:
 @model LocalPasswordModel
@{
    ViewBag.Title = "Change Password";
}

@ViewBag.Title

You're logged in as @User.Identity.Name

@ViewBag.StatusMessage

        @using (Html.BeginForm("Manage", "Account", Form.Post, new { @class = "form-horizontal" }))
        {
            @Html.AntiForgeryToken()
            @Html.ValidationSummary()

                Old Password

                    @Html.PasswordFor(m => m.OldPassword, new { @class = "form-control" })

                                            New Password

                                                @Html.PasswordFor(m => m.NewPassword, new { @class = "form-control" })

                                            Confirm Password

                                                @Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control" })

                                                <input type="submit" class="btn btn-primary" value="Change password" />

        }

The script below is placed in the _LayoutPage however as mentioned in the comments it is not doing anything.

All I am trying to do is stop the redirect after I submit, I have opened this to a bounty. It would be nice if you could also include how I could recieve the status messages back aswell after a user hits submit.
For instance user hits save changes > saves to the server > messages are then sent back to the partial page (all without redirecting)

A: Firstly, you need to decorate your POST action result as a post.
[HttpPost]
public ActionResult Manage(LocalPasswordModel model){

Secondly, you can get rid of the javascript altogether by
testing the validity of the form submit result within your controller
and this will manage whether the user is redirected or not.
[HttpPost]
public ActionResult Manage(LocalPasswordModel model){

    if(condition to redirect){
        return RedirectToAction("AdminProfile", "AdminPanel");
    }
    return View(model);

}

Lastly, I cannot see where you've actually put you jquery.
It needs to be put at the end of your form page, in your script section.
You mention it's in your layout page?
I think this link may also help, jQuery.post(), also event.preventDefault() is also useful to prevent form submission client side.
To control specifically where you want to redirect to, add redirects at every place there is a result, example: please note I am only returning to the adminprofile as this is what the op wants
if (changePasswordSucceeded)
{
    return RedirectToAction("AdminProfile", "AdminPanel", new { Message = ManageMessageId.ChangePasswordSuccess });

 }
 else
 {
     ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
     return RedirectToAction("AdminProfile", "AdminPanel");
 }

As a sidenote, you need to think through your program flow to decide how you want to manage invalid attempts, etc.

A: Is it because when you press save its doing a regular http post to the server to the Account/Manage page so you are being redirected. So your javascript is never actually running?
try using Ajax.BeginForm or changing the save button to use your javascript.

A: If you are posting your form data using AJAX then simply in the submit function
<form onsubmit="mysubmitfunc(event)" ....>

And in the submit function
function mysubmitfunc(e)
{
e.preventDefault();
/*
YOUR AJAX CODE GOES HERE
*/

return false; //last line in the function
}

A: Use ajax submit in the right way, how? attach to form submission event, catch submit event, stop the post, post it from javscript, and process the response at success.
Replace your _LayoutPage js with next, make sure you are using ID to identify the form, if not this javascript may affect other forms.
$(function() { //shorthand document.ready function

    //recommended to use Id on form identification not class... search on google how to
    //attach handler on form submit
    $('.form-horizontal').submit(catchSubmit);

    //custom handler for form submit
    function catchSubmit(event) {
      event.preventDefault(); //stop html form post
      // ajax post with serialized form
      $.post($(this).attr("action"),
         $(this).serialize(),
         postSuccessHandler
      );
    }

   //redirect decizion
   function postSuccessHandler(data) {
     if (data.redirectTo) {
               window.location.href = data.redirectTo;
            } else {
                $(".tab-2").html(data);
            }
   }
});

A: You can also move the html button to outside of the form.


When you book and pay your fare you are agreeing to the terms of the cruise line contract. You are unlikely to be given a copy of it but can access it online, in the brochure or requesting a copy from your cruise agent.
Refuse to let you cruise: You are likely to have agreed that the line can refuse to take a booking or carry you for any reason. They will only refund the cost of the cruise if they do.
Search rights: You are likely to be consenting to searches being made of your person, baggage or other property, and to the removal and confiscation or destruction of anything the line feels is a safety issue, illegal or will adversely affect other passengers and crew.
Independent contractors: Many of the facilities on ships are contracted out to third party providers like hairdressers, manicurists, masseurs, spa operators, photographers, entertainers, instructors, lecturers and excursions. The cruise line may offer no guarantees, warranties or recourse with them for any issues you have with these.
Photographic and video images: The line usually require you to give them the copyright to any photographic or video content they take of you, including allowing them to use them in advertising and publicity material without any payment.
Some contracts will give them the right to restrict how you use images and videos you take on board, including asking you to remove it from online sites.
Legal disputes: Most contracts will specify which court of law has to be used in the case of any legal dispute. These are chosen in areas that are usually more favourable to the cruising industry and may not be where the line is headquartered.
So make sure you are checking what you are agreeing to when you book and pay your final balance to avoid any surprises.


text:
Russia Still Paying Price for Crimea Five Years After Annexation
Half a decade has passed since Vladimir Putin annexed Ukraine's Crimean peninsula. For Russia, the costs continue to mount.
The accession treaty signed to bring the Black Sea territory into Moscow's fold is still unrecognized by most countries and the U.S. and European Union led a broad effort to punish Russia with sanctions.
Undeterred, Russia has kept integrating Crimea into its economy, investing billions in new power plants and building a giant bridge to the peninsula last year.
Most of the costs Russia has incurred have come from the U.S. and EU penalties, which have piled up every year since the annexation, with new ones added for alleged election meddling and other actions.
But the country and its residents — already suffering from low prices for oil, Russia's main export — are also feeling the pain a drop in foreign investment and stagnating incomes. A recent survey suggests the public appeal of the annexation is starting to wear off.
Here are five charts that illustrate the cost of the takeover.
Analysts at Bloomberg Economics estimate that sanctions have knocked as much as 6 percent off Russia's economy over the past five years. A study published by analyst Scott Johnson late last year found that the economy of the world's biggest energy exporter is more than 10 percent — or $150 billion — smaller compared with what might have been expected at the end of 2013.
Four percentage points of that come from the drop in oil prices, but sanctions and other factors are to blame for the rest.
The sanctions drag isn't likely to go away any time soon, and allegations that Russia meddled in the 2016 U.S. presidential elections mean it's only likely to get worse.
The number of Russian companies and individuals who are subject to U.S. sanctions has quadrupled to more than 700 since 2014, and another bill is doing the rounds in Washington that could hit the country with a new raft of penalties this year.
The economic lull has meant less money is filtering through to paychecks of ordinary Russians. Average incomes have barely budged above 30,000 rubles a month ($459) since the Crimea takeover and slump in oil prices pushed the country into an almost two-year recession.
One region where incomes have grown is Crimea as wages increase from a low base to catch up with those in Russia.
After picking up a bit in 2017 when it looked like U.S. President Donald Trump might move to lift sanctions, foreign direct investment has dwindled and even turned negative in the second quarter of last year.
As the economic pressure takes its toll on ordinary Russians, the positive effect the annexation had on public opinion five years ago has started to wear off. A poll published on Thursday by the Moscow-based Public Opinion Foundation (FOM) found that just 39 percent of Russians think the takeover did Russia more good than harm, down from 67 percent at the end of 2014.
Crimeans Take to the Streets in Celebrations, in PhotosRussia Will Respond to New EU Sanctions — Reports