DZone
Thanks for visiting DZone today,
Edit Profile
  • Manage Email Subscriptions
  • How to Post to DZone
  • Article Submission Guidelines
Sign Out View Profile
  • Post an Article
  • Manage My Drafts
Over 2 million developers have joined DZone.
Log In / Join
Refcards Trend Reports
Events Video Library
Refcards
Trend Reports

Events

View Events Video Library

Latest Articles - DZone

article thumbnail
Literate Programming and GitHub
I remain captivated by the ideals of Literate Programming. My fork of PyLit (https://github.com/slott56/PyLit-3) coupled with Sphinx seems to handle LP programming in a very elegant way. It works like this. Write RST files describing the problem and the solution. This includes the actual implementation code. And everything else that's relevant. Run PyLit3 to build final Python code from the RST documentation. This should include the setup.py so that it can be installed properly. Run Sphinx to build pretty HTML pages (and LaTeX) from the RST documentation. I often include the unit tests along with the sphinx build so that I'm sure that things are working. The challenge is final presentation of the whole package. The HTML can be easy to publish, but it can't (trivially) be used to recover the code. We have to upload two separate and distinct things. (We could use BeautifulSoup to recover RST from HTML and then PyLit to rebuild the code. But that sounds crazy.) The RST is easy to publish, but hard to read and it requires a pass with PyLit to emit the code and then another pass with Sphinx to produce the HTML. A single upload doesn't work well. If we publish only the Python code we've defeated the point of literate programming. Even if we focus on the Python, we need to do a separate upload of HTML to providing the supporting documentation. After working with this for a while, I've found that it's simplest to have one source and several targets. I use RST ⇒ (.py, .html, .tex). This encourages me to write documentation first. I often fail, and have blocks of code with tiny summaries and non-existent explanations. PyLit allows one to use .py ⇒ .rst ⇒ .html, .tex. I've messed with this a bit and don't like it as much. Code first leaves the documentation as a kind of afterthought. How can we publish simply and cleanly: without separate uploads? Enter GitHub and gh-pages. See the "sphinxdoc-test" project for an example. Also thishttps://github.com/daler/sphinxdoc-test. The bulk of this is useful advice on a way to create the gh-pages branch from your RST source via Sphinx and some GitHub commands. Following this line of thinking, we almost have the case for three branches in a LP project. The "master" branch with the RST source. And nothing more. The "code" branch with the generated Python code created by PyLit. The "gh-pages" branch with the generated HTML created by Sphinx. I think I like this. We need three top-level directories. One has RST source. A build script would run PyLit to populate the (separate) directory for the code branch. The build script would also run Sphinx to populate a third top-level directory for the gh-pages branch. The downside of this shows up when you need to create a branch for a separate effort. You have a "some-major-change" branch to master. Where's the code? Where's the doco? You don't want to commit either of those derived work products until you merge the "some-major-change" back into master. GitHub Literate Programming There are many LP projects on GitHub. There are perhaps a dozen which focus on publishing with the Github-flavored Markdown as the source language. Because Markdown is about as easy to parse as RST, the tooling is simple. Because Markdown lacks semantic richness, I'm not switching. I've found that semantically rich markup is essential. This is a key feature of RST. It's carried forward by Sphinx to create very sophisticated markup. Think:code:`sample` vs. :py:func:`sample` vs. :py:mod:`sample` vs.:py:exc:`sample`. The final typesetting may be similar, but they are clearly semantically distinct and create separate index entries. A focus on Markdown seems to be a limitation. It's encouraging to see folks experiment with literate programming using Markdown and GitHub. Perhaps other folks will look at more sophisticated markup languages like RST. Previous Exercises See https://sourceforge.net/projects/stingrayreader/ for a seriously large literate programming effort. The HTML is also hosted at SourceForge: http://stingrayreader.sourceforge.net/index.html. This project is awkward because -- well -- I have to do a separate FTP upload of the finished pages after a change. It's done with a script, not a simple "git push." SourceForge has a GitHub repository. https://sourceforge.net/p/stingrayreader/code/ci/master/tree/. But. SourceForge doesn't use GitHub.com's UI, so it's not clear if it supports the gh-pages feature. I assume it doesn't, but, maybe it does. (I can't even login to SourceForge with Safari... I should really stop using SourceForge and switch to GitHub.) See https://github.com/slott56/HamCalc-2.1 for another complex, LP effort. This predates my dim understanding of the gh-pages branch, so it's got HTML (in doc/build/html), but it doesn't show it elegantly. I'm still not sure this three-branch Literate Programming approach is sensible. My first step should probably be to rearrange the PyLit3 project into this three-branch structure.
June 24, 2015
by Steven Lott
· 2,011 Views
article thumbnail
Perforce and Go2Group Integrate Helix SCM Platform with ConnectALL ALM Router
New Integration Provides Seamless Connections Between Perforce Helix and Leading Application Lifecycle Management Systems WOKINGHAM, UK. (June 24, 2015) – Perforce Software, the leader in software configuration management (SCM) and collaboration, and Go2Group, an Atlassian Platinum and Enterprise Expert, today announced the Perforce ConnectALL Adapter. The new adapter for Go2Group’s ConnectALL ALM Router connects Perforce Helix to Application Lifecycle Management (ALM) systems supported by ConnectALL. The companies also announced that they have expanded their partnership, which first began in 2002. “Very few SCMs can handle binary data, and no other SCM solution supports large file formats that scale across globally distributed enterprises like Helix,” said Brett Taylor, president of Go2Group. “Our customers demand future-proof solutions, and with Perforce we know they don’t have to worry about outgrowing their systems—it will serve them well whether they’re a team of 50 or 50,000.” With the Perforce adapter, ConnectALL automatically synchronises data and workflow with other ALM systems and integrates ALM systems components within minutes. “We’re excited to be a part of the ConnectALL ecosystem of adapters and to enable companies to more easily design, configure, synchronise, manage, and monitor their integrations with Perforce,” said Dave Robertson, vice president of Channels at Perforce. “We’re glad to extend our partnership with Go2Group to new technologies and markets.” Go2Group is part of Perforce’s network of sales partners across Europe, the Middle East, Africa, Asia Pacific and India. Perforce partners serve customers in more than 100 countries worldwide. The Perforce ConnectALL Adapter is available for purchase from the Go2Group website.
June 24, 2015
by Fran Cator
· 988 Views
article thumbnail
UK Backup Receives Asigra Hybrid Partner Award for Exceptional Leadership
UK Backup Recognised for its Recovery License Model Marketing Campaign at the 2015 Asigra Partner Summit in Toronto Farnborough - Hampshire – June 24th, 2015 – UK Backup, today announced that it has won the Best Recovery License Model Marketing Campaign Award during the 2015 Asigra Partner Summit in Toronto. The award recognises UK Backup for outstanding operations in Marketing. UK Backup was recognised for its dedication and leadership in business and technology while accelerating the adoption of cloud-based data recovery solutions. The 2015 Asigra Partner Summit Awards are an integral part of the Toronto event, which is dedicated to helping IT service providers succeed with cloud-based backup and disaster recovery solutions. The three day conference provides education on technology, marketing, emerging trends and sales enablement to support service provider service quality and growth in this emerging market. Summit attendees receive an advance look and training on new technologies as part of the interactive product experience in the Asigra Hands-On Lab and insight on impactful sales and market strategies. UK Backup delivers services based on Asigra’s converged data protection platform. Asigra Cloud Backup™ software is the industry’s leading cloud-based data recovery software with over one million installments worldwide. The software is built for efficient operation and easily integrates with public, private, and hybrid cloud architectures. Asigra’s agentless architecture provides for simple deployment and hands-free management while delivering advanced features, including global de-duplication, automated mass deployment, autonomic healing, and validation restore capabilities. Asigra Cloud Backup is complemented by the company’s recently announced Converged Data Protection Appliance which addresses the complexity and cost concerns of data protection storage. Domain expertise is critical in the deployment of successful cloud-based data recovery services and the guidance provided to customers by their trusted service provider ensures success in even the most widely distributed IT environments. UK Backup was identified as the winner in one of several different award categories in the area of Marketing and noted for excellence in promoting the Recovery License Model. “Because of expanding workplace environments the proliferation of mobile and cloud-based IT, it is becoming increasingly difficult for organizations to find, protect, and ensure the recovery of important corporate data. UK Backup has demonstrated the technology and business skills that define a premier provider in this industry,” said David Farajun, CEO, Asigra. “UK Backup’s leadership momentum continues to drive them and the industry in a positive direction and we applaud their accomplishments. Their focus on customer-centered service delivery has positioned them well in data protection as end-user organizations seek guidance to improve the performance and reliability of solutions in this space.” “It is an excellent time to participate in the delivery of cloud-based data protection as organisations are increasingly open to higher value backup and DR solutions,” said James Chillman, Managing Director, UK Backup Limited “Asigra has been a key partner in this respect, providing top shelf technology to meet the broadest range of customer concerns. We welcome this recognition and extend our thanks to the entire UK Backup team.”
June 24, 2015
by Fran Cator
· 892 Views
article thumbnail
Alpnames breaks 500,000 domain names under management
Alpnames becomes the second largest registrar for new domain endings Wednesday 24th June 2015, Gibraltar: Alpnames smashed through the half million mark last night in terms of domain under management. As an ICANN accredited registrar specialising in new generic Top Level Domains, Alpnames manages nearly 8% of all new gTLD names registered to date making it the second most popular new gTLD registrar after the industry giant GoDaddy and recently overtaking the first and longest standing registrar Network Solutions (part of web.com). “We are delighted with the extraordinary growth of Alpnames” said Damon Barnard, Chief Operations Officer at Alpnames. “Our decision to focus on bringing competitively priced new domain extensions to the attention of Internet users, who might be frustrated at the lack of affordable domain names under .COM, is clearly the right one” There is currently a massive change happening in the Internet Name space meaning that domain names can now end in almost any series of letters such as .science, .party or .club. ICANN, the body that regulates names on the internet, relaxed the rules on internet domain extensions in 2013 in order to promote competition, innovation and consumer choice. Currently, over 5.75 million domain names have been registered in nearly 640 new domain extensions. These so called new generic Top Level Domains (gTLDs) will form the backbone of the next generation of the Internet, opening up the web to a whole host of new possibilities. “Alpnames is proud to be a leading player in the new era of domain names” continued Barnard. “We intend to continue bringing new domain names to Internet users at affordable prices; names that help define communities of interest online and assist Internet users in navigating to websites that provide the content or interaction that they are looking for.” With more than 500,000 web addresses under management, Alpnames is one of the fastest growing domain name registrars in history.
June 24, 2015
by Fran Cator
· 1,021 Views
article thumbnail
Sending Concatenated SMS with UDH using kannel
A normal SMS can contain upto 160 characters in GSM 7bit encoding. For sending long messages that have more then 160 characters that message has to be splitted in multiple SMS with a UDH header added to them and sent one by one. Whats a UDH: UDH - User Data Header It keeps the information about the message. UDH is made up of 6 parts: 05 - This tells the length of UDH which is 5 bytes(total bytes fllowing this byte). 00 - IEL (Information Element Identifier). This indicates that this message is concatenated. This value will remain same 03 - This tells the length of incoming information field (ie more three bytes will be there in UDH). AA- This is unique identifier of message.It remains same for all parts of message. It can be any unique byte. For eg F3 BB- This tells the total number of message parts. For example If you have a long message divided in two parts then this will be : 02 CC - The sequence number of this message. For example if you are sending first part of message then it will become 01 , if you are sending second part it will be 02. So whole UDH will look like Example UDH : 050003F30201 Sending A message with udh As UDH is in hexadecimal format, while sending message with UDH then text should also be converted to hex format. The code snippet shows simple example to send Message with UDH using XML POST in kannel public class kannelSend{ public static void sendMessage(String inputXMLConnect) throws IOException { String url = "http://localhost:13003/cgi-bin/sendsms"; CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = null; CloseableHttpResponse response = null; InputStream in; StringEntity entity = null; entity = new StringEntity(inputXMLConnect, ContentType.create( "text/xml")); entity.setChunked(true); try { httpPost = new HttpPost(url); httpPost.setEntity(entity); response = httpClient.execute(httpPost); LOG.info(response.getStatusLine()); in = response.getEntity().getContent(); String body = IOUtils.toString(in); EntityUtils.consume(entity); } catch (Exception e) { LOG.error(e.getMessage(), e); } finally{ response.close(); httpClient.close(); } public static void main(String[] args) throws IOException { String inputXMLConnect = "0000001234496e207468652063656c6c756c61722070686f6e6520696e6475737472792c206d6f62696c652070686f6e657320616e64207468656972206e6574776f726b7320736f6d6574696d657320737570706f727420636f6e636174656e617465642073686f7274206d657373616765207365727669636520746f206f766572636f6d6520746865206c696d69746174696f6e206f6e20746865206e050003F202016031abc123send"; submitKannelMessage(inputXMLConnect); inputXMLConnect = "00000123756d626572206f66206368617261637465727320746861742063616e2062652073656e7420696e20612073696e676c6520534d532074657874206d657373616765207472616e736d697373696f6e2028776869636820697320757375616c6c7920313630292e050003F202026031abc123send"; submitKannelMessage(inputXMLConnect); } }
June 24, 2015
by Kirti Mandwade
· 7,299 Views · 1 Like
article thumbnail
TEOCO launches CONNECT 9.0 for improved wireless backhaul planning
New version of planning tool adds small cell backhaul support, 64-bit OS computing FAIRFAX, VA., USA – 24 June 2015 – Network assurance and analytics company TEOCO today launched the latest version of CONNECT, its wireless backhaul network planning tool. CONNECT 9.0 includes several new upgraded features to meet mobile operators’ latest requirements for designing and planning the wireless backhaul elements of their mobile networks. The new features added to CONNECT 9.0 include a unique function for more accurate small cell backhaul planning. CONNECT 9.0’s “Site backhaul ranking” enables operators to evaluate a large number of potential small cell locations in terms of their backhaul connectivity. It assesses each location for its suitability to accept a Line-Of-Sight (LOS), non-LOS or wired backhaul connection to the existing network. Small cell planners and RF planning tools can use this information to make better, more informed decisions about where to locate small cells and how to connect them to the macro network. Other new features added to CONNECT 9.0 include 64-bit OS computing, to support larger data sets for very large networks that include more than 100,000 wireless links. Finally, CONNECT 9.0 incorporates the latest ITU recommendations for Line-Of-Sight link modelling. “With the advent of small cells, and ultra-dense mobile networks in the horizon, it is now imperative to break down the walls between backhaul planning and radio planning,” said Daniel Ramirez, Director of Planning Products. “The new version of CONNECT gives mobile operators the ability to bridge the two worlds by helping radio planners find the best locations by considering their backhaul needs. CONNECT continues to provide the most accurate backhaul planning capabilities in line with the added scale and complexity of today’s networks.” CONNECT is part of the TEOCO planning portfolio, a set of tightly integrated tools to make the entire planning process as seamless as possible. The other products in the portfolio include ASSET (radio planning), CAPESSO (automatic cell planning), DIMENSION (capacity planning) and Velox (small cell planning). CONNECT provides a complete backhaul planning solution for microwave, optical, satellite and copper links to support multiple RAN technologies, including LTE. Its cost analysis also allows operators to budget forecasts for different planning scenarios, including the ROI for network deployment. The CAPEX and OPEX of links can also be calculated to aid financial planning.
June 24, 2015
by Fran Cator
· 2,250 Views
article thumbnail
New Integrated Biometrics System Extends Enterprise Access Control to the Data Centre and Other High-Security Settings
Combining BioConnect with Digitus server cabinet access control makes biometric identity management more effective and easier ENTERTECH SYSTEMSandDigitus Biometricshave just announced a new technology partnership between ENTERTECH’S BioConnect identity management platform and the Digitus db Bus and db Cabinet Sentry for server cabinet access control. The result is a new, fully-integrated solution called db BioConnect. The newdb BioConnectlets company data centres, co-location data centres and IT room customers simplify biometric implementation, enrollment and management for access control of perimeter doors, interior rooms, cages and now server racks all integrated into one identity platform. This game-changing solution now extends enterprise access security platforms into the data centre, making investments in Access Control Management Systems far more economical and effective. “Digitus Biometrics is the leader in providing biometric access control to the critical infrastructure market," said Rob Douglas, ENTERTECH SYSTEMS CEO. "With Digitus technology integrated to BioConnect, all 15 of our certified access control partners will now be able to offer it to their customers. For the first time, end users will have access to an integrated biometric solution that secures access control from the data centre entrance to the server cabinet instead of having to deal with stand-alone systems.” The list of BioConnect certified access control partners can be found atwww.bioconnect.com/partners. ENTERTECH SYSTEMS’BioConnectis the most advanced identity management platform on the global market today. Simple, secure and scalable, it provides Suprema biometric authentication across leading access control systems. As an application for security professionals, BioConnect helps enterprises successfully implement identity solutions by making deployment and use of biometrics easier than ever. BioConnect addresses deployment challenges by reducing costs, overcoming complexity and making it easier to on-board users. The platform provides seamless synchronization of data such as new cardholders, changes and deletions, and is tailor-made for enterprises where true identity is critical for secure access to physical facilities and software applications. “Our biometric access control solutions are designed to meet the needs of a diverse range of clients," said David Orischak, Digitus Biometrics CEO. "This technology integration to create db BioConnect will let us offer a single, centralised, highly advanced access control solution that's easy to deploy and use. An industry first, our customers will be able to use one centralised system facility-wide to secure a company’s critical infrastructure and data." db Bus ServerRack Access Controlis designed for data centres needing to secure large volumes of server cabinets with only one small component per cabinet. A single db Bus controller allows the user to secure up to 32 racks with a single 48V power supply and may be infinitely scaled.db Cabinet Sentryis designed for data centres with a structured cabling scheme. It is Digitus’ most compact, cost-effective and energy-efficient means of securing server cabinets. This extremely versatile unit can be deployed in networked or stand-alone environments, using power over Ethernet (PoE) or an external power supply.db BioLockis a server cabinet lock that uses biometric identification with prints for up to 10 fingers per user. Through this new technology partnership, these db products will be integrated with BioConnect to create the new integrated db BioConnect solution. “Digitus’ use of leading Suprema biometric technology in their server cabinet access control solutions is a natural fit for ENTERTECH SYSTEMS as the operating partner for Suprema in the US, Canada, UK, Ireland and Puerto Rico,” added Douglas. “The implications to the market are significant," added Orischak. "The integrated db BioConnect solution can be used to manage any cabinet system where biometric access control is warranted – even SCIF’s and locked areas housing sensitive assets such as pharmaceuticals, hazardous materials, intelligence archives, customer and patient records, as well as critical IP.” For more information on the db BioConnect integrated solution, visitwww.bioconnect.com/db.
June 24, 2015
by Fran Cator
· 1,383 Views
article thumbnail
Department for International Development delivers global relief and aid with the help of Google Sites
24th June: The UK Government’s Department for International Development (DFID) has introduced Google Sites, part of the Google Apps suite, to assist with the delivery of global relief and aid programmes, with the help of Google for Work Premier Partner, Ancoris. DFID had a system in place to create project and programme collaboration sites, and began looking for an alternative tool when a change to the existing price model meant it faced a steep rise in costs. The department put the project out to tender on G-Cloud, and awarded it to Ancoris within just four weeks. DFID is using Google Sites to provide workspaces where staff and local partners can share and access documents and collaborate when delivering aid and development projects, no matter where they are in the world. One site which DFID staff use on a daily basis, helps to manage the procurement and transfer of goods and equipment being sent overseas, including emergency supplies being distributed to Sierra Leone. The initial roll-out saw DFID migrate around 40 collaboration sites, extracting data from its previous system and loading it into new templates developed by Ancoris. DFID transferred approximately 400 internal users and 1500 external collaborators, with Ancoris helping the organisation to create a change in management strategy, as well as providing online training for internal users. All was completed to a demanding timescale of less than two months, so the new Google Sites would be live when the contract for the old system ended in January 2015. In just two months, DFID had added a further 20 sites, increasing the total number to 60. "We can set up sites very quickly, ensuring we are responsive when we need to get the infrastructure in place to support a new programme or team," explains Julie Gray, Intranet Customer Delivery Manager at DFID. "And because it's an intuitive tool, people don't need much training to be able to use it and can quickly get the information to the right people at the right time. That's very important to us." Going forward, DFID is starting to explore the other tools available within Google Apps. Some staff are now using Google Drive to securely share and collaborate on documents, and trialling Hangouts within DFID’s UK offices. Richard Franklin, Service Delivery Manager at DFID commented: "Procuring Google Apps through G-Cloud, which encourages the use of SMEs like Ancoris, has given DFID the chance to work with a smaller partner rather than a large system integrator and it's been a really positive and constructive experience. Ancoris’ hands on approach ensured we met our migration deadline and delivered a working solution to the business." “Google Sites is a really simple way for government departments to achieve greater agility” commented David McLeman CEO of Ancoris. “The collaborative nature and flexibility of Google Apps for Work has helped DFID to get the right information, to the right people, at the right time, wherever they are in the world.”
June 24, 2015
by Fran Cator
· 1,058 Views
article thumbnail
Craving for reactive awesomeness? Vert.x 3 is now live!
We're pleased to announce the release of Vert.x 3! This is the culmination of over a year's work to bring you what we hope is the most compelling way to write scalable modern applications and services on the JVM using Java, Groovy, Ruby or JavaScript. Explore the new web-site to find out more. Please see the official release announcement for full details.
June 24, 2015
by Tim Fox
· 947 Views
article thumbnail
How to Split Single PST File into Multiple PSTs & Merge Multiple PSTs using .NET
This technical tip explains how to .NET developers can split and Merge PST files using Aspose.Email. Aspose.Email API provides the capability to split a single PST file into multiple PST files of desired file size. It can also merge multiple PST files into a single PST file. Both the splitting and merging of PSTs operations can be tracked by adding events to these operations. Aspose.Email for .NET is a set of components allowing developers to easily implement email functionality within their ASP.NET web applications, web services & Windows applications. It Supports Outlook PST, EML, MSG & MHT formats. //Code sample for Splitting a Single PST into multiple PSTs [C#] using (PersonalStorage pst = PersonalStorage.FromFile(@"D:\test\source.pst")) { // The events subscription is an optional step for the tracking process only. pst.StorageProcessed += PstSplit_OnStorageProcessed; pst.ItemMoved += PstSplit_OnItemMoved; // Splits into pst chunks with the size of 5mb pst.SplitInto(5000000, @"D:\test\chunks\"); } [VB.NET] Using pst As PersonalStorage = PersonalStorage.FromFile("D:\test\source.pst") ' The events subscription is an optional step for the tracking process only. pst.StorageProcessed += PstSplit_OnStorageProcessed pst.ItemMoved += PstSplit_OnItemMoved ' Splits into pst chunks with the size of 5mb pst.SplitInto(5000000, "D:\test\chunks\") //Code sample for Merging of Multiple PSTs into a single PST [C#] totalAdded = 0; using (PersonalStorage pst = PersonalStorage.FromFile(@"D:\test\destination.pst")) { // The events subscription is an optional step for the tracking process only. pst.StorageProcessed += PstMerge_OnStorageProcessed; pst.ItemMoved += PstMerge_OnItemMoved; // Merges with the pst files that are located in separate folder. pst.MergeWith(Directory.GetFiles(@"D:\test\sources\")); Console.WriteLine("Total messages added: {0}", totalAdded); } [VB.NET] totalAdded = 0 Using pst As PersonalStorage = PersonalStorage.FromFile("D:\test\destination.pst") ' The events subscription is an optional step for the tracking process only. pst.StorageProcessed += PstMerge_OnStorageProcessed pst.ItemMoved += PstMerge_OnItemMoved ' Merges with the pst files that are located in separate folder. pst.MergeWith(Directory.GetFiles("D:\test\sources\")) Console.WriteLine("Total messages added: {0}", totalAdded) End Using //Code sample Merging Folders from another PST [C#] totalAdded = 0; using (PersonalStorage destinationPst = PersonalStorage.FromFile(@"D:\test\destination.pst")) using (PersonalStorage sourcePst = PersonalStorage.FromFile(@"D:\test\source.pst")) { FolderInfo destinationFolder = destinationPst.RootFolder.AddSubFolder("FolderFromAnotherPst"); FolderInfo sourceFolder = sourcePst.GetPredefinedFolder(StandardIpmFolder.DeletedItems); // The events subscription is an optional step for the tracking process only. destinationFolder.ItemMoved += destinationFolder_ItemMoved; // Merges with the folder from another pst. destinationFolder.MergeWith(sourceFolder); Console.WriteLine("Total messages added: {0}", totalAdded); } [VB.NET] totalAdded = 0 Using destinationPst As PersonalStorage = PersonalStorage.FromFile("D:\test\destination.pst") Using sourcePst As PersonalStorage = PersonalStorage.FromFile("D:\test\source.pst") Dim destinationFolder As FolderInfo = destinationPst.RootFolder.AddSubFolder("FolderFromAnotherPst")t Dim sourceFolder As FolderInfo = sourcePst.GetPredefinedFolder(StandardIpmFolder.DeletedItems) ' The events subscription is an optional step for the tracking process only. destinationFolder.ItemMoved += destinationFolder_ItemMoved ' Merges with the folder from another pst. destinationFolder.MergeWith(sourceFolder) Console.WriteLine("Total messages added: {0}", totalAdded) End Using End Using //Helping Methods void destinationFolder_ItemMoved(object sender, ItemMovedEventArgs e) { totalAdded++; } void PstMerge_OnStorageProcessed(object sender, StorageProcessedEventArgs e) { Console.WriteLine("*** The storage is merging: {0}", e.FileName); } void PstMerge_OnItemMoved(object sender, ItemMovedEventArgs e) { if (currentFolder == null) { currentFolder = e.DestinationFolder.RetrieveFullPath(); } string folderPath = e.DestinationFolder.RetrieveFullPath(); if (currentFolder != folderPath) { Console.WriteLine(" Added {0} messages to \"{1}\"", messageCount, currentFolder); messageCount = 0; currentFolder = folderPath; } messageCount++; totalAdded++; } void PstSplit_OnStorageProcessed(object sender, StorageProcessedEventArgs e) { if (currentFolder != null) { Console.WriteLine(" Added {0} messages to \"{1}\"", messageCount, currentFolder); } messageCount = 0; currentFolder = null; Console.WriteLine("*** The chunk is processed: {0}", e.FileName); } void PstSplit_OnItemMoved(object sender, ItemMovedEventArgs e) { if (currentFolder == null) { currentFolder = e.DestinationFolder.RetrieveFullPath(); } string folderPath = e.DestinationFolder.RetrieveFullPath(); if (currentFolder != folderPath) { Console.WriteLine(" Added {0} messages to \"{1}\"", messageCount, currentFolder); messageCount = 0; currentFolder = folderPath; } messageCount++; }
June 24, 2015
by David Zondray
· 1,630 Views
article thumbnail
10 Steps to Social Knowledge Network Success
Business leaders today are becoming more aware of the many ways social knowledge networks can bring value to an organization. Communication is enhanced, knowledge is organized and accessible, products and customer service are improved, and business culture is strengthened through team collaboration. However, what many business leaders are failing to remember is that finding the right technology is only the first step in implementing a successful social knowledge network. The technology must be paired with smart planning and a well-thought-out structure. Elizabeth Lupfer, social collaboration and HR expert, claims, “A social knowledge network is one part technology and two parts process. The technology is only an enabler, and may only be worth 20 percent of the total value of the intranet.” The other 80 percent of value is created through effective structure and long-lasting employee engagement. We have researched and created a 10-step social knowledge network success plan that if implemented properly can maximize the value of any social knowledge network. Have a plan. Taking the time to create a social knowledge network implementation plan for your organization ensures managers and employees are motivated and committed to maximizing the value of the network. The network will only become as valuable as managers and employees plan to make it. Setting expectations for productivity and engagement ahead of time is important. Give employees a detailed explanation of how the social knowledge network connects to the organizational purpose. Communicate the value and purpose of the social knowledge network. Employees must clearly understand how the social knowledge network will contribute to the organizational purpose, long term and short term goals of the organization, and their individual role. Set up the organization and structure of the intranet at the beginning. Understand the priorities of each department, region, and team within your organization and how they connect. Who communicates with whom the most? What knowledge is of most value to each team? Your social knowledge network structure should enhance easy collaboration between individuals who value the information being shared. Thinking about the structure of your social knowledge network in advance will allow for easier search capabilities in the network and less time wasted sifting through information that is not relevant. Define roles and expectations around engagement for employees. Collaboration can be encouraged by asking employees to share projects and knowledge on the social knowledge network so that all team members are on the same page and no question is asked twice. Create and announce objectives with time-specific deadlines. It is important to create quantitative and time-specific objectives for your social knowledge network, such as “60 percent of users will have contributed some knowledge to our social knowledge network by June 30th.” Creating measurable engagement expectations will encourage employees to actively work towards the objective and increase network participation toward a common goal. Assign key social knowledge network ambassadors to start and maintain collaboration. Have people in your organization serve as the “ambassadors” of the social knowledge network. The ambassadors will be the network’s support, taking care of employee questions and concerns about the social knowledge network and asking the correct individuals for answers when they don’t know the answer themselves. Get the CEO and top level management involved. CEO and top-level involvement in a social knowledge network is very valuable, as employees pay special attention to what leaders have to share. Top level management should post openly about company activities to keep employees inspired about the broader picture of the organization. Management contributions should push brand, company culture, and core values. Industry and competitor news, trends, and expectations should be shared by management as well. Determine and reward achievement of Key Performance Indicators. Financial and non-financial benefits are important ways to encourage employee engagement in your social knowledge network. Gift cards, time off, or simple acknowledgment given to active users are good ways to inspire employees to participate more. Rewards given to the most active team or department will encourage group involvement and can be a great way to spark participation. Upload company documents and shared files. Ensure that your social knowledge network is the main place to access information, forms, presentations, and documents of all kinds. Keep all documents updated and organized so that they are accurate and searchable within the platform. Onboarding information, required customer forms, sales presentations, marketing tools, company calendars, and price lists should all be easily accessible on your social knowledge network. This will immediately spark network participation because these documents are needed by many people in your organization who will now access them through your social knowledge network. Be social! Although your social knowledge network should be a valuable business tool, there are many benefits of adding social, non-business related activity. Social activity on your network will create increased openness, allowing employees to get to know each other better and become more comfortable with sharing thoughts and opinions. Adding personal employee profile contributions, weekly peer-to-peer shout-outs for special accomplishments, employee group activities outside of work, or even posting something humorous once a week can help your social knowledge network become more open and fun, drawing employees back to check and use the network more often. Finding the right social knowledge network software for your organization is only the start. Research from the 2014 Social Business Global Executive Study shows only 17 percent of respondents see their organization as having mature social business practices. Following these steps will help you successfully integrate your social knowledge network into the flow of work. Once your organization becomes a true social business, you’ll see measurable value in improved innovation, talent management, and operations. If you are interested in learning more about how a knowledge base can break down silos within your organization, check out our white paper, Proving the Value: Getting Internal Buy-In for a Knowledge Base. Like this post? Click here to subscribe to our blog and receive the latest content on social learning, customer support, sales enablement, or all three.
June 24, 2015
by Bloomfire Marketing
· 1,055 Views
article thumbnail
Writing a Download Server Part I: Always Stream, Never Keep Fully in Memory
Downloading various files (either text or binary) is a bread and butter of every enterprise application. PDF documents, attachments, media, executables, CSV, very large files, etc. Almost every application, sooner or later, will have to provide some form of download. Downloading is implemented in terms of HTTP, so it's important to fully embrace this protocol and take full advantage of it. Especially in Internet facing applications features like caching or user experience are worth considering. This series of articles provides a list of aspects that you might want to consider when implementing all sorts of download servers. Note that I avoid "best practices" term, these are just guidelines that I find useful but are not necessarily always applicable. One of the biggest scalability issues is loading whole file into memory before streaming it. Loading full file into byte[] to later return it e.g. from Spring MVC controller is unpredictable and doesn't scale. The amount of memory your server will consume depends linearly on number of concurrent connections times average file size - factors you don't really want to depend on so much. It's extremely easy to stream contents of a file directly from your server to the client byte-by-byte (with buffering), there are actually many techniques to achieve that. The easiest one is to copy bytes manually: @RequestMapping(method = GET) public void download(OutputStream output) throws IOException { try(final InputStream myFile = openFile()) { IOUtils.copy(myFile, output); } } Your InputStream doesn't even have to be buffered, IOUtils.copy() will take care of that. However this implementation is rather low-level and hard to unit test. Instead I suggest returning Resource: @RestController @RequestMapping("/download") public class DownloadController { private final FileStorage storage; @Autowired public DownloadController(FileStorage storage) { this.storage = storage; } @RequestMapping(method = GET, value = "/{uuid}") public Resource download(@PathVariable UUID uuid) { return storage .findFile(uuid) .map(this::prepareResponse) .orElseGet(this::notFound); } private Resource prepareResponse(FilePointer filePointer) { final InputStream inputStream = filePointer.open(); return new InputStreamResource(inputStream); } private Resource notFound() { throw new NotFoundException(); } } @ResponseStatus(value= HttpStatus.NOT_FOUND) public class NotFoundException extends RuntimeException { } Two abstractions were created to decouple Spring controller from file storage mechanism.FilePointer is a file descriptor, irrespective to where that file was taken. Currently we use one method from it: public interface FilePointer { InputStream open(); //more to come } open() allows reading the actual file, no matter where it comes from (file system, database BLOB, Amazon S3, etc.) We will gradually extend FilePointer to support more advanced features, like file size and MIME type. The process of finding and creatingFilePointers is governed by FileStorage abstraction: public interface FileStorage { Optional findFile(UUID uuid); } Streaming allows us to handle hundreds of concurrent requests without significant impact on memory and GC (only a small buffer is allocated in IOUtils). BTW I am using UUID to identify files rather than names or other form of sequence number. This makes it harder to guess individual resource names, thus more secure (obscure). More on that in next articles. Having this basic setup we can reliably serve lots of concurrent connections with minimal impact on memory. Remember that many components in Spring framework and other libraries (e.g. servlet filters) may buffer full response before returning it. Therefore it's really important to have an integration test trying to download huge file (in tens of GiB) and making sure the application doesn't crash. Writing a download server Part I: Always stream, never keep fully in memory Part II: headers: Last-Modified, ETag and If-None-Match Part III: headers: Content-length and Range Part IV: Implement HEAD operation (efficiently) Part V: Throttle download speed Part VI: Describe what you send (Content-type, et.al.) The sample application developed throughout these articles is available on GitHub.
June 24, 2015
by Tomasz Nurkiewicz
· 17,225 Views
article thumbnail
Overcoming Barriers to Performance and Scalability Test Automation
[This article was written by Ophir Prusak] Guest author Ophir Prusak is chief evangelist atBlazeMeter. To learn more about load and performance testing automation, he invites readers toattend a meetupthis Wednesday, June 24, at New Relic’s San Francisco offices. Performance and load testing are kind of like flossing your teeth. You know you need to do it, but you might not be doing it as much as you should. When your site goes down because it couldn’t handle the load, you look back and realize you might have easily prevented it with a little more testing in advance. That’s why companies are automating their application testing in an effort to lower costs, increase efficiency, and reduce the time needed to release new features. The importance of automated testing in a continuous delivery era Continuous Delivery (CD) is rapidly emerging as the “new normal” in software development, as Perforce discovered in an independent survey, with an estimated 80% of SaaS companies and 51% of non-SaaS companies adopting this practice. Companies that provide Software-as-a-Service know they need to be continuously creating new features, updating their websites, and optimizing their backend. But while software development has adapted nicely in terms of automation, the testing side has moved more slowly. For a fully Continuous Delivery and Integration process to be realized, performance testing must be automated. As the need for testing increases, doing it manually can dramatically increase your time to release. Automating testing throughout the CD process can help detect errors instantly and deliver software faster. Making it work JMeter is the de facto standard in open source load testing. It’s the most widely used open source tool for performance testing for a good reason. There’s virtually nothing it can’t test (websites, native mobile applications, APIs, and Web applications) and it’s extremely powerful and fully featured. Yet there are challenges. JMeter poses a steep learning curve in terms of integration and ease of use. Additionally, it doesn’t integrate easily with APM and Continuous Integration (CI) tools. Many developers have been looking for a way to conduct performance testing with less time and effort—and fewer hiccups along the way. Taurus: An effort to simplify test automation A new open source project called Taurus (Test AUtomation Running Smoothly) is designed to provide exactly that—a way to remove most of the pain of using JMeter on its own. Taurus can give you the ability to Create and define a load test even without using JMeter. Override existing JMeter files or tests configurations. Create human-readable configuration files and testing scripts that are easily added to source control systems like GitHub. Integrate into CI tools like Jenkins. Run multiple tests in parallel. Provide pass/fail criteria back into the CI tool for easier automation of test-results analysis. Make analysis of test results easier and more intuitive. Taurus still uses JMeter under the hood, but is designed to have a much easier learning curve, especially for simple tests. Taurus also offers a built-in result analysis engine that provides both console-based reporting features and result analysis. Performance testing and optimizing your applications is not simple, yet there are solutions available that make the process easier and more successful. I’m looking forward to seeing how the technology evolves even further in the near future. If you want to learn more about Taurus, check out the project on GitHub. Better yet, you are invited to come to a meetup this Wednesday, June 24, at New Relic’s San Francisco offices. You can learn a lot more about Taurus and how you can use it to help scale load and performance testing automation.
June 24, 2015
by Fredric Paul
· 1,840 Views
article thumbnail
8 Key Findings About IoT Development
IoT is really hot, but can also be a bit confusing. Read about these 8 development key findings.
June 24, 2015
by Burke Holland
· 1,930 Views
article thumbnail
Don't Leave Your Database Behind
Microsoft’s recent announcement that Windows 10 will be the last big-bang release for the operating system was a surprise to many. But what on Earth is going on? Why have they suddenly turned round and decided to upgrade their software with a series of frequent updates instead? The answer is a term not many chief executives will be familiar with, but an important one nevertheless: continuous delivery. Continuous delivery for software applications means that new features can be released faster and companies can be more competitive. Although it requires a change in processes and an investment in the tools that make it possible, the return on investment is high – and proven. The 2014 State of DevOps Report from Puppet Labs found that high-performing IT organisations that use practices such as continuous delivery are twice as likely to exceed their profitability, market share and productivity goals. WHAT ABOUT THE DATABASE? A stumbling block many organisations find in their pursuit of continuous delivery is the database. Databases hold critical information and their stability is vital to the bottom line. Often they’re tied into those same applications that can gain from continuous delivery, but they’re seen as too risky to include in the process. In fact, the DZone Guide to Continuous Delivery 2015 showed that while 61 per cent of companies have already implemented continuous delivery for their applications, it falls to half that number when it comes to the database.The result? Application development is faster, smoother and more cost effective, while database development lags behind. “Clients such as Yorkshire Water are seeing a return on investment of 700 per cent after investing in continuous delivery for their databases” At Redgate, we’ve been working on a way to resolve the issue with a Database Lifecycle Management (DLM) solution: one that brings all the advantages of continuous delivery to the database, while protecting the data at the same time. We have some pedigree here. Our tools are already used in more than 90 per cent of Fortune 100 companies, and are trusted in areas such as finance, healthcare and manufacturing, where performance and reliability are not optional. It’s working too. Clients such as Yorkshire Water are seeing a return on investment of 700 per cent after investing in continuous delivery for their databases. Similarly, StateServ, a medical equipment supplier with customers across the United States, has adopted Redgate’s SQL Source Control and SQL Compare to reduce the time it takes to release new versions of its website by 50 per cent. Property services provider Move With Us has also adopted these tools to reduce the cost of releasing database updates by 97 per cent. As Anthony Hall, IT operations manager, says: “We spend less time deploying and more time developing better software, which keeps us ahead of our competitors. It results in a product that more closely matches what the customer wants, at a cheaper price. That equals happy customers, a happier development team and bigger profits for the company.” I love comments like that. It demonstrates that all the effort we’ve put into developing our tools and the DLM process to go with it is paying off. Not for us – for our clients. By aligning the continuous delivery of the application with the continuous delivery of the database, a company will inevitably see increased productivity, reduced risk and higher quality end-products. This suddenly means that your technology becomes a strategic advantage, as opposed to an unpredictable risk, and can be used to deliver real financial benefits to the business. CASE STUDY KEEPING DATA FLOWING FOR YORKSHIRE WATER Yorkshire Water manage the collection, treatment and distribution of water in Yorkshire, supplying around 1.24 billion litres of drinking water daily. At the same time they collect, treat and dispose of about one billion litres of waste water safely back into the environment. As might be imagined, their applications and databases are diverse and technically challenging, and deploying changes to the databases used to be manual and time consuming. The company turned to Redgate’s database development tools to automate the changes, saving time as well as avoiding errors. Using SQL Source Control and SQL Compare, they achieved every aim. In 25 days, they moved their first project from a manual deployment process to full automation and it now takes half a day to start auto-deploying a new project. As software development team leader Carl Davison says: “It’s now a minor overhead to deploy. We predict the return on investment to be in the order of 700 per cent over the next five years. We can deploy database changes as soon as the business needs them, without delays or problems.”
June 24, 2015
by Moe Long
· 1,544 Views
article thumbnail
Hazelcast Cluster Quorum
Originally written by David Brimley. The Death Spiral. A new feature in the 3.5 release of Hazelcast is the Cluster Quorum. In this instance we’re not talking about a Quorum in its traditional distributed systems sense, think of a Cluster Quorum as a kind of gatekeeper, protecting your cluster during times of unexpected member loss. You can use Cluster Quorums to restrict operations on Maps or indeed the entire cluster based upon environmental criteria. This sounds great you say, but I’m still not sure how this can help me? OK. Let's take a look at a scenario… Imagine a cluster that has a very high number of writes to a certain map. We also have other maps that are not updated quite so frequently and all the while we have hundreds of clients all reading from the cluster but not at the same frequency as the data that is entering the system. In normal circumstances if a machine or a number of machines were to die in the cluster we may still have enough memory available to store our data, but the amount of threads available to process requests would be reduced. We now have less cores available and the partition threads in the cluster could quickly become overwhelmed by the one map that is updated rapidly. This could mean other clients becoming starved of threads, unable to service requests. It’s also possible that the remaining members would become so consumed that they’re unable to respond to membership pings, the knock on effect could result in the member being forced out of the cluster on the assumption that it is dead. To protect the rest of the cluster in the event of member loss we need a way to stop the writes to the high frequency map whilst allowing operations to the other data structures. We can then continue to provide a good service to our other users whilst the crashed machines are restored to the cluster. Bring on the Quorum! As of Hazelcast 3.5 we now have the ability to restrict operations on distinct data structures. We do this via a Quorum configuration. We observed that other IMDG products provide Quorums that have protection at a cluster level,we decided to go one step further and provide Quorum protection around data structures as well. In the example below we create a very simple Quorum on the default map. The ‘default’ map in Hazelcast is the configuration used if no other match is found. In this instance no operations will be allowed unless the cluster has a minimum of 3 members. You’ll also note that the Quorum configuration is separate from the Map. This means that you can have multiple Quorums in a cluster attached to many different structures. If the Quorum thresholds are not satisfied then a QuorumException is thrown when we try to interact with the default map in any way. Be it from a client or another member. 3 quorumRuleWithThreeNodes Quorum Functions It’s simple to set up a Quorum check based on cluster size as we’ve seen above, but if you want to make a slightly more complex check you can do this by applying a Quorum Function. QuorumConfig quorumConfig = new QuorumConfig(); quorumConfig.setName("MyQuorum"); quorumConfig.setEnabled(true); quorumConfig.setType(QuorumType.WRITE); quorumConfig.setQuorumFunctionImplementation(new QuorumFunction() { @Override public boolean apply(Collection members) { return (members.size() >= 3) && (someOtherExternalClusterState); } }); In the example above we use Configuration API to set-up the Quorum to disallowwrites if the boolean returned from the QuorumFunction is false. In the function we test if the size of the cluster is greater than 3 and also if a variable namedsomeOtherExternalClusterState is equal true. You now get the idea that by using a function you can test for other state and not just cluster member. Listen In. Another nice feature of Quorums is the ability to listen in to Quorum Events. You can register a new callback interface called not surprisingly a QuorumListener. Quorum listeners are local to the node that they are registered, so they receive only events occurred on that local node. 3 com.company.quorum.ThreeNodeQuorumListener quorumRuleWithThreeNodes The QuorumListener has just one method that is called passing you aQuorumEvent. package com.hazelcast.quorum; import java.util.EventListener; /** * Listener to get notified when a quorum state is changed */ public interface QuorumListener extends EventListener { /** * Called when quorum presence state is changed. * * @param quorumEvent provides information about quorum presence and current member list. */ void onChange(QuorumEvent quorumEvent); } The QuorumEvent itself allows you to determine if a Quorum has been established or if it has been lost via its isPresent() method call. Additionally it provides the required cluster members to form a quorum and also the current membership list. Query the Quorums. Above we saw how we could receive callbacks, but in some cases we may just wish to make an immediate check to see if the Quorum is established or not. We can do this via the QuorumService. HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance(config); QuorumService quorumService = hazelcastInstance.getQuorumService(); Quorum quorum = quorumService.getQuorum(quorumName); boolean quorumPresence = quorum.isPresent(); In Conclusion The Cluster Quorum feature is another important tool for you to manage your cluster. In future versions of Hazelcast there are plans to add other data structures, for example you’ll be able to protect operations against Topics or Queues.
June 24, 2015
by Andrea Echstenkamper
· 2,877 Views · 2 Likes
article thumbnail
New Relic’s Docker Monitoring Now Generally Available
[This article was written by Andrew Marshall] We’ve been talking a lot about Docker over the past few weeks—with good reason. Docker’s explosive growth in popularity within the enterprise has enabled new distributed application architectures and with it a need for app-centric monitoring of your Docker containers within the context of the rest of your infrastructure. We’re thrilled to announce today that New Relic’s Docker monitoring is now generally available to New Relic customers, just in time for DockerCon 2015! (And as we noted last week, New Relic’s Docker monitoring solution has been selected by Docker for its Ecosystem Technology Partner program as a proven container monitoring solution.) Why app-centric monitoring? If you’re a software business using Docker containers, chances are you’ve done so to gain efficiencies from your system resources or portability across environments to shorten the cycle between writing and running code. Either way, adding Docker containers to your app development meant a new tier of infrastructure to monitor, which equated to a “black box” in your data—one that you had no visibility into from a monitoring perspective, Docker monitoring with New Relic is designed to “fix” this lack of monitoring visibility by adding an app-centric view of Docker containers to the existing New Relic Servers interface you already use. Now, instead of having a gap between the application and server monitoring views, we’ve added the ability to see containers with the same “first-class“ experience as you would with virtual machines and servers. You can now drill down from the application (which is really what you care about) to the individual Docker container, and then to the physical server. No more blind spots! As we strive to do with all of our products, we took the approach of “important” over “impressive” when it comes to the container information we provide to users. Based on direct feedback from customers, we’ve tried to take the mystery out of finding the right container to help you get back to developing your applications. As the way people use containers changes over time, we plan to continue to listen to our customers to help shape how we approach Docker container monitoring. Restoring 360-degree view of your application environment One example of how app-centric monitoring can impact a team moving to microservices or distributed application environments is Motus, a mobile workforce management company. Motus has been a New Relic customer for more than four years and recently has been shifting to a microservices architecture with approximately 95% of its production workload now running in Docker containers. While Docker helpd Motus gain speed and agility while reducing infrastructure complexity, the link between the application and what was happening with the container it was running on was broken. During the trial of New Relic’s Docker monitoring, Motus was able to more easily identify which container an app was running on, all the way down to the node. That was a big help when they needed to investigate an issue and determine if a new container was required.. During the beta alone, Motus estimates that using New Relic helped them to reduce the time to investigate and fix problems with its Docker containers by 30%! Motus isn’t just using New Relic to diagnose when a problem occurs. Docker monitoring with New Relic has helped Motus analyze and “right size” its containers for the application to better allocate resources for performance and budget. Get started with New Relic’s Docker monitoring today, for more information, please stop by our booth at DockerCon, June 22-23 in San Francisco! Resources: Motus Docker Monitoring Case Study Docker Monitoring with New Relic Enabling Docker Monitoring with New Relic Docker in the New Relic Community Forum
June 24, 2015
by Fredric Paul
· 1,019 Views
article thumbnail
A look at New Relic Browser
while at fluent conf this year, i was walking by the new relic booth when i noticed something interesting – a product called new relic browser. back when i converted my blog to wordpress, i ran into a lot of problems. my server went down, wordpress crashed, it was a bit frustrating. (much like how lemonade in a paper cut is a bit frustrating.) one of the tools i used to help diagnose my server was the new relic server monitor . outside of a few issues installing, i was really impressed with the level of detail the monitor provided. while it wasn’t the final solution for fixing my problem, it definitely helped me pinpoint what was sucking up all the ram on my box, and helped me check my changes to ensure things were going well. best of all, this was entirely free. i’ll give them huge props for offering such a powerful tool for no up front money. because i had such a good experience with them on the server side, i thought i’d give their browser product a try as well. as you can guess, this tool is meant to help you gain insights into how well your web application is performing. i decided to try it on my blog, which, admittedly, is probably not the best use case for this product. wordpress isn’t something i need to hack up and outside of the performance issues i had on the server side, i figured the client side was pretty much good enough. it certainly seemed good enough to me. but at the same time, my blog gets quite a bit of traffic so i figured it would also provide a good set of data to dig into as well. setup is relatively simple. you begin by selecting a deployment method: i selected copy/paste as i figured that would be simpler. on the next page, i said i was not using apm, even though i guess i kinda was. i was trying to test this as someone who was not also using the server side product, so there may be things i missed out on. typically when i try products like this though i try to keep things as simple as possible. the final step was copying a ginormous javascript string into my wordpress template. so that was that. i copied in the code, cleared my wordpress cache, and then promptly forgot about it for a week or so. i then took a look back at my stats. there’s a tremendous amount of information you get right on the front dashboard. first off – note the browser load times. i’m averaging 6.8 seconds or so which is quite high and not what i expected. for over ten years i ran my blog with very precise knowledge of what i had going on within my templates. with wordpress, i’ve kinda gotten lazy about it and have given up being so deeply involved. this gives me a clue that maybe i need to take a closer look at my template and plugins and see if i need everything i’ve got. also note the error graph. on average, 2% of my pages have javascript errors. the real question is – how often do those javascript errors impact the core thing people need to do on my site – read a blog post. as i said, the dashboard is pretty packed, but let’s go deeper. first, the page views report. this report shows recent pages and which page requests are consuming the most load time. you can mouse over each line item for a detailed view: you can also switch the “sort by” to show average page load time: and yes – that twenty plus second item on top there made me crap my pants. honestly i’m not sure why that page averaged so high as it is relatively simple, but it does give me something to dig into deeper. the next link, session traces , is not what you may think. i had assumed this was a report of a ‘session’ for one visitor to my blog. instead, it is a deep look at one particular web page. and when i say deep, i mean deep. here is a top level report for one session: note all the detail in the chart. you can then scroll through the session and look at every particular darn thing in the one request. for example, here i can look at what google analytics is doing. the next report shows you the ajax requests your web app is making. you get details on what is making requests as well as throughput and data size. i can say from experience that the data size chart could be really useful. back when i first learned ajax i made the mistake of not considering the size of my packets and my applications suffered through it. this is a rather long page so i’ve split the screen shot into two parts. i’m thinking that in ‘real’ web app the ajax report will be the number one place you’ll find nuggets of information. of similar importance is the js errors report. clicking on a particular item will give you details: if you click on the instance details, you can see the line number where this error was thrown. while not this particular error, earlier i found an issue with gravatar. i didn’t think i was using gravatar, but it turned out one plugin was making use of it and throwing an error. i modified the plugin and the error went away. the browsers report gives you details about what types of browsers are hitting your site and how well they perform. i mentioned how i was a bit surprised by the page load times on my site, well in this report i can see what browsers are having the worst issues with page load: look at that jump for ie and opera! that’s fascinating to me. it doesn’t necessarily mean those are bad browsers, but it gives me an area to focus in if i were to start digging into my site performance. you can then go to the geo report to see how different areas of the world (and america) handle your site. along with just reporting, you can also create alerts too. you get a default alert policy out of the box and can define your own as well. this is fairly similar to what you get in the server product as well. from what i can see, this is a really darn good tool, and as i said, i had great success with the server tool. so how much does it cost? here is the price plans as of the time i wrote the post: 150 a month isn’t necessarily cheap, but heck, that’s my rate for development (yes, that’s what i charge by the hour) and considering how much data you get the forensic information is easily worth it. the free (lite) version also has fewer reports. if you go to their pricing page you can see what you don’t get at that tier, but note that you get 14 days of free access to the top tier to see if it is worth it.
June 24, 2015
by Raymond Camden
· 872 Views
article thumbnail
The Apple Watch is Simultaneously Awesome and Pointless
I’ve had a week and a bit playing with the Apple Watch, pretty much all of that time being on flights and at events which is probably not a normal usage representation, but it’s certainly given me a chance to give it a good workout. Some stuff is good, some is bad and a bunch of it is quite frankly absolutely pointless. But I expected that – it’s what you get with first gen tech – what I was more interested in is how it changes the way I might do otherwise normal everyday stuff. Pictures speak louder than words in this case so I’ve just been snapping interesting stuff as I’ve gone along. Let me show you what I’ve found. It’s beautifully made You kinda expect that from Apple and they’ve definitely delivered on that front. It could be thinner (and that will no doubt happen in future gens), but compared to something like a Pebble, it’s definitely a much nicer piece of gear. This is the “Watch” Apple Watch rather than the “Watch Sport” Apple Watch so it gets the stainless steel body and sapphire glass. Some use cases are just perfect for it Flight info is awesome. Qantas does a great app which is really easy to glance at while you’re working. You might argue that it sounds stupid to say that taking your phone out of your pocket is too laborious, but there is a very different usability proposition to info available at a glance as opposed to that which is secreted away on a device in your pocket. Same deal with TripIt – seeing things like flight delays pop up on your wrist is just perfect. I crashed it I tried going into energy saving mode and, well, it kinda crashed. I haven’t been able to do this specifically again, but I’ve had many occasions where it’s hung or an app has been pretty much unresponsive. It’s certainly not a consistently stable experience yet, particularly with a bunch of the third party apps. An app telling you to go to your phone is pointless Why oh why would you do this?! Either build an app that works on the watch or don’t do one at all. Telling someone on their watch to go to their phone is just plain stupid. Now maybe I have to go to the phone to setup the watch, I don’t know because after this initial experience I didn’t feel much like using the app at all! It reeks of “we need a presence on the watch – just do something!” Be careful what you say near it… I must have just opened the Amazon app or done something that got me into that context, but without realising the ramifications, I made a comment on something I saw on TV. This is not fabricated – next moment I look down at the watch and, well, yeah. Of course the phone has had voice recognition in one form or another, but I must admit that the watch listening to me caught me off guard. It’s more omnipresent than the phone and that’s an important fact to remember. Short notices work beautifully A quick glance at Skype or a new email, for example, works really well. Having to scroll or drill down is less effective so of course it’s very dependent on the nature of the app and the length of the message. Cases like this though are beautiful – feel the tap on the wrist, glance at it and that’s all you need. Glances on the go are awesome A bit similar to the airline app use case, I was walking home from the shops the day I got it and with bags in hand was able to see the following message, turn around and get my dry cleaning. Again, I know it might sounds weird, but there’s just a lower barrier to entry for this sort of interaction which really trumps the phone experience. Fitness has a lot of potential I say “potential” because whilst it’s quite neat right now, it feels like there’s a much more valuable use case hidden in there somewhere. Having said that, even the standing guidance is a good reminder that perhaps sitting at the desk nonstop all day isn’t such a good idea. We know this, of course, but having the device tell you this does prompt action which you may not have otherwise taken. Sending quick messages or emoticons is kinda neat… I’m sure it resonates more with certain demographics, but the watch is pretty handy at quickly tapping out pre-canned messages. Same again with emoticons such as this lovely heart with little spinning hearts around it, right…? …but not everyone will share you enthusiasm Your novelty factor can be another person’s annoyance! I actually find most people pretty interested in what it is and what it does, although admittedly some of them fail to get excited about it… It reduces the “time to penis” I didn’t know that was even a thing, yet here we are – TTP. Once my brother got his hands on his wife’s watch, this novel use case became immediately clear. I actually missed snapping it the first time an old fella appeared on my watch so I had to ask for another to be drawn. This caused a different problem… It’s another channel of potential privacy violation (or embarrassment) When you ask someone with an Apple Watch to, say, draw you another penis, it’s worthwhile keeping in mind the setting in which they may receive that message. Of course we could always embarrass people in similar ways with phone or other device that pops up a message, this is just one more channel now. Photos are kind of pointless I’ve looked at them several times for the novelty value, but to take a photo with the clarity you get from a device like an iPhone 6 Plus then drop into the watch to look at them is just pointless. If you want to look at photos, use the device that does it well! Just because you can, doesn’t mean you should I snapped this pic from the WWDC keynote the other day with my mind thinking “Who the hell wants to control their car climate control via the watch while they’re sitting in it?!” Of course this is my Australian-centric mind thinking and I’m conscious there are places in the world where you need to warm your car before getting into it. But it seemed feasible – that someone would create an app to use whilst in your car – because so many are rushing to put things on the phone which might be completely and utterly ridiculous! More charging… On my way over to Europe, I found I had to charge it in-flight or it wouldn’t have lasted the 38 hour journey (don’t get me started – changing flights with late notice to the European summer is a nightmare). I’ve had no problem with it lasting a full day and still having heaps of battery left (often more than half), but if you’re overnighting then there’s another thing you’ll need to have with you. It’s not as smart as it thinks it is I stood there watching the keynote at the NDC conference in Oslo last week because that’s what we had to do – it was a standing only event. I stood for so long I really wanted to go and grab a seat; and then the watch told me I should stand up! Obviously it hadn’t realised I was already standing and it wasn’t exactly what I wanted to see while feeling weary! Device switching is clunky This sort of thing – where the watch tells you to go to another device – is enormously annoying. I’d asked Siri for a currency conversion (Siri is actually awesome on the watch… when it works) and instead I’m told to go to my phone. That’s just plain annoying and it seems like the sort of thing the watch should be able to get right. Don’t forget that the watch is just a thin client Spending all that time on planes in flight mode means I saw a lot of this. The watch is extremely dependent on the phone and to a degree, I kind of get it – it’s effectively a thin client. That will change to some degree when native apps hit in the second generation OS and of course being able to communicate over wifi on its own will also go some way to freeing it. For now though, no phone or flight mode means a lot of stuff just not working. Doing some things on the phone makes a lot of sense I’m quite ok with “dropping back” to the phone for certain activities. Rearranging the app screen, for example, or choosing which apps should be installed. This would be a miserable experience on the watch itself and it’s one that’s irregular enough to justify pulling the device out of your pocket. It also reinforces why the watch really needs an iPhone – you’re plugging deep into the Apple ecosystem here in terms of things like connecting to the app store and I get why that’s just not going to make sense on an Android or other device. (Incidentally, the somewhat strange collection of apps is for a little hacking event I’m doing at a Dutch user group tomorrow night – I wouldn’t normally be running the Family Guy app, but I reckon there might be some curious things to find in there…) Summary This is really pretty much what I expected – a bunch of neat stuff, a bunch of pretty rough stuff and lots of ideas on how it might change the way we actually work or play or do whatever. In that regard it’s pretty revolutionary not because Apple is the first to do it, but because they’ll be the first to bring it into the mainstream.
June 24, 2015
by Troy Hunt
· 1,289 Views
article thumbnail
R: dplyr -- Segfault Cause 'memory not mapped'
In my continued playing around with web logs in R I wanted to process the logs for a day and see what the most popular URIs were. I first read in all the lines using the read_lines function in readr and put the vector it produced into a data frame so I could process it using dplyr. library(readr) dlines = data.frame(column = read_lines("~/projects/logs/2015-06-18-22-docs")) In the previous post I showed some code to extract the URI from a log line. I extracted this code out into a function and adapted it so that I could pass in a list of values instead of a single value: extract_uri = function(log) { parts = str_extract_all(log, "\"[^\"]*\"") return(lapply(parts, function(p) str_match(p[1], "GET (.*) HTTP")[2] %>% as.character)) } Next I ran the following function to count the number of times each URI appeared in the logs: library(dplyr) pages_viewed = dlines %>% mutate(uri = extract_uri(column)) %>% count(uri) %>% arrange(desc(n)) This crashed my R process with the following error message: segfault cause 'memory not mapped' I narrowed it down to a problem when doing a group by operation on the ‘uri’ field and came across this post which suggested that it was handled more cleanly in more recently version of dplyr. I upgraded to 0.4.2 and tried again: ## Error in eval(expr, envir, enclos): cannot group column uri, of class 'list' That makes more sense. We’re probably returning a list from extract_uri rather than a vector which would fit nicely back into the data frame. That’s fixed easily enough by unlisting the result: extract_uri = function(log) { parts = str_extract_all(log, "\"[^\"]*\"") return(unlist(lapply(parts, function(p) str_match(p[1], "GET (.*) HTTP")[2] %>% as.character))) } And now when we run the count function it’s happy again, good times!
June 24, 2015
by Mark Needham
· 1,669 Views
  • Previous
  • ...
  • 1463
  • 1464
  • 1465
  • 1466
  • 1467
  • 1468
  • 1469
  • 1470
  • 1471
  • 1472
  • ...
  • Next
  • RSS
  • X
  • Facebook

ABOUT US

  • About DZone
  • Support and feedback
  • Community research

ADVERTISE

  • Advertise with DZone

CONTRIBUTE ON DZONE

  • Article Submission Guidelines
  • Become a Contributor
  • Core Program
  • Visit the Writers' Zone

LEGAL

  • Terms of Service
  • Privacy Policy

CONTACT US

  • 3343 Perimeter Hill Drive
  • Suite 215
  • Nashville, TN 37211
  • [email protected]

Let's be friends:

  • RSS
  • X
  • Facebook
×