All Feeds

Designmodo Newspaper Theme for WordPress is Packed with Features You're reading Newspaper Theme for WordPress is Packed with Features, originally posted on Designmodo. If you've enjoyed this post, be sure to follow on Twitter, Facebook! If you like to write for the web, we have the perfect theme for your next WordPress website build. Newspaper, which is the top selling news theme of all time on the Envato Market, is a robust and easy-to-use option … 10:44 AM SitePoint Nuxt.js: a Minimalist Framework for Creating Universal Vue.js Apps Universal (or Isomorphic) JavaScript is a term that has become very common in the JavaScript community. It’s used to describe JavaScript code that can execute both on the client and the server. Many modern JavaScript frameworks, like Vue.js, are aimed at building single-page applications (SPAs). This is done to improve the user experience and make the app seem faster, since users can see updates to pages instantaneously. While this has a lot of advantages, it also has a couple of disadvantages, such as long “time to content” when initially loading the app as the browser retrieves the JavaScript bundle, and some search engine web crawlers or social network robots won’t see the entire loaded app when they crawl your web pages. Server-side rendering of JavaScript is about preloading JavaScript applications on a web server and sending rendered HTML as the response to a browser request for a page. Building server-side rendered JavaScript apps can be a bit tedious, as a lot of configuration needs to be done before you even start coding. This is the problem Nuxt.js aims to solve for Vue.js applications. What Nuxt.js Is Simply put, Nuxt.js is a framework that helps you build server-rendered Vue.js applications easily. It abstracts most of the complex configuration involved in managing things like asynchronous data, middleware, and routing. It’s similar to Angular Universal for Angular, and Next.js for React. According to the Nuxt.js docs, “its main scope is UI rendering while abstracting away the client/server distribution.” Static Generation Another great feature of Nuxt.js is its ability to generate static websites with the generate command. It’s pretty cool, and provides features similar to popular static generation tools like Jekyll. Under the Hood of Nuxt.js In addition to Vue.js 2.0, Nuxt.js includes the following: Vue-Router, Vuex (only included when using the store option), Vue Server Renderer and vue-meta. This is great, as it takes away the burden of manually including and configuring different libraries needed for developing a server-rendered Vue.js application. Nuxt.js does all this out of the box, while still maintaining a total size of 57kB min+gzip (60KB with vuex). Nuxt.js also uses webpack with vue-loader and babel-loader to bundle, code-split and minify code. How it works This is what happens when a user visits a Nuxt.js app or navigates to one of its pages via <nuxt-link>: When the user initially visits the app, if the nuxtServerInit action is defined in the store, Nuxt.js will call it and update the store. Next, it executes any existing middleware for the page being visited. Nuxt checks the nuxt.config.js file first for global middleware, then checks the matching layout file (for the requested page), and finally checks the page and its children for middleware. Middleware are prioritized in that order. If the route being visited is a dynamic route, and a validate() method exists for it, the route is validated. Then, Nuxt.js calls the asyncData() and fetch() methods to load data before rendering the page. The asyncData() method is used for fetching data and rendering it on the server-side, while the fetch() method is used to fill the store before rendering the page. At the final step, the page (containing all the proper data) is rendered. These actions are portrayed properly in this schema, gotten from the Nuxt docs: Creating A Serverless Static Site With Nuxt.js Let’s get our hands dirty with some code and create a simple static generated blog with Nuxt.js. We’ll assume our posts are fetched from an API and will mock the response with a static JSON file. To follow along properly, a working knowledge of Vue.js is needed. You can check out Jack Franklin’s great getting started guide for Vue.js 2.0 if you’re new to the framework. I’ll also be using ES6 Syntax, and you can get a refresher on that here: sitepoint.com/tag/es6/. Our final app will look like this: The entire code for this article can be seen here on GitHub, and you can check out the demo here. Application Setup and Configuration The easiest way to get started with Nuxt.js is to use the template created by the Nuxt team. We can install it to our project (ssr-blog) quickly using the vue-cli: vue init nuxt/starter ssr-blog Once you’ve run this command, a prompt will open and ask you a couple of questions. You can press Return to accept the default answers, or enter values of your own. Note: If you don’t have vue-cli installed, you have to run npm install -g @vue/cli first, to install it. Next, we install the project’s dependencies: cd ssr-blog npm install Now we can launch the app: npm run dev If all goes well, you should be able to visit http://localhost:3000 to see the Nuxt.js template starter page. You can even view the page’s source, to see that all content generated on the page was rendered on the server and sent as HTML to the browser. Next, we can make some simple configurations in the nuxt.config.js file. We’ll add a few options: // ./nuxt.config.js module.exports = { /* * Headers of the page */ head: { titleTemplate: '%s | Awesome JS SSR Blog', // ... link: [ // ... { rel: 'stylesheet', href: 'https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css' } ] }, // ... } In the above config file, we simply specify the title template to be used for the application via the titleTemplate option. Setting the title option in the individual pages or layouts will inject the title value into the %s placeholder in titleTemplate before being rendered. We also pulled in my current CSS framework of choice, Bulma, to take advantage of some preset styling. This was done via the link option. Note: Nuxt.js uses vue-meta to update the headers and HTML attributes of our apps. So you can take a look at it for a better understanding of how the headers are being set. Now we can take the next couple of steps by adding our blog’s pages and functionalities. The post Nuxt.js: a Minimalist Framework for Creating Universal Vue.js Apps appeared first on SitePoint. 8:00 AM Digital Photography School How to Improve Your Photography by Changing Perspective The post How to Improve Your Photography by Changing Perspective appeared first on Digital Photography School. It was authored by Simon Ringsmuth. Sometimes I find myself stuck in a bit of a photographic rut, and it seems like no matter what I do I just can’t quite find interesting subjects to take pictures of or compelling scenes to capture. Even worse, when I do think I’ve stumbled across something that would make a good picture, I’ll start […] The post How to Improve Your Photography by Changing Perspective appeared first on Digital Photography School. It was authored by Simon Ringsmuth. Mar 17 Digital Photography School Review: Yongnuo 50mm f/1.8 lens for Canon – At just US$50 could this be the most affordable “nifty fifty”? The post Review: Yongnuo 50mm f/1.8 lens for Canon – At just US$50 could this be the most affordable “nifty fifty”? appeared first on Digital Photography School. It was authored by Kunal Malhotra. The 50mm f/1.8 lens, or as we call it, the ‘Nifty Fifty,’ is one of the most widely used lenses in the market. This is usually the first lens a modern digital camera owner desires to purchase after the kit lenses. The reasons why this is the most popular lens are fairly simple – the […] The post Review: Yongnuo 50mm f/1.8 lens for Canon – At just US$50 could this be the most affordable “nifty fifty”? appeared first on Digital Photography School. It was authored by Kunal Malhotra. Mar 17 Digital Photography School A Beginners Guide to Taking Portraits of Elderly Clients: Part 1 – Preparation and Rapport The post A Beginners Guide to Taking Portraits of Elderly Clients: Part 1 – Preparation and Rapport appeared first on Digital Photography School. It was authored by Clinton Moore. You often hear it said that outstanding photography is about storytelling. An image may not have perfect lighting ratios or razor sharpness, but if it connects with you that can be all that matters. Working with elderly clients can be the ultimate storytelling journey as these folks have experience in spades! In this first of […] The post A Beginners Guide to Taking Portraits of Elderly Clients: Part 1 – Preparation and Rapport appeared first on Digital Photography School. It was authored by Clinton Moore. Mar 16 Rick Strahl's Web Log ASP.NET Core InProcess Hosting on IIS with ASP.NET Core 2.2 ASP.NET Core 2.2 has been out for a while now and with it come some significant improvements to the hosting model if you plan on hosting in IIS. In previous versions you were required to host ASP.NET Core applications by proxying requests from IIS into the ASP.NET Core Kestrel server with IIS effectively as a Reverse Proxy. I wrote about this in a detailed blog post a while back. In version 2.2 ASP.NET Core adds support for direct in-process hosting which improves throughput considerably using an easy mechanism that allows switching between in-process and out-of-process hosting. In this post I'll focus on the new In Process hosting model since that's what's changed and is improved, but I'll review the basics of both models here so this post can stand on its own. I'll start with what's changed and then dig a little deeper into how the models work and how they differ. ASP.NET Core 2.2 adds InProcess Hosting on IIS The original versions of ASP.NET Core required you to host on IIS using an Out of Process model that proxies through IIS. Requests hit IIS and are forwarded to your ASP.NET Core app running the Kestrel Web Server. Out of Process Hosting (pre v2.2 model) Figure 1 - Out of Process Hosting uses IIS as proxy to forward requests to your dotnet.exe hosted Console application. With ASP.NET Core 2.2 there's now an In Process hosting model on IIS which hosts ASP.NET Core directly inside of an IIS Application pool without proxying to an external dotnet.exe instance running the .NET Core native Kestrel Web Server. In Process Hosting (v2.2 and later) Figure 2 - With In Process hosting your application runs nside of the IIS application pool and uses IIS's intrinsic processing pipeline. The In Process model does not use Kestrel and instead uses a new Web Server implementation (IISHttpServer) that is hosted directly inside of the IIS Application Pool that is some ways similar to the way classic ASP.NET was plumbed into IIS. This implementation accesses native IIS objects to build up the request data required for creating an HttpContext which is passed on to the ASP.NET Core middleware pipeline. As with the old version, the the Application Pool that hosts the ASP.NET Core Module does not have to be running .NET since the module hooks into the native code IIS pipeline. Although this sounds like a fairly drastic change, from an application compatibility aspect I've not run into into any issues that have had any effect on my applications other than faster request throughput. This feature improves throughput for ASP.NET Core requests on IIS significantly. In my off the cuff testing I see more than twice the throughput for small, do-nothing requests using IIS InProcess hosting. More on this later. Microsoft has done a great job of introducing this hosting model with minimal impact on existing configuration: It's easy to switch between the old OutOfProcess and InProcess models via a simple project configuration switch that is propagated into the deployed web.config file. OutOfProcess or InProcess? Use InProcess For new applications that are deployed to IIS you almost certainly will want to use InProcess hosting because it provides better performance and is generally less resource intensive as it avoids the extra network hop between IIS and Kestrel and maintaining an additional process on the machine that needs to be monitored. There are a few cases when OutOfProcess hosting might be desirable, such as for trouble shooting and debugging a failing server (you can run with console logging enabled for example) or if you want to be 100% compatible between different deployments of the same application, whether it's on Windows or Linux, since Kestrel is the primary mechanism used to handle HTTP requests on all platforms. With the InProcess model you're not using Kestrel, but rather a custom IISHttpServer implementation that directly interfaces with IIS's request pipeline. But for most intents and purposes I think running InProcess on IIS is the way to go, unless you have a very specific need to require Kestrel and OutOfProcess hosting. New ASP.NET Core projects automatically configure projects for InProcess hosting, but if you're coming from an older project you may have to update your project settings explicitly. Settings Affected Switching between hosting modes is very easy and requires only a configuration switch either inside of your .csproj file or in web.config. Project Change - <AspnetCoreHostingModel> The first change is in the project file where you can specify the hosting model by using the <AspNetCoreHostingModel> key. To use InProcess hosting add the following to your Web project's .csproj file: <PropertyGroup> <TargetFramework>netcoreapp2.2</TargetFramework> <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel> </PropertyGroup> The relevant project setting is the AspNetCoreHostingModel which can be InProcess or OutOfProcess. When missing it defaults to the old OutOfProcess mode that uses an external Kestrel server with IIS acting as a proxy. This affects how dotnet publish creates your configuration when you publish your project and what it generates into the web.config file when the project is published. web.config Change The <AspnetCoreHostingModel> project setting affects the generated build output by writing configuration data into the web.config file for the project. Specifically it sets the the hostingModel attribute on the <aspNetCore> element that is generated: <?xml version="1.0" encoding="utf-8"?> <configuration> <location path="." inheritInChildApplications="false"> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" /> </handlers> <!-- hostingModel is the new property here --> <aspNetCore processPath="dotnet" arguments=".\WebApplication1.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" /> </system.webServer> </location> </configuration> If the <AspNetCoreHostingModel> key in the project is set to OutOfProcess or is missing, the hostingModel attribute is not generated and the application defaults to OutOfProcess. Refresh web.config on Publish I found that unlike the rest of the files in the publish output folder the web.config file was not updated on a new publish unless I deleted the file (or the entire publish folder). If you make changes that affect the IIS configuration I recommend to nuke the publish folder and doing a clean publish. Note that you can easily switch between modes after publishing by simply changing the value between InProcess and OutOfProcess in the web.config in the Publish folder. This can be useful for debugging if you want to log output on a failing application with verbose log settings enabled for example. Just remember that if you change publish output it will be overwritten next time you publish again. Cool - this single setting is all you need to change to take advantage of InProcess hosting and you'll gain a bit of extra speed connecting to your application. More Detail: Reviewing IIS Hosting To understand how InProcess hosting for IIS is a nice improvement, lets review how ASP.NET Core applications are hosted on Windows with IIS. What is an ASP.NET Core Application? When you create an ASP.NET Core application you typically create a standalone Console application that is launched with dotnet .\MyApplication.dll. When you run the Console application, ASP.NET Core hosts its own internal Kestrel Web Server inside of the application. Kestrel handles the incoming HTTP traffic and a Kestrel connector hands of an HttpContext to the ASP.NET Core request middleware pipeline for processing. When you build an ASP.NET Web application you essentially create a fully self contained Web Server that runs ASP.NET Core on top of it. Why do I need a Web Server for my Web Server? For live applications hosted on Windows you typically use IIS as the front end server for your ASP.NET Core application rather than letting your ASP.NET Core running the .NET Kestrel Web Server be accessed directly. In a nutshell, the built in Kestrel Web server in ASP.NET core is not meant to be an Internet facing Web server, but rather act as an application server or Edge Server that handles very specific data processing tasks. Kestrel is optimized for application scenarios, but it's not optimized for other things like static file serving or managing the server's lifetime For this reason you generally do not want to run Kestrel directly in a Web application. This is true on Windows with IIS and also on Linux where you tend to use a Web server nginx or ha-proxy to handle non-application concerns. I wrote about how to set up IIS rewrite rules to route common static files rather than letting Kestrel handle them. This is not only about speed but it lets your Web application focus on doing the dynamic things that it's designed to do, letting IIS do the work it was designed for. Here are a few of many arguments on why you want to use a full Web Server rather than running your application directly connected to the Web: Port Sharing Kestrel currently can't do port sharing in the same way that IIS and http.sys can do on Windows. Currently that functionality is supported only through IIS on Windows. (AFAIK you can't even using the HttpSys Server to do this). Additionally although it's possible to use host header routing in ASP.NET Core, it's not exactly easy or maintainable to set this up currently. Lifetime Management If you run your app without any support infrastructure any crash or failure will shut down the application and take your site offline. No matter what, you need some sort of host monitor to ensure your app continues to run if it fails and IIS provides that out of the box. ASP.NET Core with the ASP.NET Core Module benefits directly by being able to restart application pools that can relaunch your application on failures. Static File Serving Kestrel is not very good with static file handling currently and compared to IIS's optimized static file caching and compression infrastructure, Kestrel is comparitively slow. IIS takes full advantage of Kernel mode caching, and built in compression infrastructure that is much more efficient than today's ASP.NET StaticFile handler (".UseStaticFiles()"). There are additional reasons: Security and server hardening, administration features, managing SSL certificates, full logging and Http Request tracing facilities and the list goes on. All good reasons to sit behind a dedicated Web server platform rather than running and managing a self-hosted server instance. Out of Process Hosting Prior to ASP.NET Core 2.2 the only way to host ASP.NET Core on IIS was through out of process, proxy mode hosting. In this model IIS is acting like a Web Server Frontend/Proxy that passes requests through to a separately executing instance of the .NET Core Console application that runs Kestrel and your ASP.NET Core application. Each request first hits IIS and the AspNetCoreModule packages up all the request headers and data and essentially forwards it from port 80/443 (or whatever your port is) to the dedicated port(s) that Kestrel is listening on. Figure 3 - Out of Process ASP.NET Core IIS Hosting As you can see the out of process model makes an additional http call to the self-contained running dotnet core application. As you can imagine there's some overhead involved in this extra HTTP call and the packaging of the data along the way. It's pretty quick, because it all happens over a loopback connection, but it's still a lot of overhead compared to directly accessing request data from IIS. Once on the ASP.NET Core side the request is picked up by Kestrel, which then passes on processing to the ASP.NET Core pipeline. *Figure 4 - Once requests are forwarded via HTTP, they are picked up by the Kestrel Web Server In Process Hosting In ASP.NET Core 2.2 and later, an in process processing model has been added that provides a more direct connection between IIS and your application. Like the out of process model the AspNetCoreModule intercepts requests and routes them directly into the ASP.NET Core application: Figure 4 - IIS In Process Hosting routes requests directly into the application pipeline via the IISHttpServer implementation. In-process hosting does not use the Kestrel Web Server and instead uses an IISHttpServer implementation. This implementation receives incoming requests from the standard IIS http.sys driver and the built-in IIS native pipeline. Requests are routed to the Web site's port and host name through IIS and the request is then routed to IISHttpServer into ASP.NET Core. Figure 5 - In Process hosting uses the IISHttpServer component to handle the Web Server interface IISHttpServer then packages up request data for passing on to the ASP.NET Core pipeline to provide the HttpContext required to process the current request through the ASP.NET Core pipeline. Input is retrieved through native interfaces that talk to the IIS intrinisic objects and output is routed into the IIS output stream. In Process Differences Keep in mind that In Process Hosting does not use Kestrel and because you are using a different Web Server there might be some subtle differences in some settings that are picked up from the Web Server to create the HttpContext. One advantage of running Out of Process with Kestrel you get the same Web Server on all platforms regardless of whether you run standalone, on IIS, on Linux or even in Docker. That said I haven't run into any issues with any of my (small to medium sized) applications where I've noticed anything that affected my application, but it's a possibility to watch out for. One ASP.NET Core Application per Application Pool The ASP.NET Core module V2 running in InProcess mode has to run in its own dedicated Application Pool. According to the documentation you cannot run multiple sites or virtual directories (Web Applications) using the the ASP.NET Core Module in a single Application Pool. Make sure each ASP.NET Core app on IIS gets its own Application Pool. Checking for InProcess or OutOfProcess Hosting Once an application is in production you might want to ensure that you're using the appropriate hosting mechanism. You can check in a couple of ways. Check for the dotnet process You can check for a dotnet process that runs your application's dll. If you're running out of process you should have a dotnet process that's running your application's dll as shown in Figure 5: Figure 6 - OutOfProcess uses dotnet.exe to run your application in proxy forwarding mode when using IIS and you can see that separate process in the Process list. If the dotnet.exe process is running with your application's specific command line, you know your app is running Out Of Process. Check the Response Server Header You can also check the HTTP response for the server and check for either Kestrel or Microsoft IIS as the Web Server for OutOfProcess and Inprocess modes respectively : OutOfProcess Figure 7 - Out of Process IIS Hosting forwards requests to an externally hosted ASP.Core application running Kestrel. InProcess Figure 8 - In Process IIS Hosting implements the Web server host inside of the Asp.Net Core Module using IIS infrastructure. The Server reads Microsoft-IIS/10.0. Performance So the obvious reason to use the new In Process model is that it's faster and uses less resources as it's running directly in process of the IIS Application Pool. There is no internal HTTP traffic and overhead and requests are processed immediately. Before I show a few simplistic requests here, keep in mind that these tests are not representative of typical application traffic. Running simple do-nothing requests only demonstrates that potential throughput is drastically improved, but for longer running request the request overhead is far overshadowed by application level processing in comparison to the request access times. Still it's always a good idea to eek out extra performance and the improved throughput means less latency in requests, slightly faster response times and less overhead on the server potential more load that can be processed. How I set up the Test For this test I used a standard .NET Core API project and then created a small custom class that has a few basically do nothing HelloWorld style methods in it: public class TestController : Controller { [Route("api/helloworld")] public string HelloWorld() { return "Hello World. Time is: " + DateTime.Now.ToString(); } [Route("api/helloworldjson")] public object HelloWorldJson() { return new { Message = "Hello World. Time is: " + DateTime.Now.ToString(), Time = DateTime.Now }; } [HttpPost] [Route("api/helloworldpost")] public object HelloWorldPost(string name) { return $"Hello {name}. Time is: " + DateTime.Now.ToString(); } ... informational requests removed } How Much of a Difference? OutOfProcess The out of process test result looks something like this: Figure 9 - IIS Out of Process processing results with Proxying This is on my local i7 - 12 core laptop. As you can see I get ~8.2k requests a second using out of process hosting. InProcess Running that same test with InProcess hosting - ie. only adding the hostingModel="InProcess" to web.config (or via the AspNetCoreHosting project setting) I get this: Figure 10 - IIS In Process processing results This produces 19k+ requests a second. That's more than twice as many requests! This is not exactly surprising given that you are removing an extra HTTP request and all the parsing that goes along the for ride in that process. But still it's quite a significant difference. But again keep this in perspective. This doesn't mean that your app will now run twice as fast, but simply that you get slightly faster connect and response times for each request that runs through IIS which is a welcome addition, especially given that you have to do nothing to take advantage of this improvement except upgrade and set a configuration switch in your project. Just for reference, if I hit an IIS static Web site using tiny plain static pages I can generate about ~50k requests/second on this same setup. Raw Kestrel Just for argument's sake I also wanted to test that same process using just raw Kestrel (on Windows) without IIS in the middle. Figure 11 - Out of Process processing results with direct Kestrel access Direct Kestrel access lands somewhere in the middle between In and Out of Process hosting. I was a bit surprised by this - I would have expected raw Kestrel to perform on par or better than IIS for dynamic requests. Given all the performance stats we've heard how well ASP.NET Core performance on various benchmarks and many of the fastest benchmarks use raw Kestrel access. I would expect IIS to have a big edge for static files (with Kernel caching), but for dynamic requests I expected Kestrel to beat IIS. But apparently that's not the case at least not on Windows. Even for dynamic requests the IIS Inprocess throughput is better than Kestrel's. Summary While IIS is getting marginalized in favor of hosting on Linux and Docker, remember that IIS is still Azure's default ASP.NET Core deployment model if you publish to an AppService and don't explicit specify platform. This means IIS is still in use in more scenarios than just self-hosted IIS applications, so it's not going away anytime soon. And Microsoft just backed that up with the new in processing hosting features that provide much better performance. You now have two options for hosting on IIS using either the now classic Out of Processing that proxies requests through IIS and uses a completely self-contained ASP.NET Core console application using the .NET Based Kestrel Web Server, or you can use the In Process Hosting model which is more similar to the way classic ASP.NET used to interface with IIS through its own native APIs. The new In Process model is considerably faster in terms of request throughput so in almost all cases when hosting on IIS you'll want to choose the InProcess model. The key setting to remember is to set: <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel> in your project and remove it or set it to OutOfProcess to use the old mode. The setting will generate the required hostingModel attribute in web.config which can also be explictly set in this file to make runtime changes to the host behavior. This is a great improvement that gets you a decent performance bump for literally setting a switch. Switch it on and go burn some rubber... Resources Sample Repo Original ASP.NET Core IIS Hosting Post (covers out of process hosting only) Docs: Host ASP.NET Core on Windows with IIS Docs: Web Server Implementations in ASP.NET Core this post created and published with Markdown Monster © Rick Strahl, West Wind Technologies, 2005-2019Posted in ASP.NET Core  IIS   Mar 16 Digital Photography School How to Edit and Retouch Images Using Capture One Pro The post How to Edit and Retouch Images Using Capture One Pro appeared first on Digital Photography School. It was authored by Carl Spring. Whilst we all flock to Photoshop for our retouching, Capture One now has a lot of great tools. But is it possible to do a full image edit including retouching? More so, if it is, should you do it and avoid Photoshop altogether? To find out, I closed Photoshop and settled myself down for a […] The post How to Edit and Retouch Images Using Capture One Pro appeared first on Digital Photography School. It was authored by Carl Spring. Mar 16 Digital Photography School Weekly Photography Challenge – Arches The post Weekly Photography Challenge – Arches appeared first on Digital Photography School. It was authored by Caz Nowaczyk. This week’s photography challenge topic is ARCHES! Your photos can include anything includes anything that has arches. It can be architecture, human, objects, nature, motion-blurred, cropped, minimalist, color-based or anything really! They can be color, black and white, moody or bright. You get the picture! Have fun, and I look forward to seeing what you come […] The post Weekly Photography Challenge – Arches appeared first on Digital Photography School. It was authored by Caz Nowaczyk. Mar 15 SitePoint How to Replace jQuery with Vue I’m willing to bet that there are a lot of developers out there who still reach for jQuery when tasked with building simple apps. There are often times when we need to add some interactivity to a page, but reaching for a JavaScript framework seems like overkill — with all the extra kilobytes, the boilerplate, the build tools and module bundlers. Including jQuery from a CDN seems like a no-brainer. In this article, I’d like to take a shot at convincing you that using Vue.js (referred to as Vue from here on), even for relatively basic projects, doesn’t have to be a headache, and will help you write better code faster. We’ll take a simple example, code it up in jQuery, and then recreate it in Vue step by step. What We’re Building For this article, we’re going to be building a basic online invoice, using this open-source template from Sparksuite. Hopefully, this should make a refreshing change from yet another to-do list, and provide enough complexity to demonstrate the advantages of using something like Vue while still being easy to follow. We’re going to make this interactive by providing item, unit price, and quantity inputs, and having the Price column automatically recalculated when one of the values changes. We’ll also add a button, to insert new empty rows into the invoice, and a Total field that will automatically update as we edit the data. I’ve modified the template so that the HTML for a single (empty) row now looks like this: <tr class="item"> <td><input value="" /></td> <td>$<input type="number" value="0" /></td> <td><input type="number" value="1" /></td> <td>$0.00</td> </tr> jQuery So, first of all, let’s take a look at how we might do this with jQuery. $('table').on('mouseup keyup', 'input[type=number]', calculateTotals); We’re attaching a listener to the table itself, which will execute the calculateTotals function when either the Unit Cost or Quantity values are changed: function calculateTotals() { const subtotals = $('.item').map((idx, val) => calculateSubtotal(val)).get(); const total = subtotals.reduce((a, v) => a + Number(v), 0); $('.total td:eq(1)').text(formatAsCurrency(total)); } This function looks for all item rows in the table and loops over them, passing each row to a calculateSubtotal function, and then summing the results. This total is then inserted into the relevant spot on the invoice. function calculateSubtotal(row) { const $row = $(row); const inputs = $row.find('input'); const subtotal = inputs[1].value * inputs[2].value; $row.find('td:last').text(formatAsCurrency(subtotal)); return subtotal; } In the code above, we’re grabbing a reference to all the <input>s in the row and multiplying the 2nd and 3rd together to get the subtotal. This value is then inserted into the last cell in the row. function formatAsCurrency(amount) { return `$${Number(amount).toFixed(2)}`; } We’ve also got a little helper function that we use to make sure both the subtotals and the total are formatted to two decimal places and prefixed with a currency symbol. $('.btn-add-row').on('click', () => { const $lastRow = $('.item:last'); const $newRow = $lastRow.clone(); $newRow.find('input').val(''); $newRow.find('td:last').text('$0.00'); $newRow.insertAfter($lastRow); $newRow.find('input:first').focus(); }); Lastly, we have a click handler for our Add row button. What we’re doing here is selecting the last item row and creating a duplicate. The inputs of the cloned row are set to default values, and it’s inserted as the new last row. We can also be nice to our users and set the focus to the first input, ready for them to start typing. Here’s the completed jQuery demo: See the Pen jQuery Invoice by SitePoint (@SitePoint) on CodePen. The post How to Replace jQuery with Vue appeared first on SitePoint. Mar 15 Digital Photography School Lightroom Shortcuts Every Photographer Needs to Know [video] The post Lightroom Shortcuts Every Photographer Needs to Know [video] appeared first on Digital Photography School. It was authored by Caz Nowaczyk. In this awesome video by Lucy Martin, you’ll learn Lightroom shortcuts every photographer needs to know to make their editing workflow faster and more efficient. ?   The Lightroom shortcuts every photographer needs to know Help make your editing process be more efficient and fast-paced so you can deliver your photos much quicker by knowing […] The post Lightroom Shortcuts Every Photographer Needs to Know [video] appeared first on Digital Photography School. It was authored by Caz Nowaczyk. Mar 15 Digital Photography School Your Guide to Photography User Agreements The post Your Guide to Photography User Agreements appeared first on Digital Photography School. It was authored by Darina Kopcok. Copyright and image usage can be a complex and confusing arena even for experienced photographers. When you shoot for a client, you not only need a contract outlining the deliverables, but you also need a user or licensing agreement. You also need a user agreement if a brand or organization comes across one of your […] The post Your Guide to Photography User Agreements appeared first on Digital Photography School. It was authored by Darina Kopcok. Mar 14 Designmodo 7 Things to Look For in a Website Builder for Your Next Project You're reading 7 Things to Look For in a Website Builder for Your Next Project, originally posted on Designmodo. If you've enjoyed this post, be sure to follow on Twitter, Facebook, Google+! Website builders are great assets. If you’ve chosen to use one, we hope you like it. If you are debating which website builder to use, this post will go over seven different features to be mindful of when selecting the … Mar 14 Digital Photography School How to Tell Stories with Architecture Photography The post How to Tell Stories with Architecture Photography appeared first on Digital Photography School. It was authored by Charlie Moss. At first glance, it might seem like architecture photography is all about prestige projects, glittering corporate headquarters, and well-paid specialist photography gigs. However, there can be much more to architectural photography if you look a little deeper. Architecture is a vast and diverse field. It basically means the design and construction of buildings or the […] The post How to Tell Stories with Architecture Photography appeared first on Digital Photography School. It was authored by Charlie Moss. Mar 13 SitePoint Create an Automated Scoreboard that Senses Your Score with a Raspberry Pi On an impulse just before Christmas, I bought myself an NBA "over-the-door" mini basketball hoop. I wasn't sure what I'd do with it, but having a basketball hoop for my office seemed like a good move. In the end I decided to experiment and bring some connectivity to it by hooking it up to a Raspberry Pi to give it a scoreboard display. Here's how that went, with step-by-step instructions if you'd like to try to adapt and improve upon it! This tutorial isn't intended to be used as a step-by-step "do exactly as I did" style guide — my hope is that you'll take this concept and use it for all sorts of other ideas. Add a virtual scoreboard that counts how often people come into your office. Or go with a different sport (maybe a mini soccer goal tracker?). Or use an entirely different sensor but track hits on it visually with a Raspberry Pi! There are so many potential applications of this technique. Try stuff and let me know how you go! What You'll Need In order to be able to follow along and make something similar, here's a list of the parts I used (or their equivalent for the things I had around my lab already): Raspberry Pi 3 B+ — I used an older version of this from 2015, if you're going to buy one, get a newer version like this! A MicroSD card with NOOBS — if you are looking to install this yourself and have an SD card ready to go Raspberry Pi foundation have a guide on how to do so here. Spalding NBA Slam Jam Over-The-Door Mini Basketball Hoop — This is the mini basketball hoop I used. You could use a different one — especially if its net works better! Raspberry Pi 3.3190G 7" Touchscreen Display — This is my favourite display for the Raspberry Pi, it is a touchscreen, so you can interact with the UI without needing to connect up a mouse. RS Raspberry Pi 7-Inch LCD Touch Screen Case, Black — To make the display look a bit nicer when all together with the Pi, I have my Pi in this black case. HC-SR04 Ultrasonic Distance Measuring Sensor Module — I had a spare cheap clone HC-SR04 sensor around, but I'd recommend buying a good quality one. My one has occasional odd readings and is a bit temperamental. One thing to note — if you don't have a 7 inch display for your Pi, you could display the score on a nearby computer monitor too. Any device on your local network with a web browser and a screen would work! The Code Want to skip to downloading the code? It's available on GitHub here. What I put together I hung my new basketball hoop up on a door with an ultrasonic sensor attached to the hoop to track when a ball goes into the hoop. Underneath is a Raspberry Pi powered scoreboard — I'd actually recommend finding longer cables so you can connect it outside of basketball falling range. [caption id="attachment_171361" align="aligncenter" width="1024"] Me testing out my connected scoreboard — with a customised Suns themed interface![/caption] I'll go over why everything is as it is below — along with some suggestions for those who might want to improve upon this base! Languages we'll be using JavaScript - In order to follow along, you'll need a knowledge of the basics, but we won't have lines upon lines of code, things are actually pretty simple in the JS side of things. Node.js - A basic knowledge of how to run npm and Node is needed to run our scoreboard server. Setting up our Raspberry Pi If you are completely new to the Raspberry Pi and haven't set anything up yet, never fear! There are many guides out there for setting things up and it's nice and straightforward. The Raspberry Pi foundation have a step by step guide for installing the Raspbian operating system using the NOOBS operating system manager. You'll want to make sure the operating system is running before you get onto any of the other steps. Touchscreen setup I put together my connected scoreboard using a Raspberry Pi 3 with touchscreen. My touchscreen and case were already put together and screwed down tight as I've used this Pi 3 before for other projects, however if you are starting from scratch — it isn't too hard to connect up. Newer shipments (like mine) actually have a bunch of it already assembled, with the adapter board already screwed onto the LCD screen, if that's the case, half the steps are already complete! Instructions on how to assemble the screen are available online: Official instructions — these are the instructions which come with the screen in case you lose them! The Pi Hut have their own tutorial — they explain the details of the process too. ZDNet's look at the touch display with case — they've got a good amount of detail and tips for setting up the screen and case to use in various situations. Case setup When it comes to putting the case around the LCD screen and Raspberry Pi, that process is also quite easy with the case I have. I already had mine together, however the general steps for this are: Make sure you've already got your microUSB card inside the Raspberry Pi and are happy with how it's running! Annoyingly with a lot of cases, you can't get the card out once the case is in place. My case linked above is one of those... so make sure the card is all good before you lose access to it! Place the Pi with screen into place inside the case Arrange the ribbon cables and cables coming from the GPIO so they aren't in the way Make sure the holes for your USB ports and such are on the correct side of the bulkier part of the case and line up nicely. Once everything is lined up nicely, screw in the four screws to put it all together! Turn it on! If you find that the screen comes up upside down, don't worry, it's a side effect of the case manufacturers lining up the power to come out of the top. When I mounted my scoreboard though, I mounted it with the power coming out of the bottom, so this wasn't an issue for me. If it is an issue for you: Run sudo nano /boot/config.txt to open the config for the Pi Then add lcd_rotate=2 to the end, this will rotate the screen around. Press Ctrl X and the Ctrl Y to save your changes. Restart your Pi and when it loads back up it should be the right way around! Running Node.js on our Raspberry Pi Conveniently, Raspbian has Node installed by default! However, it is a rather old version of Node. You can check which version is installed on your Pi by opening up the Terminal and typing in: node -v I've got version 8.15.0 installed on my Pi. You can upgrade by running the following commands: sudo su - apt-get remove nodered -y apt-get remove nodejs nodejs-legacy -y apt-get remove npm -y curl -sL https://deb.nodesource.com/setup_5.x | sudo bash - apt-get install nodejs -y After running all of those, if you type in that version command again, you should see a better version: node -v You can also check npm is installed correctly by running: npm -v With node running on our device, we're ready to get a scoreboard Node server running! The post Create an Automated Scoreboard that Senses Your Score with a Raspberry Pi appeared first on SitePoint. Mar 13 Designmodo What’s New in Postcards 2.8? You're reading What’s New in Postcards 2.8?, originally posted on Designmodo. If you've enjoyed this post, be sure to follow on Twitter, Facebook, Google+! Normally we don’t write about product updates between versions, but this time we decided to tell you about Postcards 2.8 because it contains new features requested based on your requests. After the release of transaction modules, we focused on product … Mar 13 Digital Photography School When and How Often Should You Upgrade Your Photography Equipment? The post When and How Often Should You Upgrade Your Photography Equipment? appeared first on Digital Photography School. It was authored by Lily Sawyer. We have all heard of the shiny object syndrome have we not? Perhaps you have even fallen victim to it? It’s an easy trap; especially when we are newbies. I have certainly been a victim of it when I first started and was always thinking that my photography would improve if only I had better […] The post When and How Often Should You Upgrade Your Photography Equipment? appeared first on Digital Photography School. It was authored by Lily Sawyer. Mar 12 Premier Developer Planning the future for NoSQL Cassandra DB Applications on Azure In this post, App Dev Manager Shany Wiesel explains the different deployment models for Apache Cassandra on Azure. Microsoft Azure is an open cloud platform that runs both Microsoft as well as non-Microsoft software which includes operating systems, The post Planning the future for NoSQL Cassandra DB Applications on Azure appeared first on Premier Developer. Mar 12 Harold Davis Radiating Beauty: Creating a new photographic form with fusion x-rays The shapes and forms are recognizable, yet the level of detail is deeper than the human eye can normally perceive: Leaves appear minutely laced and surfaces are impossibly intricate, somewhere between translucent and opaque. Welcome to the captivating work of photographer Harold Davis and radiologist Dr. Julian Köpke, who combine their skill, passion, and vision to create stunning […] Mar 11 Digital Photography School How to Photograph Frozen Bubbles in the Cold The post How to Photograph Frozen Bubbles in the Cold appeared first on Digital Photography School. It was authored by Mark C Hughes. I live somewhere that gets pretty cold in the winter, and occasionally it gets super-cold. Alright, discussing cold is always a relative measure depending upon where you live, but I may be understating a bit to say it gets pretty cold, when actually, it gets freezing by pretty much anyone’s measure. Fortunately for my family […] The post How to Photograph Frozen Bubbles in the Cold appeared first on Digital Photography School. It was authored by Mark C Hughes. Mar 11 SitePoint 15 Top Prototyping Tools Go Head-to-Head Want to learn UX from the ground up? Get an entire collection of UX books covering fundamentals, projects, tips and tools & more with SitePoint Premium. Join now for just $9/month or try our 7 day free trial. As the number and variety of prototyping tools continues to grow, it’s becoming harder and harder to figure out which tools meet what needs, and who they’re suitable for. Since we first wrote this article back in 2015, countless design apps have dominated (and changed) the prototyping space. Stakeholder feedback and user testing is now taking a far greater role in UI design and this new generation of tools aims to connect these two previously separate stages of the design process. Clients want to be involved, and email isn’t cutting it anymore. Some apps like UXPin are also taking care of the wireframing stages, whereas others like InVision App are bridging the gap between designer and developer by offering design handoff tools. Plus, there’s now a clear divide between desktop tools with cloud sharing (Adobe XD, Axure, Balsamiq, Sketch+InVision) and collaborative online tools (Figma, UXPin, Fluid UI, Proto.io). Many of these tools appear to be converging on a feature set that defines the role of the modern user experience designer. TL;DR—here’s a swift comparison of prototyping tools. This article was updated in March 2019 to reflect the current state of the prototyping tools market. The post 15 Top Prototyping Tools Go Head-to-Head appeared first on SitePoint. Mar 11 Digital Photography School Your Guide to the Best Poses for Engagement Photos The post Your Guide to the Best Poses for Engagement Photos appeared first on Digital Photography School. It was authored by Jackie Lamas. Engagement sessions can be really fun, but it can get a little repetitive posing the couple together again and again throughout the session. Here are great poses that work for all couples during an engagement photo session. Begin with foundation poses A foundation pose is a pose where you set the couple in the exact […] The post Your Guide to the Best Poses for Engagement Photos appeared first on Digital Photography School. It was authored by Jackie Lamas. Mar 10 Digital Photography School 4 Essential Things to Consider When Styling a Photoshoot The post 4 Essential Things to Consider When Styling a Photoshoot appeared first on Digital Photography School. It was authored by Lily Sawyer. A successful photoshoot doesn’t just happen by itself. Perhaps there are times when everything lines up and an impromptu photoshoot happens. But that is often the exception. From my experience, much planning goes into a successful photoshoot. Whether you are doing a family, newborn, or portrait shoot, formal, informal, indoor or outdoors, styled or casual […] The post 4 Essential Things to Consider When Styling a Photoshoot appeared first on Digital Photography School. It was authored by Lily Sawyer. Mar 9 SitePoint SitePoint Premium New Releases: Vue Projects, Django & Isomorphic Go We're working hard to keep you on the cutting edge of your field with SitePoint Premium. We've got plenty of new books and mini-books to check out in the library — let us introduce you to them. Build a Real-time Chat App with Pusher and Vue.js Build a real-time chat application using Vue.js powered by ChatKit. The ChatKit service will provide us with a complete back end necessary for building a chat application on any device, leaving us to focus on building a front-end user interface. Read Build a Real-time Chat App with Pusher and Vue.js. Django Design Patterns and Best Practices Second Edition - Packt Build maintainable websites with elegant Django design patterns and modern best practices. Explore aspects from Models and Views to testing and deployment. You’ll also understand the nuances of web development, such as browser attack and data design. Read Django Design Patterns and Best Practices Second Edition. Creating Beautiful Charts Using Vue.js Wrappers for Chart.js Learn how to represent data in the form of various types of chart with the help of Chart.js and Vue.js. Read Creating Beautiful Charts Using Vue.js Wrappers for Chart.js. Isomorphic Go Learn isomorphic development in Go, getting a unified view of web and back-end development. Learn how to build Isomorphic Go web apps. Neatly organize your isomorphic codebase to enhance the maintainability of your app. Leverage the same Go code across the web server and the web browser. Read Isomorphic Go. How to Build a Chrome Extension with Vue Learn how to build a simple extension for Chrome. For the JavaScript part of the extension, we'll be using Vue. Read How to Build a Chrome Extension with Vue. And More to Come… We're releasing new content on SitePoint Premium almost every day, so we'll be back next week with the latest updates. And don't forget: if you haven't checked out our offering yet, take our 7 day free trial for a spin. The post SitePoint Premium New Releases: Vue Projects, Django & Isomorphic Go appeared first on SitePoint. Mar 8 Digital Photography School How to Develop Better Black and White Photos in Lightroom The post How to Develop Better Black and White Photos in Lightroom appeared first on Digital Photography School. It was authored by Darina Kopcok. Achieving great looking black & white images in Lightroom is not about converting your colour images to grayscale with the click of your mouse and calling it a day. Black & white photography is subtle, and it takes experience to see and understand its nuances. Lightroom has a fantastic set of tools to help you […] The post How to Develop Better Black and White Photos in Lightroom appeared first on Digital Photography School. It was authored by Darina Kopcok. Mar 7 SitePoint How User Research Turned a Good App into a Great One Firstly, the backstory. In 2013 the popular Cook app was launched, and it’s great to reflect on the journey it’s been through. I love to cook. This is probably not surprising for someone who created a cooking app. As a child, some of my earliest memories are of sitting on the kitchen bench watching my mother cook amazing food for all manner of social events, and getting to help stir or participate in other small ways was a highlight for me. I really think food holds many memories. The smell of food, or the type of dish you’re eating, can take you back in time — in much the same way music has the ability to trigger memories of different times in your life, reminding you of people and places from your past. It was the memories of the past that led me to think of a digital recipe book being a good idea for an app. I was chatting with my mother one day and asked her where my grandmother’s baked custard recipe was. She responded, “Oh, I don’t know. I don’t think she ever wrote it down. She just did it from memory.” I was horrified. It was a simple recipe. But at the time I asked the question, my grandmother had been dead for ten years. That meant the recipes I recalled from my past — simple though they were — had now been lost with her. My grandmother isn’t any different from many home cooks who have an array of recipes they cook so often they know how to do them from memory, and so never write them down. Recipes can represent your heritage in many ways. My grandmother’s was a simple recipe, and I could probably easily recreate it from a web search. But this particular recipe held special memories of baked dinners and times spent with my grandmother. Because she didn’t write it down, it was lost now — never to be recovered. So Cook was first imagined as a way to preserve the heritage of family recipes — helping to overcome the loss of handwritten recipes over time, assisting to preserve recipes from generations of family cooks. By digitizing the old world of index cards, tatty old recipe books, or other random means, my hope was to enable family recipes to be captured and shared with future generations. Digital meant that recipes could be handed down more easily and not lost to a time gone by. The Opportunity to Do Something Knocks Like many people who have a killer idea for an app, I did nothing with this idea for ages. I was just another person that imagined a “great idea” for an app and bored people with that idea at dinner parties. Then, in 2011, SitePoint approached me to write a book on UX. SitePoint is a publication mainly aimed toward the developer community, so they suggested that a case study would be useful in bringing the value of UX to life for their readers in a more tangible way. UX has often been viewed with skepticism in terms of tangible, measurable benefit. In those days, it was still kind of new to consider “the user” of a product as you developed it — as crazy as that sounds. So I discussed with my editor Simon the idea for the app, and that we could incorporate the story of it into the UX book. We imagined that each chapter could talk about the key methods to follow, and that the app would be the living and breathing example of how we put the methods to work in order to bring the app idea to life. In this sense, Cook became the case study for taking a “human-centered design” approach to product design. So, by writing the book we were able to mature the idea of a recipe app a bit further, taking an educational approach. The UX Rules of Product Development Whenever creating a product, you should ask yourself three simple questions: What problem needs solving? Who are you solving it for? How are you going to measure success? What Problem Needs Solving? Quite often this gets answered as a product is imagined, and Cook was no different. I was a passionate home cook that thought there was potentially was a gap in the market, based on a pain I had encountered. Although it’s wise to never think you are your users, this is the way many ideas start. And this thought spurred on the idea for a digital recipe book. Exploration of that idea comes next. As part of the process of exploration, we needed to scan the landscape. What else was out there? Were we the only ones with this idea? How could we be inspired by the competing and complimentary offerings that existed? Had someone else beaten us to it? This task proved to be a scary one, as we discovered the cooking app landscape was littered with famous celebrity chefs. Jamie and Nigella were everywhere. I was a passionate home chef, but I was no MasterChef. Eeep! However, regardless of the talent in the space, the design gap still remained. There was no app we could find that presented people with a stupidly simple means of creating recipes and storing them digitally. There were many complex ones that were hard to use. And therefore, not only was there a gap, but there was an area that we could easily differentiate — simply by being easy to use. Who Are We Solving It For? The problem we were solving for was, to my mind, home cooks. Passionate, average, everyday cooks, the type of people that had their own recipe scrapbook full of favorite recipes from times past. Collected from family and friends over the years. This focus is why we initially named the app “Family Favorites”. It said what we intended — but it was a bit lame in selling the dream from a marketing perspective, and also tended to pigeonhole the target audience in a way we didn’t want. That is, it seemed to say “families only”. We knew we had work to do on the name and on giving it a broader appeal. Nevertheless, the placeholder name held for a while as we got on with the business of researching and creating the app. We’d think about the name later. Measuring Success Obviously, the easiest measure of success was going to be people downloading it and using it. Actually, creating recipes within the app was going to be the main measure of success at this stage. This measure would change over time as the design and concept evolved, but, at a basic level, if you’re downloading an app and using it, it’s a good basic success metric. We agonized over whether to charge for the app or not, and we eventually decided we needed eyeballs in the early days. So the app would be free, so that there was no barrier to people downloading it. What Taking a “UX” Approach Means in Practice We ate our own dog food and followed a “human-centered design approach” (HCD), or “UX” approach. This approach is more commonly understood and accepted nowadays as a beneficial approach to product development. But what does it mean in practice? HCD, UX, even service design (SD), are all very similar in their philosophy: that is, to design by putting the human at the center of your design process — considering their needs upfront and throughout the product development process, being prototype-driven (that is, experimental), and iterative (that is, changing your mind and updating the design, based on what you learn from exploration and validation with people). It’s stupidly simple. We did all these things developing Cook. It works. I’ve often told the story of how I recruited people to take part in some concept exploration research before we started designing the app. I did this across a weekend — the only time I could fit it in around work. I told participants I was going to come over to their house, and I wanted them to prepare and cook for me one of their favorite recipe dishes of all time. Everyone I tell this story to laughs and says the same thing. “Nice one! You just wanted to be fed!” Without doubt, it was one of the most enjoyable sessions I’ve ever run, and I certainly loved the many and varied outputs. But that was part of the real trick — to ensure they didn’t really know what I was exploring. From a process perspective, I sent them a homework activity to complete before I got there, so we could talk about it. The homework task was to create a poster that combined words and images to show how they feel about cooking (this helped prime them to the topic). They knew I was going to arrive and chat to them while they prepared the dish, but they didn’t really know what it was I was researching beyond that. As they prepared the food, I asked them questions about the dish they’d chosen, and watched to see if they used a recipe, and where they had the recipe as a reference. (Was it in a recipe scrap book? Was it in a book? Index cards? From memory? Other?) I intentionally didn’t talk about storage or recipe management too much. That part I observed. I talked to them mainly about their love of cooking, how they came to find this recipe and how it ended up being a family favorite. I talked about how they came across new ideas for cooking dishes and where they kept things stored. But we didn’t ever talk about whether they thought a “digital recipe app” was a good idea or not. The trick to good research is to explore around the edges of what you’re looking at, and not let the people you’re talking to necessarily know what you’re actually researching. You gain real insights from observing people’s true habits and behaviors, rather than by asking direct questions about their habits — which just puts people in a position of making up an answer if they don’t know why they do what they do. Most of the time we don’t know why we do things. We just do them automatically. It’s a habit we’ve formed for some reason, and it serves a particular purpose for us. Exploring the purpose around what we do, and why, is the job of a design researcher. This comes to another thing about design research: we explore the way users work and live in a more contextual manner, and from that we gain inspiration for design. People often forget the little details of routine, so going into their environment helps us make connections that they might not think to articulate. Design research is intended to explore the design gaps and facilitate a better understanding for how users’ needs can be met — so that we can design better solutions for them. One of the central tenets of HCD is to go to the extremes. Don’t just engage with people you think you’re creating the product for. Go to the edges and get inspiration from the types of users who might never want to buy your product. The anti-users and the experts often give you the best hints for how your product can differentiate itself and appeal to a broader market. The people I recruited to participate included passionate home cooks, people who couldn’t cook, people who hated cooking, and professional chefs. What I Learned that Changed My Thinking The idea we went into research to create was quite different from what we came out with. We went into concept research absolutely sure we had an opportunity to create a digital recipe cookbook that people could store their recipes within. The ability to be digital meant cherished recipes would never be lost, and you could keep adding to your digital cookbook indefinitely. What we missed with this perspective, however, was the gap for sharing and swapping recipes. And we also totally underestimated people’s voyeuristic, idle curiosity about what other people cook and eat from day to day. It’s funny. I’m a passionate home cook. But I was so focused on what I thought the product needed to be that I totally overlooked many things that user research helped me open my eyes to and refocus on. In this sense, my own bias about the product made me overlook critical product features that would help make the app really special. This points to a few things about research. As a human, you have a lot of biases and self-fulfilling tendencies when creating a product you’ve been personally invested in. You really need to watch that. It’s part of being human, and hard to control. Being aware of it and testing your assumptions with real people other than you is critical. As a design researcher, you have to be open to changing your mind about what you think you know to be true. This is product design, not art. The purpose of design is to ensure it’s as good as it possibly can be for the eventual end users. You need to accept that your initial wonderful idea might not have it all covered. You need to change your mind, and your design approach, based on what you learn. Otherwise, you’re just creating art. This self-reflective moment is essential for design researchers. Your humble attitude to being open to new ideas, and changing your design accordingly, is not only essential, it’s critical to your success. The Critical Aha Moments People who love to cook often are friends with other people who love to cook. Swapping and sharing recipes is something they do. But as we learned, it’s a difficult and messy process. This was the first aha moment. When we unpacked the research, we realized we needed to make Cook more than just a digital recipe book. We needed to facilitate sharing. It needed to be a social network for recipe sharing — enabling you to connect with friends and family and access each other’s recipes. Another aha moment was discovering that people were fascinated by what other people cooked and ate. Not the exotic or highly skilled cheffy stuff, but the everyday meals that were quick and easy were interesting to people. Ultimately, they wanted inspiration for their everyday. But it had to be quick and simple — things that didn’t take too long. They were curious about what other people were doing in the kitchen on week nights, when they were pushed for time and were preparing for the week ahead. Another critical aha moment was that people’s voyeuristic food tendencies weren’t limited to the banality of the local day-to-day. They were interested in the day-to-day food from other cultures. We discovered that many people attend cooking courses and buy recipe books from countries they visit. And while they’re interested in the exotic and higher-brow stuff, they’re also interested in the day-to-day. This opened our eyes to the prospect of a global recipe sharing network, which would facilitate users seeing what everyday cooks in other countries cooked regularly. This led to two things: we launched the app globally, rather than just in Australia, and we partly focused recipe browsing on where recipes were submitted from. So one of the main navigation features was the “world books”, which allowed you to see what the everyday cooks in the UK, or USA, or Singapore were cooking. This may seem like a little thing, but to me this really was one of the coolest features of Cook. Yes, people in the USA have an inordinate amount of Oreo Cookie recipes to share, and people in Italy have an amazing stash of pasta dishes. Another aha moment was considering how to assist users to “fill up” their recipe book without having to actually write out recipes. People who had recipe scrap books had been adding to them for years — and still they might not have had many recipes within them. This was a concern for us. For Cook to be successful, you needed to be able to have it all, and it needed to be super simple. We knew that searching the Web was a common way to find recipes. So the need to search the Web for recipes and add them to your book was clear, but another way to help build out your book was to be able to add recipes you found within Cook, from across the global selection. This helped to save the things you loved as your own, and also helped to fill out your book quickly and easily. These things may not appear to be much. But they were a fundamentally different way to design and build out the app. And we were able to then do these things because we did this research up-front, before we had started to build or lay down foundations that were going to be hard (or impossible) to change. We were letting what we’d learned reshape our thoughts of the Cook app, which was a great position to be in. Where We Are Now Cook launched in 2013, a year after the launch of the book Killer UX Design, and I’m pleased to say we’re still rated one of the top 20 best apps for the food and drink category. We’ve had 1.5 million downloads to date, and there have been 800 thousand recipes shared through the app worldwide. Cook is featured on iPads in the Apple store around the world. In fact, I’ll never forget going into the Apple store in NYC and seeing Cook on the iPads on display. Wow! What a thrill that was. The app has many dedicated users who love and cherish their digital cookbook. I don’t think I could have dreamed of a happier ending. Like all start-ups, we always managed Cook on the side of our day jobs. And it’s the same right now. We’ve never received any funding and have been keeping the dream alive through our dedicated community of Cooks, who create and share content via the app daily. We never did change the charging model, so to date, Cook has brought us lots of grateful moments, but no money. As we mentioned, we decided to remove all barriers for download and therefore not to charge for the app. To this day the app is free — an expensive decision, but the right one at that time. The funniest thing about apps is that you ask someone to go to a different bank ATM and pay $3 to extract money and no one batts an eyelid. You ask someone to pay $3 for an app and they’re up in arms! And so not charging for Cook is something we’re going to reconsider. It’s certainly hard sometimes for people who use Cook to understand that there are only about two people overseeing that app. So right now I’m looking for funding to keep Cook going into the future — a true labor of love. Working with Cook has been a design experience of a lifetime, and one that totally validates the HCD approach we set out to prove. The post How User Research Turned a Good App into a Great One appeared first on SitePoint. Mar 7 Premier Developer e-signature retirement in Azure DevOps service and Azure DevOps Server Premier Developer consultant Brian Blackman shares insights around e-signature requirements with Azure DevOps. The reason for this post is to help customers realize how to satisfy the CFR – Code of Federal Regulations, The post e-signature retirement in Azure DevOps service and Azure DevOps Server appeared first on Premier Developer. Mar 7 Premier Developer Gathering real-time Perfmon Counters in a cluster Premier Development Consultant Kurt Schenk demonstrates how to gather real-time performance metrics in a cluster. Performance (aka. Perfmon) Counters are critical to understanding the health of and diagnosing issues on Windows. In recent performance and scalability testing of a solution built on top of Azure Service Fabric, The post Gathering real-time Perfmon Counters in a cluster appeared first on Premier Developer. Mar 6 Digital Photography School 5 Portrait Photography Rules You Should Probably Ignore The post 5 Portrait Photography Rules You Should Probably Ignore appeared first on Digital Photography School. It was authored by John McIntire. Think back to the time when you first got interested in photography. From the moment you first pick up a camera, you are bombarded with a constant onslaught of dos and don’ts. You have to do this. You can’t do that. Rules, rules, rules, some more rules: then once you have a grasp on those, […] The post 5 Portrait Photography Rules You Should Probably Ignore appeared first on Digital Photography School. It was authored by John McIntire. Mar 6 Digital Photography School Simple Yet Unique Ways to Add Creativity into Your Photos The post Simple Yet Unique Ways to Add Creativity into Your Photos appeared first on Digital Photography School. It was authored by Karthika Gupta. A lot of us get into a creative rut when it comes to winter time or gets into a winter slump! For some, the start of a new year means new goals and new resolutions which also means trying out everything that they possibly can.  If you are like me, and always love looking for […] The post Simple Yet Unique Ways to Add Creativity into Your Photos appeared first on Digital Photography School. It was authored by Karthika Gupta. Mar 6 SitePoint Browser DevTools Secrets: Start-up, Network and Performance During the past decade, browser development tools (browser DevTools) have evolved from basic JavaScript consoles to fully-integrated development and debugging environments. It's become possible to alter and inspect any aspect of your web application but few of us venture beyond the basics. In this series of articles, we'll explore a range of features you may or may not have considered. Chrome's DevTools are described in most cases but alternative options are shown for Firefox where available. Keyboard Shortcuts Using a menu to launch DevTools wastes valuable seconds! Try one of these options instead: F12 ctrl + shift + i cmd + option + j or right-click any element on the page and choose Inspect or Inspect Element. Chrome provides useful keyboard shortcut assistance. From DevTools, press F1 or select Settings from the three-dot menu at the top-right. Then choose Shortcuts from the menu: Docking The DevTools pane can be docked to the left, right or bottom of the browser window. If you require more room, undock it to a separate window. Docking options are found in the main three-dot menu in Chrome: and Firefox: Settings DevTool settings can be accessed from the same menu or by pressing F1. This allows you to set options such as the tools shown, theme, tab sizes, color units and more. Auto-start DevTools When working on a web application, it may be practical to create a dedicated desktop shortcut to launch your browser, open the URL and launch DevTools in a single step. For Chrome, create a desktop icon with the following Chrome command-line options: chrome --auto-open-devtools-for-tabs http://localhost:8000/ where http://localhost:8000/ is your development URL. Similarly for Firefox: firefox -devtools -url http://localhost:8000/ (The executable name may differ across systems.) Go Incognito During Development Incognito/private mode does not retain data such as cookies and localStorage after the browser is closed. The mode is ideal for testing Progressive Web Apps (PWAs) and log-in systems. You can start browsers in incognito mode manually or by adding --incognito to Chrome or -private to Firefox's command line. Command Palette Chrome DevTools offers an editor-like command palette. Press ctrl + shift + p: It provides quick access to most functions and source files (hit backspace to remove the >). Escape to the Console The console is useful regardless of which DevTool panel you're using. Hit Esc to show and hide a console window in the bottom pane. Find Page Colors Most browsers show a color picker when you click any CSS color property. Chrome also shows the colors used in the page at the bottom of the panel: The panel can be clicked to show further colors. Color Contrast Accessibility The color picker also shows the contrast ratio which indicates the visual difference between the foreground text and background color. Click the ratio to view how this rates against AA and AAA accessibility standards which ensure text can be read by most people: Any color below the line on the color swash will pass AA contrast recommendations. The post Browser DevTools Secrets: Start-up, Network and Performance appeared first on SitePoint. Mar 6 Harold Davis New Course: Creative LAB Color in Photoshop Click here to view my course on LinkedIn Learning and here to view my course on Lynda.com. Here’s a preview: The creative power of Lab from Photoshop: Creative Lab Color by Harold Davis Course Description: Explore the tools, techniques, and creative possibilities of Lab Color in Adobe Photoshop. Lab opens new opportunities for photo enhancement […] Mar 6 Premier Developer Walk through Running Traefik on Service Fabric Local Cluster Premier Development Consultant Kurt Schenk provides a walk through to help you get up and running with Traefik on a Service Fabric Local Cluster. In order to help you get up and running quickly to test Træfik and Service Fabric, The post Walk through Running Traefik on Service Fabric Local Cluster appeared first on Premier Developer. Mar 5 Designmodo Celebrate Designmodo’s 8th Birthday with a Donation, Giveaway and Discount! You're reading Celebrate Designmodo’s 8th Birthday with a Donation, Giveaway and Discount!, originally posted on Designmodo. If you've enjoyed this post, be sure to follow on Twitter, Facebook, Google+! Today we turn 8 🥳. We’re proud to have been in business for 8 years, and want to thank you for your contribution to the Designmodo story. Thanks to all! Donation To start this party, we are going to donate our … Mar 5 Digital Photography School How to Edit Silhouette Photos in Lightroom The post How to Edit Silhouette Photos in Lightroom appeared first on Digital Photography School. It was authored by Kunal Malhotra. Clicking silhouette photos is in itself a different kind of experience. Unlike photos where the subject is exposed correctly, here the subject appears completely dark. However, there must be situations when you are not able to capture a proper silhouette image in-camera. The reasons could be anything from incorrect exposure settings to the insufficient dynamic […] The post How to Edit Silhouette Photos in Lightroom appeared first on Digital Photography School. It was authored by Kunal Malhotra. Mar 5 Harold Davis Creative Black & White—Revised and Expanded We’re almost through authoring the second edition of Creative Black & White. It has been revised, substantially expanded, and brought up to date. You can pre-order my new book from Amazon (the official publication date is August 1, 2019). As I note in the Preface to this Second Edition, “Of course, I was flattered to be […] Mar 4 Designmodo Free Absurd Illustrations for Landing Pages You're reading Free Absurd Illustrations for Landing Pages, originally posted on Designmodo. If you've enjoyed this post, be sure to follow on Twitter, Facebook, Google+! Absurd Illustrations that make sense are something completely new when it comes to modern web design. The digital era has its aesthetic standards inspired by perfection and artificial intelligence. On the other hand, Absurd Illustrations provide us with perfect imperfection. … Mar 4 Digital Photography School 5 Ways to Become a Better Photographer this Year The post 5 Ways to Become a Better Photographer this Year appeared first on Digital Photography School. It was authored by Karthika Gupta. Are you looking to improve your photography this year? Perhaps you want to take your skill level up a notch or even get into a business. If you are already in business, perhaps a more lucrative client roster is one of your goals. No matter where you are at, let’s make this year the year […] The post 5 Ways to Become a Better Photographer this Year appeared first on Digital Photography School. It was authored by Karthika Gupta. Mar 4 Premier Developer Classroom Labs with Azure Lab Services Mahendar Madhavaram and Sreedhar Pelluru spotlight the benefits of Classroom Labs with Azure Lab Services. In digital economy, customers are struggling to build and keep the talent pool to develop digital assets to meet their business demands and stay competitive in the market place. The post Classroom Labs with Azure Lab Services appeared first on Premier Developer. Mar 3 Digital Photography School 3 Quick Tips for Achieving Moody Portraits with Natural Light The post 3 Quick Tips for Achieving Moody Portraits with Natural Light appeared first on Digital Photography School. It was authored by Lily Sawyer. If, like me, you are drawn to moody portraits and have been wondering how to take them, read on. Achieving moody portraits with natural light can be quite simple. I hope this takes the mystery our of dark moody portraits in natural light. Before you start, plan your photo shoot first by keeping the following […] The post 3 Quick Tips for Achieving Moody Portraits with Natural Light appeared first on Digital Photography School. It was authored by Lily Sawyer. Mar 3 Digital Photography School Review of the Sigma 28mm f1.4 Art DG HSM for Canon The post Review of the Sigma 28mm f1.4 Art DG HSM for Canon appeared first on Digital Photography School. It was authored by Karthika Gupta. A couple of weeks ago I got my hands on the Sigma 28mm f1.4 Art DG HSM for Canon (also  available for Nikon, and Sony) and got to play with it for a couple of weeks. Let me tell you; it was a tough one to give back. This lens is quite amazing in terms of […] The post Review of the Sigma 28mm f1.4 Art DG HSM for Canon appeared first on Digital Photography School. It was authored by Karthika Gupta. Mar 3 Premier Developer Preserving Date Modified on Files Deployed via Build/Release Pipelines App Dev Manager Patrick King shares some insight into preserving date modified on files deployed via Build/Release pipelines. I was working on a DevOps scenario that involved automating the deployment of batch process files from one server to one or more other servers. The post Preserving Date Modified on Files Deployed via Build/Release Pipelines appeared first on Premier Developer. Mar 2 Digital Photography School What’s The Highest ISO You Can Use? How To Find Out For Yourself The post What’s The Highest ISO You Can Use? How To Find Out For Yourself appeared first on Digital Photography School. It was authored by Peter West Carey. Do you know the limits of your camera’s ISO? By limit, I mean the point at which, egads!, it’s just too much noise. If not, or if you’ve never bothered to figure out your camera’s limits, I have an easy experiment for you to try. Each camera model is different and camera manufacturers are improving […] The post What’s The Highest ISO You Can Use? How To Find Out For Yourself appeared first on Digital Photography School. It was authored by Peter West Carey. Mar 2 Digital Photography School How to Correct Perspective Distortion in Photoshop The post How to Correct Perspective Distortion in Photoshop appeared first on Digital Photography School. It was authored by Ana Mireles. When talking about perspective, you step into a deep and somewhat complicated subject. It has to do with geometry, history of art, viewpoint and so on. However, solving that big issue won’t be the point of this tutorial. Instead, it focuses on solving perspective issues in your photography using photoshop. So keep reading to learn […] The post How to Correct Perspective Distortion in Photoshop appeared first on Digital Photography School. It was authored by Ana Mireles. Mar 2 Digital Photography School Weekly Photography Challenge – Backlighting The post Weekly Photography Challenge – Backlighting appeared first on Digital Photography School. It was authored by Caz Nowaczyk. This week’s photography challenge topic is BACKLIGHTING! Your photos can include anything with backlighting. It could be portraits, street photography, nature, food, objects, silhouettes etc. They can be color, black and white, moody or bright. You get the picture. Have fun, and I look forward to seeing what you come up with!   Some Inst-piration from some […] The post Weekly Photography Challenge – Backlighting appeared first on Digital Photography School. It was authored by Caz Nowaczyk. Mar 1 Premier Developer Calculating server capacity and planning for future user growth App Dev Manager Omer Amin explorers server capacity and growth planning along with key metrics and tools to consider in your roadmap. Do I need to add more servers if my user load grows by 10% each month for the next 12 months? The post Calculating server capacity and planning for future user growth appeared first on Premier Developer. Mar 1 Premier Developer Exploring Feature Weights using R and Azure Machine Learning Studio In this post, Senior App Dev Manager Randy Park performs an exploratory data analysis using R and Azure Machine Learning Studio. Suppose we have to design a black box which will display a “thumbs up” or “thumbs down” depending on hundreds of different combinations of inputs, The post Exploring Feature Weights using R and Azure Machine Learning Studio appeared first on Premier Developer. Mar 1 SitePoint SitePoint Premium New Releases: More Vue, Nuxt.js + JS Data Structures We're working hard to keep you on the cutting edge of your field with SitePoint Premium. We've got plenty of new books and mini-books to check out in the library — let us introduce you to them. Learning JavaScript Data Structures and Algorithms Third Edition - Packt Create classic data structures and algorithms such as depth-first and breadth-first search. You'll also learn about recursion, heap data structures using JavaScript, how to implement common data structures and more. Read Learning JavaScript Data Structures and Algorithms Third Edition. A Beginner’s Guide to Working With Components in Vue An introduction to working with components in Vue. We'll look at how to create components, how to pass data between components (via both props and an event bus) and how to use Vue’s <slot> element to render additional content within a component. Read A Beginner’s Guide to Working With Components in Vue. A Beginner’s Guide to Working with Forms in Vue Learn how to work with forms in Vue. We’ll start off by creating a simple form and look at how to use two-way data binding to keep user input in sync with our data model. We’ll then take a look at modifiers and filters, and finish off with validation. Each section has a runnable CodePen demo. Read A Beginner’s Guide to Working with Forms in Vue. Build Your Own Link-sharing Site with Nuxt.js and vue-kindergarten In this tutorial, we’ll create our own link-sharing news site, much like Echo JS or Hacker News, complete with comments and upvoting. The tech stack we’ll be using consists of Vue.js, the Nuxt.js Vue framework, and an access-control/authorization library called vue-kindergarten. Read Build Your Own Link-sharing Site with Nuxt.js and vue-kindergarten. And More to Come… We're releasing new content on SitePoint Premium almost every day, so we'll be back next week with the latest updates. And don't forget: if you haven't checked out our offering yet, take our 7 day free trial for a spin. The post SitePoint Premium New Releases: More Vue, Nuxt.js + JS Data Structures appeared first on SitePoint. Mar 1 SitePoint Working with Design Thinking, Lean and Agile Design Thinking is the latest buzz phrase to have taken over the business and technology world. In seems like the phrase is popping up in nearly every context. A few years ago, Lean UX was all the rage, following a few years focused on the Lean Startup. A few years before that, every tech company I knew was rushing to implement Agile development processes. Experts like Lou Rosenfeld are already making predictions about what new approaches are coming next. It’s not that any of these approaches have become less useful over time, but people are experimenting with new ways to build products and successful techniques to get attached to as “The Next Big Thing” that will prove to be a magical solution for everyone. The problem is that in the excitement of discussing something new, we don’t always connect the dots of our existing methods and people can be left confused as to how to best implement things all together. Read on to better understand Design Thinking, Lean UX, and Agile, and how to implement elements of each for your team. Before we get too far, let’s take a step back to understand each approach. Agile Let’s be clear: Agile is a software development approach. It was born out of frustration with traditional “waterfall” software practices, with a long period of upfront requirements gathering and design work, then a long development stage of implementing said designs but without the ability to understand or respond to changing needs. The outcome was that teams were spending a long time building things that people didn’t really want or need, and companies were struggling. Software developers started experimenting with new ways to build, and came up with a set of shared values and principles to guide teams to do better work. The official Agile Manifesto was released in 2001, and called for valuing: individuals and interactions over processes and tools working software over comprehensive documentation customer collaboration over contract negotiation responding to change over following a plan The Agile Alliance has also defined 12 detailed principles to follow, but does not prescribe any particular processes, so dev teams often end up using specific frameworks, like Scrum or Kanban, to help them figure out how to organize, plan, and execute their work. There’s a strong focus on teams’ independence to self organize, so no two Agile teams look the same, even within the same departments or organizations. In theory, Agile approaches not only play well with UX practices, but actively require ongoing UX research to constantly understand the changing needs of the customers. However, in practice, teams can get caught up on trying to release more working code faster, and it can be hard to dedicate any time at all to conducting research or focusing on design decisions. Agile teams often struggle with how to best incorporate UX team members and their work into their practices. Lean UX Lean UX was born out of the struggle that so many teams had incorporating UX best practices as they adjusted their development processes to Agile methods and attempted to speed up time from idea to implementation. Lean UX is the umbrella term for altering traditional UX methods to fit faster timeframes, which often means shifting focus away from detailed deliverables. But beware: you may also hear about Lean and Lean Startup, which often get conflated but do have specific meanings and distinct elements. Lean is derived from manufacturing best practices and focuses on general business and management practices to reduce waste and maximize value. Lean Startup is a broader business and product development approach that suggests incorporating periods of experimentation in order to reduce waste and risk. The terms aren’t mutually exclusive but nor are they interchangeable. Back to Lean UX: the core idea is to alter traditional UX design methods to become faster. Rather than spending a lot of time thoroughly designing and documenting each element, the team is meant to quickly and collaboratively visualize ideas and gather feedback as soon as possible, from both other team members and stakeholders and the users. Jeff Gothelf lays out the following Lean UX process: concept, prototype, internal validation, external validation, learn, iterate, and repeat. This process mirrors the “regular” UX process but each step is shortened. Let’s say a team is working on integrating a new feature. The team might first have a quick whiteboarding session to flesh out the core workflow. Once the group agrees on a direction, they can show a low-fidelity design to users and incorporate the feedback found during a joint sketch session where they sort out more interaction details. You’ll notice this example doesn’t have any fully functional prototypes or detailed test reports, but Lean UX isn’t an excuse to skip steps. Rather, it’s an invitation to do just enough to build a shared vision and get feedback, scaling up and back different tools or methods as it makes the most sense for your specific context. Lean UX also doesn’t suggest you completely abandon documentation, nor that the experience decisions are taken away from UX professionals. Rather, it suggests that the whole team is involved with the design process so there are no surprises or unforeseen technical challenges. Feedback is collected early and often, and if changes need to be made, they can be done quickly and easily before much time has been invested in final designs. The post Working with Design Thinking, Lean and Agile appeared first on SitePoint. Feb 28 Digital Photography School How to Use Photoshop to Resize and Sharpen Images for the Web The post How to Use Photoshop to Resize and Sharpen Images for the Web appeared first on Digital Photography School. It was authored by Peter Dam. Do you struggle with getting your images to look super sharp when you use them online? Do they even look blurry? No matter if you share your images on social media platforms or photo sharing sites like Flicker and 500px, you want your images to look as sharp as possible. Most photographers come across web […] The post How to Use Photoshop to Resize and Sharpen Images for the Web appeared first on Digital Photography School. It was authored by Peter Dam. Feb 28 UX Movement Optimal Size and Spacing for Mobile Buttons Tap, tap, tap! Are users able to hit your mobile buttons with high touch accuracy, or are they missing their target? Before you blame the user, check the size and spacing of your buttons. Feb 28