mp How Important Is A Domain Name For Your Business? By icanbecreative.com Published On :: Tue, 10 Mar 2020 16:41:03 PDT Online representation has a crucial role in planning a business. Today, people turn to the internet whenever they need help, but especially when they want to find certain products or specific... Full Article Business
mp The Best Way To Improve Your Business Skills By icanbecreative.com Published On :: Mon, 16 Mar 2020 08:40:10 PDT Are you thinking about running a business after getting a degree? This article will help you find the best ways to make your business skills more efficient and useful. The Best Way To Improve Your... Full Article Business
mp Loosening the Caregiver's Grip By feedproxy.google.com Published On :: Monday, June 11, 2018 - 12:47pm It happens slowly, like that metaphorical frog you’ve heard about. Possessiveness and controlling behavior in TBI caregivers is something that creeps up on you, and I suspect it is common — not because people are trying to be annoying, but because they care so much and want to see that their loved one is treated well in every respect. Full Article
mp Never Stop Asking 'What If?' By feedproxy.google.com Published On :: Monday, July 16, 2018 - 6:26am We imagine the what-ifs as a worst case scenario, our worst nightmare happening to us, our life falling apart. But here’s another way of looking at it. Full Article
mp Comparing Covid-19 models By flowingdata.com Published On :: Tue, 05 May 2020 07:44:30 +0000 FiveThirtyEight compared six Covid-19 models for a sense of where we might be…Tags: coronavirus, FiveThirtyEight, modeling Full Article Statistics coronavirus FiveThirtyEight modeling
mp Concurrency & Multithreading in iOS By feedproxy.google.com Published On :: Tue, 25 Feb 2020 08:00:00 -0500 Concurrency is the notion of multiple things happening at the same time. This is generally achieved either via time-slicing, or truly in parallel if multiple CPU cores are available to the host operating system. We've all experienced a lack of concurrency, most likely in the form of an app freezing up when running a heavy task. UI freezes don't necessarily occur due to the absence of concurrency — they could just be symptoms of buggy software — but software that doesn't take advantage of all the computational power at its disposal is going to create these freezes whenever it needs to do something resource-intensive. If you've profiled an app hanging in this way, you'll probably see a report that looks like this: Anything related to file I/O, data processing, or networking usually warrants a background task (unless you have a very compelling excuse to halt the entire program). There aren't many reasons that these tasks should block your user from interacting with the rest of your application. Consider how much better the user experience of your app could be if instead, the profiler reported something like this: Analyzing an image, processing a document or a piece of audio, or writing a sizeable chunk of data to disk are examples of tasks that could benefit greatly from being delegated to background threads. Let's dig into how we can enforce such behavior into our iOS applications. A Brief History In the olden days, the maximum amount of work per CPU cycle that a computer could perform was determined by the clock speed. As processor designs became more compact, heat and physical constraints started becoming limiting factors for higher clock speeds. Consequentially, chip manufacturers started adding additional processor cores on each chip in order to increase total performance. By increasing the number of cores, a single chip could execute more CPU instructions per cycle without increasing its speed, size, or thermal output. There's just one problem... How can we take advantage of these extra cores? Multithreading. Multithreading is an implementation handled by the host operating system to allow the creation and usage of n amount of threads. Its main purpose is to provide simultaneous execution of two or more parts of a program to utilize all available CPU time. Multithreading is a powerful technique to have in a programmer's toolbelt, but it comes with its own set of responsibilities. A common misconception is that multithreading requires a multi-core processor, but this isn't the case — single-core CPUs are perfectly capable of working on many threads, but we'll take a look in a bit as to why threading is a problem in the first place. Before we dive in, let's look at the nuances of what concurrency and parallelism mean using a simple diagram: In the first situation presented above, we observe that tasks can run concurrently, but not in parallel. This is similar to having multiple conversations in a chatroom, and interleaving (context-switching) between them, but never truly conversing with two people at the same time. This is what we call concurrency. It is the illusion of multiple things happening at the same time when in reality, they're switching very quickly. Concurrency is about dealing with lots of things at the same time. Contrast this with the parallelism model, in which both tasks run simultaneously. Both execution models exhibit multithreading, which is the involvement of multiple threads working towards one common goal. Multithreading is a generalized technique for introducing a combination of concurrency and parallelism into your program. The Burden of Threads A modern multitasking operating system like iOS has hundreds of programs (or processes) running at any given moment. However, most of these programs are either system daemons or background processes that have very low memory footprint, so what is really needed is a way for individual applications to make use of the extra cores available. An application (process) can have many threads (sub-processes) operating on shared memory. Our goal is to be able to control these threads and use them to our advantage. Historically, introducing concurrency to an app has required the creation of one or more threads. Threads are low-level constructs that need to be managed manually. A quick skim through Apple's Threaded Programming Guide is all it takes to see how much complexity threaded code adds to a codebase. In addition to building an app, the developer has to: Responsibly create new threads, adjusting that number dynamically as system conditions change Manage them carefully, deallocating them from memory once they have finished executing Leverage synchronization mechanisms like mutexes, locks, and semaphores to orchestrate resource access between threads, adding even more overhead to application code Mitigate risks associated with coding an application that assumes most of the costs associated with creating and maintaining any threads it uses, and not the host OS This is unfortunate, as it adds enormous levels of complexity and risk without any guarantees of improved performance. Grand Central Dispatch iOS takes an asynchronous approach to solving the concurrency problem of managing threads. Asynchronous functions are common in most programming environments, and are often used to initiate tasks that might take a long time, like reading a file from the disk, or downloading a file from the web. When invoked, an asynchronous function executes some work behind the scenes to start a background task, but returns immediately, regardless of how long the original task might takes to actually complete. A core technology that iOS provides for starting tasks asynchronously is Grand Central Dispatch (or GCD for short). GCD abstracts away thread management code and moves it down to the system level, exposing a light API to define tasks and execute them on an appropriate dispatch queue. GCD takes care of all thread management and scheduling, providing a holistic approach to task management and execution, while also providing better efficiency than traditional threads. Let's take a look at the main components of GCD: What've we got here? Let's start from the left: DispatchQueue.main: The main thread, or the UI thread, is backed by a single serial queue. All tasks are executed in succession, so it is guaranteed that the order of execution is preserved. It is crucial that you ensure all UI updates are designated to this queue, and that you never run any blocking tasks on it. We want to ensure that the app's run loop (called CFRunLoop) is never blocked in order to maintain the highest framerate. Subsequently, the main queue has the highest priority, and any tasks pushed onto this queue will get executed immediately. DispatchQueue.global: A set of global concurrent queues, each of which manage their own pool of threads. Depending on the priority of your task, you can specify which specific queue to execute your task on, although you should resort to using default most of the time. Because tasks on these queues are executed concurrently, it doesn't guarantee preservation of the order in which tasks were queued. Notice how we're not dealing with individual threads anymore? We're dealing with queues which manage a pool of threads internally, and you will shortly see why queues are a much more sustainable approach to multhreading. Serial Queues: The Main Thread As an exercise, let's look at a snippet of code below, which gets fired when the user presses a button in the app. The expensive compute function can be anything. Let's pretend it is post-processing an image stored on the device. import UIKit class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { compute() } private func compute() -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } At first glance, this may look harmless, but if you run this inside of a real app, the UI will freeze completely until the loop is terminated, which will take... a while. We can prove it by profiling this task in Instruments. You can fire up the Time Profiler module of Instruments by going to Xcode > Open Developer Tool > Instruments in Xcode's menu options. Let's look at the Threads module of the profiler and see where the CPU usage is highest. We can see that the Main Thread is clearly at 100% capacity for almost 5 seconds. That's a non-trivial amount of time to block the UI. Looking at the call tree below the chart, we can see that the Main Thread is at 99.9% capacity for 4.43 seconds! Given that a serial queue works in a FIFO manner, tasks will always complete in the order in which they were inserted. Clearly the compute() method is the culprit here. Can you imagine clicking a button just to have the UI freeze up on you for that long? Background Threads How can we make this better? DispatchQueue.global() to the rescue! This is where background threads come in. Referring to the GCD architecture diagram above, we can see that anything that is not the Main Thread is a background thread in iOS. They can run alongside the Main Thread, leaving it fully unoccupied and ready to handle other UI events like scrolling, responding to user events, animating etc. Let's make a small change to our button click handler above: class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { DispatchQueue.global(qos: .userInitiated).async { [unowned self] in self.compute() } } private func compute() -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } Unless specified, a snippet of code will usually default to execute on the Main Queue, so in order to force it to execute on a different thread, we'll wrap our compute call inside of an asynchronous closure that gets submitted to the DispatchQueue.global queue. Keep in mind that we aren't really managing threads here. We're submitting tasks (in the form of closures or blocks) to the desired queue with the assumption that it is guaranteed to execute at some point in time. The queue decides which thread to allocate the task to, and it does all the hard work of assessing system requirements and managing the actual threads. This is the magic of Grand Central Dispatch. As the old adage goes, you can't improve what you can't measure. So we measured our truly terrible button click handler, and now that we've improved it, we'll measure it once again to get some concrete data with regards to performance. Looking at the profiler again, it's quite clear to us that this is a huge improvement. The task takes an identical amount of time, but this time, it's happening in the background without locking up the UI. Even though our app is doing the same amount of work, the perceived performance is much better because the user will be free to do other things while the app is processing. You may have noticed that we accessed a global queue of .userInitiated priority. This is an attribute we can use to give our tasks a sense of urgency. If we run the same task on a global queue of and pass it a qos attribute of background , iOS will think it's a utility task, and thus allocate fewer resources to execute it. So, while we don't have control over when our tasks get executed, we do have control over their priority. A Note on Main Thread vs. Main Queue You might be wondering why the Profiler shows "Main Thread" and why we're referring to it as the "Main Queue". If you refer back to the GCD architecture we described above, the Main Queue is solely responsible for managing the Main Thread. The Dispatch Queues section in the Concurrency Programming Guide says that "the main dispatch queue is a globally available serial queue that executes tasks on the application’s main thread. Because it runs on your application’s main thread, the main queue is often used as a key synchronization point for an application." The terms "execute on the Main Thread" and "execute on the Main Queue" can be used interchangeably. Concurrent Queues So far, our tasks have been executed exclusively in a serial manner. DispatchQueue.main is by default a serial queue, and DispatchQueue.global gives you four concurrent dispatch queues depending on the priority parameter you pass in. Let's say we want to take five images, and have our app process them all in parallel on background threads. How would we go about doing that? We can spin up a custom concurrent queue with an identifier of our choosing, and allocate those tasks there. All that's required is the .concurrent attribute during the construction of the queue. class ViewController: UIViewController { let queue = DispatchQueue(label: "com.app.concurrentQueue", attributes: .concurrent) let images: [UIImage] = [UIImage].init(repeating: UIImage(), count: 5) @IBAction func handleTap(_ sender: Any) { for img in images { queue.async { [unowned self] in self.compute(img) } } } private func compute(_ img: UIImage) -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } Running that through the profiler, we can see that the app is now spinning up 5 discrete threads to parallelize a for-loop. Parallelization of N Tasks So far, we've looked at pushing computationally expensive task(s) onto background threads without clogging up the UI thread. But what about executing parallel tasks with some restrictions? How can Spotify download multiple songs in parallel, while limiting the maximum number up to 3? We can go about this in a few ways, but this is a good time to explore another important construct in multithreaded programming: semaphores. Semaphores are signaling mechanisms. They are commonly used to control access to a shared resource. Imagine a scenario where a thread can lock access to a certain section of the code while it executes it, and unlocks after it's done to let other threads execute the said section of the code. You would see this type of behavior in database writes and reads, for example. What if you want only one thread writing to a database and preventing any reads during that time? This is a common concern in thread-safety called Readers-writer lock. Semaphores can be used to control concurrency in our app by allowing us to lock n number of threads. let kMaxConcurrent = 3 // Or 1 if you want strictly ordered downloads! let semaphore = DispatchSemaphore(value: kMaxConcurrent) let downloadQueue = DispatchQueue(label: "com.app.downloadQueue", attributes: .concurrent) class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { for i in 0..<15 { downloadQueue.async { [unowned self] in // Lock shared resource access semaphore.wait() // Expensive task self.download(i + 1) // Update the UI on the main thread, always! DispatchQueue.main.async { tableView.reloadData() // Release the lock semaphore.signal() } } } } func download(_ songId: Int) -> Void { var counter = 0 // Simulate semi-random download times. for _ in 0..<Int.random(in: 999999...10000000) { counter += songId } } } Notice how we've effectively restricted our download system to limit itself to k number of downloads. The moment one download finishes (or thread is done executing), it decrements the semaphore, allowing the managing queue to spawn another thread and start downloading another song. You can apply a similar pattern to database transactions when dealing with concurrent reads and writes. Semaphores usually aren't necessary for code like the one in our example, but they become more powerful when you need to enforce synchronous behavior whille consuming an asynchronous API. The above could would work just as well with a custom NSOperationQueue with a maxConcurrentOperationCount, but it's a worthwhile tangent regardless. Finer Control with OperationQueue GCD is great when you want to dispatch one-off tasks or closures into a queue in a 'set-it-and-forget-it' fashion, and it provides a very lightweight way of doing so. But what if we want to create a repeatable, structured, long-running task that produces associated state or data? And what if we want to model this chain of operations such that they can be cancelled, suspended and tracked, while still working with a closure-friendly API? Imagine an operation like this: This would be quite cumbersome to achieve with GCD. We want a more modular way of defining a group of tasks while maintaining readability and also exposing a greater amount of control. In this case, we can use Operation objects and queue them onto an OperationQueue, which is a high-level wrapper around DispatchQueue. Let's look at some of the benefits of using these abstractions and what they offer in comparison to the lower-level GCI API: You may want to create dependencies between tasks, and while you could do this via GCD, you're better off defining them concretely as Operation objects, or units of work, and pushing them onto your own queue. This would allow for maximum reusability since you may use the same pattern elsewhere in an application. The Operation and OperationQueue classes have a number of properties that can be observed, using KVO (Key Value Observing). This is another important benefit if you want to monitor the state of an operation or operation queue. Operations can be paused, resumed, and cancelled. Once you dispatch a task using Grand Central Dispatch, you no longer have control or insight into the execution of that task. The Operation API is more flexible in that respect, giving the developer control over the operation's life cycle. OperationQueue allows you to specify the maximum number of queued operations that can run simultaneously, giving you a finer degree of control over the concurrency aspects. The usage of Operation and OperationQueue could fill an entire blog post, but let's look at a quick example of what modeling dependencies looks like. (GCD can also create dependencies, but you're better off dividing up large tasks into a series of composable sub-tasks.) In order to create a chain of operations that depend on one another, we could do something like this: class ViewController: UIViewController { var queue = OperationQueue() var rawImage = UIImage? = nil let imageUrl = URL(string: "https://example.com/portrait.jpg")! @IBOutlet weak var imageView: UIImageView! let downloadOperation = BlockOperation { let image = Downloader.downloadImageWithURL(url: imageUrl) OperationQueue.main.async { self.rawImage = image } } let filterOperation = BlockOperation { let filteredImage = ImgProcessor.addGaussianBlur(self.rawImage) OperationQueue.main.async { self.imageView = filteredImage } } filterOperation.addDependency(downloadOperation) [downloadOperation, filterOperation].forEach { queue.addOperation($0) } } So why not opt for a higher level abstraction and avoid using GCD entirely? While GCD is ideal for inline asynchronous processing, Operation provides a more comprehensive, object-oriented model of computation for encapsulating all of the data around structured, repeatable tasks in an application. Developers should use the highest level of abstraction possible for any given problem, and for scheduling consistent, repeated work, that abstraction is Operation. Other times, it makes more sense to sprinkle in some GCD for one-off tasks or closures that we want to fire. We can mix both OperationQueue and GCD to get the best of both worlds. The Cost of Concurrency DispatchQueue and friends are meant to make it easier for the application developer to execute code concurrently. However, these technologies do not guarantee improvements to the efficiency or responsiveness in an application. It is up to you to use queues in a manner that is both effective and does not impose an undue burden on other resources. For example, it's totally viable to create 10,000 tasks and submit them to a queue, but doing so would allocate a nontrivial amount of memory and introduce a lot of overhead for the allocation and deallocation of operation blocks. This is the opposite of what you want! It's best to profile your app thoroughly to ensure that concurrency is enhancing your app's performance and not degrading it. We've talked about how concurrency comes at a cost in terms of complexity and allocation of system resources, but introducing concurrency also brings a host of other risks like: Deadlock: A situation where a thread locks a critical portion of the code and can halt the application's run loop entirely. In the context of GCD, you should be very careful when using the dispatchQueue.sync { } calls as you could easily get yourself in situations where two synchronous operations can get stuck waiting for each other. Priority Inversion: A condition where a lower priority task blocks a high priority task from executing, which effectively inverts their priorities. GCD allows for different levels of priority on its background queues, so this is quite easily a possibility. Producer-Consumer Problem: A race condition where one thread is creating a data resource while another thread is accessing it. This is a synchronization problem, and can be solved using locks, semaphores, serial queues, or a barrier dispatch if you're using concurrent queues in GCD. ...and many other sorts of locking and data-race conditions that are hard to debug! Thread safety is of the utmost concern when dealing with concurrency. Parting Thoughts + Further Reading If you've made it this far, I applaud you. Hopefully this article gives you a lay of the land when it comes to multithreading techniques on iOS, and how you can use some of them in your app. We didn't get to cover many of the lower-level constructs like locks, mutexes and how they help us achieve synchronization, nor did we get to dive into concrete examples of how concurrency can hurt your app. We'll save those for another day, but you can dig into some additional reading and videos if you're eager to dive deeper. Building Concurrent User Interfaces on iOS (WWDC 2012) Concurrency and Parallelism: Understanding I/O Apple's Official Concurrency Programming Guide Mutexes and Closure Capture in Swift Locks, Thread Safety, and Swift Advanced NSOperations (WWDC 2015) NSHipster: NSOperation Full Article Code
mp CLI Equivalents for Common MAMP PRO and Sequel Pro Tasks By feedproxy.google.com Published On :: Thu, 26 Mar 2020 00:00:00 -0400 Working on website front ends I sometimes use MAMP PRO to manage local hosts and Sequel Pro to manage databases. Living primarily in my text editor, a terminal, and a browser window, moving to these click-heavy dedicated apps can feel clunky. Happily, the tasks I have most frequently turned to those apps for —starting and stopping servers, creating new hosts, and importing, exporting, deleting, and creating databases— can be done from the command line. I still pull up MAMP PRO if I need to change a host's PHP version or work with its other more specialized settings, or Sequel Pro to quickly inspect a database, but for the most part I can stay on the keyboard and in my terminal. Here's how: Command Line MAMP PRO You can start and stop MAMP PRO's servers from the command line. You can even do this when the MAMP PRO desktop app isn't open. Note: MAMP PRO's menu icon will not change color to reflect the running/stopped status when the status is changed via the command line. Start the MAMP PRO servers: /Applications/MAMP PRO.app/Contents/MacOS/MAMP PRO cmd startServers Stop the MAMP PRO servers: /Applications/MAMP PRO.app/Contents/MacOS/MAMP PRO cmd stopServers Create a host (replace host_name and root_path): /Applications/MAMP PRO.app/Contents/MacOS/MAMP PRO cmd createHost host_name root_path MAMP PRO-friendly Command Line Sequel Pro Note: if you don't use MAMP PRO, just replace the /Applications/MAMP/Library/bin/mysql with mysql. In all of the following commands, replace username with your user name (locally this is likely root) and database_name with your database name. The -p (password) flag with no argument will trigger an interactive password prompt. This is more secure than including your password in the command itself (like -pYourPasswordHere). Of course, if you're using the default password root is not particular secure to begin with so you might just do -pYourPasswordHere. Setting the -h (host) flag to localhost or 127.0.0.1 tells mysql to look at what's on localhost. With the MAMP PRO servers running, that will be the MAMP PRO databases. # with the MAMP PRO servers running, these are equivalent: # /Applications/MAMP/Library/bin/mysql -h 127.0.0.1 other_options # and # /Applications/MAMP/Library/bin/mysql -h localhost other_options /Applications/MAMP/Library/bin/mysql mysql_options # enter. opens an interactive mysql session mysql> some command; # don't forget the semicolon mysql> exit; Create a local database # with the MAMP PRO servers running # replace `username` with your username, which is `root` by default /Applications/MAMP/Library/bin/mysql -h localhost -u username -p -e "create database database_name" or # with the MAMP PRO servers running # replace `username` (`root` by default) and `database_name` /Applications/MAMP/Library/bin/mysql -h localhost -u username -p # and then enter mysql> create database database_name; # don't forget the semicolon mysql> exit MAMP PRO's databases are stored in /Library/Application Support/appsolute/MAMP PRO/db so to confirm that it worked you can ls /Library/Application Support/appsolute/MAMP PRO/db # will output the available mysql versions. For example I have mysql56_2018-11-05_16-25-13 mysql57 # If it isn't clear which one you're after, open the main MAMP PRO and click # on the MySQL "servers and services" item. In my case it shows "Version: 5.7.26" # Now look in the relevant MySQL directory ls /Library/Application Support/appsolute/MAMP PRO/db/mysql57 # the newly created database should be in the list Delete a local database # with the MAMP PRO servers running # replace `username` (`root` by default) and `database_name` /Applications/MAMP/Library/bin/mysql -h localhost -u username -p -e "drop database database_name" Export a dump of a local database. Note that this uses mysqldump not mysql. # to export an uncompressed file # replace `username` (`root` by default) and `database_name` /Applications/MAMP/Library/bin/mysqldump -h localhost -u username -p database_name > the/output/path.sql # to export a compressed file # replace `username` (`root` by default) and `database_name` /Applications/MAMP/Library/bin/mysqldump -h localhost -u username -p database_name | gzip -c > the/output/path.gz Export a local dump from an external database over SSH. Note that this uses mysqldump not mysql. # replace `ssh-user`, `ssh_host`, `mysql_user`, `database_name`, and the output path # to end up with an uncompressed file ssh ssh_user@ssh_host "mysqldump -u mysql_user -p database_name | gzip -c" | gunzip > the/output/path.sql # to end up with a compressed file ssh ssh_user@ssh_host "mysqldump -u mysql_user -p database_name | gzip -c" > the/output/path.gz Import a local database dump into a local database # with the MAMP PRO servers running # replace `username` (`root` by default) and `database_name` /Applications/MAMP/Library/bin/mysql -h localhost -u username -p database_name < the/dump/path.sql Import a local database dump into a remote database over SSH. Use care with this one. But if you are doing it with Sequel Pro —maybe you are copying a Craft site's database from a production server to a QA server— you might as well be able to do it on the command line. ssh ssh_user@ssh_host "mysql -u username -p remote_database_name" < the/local/dump/path.sql For me, using the command line instead of the MAMP PRO and Sequel Pro GUI means less switching between keyboard and mouse, less opening up GUI features that aren't typically visible on my screen, and generally better DX. Give it a try! And while MAMP Pro's CLI is limited to the essentials, command line mysql of course knows no limits. If there's something else you use Sequel Pro for, you may be able to come up with a mysql CLI equivalent you like even better. Full Article Code Front-end Engineering Back-end Engineering
mp "I always hated that word—marketing—and I hate it now. Because for me, and this may sound simplistic,..." By feedproxy.google.com Published On :: Sat, 08 Oct 2011 20:20:00 -0700 ““I always hated that word—marketing—and I hate it now. Because for me, and this may sound simplistic, the key to marketing is to make something people want. When they want it, they buy it. When they buy it, you have sales. So the product has to speak. The product is what markets things.”” - Interview with Tom Ford. Full Article tom ford
mp "What is deceptive, especially in the West, is our assumption that repetitive and mindless jobs are..." By feedproxy.google.com Published On :: Wed, 12 Oct 2011 12:30:00 -0700 “What is deceptive, especially in the West, is our assumption that repetitive and mindless jobs are dehumanizing. On the other hand, the jobs that require us to use the abilities that are uniquely human, we assume to be humanizing. This is not necessarily true. The determining factor is not so much the nature of our jobs, but for whom they serve. ‘Burnout’ is a result of consuming yourself for something other than yourself. You could be burnt out for an abstract concept, ideal, or even nothing (predicament). You end up burning yourself as fuel for something or someone else. This is what feels dehumanizing. In repetitive physical jobs, you could burn out your body for something other than yourself. In creative jobs, you could burn out your soul. Either way, it would be dehumanizing. Completely mindless jobs and incessantly mindful jobs could both be harmful to us.” - Dsyke Suematsu from his white paper discussed at Why Ad People Burn Out. Full Article Dsyke Suematsu
mp "In conceptual art the idea or concept is the most important aspect of the work. When an artist uses..." By feedproxy.google.com Published On :: Fri, 28 Oct 2011 12:13:00 -0700 “In conceptual art the idea or concept is the most important aspect of the work. When an artist uses a conceptual form of art, it means that all of the planning and decisions are made beforehand and the execution is a perfunctory affair. The idea becomes a machine that makes the art. This kind of art is not theoretical or illustrative of theories; it is intuitive, it is involved with all types of mental processes and it is purposeless. It is usually free from the dependence on the skill of the artist as a craftsman.” - Artist Sol Lewitt on conceptual art. Full Article
mp Illustrator Tutorial: How to Create a Simple Computer Icon By feedproxy.google.com Published On :: Fri, 12 Apr 2019 14:50:36 +0000 In today’s tutorial, we're going to take a close look behind the process of creating a simple computer icon, and see how easy it is to build one of our one using nothing more than some basic geometric shapes. 1. Set Up a New Project File As with any new project, we’re going to kick […] The post Illustrator Tutorial: How to Create a Simple Computer Icon appeared first on Bittbox. Full Article How To Illustrator adobe illustrator computer icon Featured flat icon icon Vector vector icon
mp A simple random bit on var selector By feedproxy.google.com Published On :: Wed, 10 Aug 2011 00:26:21 +0000 Isobar’s Rob Larsen suggests that there is often a need to build CSS selectors dynamically when building applications. ”This is typically some existing pattern paired with a loop counter or something pulled from a data attribute,” he writes on his blog. His choice is to create a variable called ”selector” and ”to craft the selector Read the rest... Full Article CSS Front Page jQuery
mp 10 Exciting Examples of the Beaver Builder Plugin in Use By wphacks.com Published On :: Mon, 03 Feb 2020 08:00:00 +0000 Building a stunning website is a tough job. Even if you have some basic understanding of things like code and […] The post 10 Exciting Examples of the Beaver Builder Plugin in Use appeared first on WPHacks. Full Article Plugins beaver builder plugin web design
mp 5 Key Components of a Highly Converting Landing Page By wphacks.com Published On :: Wed, 05 Feb 2020 08:00:00 +0000 A landing page can be the difference between having a strong conversion rate and a bad one. After putting a […] The post 5 Key Components of a Highly Converting Landing Page appeared first on WPHacks. Full Article Beginners Guide boost conversions email list building landing page
mp 40 Beautiful WordPress Divi Theme Examples That Will Wow You By wphacks.com Published On :: Tue, 11 Feb 2020 00:43:00 +0000 Are you looking for a new WordPress theme? The Divi Theme, by Elegant Themes, is easily one of the most […] The post 40 Beautiful WordPress Divi Theme Examples That Will Wow You appeared first on WPHacks. Full Article Themes divi theme elegant themes
mp 40 Examples of Sites Using WooCommerce By wphacks.com Published On :: Tue, 18 Feb 2020 08:00:00 +0000 Are you on the hunt for the ideal eCommerce solution? There are plenty of tools on the market today that […] The post 40 Examples of Sites Using WooCommerce appeared first on WPHacks. Full Article Plugins online store woocommerce
mp 40 Examples of Sites Using the Total Theme By wphacks.com Published On :: Wed, 04 Mar 2020 08:00:00 +0000 Choosing the ultimate theme for your WordPress site is easier said than done. You need something easy to use, attractive, […] The post 40 Examples of Sites Using the Total Theme appeared first on WPHacks. Full Article Themes total theme wordpress website
mp WPCampus 2019 WP Rig Workshop By feedproxy.google.com Published On :: Mon, 29 Jul 2019 17:24:52 +0000 This post contains the slides for and links to all the things you need to follow my WP Rig workshop at WP Campus 2019, including a couple of verbose code examples for complex walk-throughs. WP Rig itself: WP Rig WP Rig Wiki Free LinkedIn Learning course on WP Rig VS Code extensions EditorConfig ESLint PHP […] The post WPCampus 2019 WP Rig Workshop appeared first on MOR10. Full Article Events WP Rig
mp Star Wars Size Comparison Video By feedproxy.google.com Published On :: Tue, 22 Oct 2019 16:18:37 +0000 The galaxy far far away has items both big and small. The Star Wars Size Comparison Video created by MetaBallStudios brings droids, people and planets together from the Star Wars movies (episode I to VIII, Rogue One and Solo). See how your favorites size up against each other.Comparison of many things from the Star Wars movies. Only movies from episode I to VIII, Rogue One and Solo. Obviously not everything appears, only the most representative.Providing scale and context to your audience is one of the key tenets of data visualization, and this video does a fantastic job of giving you the context of the size of everything in the Star Wars universe.Found on Gizmodo.com. Full Article
mp The Chart Guide v4.0 - Interview & Giveaway By feedproxy.google.com Published On :: Fri, 08 Nov 2019 19:33:45 +0000 Michiel Dullaert, data visualization expert and trainer from the Netherlands, has updated his Chart Guide poster to version 4! A free PDF is available for download from his website, and introduces a new category, 19 new charts and 4 extra design tips. You can also purchase a full-size printed poster version.As the November 2019 Giveaway, I have a pair of Chart Guide posters, that will be shipped to one lucky winner. That way you get one for yourself, and one you can give to a friend or coworker.Register HERE by November 30, 2019 at 11:59pm CT, and the winner will be randomly chosen on December 1st!This poster shows 84 charts to choose from and includes 16 chart design tips to help you make the Perfect Chart. The poster is available as a big poster or you can download the PDF file for free. Let this ChartGuide poster help you choose and design your Perfect Chart.You can see his complete write-up about the new version HERE. I was able to ask Michiel a few interview questions about developing the posters:Cool Infographics: What’s your background and how did you get into visualizing data?Michiel Dullaert: Years ago I have been working in the boardgame and puzzle industry. Part of my work was discovering new boardgames and puzzles and introduce them to the market. I was working for two different companies, both at the time that a new product of theirs really changed the market. For the boardgame industry I worked for the company that introduced a new type of boardgame (the game of Catan) that made playing boardgames a popular hobby. After that, I worked for a company that created puzzle magazines at the time the Sudoku puzzles was introduced. And here the same happened again, a new type of puzzle that changed the way people would puzzle and talk about puzzles. Both were very nice jobs, with a lot of enthusiastic conversations with customers about new products.In both companies I was working in the product development. I always had a large personal interest in the data behind the products. So it felt logic to do more with data, and I changed careers. I started working for a large company as an analyst. And it was not long that I found out that my colleagues were not interested in my reports. Although the reports contained interesting information it was shown in large tables and busy charts. People seemed to be not interested and if the looked into the numbers, they did not seem to understand them. My work did not seem to matter. The contrast between my previous jobs and the work as an analyst could not have been bigger. At that time I decided I would try to find a way to make people as enthusiastic about data as they were about boardgames and Sudoku puzzles. The first step was reading books on the topic of data visualization. Because I was working in the business intelligence field, the most logic choice were the books of Stephen Few. I bought them all and a whole new world opened for me. When Few was in the Netherlands to give a course I felt very lucky I could join. The workshops inspired me to learn more on this topic. So I bought more books and the next year I joined a class of Alberto Caïro. This gave me multiple perspectives on the same topic. The things I learned were applied to my work, and I was getting more and more responses on my visualizations. People actually started to read and understand them. My manager asked me to explain my choices in visualizations to my colleagues, so they could learn from me. And then I discovered how great it is to teach about data visualisation. I met a couple of UX designers and they inspired me learn more about that topic and to get an UX certification. The knowledge I gained in learning UX helped me in developing my own perspective on good data visualization. And in my workshop I try to inspire others to create such. For these workshops I wanted an overview of charts. Although there were already some great overviews, none of them had the point of view I was teaching in class. So I decided to design my own. That’s how Chart.Guide started. Cool Infographics: Who is the Chart Guide poster intended for?Michiel Dullaert: The website and the posters are intended for everyone who makes charts. For me it does not matter if you are working as a data-journalist or a data scientist, a infographic designer, project manager or a financial analyst. As long as you need help or inspiration when making charts or tables, Chart.Guide can help you. Online in the form of the website and offline in the form of the poster. Because I want to inspire as many people as possible I made the PDF of the poster free to download. I know that the poster is used in business departments, newsrooms and in school classrooms.Cool Infographics: What was your design process for the poster?Michiel Dullaert: The main source for updates to the poster or website, is the conversations I have with people I teach or work with. If they have a need for certain chart types, or make design mistakes, I try to add that topic. DPG Chart Chooser The first poster edition (picture DPG Chart Chooser) was just a collection of charts I created for my students. For each chart a few words on when to use the chart and, more important, it gave advice on what charts were not recommended. On the second edition (the first under the Chart.Guide brand) I added chart design tips. The reason, I saw people choose a good chart but then mess up the design. Last year, I got questions about maps, so I decided to add them on poster edition 4. Rearranging the layout of the Chart Guide The design process starts with insight I get from conversations I am having. Next step is cutting the old poster and rearranging everything. (see picture ChartGuide rearrange) now, will lead to more insights on the poster in the future. Although it make take some time to transform everything to the screen or paper. I still need to find some time to explain on the website why some charts are “not recommended”. Cool Infographics: You asked your followers to help choose the design of the new poster. How did that go?Michiel Dullaert: The poster is made to help people. So it seems to be logic to give them a role in the design process. As a UX designer I like to test my designs before releasing them. Most of these tests are done in class, because I like to observe the users in how they use the new design. The online voting was suggestion of a student. It did give me a lot of useful feedback. Especially when people wrote a lot of text explaining their choice. For future editions I will do the same.Cool Infographics: How can people follow you for updates?Michiel Dullaert: People who have downloaded the PDF will get an email when a new poster is available, or when something interesting is added to the website. For this and more chart related inspiration, they can follow me on Twitter: @Chart_Guide or on facebook: /ChartGuide1.This helpful reference guide is one of over 25 FREE data visualization guides I maintain links to in the Cool Infographics Tools pages. See them all on the DataViz Reference Guides page, and let me know if I’m missing any. Full Article
mp How Does Impeachment Work? By feedproxy.google.com Published On :: Mon, 16 Dec 2019 18:38:54 +0000 With Impeachment in the news every day lately, Curtis Newbold (The Visual Communication Guy) put together a handy explanation infographic, How Does Impeachment Work? A FREE downloadable PDF is also available from his website.Considering the recent news of the House launching an official impeachment inquiry against President Donald Trump, it seemed worthwhile to create an infographic that describes the impeachment process.Many Americans falsely assume that the term “impeachment” means automatic removal from office. That isn’t the case. The term “impeachment” simply means that someone in a high-ranking federal position has been found to have committed a crime or act of treason or bribery that seems serious enough to send that person through trial. If impeachment occurs, only then will the Senate conduct a trial and vote on conviction and removal from office.As you can see in the graphic, “impeachment” simply means officially charging someone in public office of misconduct or legal wrongdoing. The term and process can be used for many different federal officials, not just the President of the United States. Impeachment does not mean that the person is necessarily guilty. But it does mean that they have been officially accused of some wrongdoing and that the House of Representatives feels there is enough evidence to at least do an investigation.Here is a quick review of how the process works:This is a great use of infographics. Take a complicated subject, and try to make it understandable to your audience. Notice that I said “understandable” not “simple”. The main goal of data visualization and infographics is to clarify information, but it is often mis-characterized as simplifying information.This design still has too much text explanation for my taste. He goes into more details in the blog post that accompanies the infographic, so I think the infographic design could remove more of the explanatory text and draw people to the full article. Full Article
mp SS Peter & Paul By www.flickr.com Published On :: Sun, 15 Feb 2015 11:43:10 -0800 Andrew Rickmann posted a photo: SS Peter and Paul in Wantage, Oxfordshire. Full Article
mp Can Houseplants Improve Indoor Air Quality? By feedproxy.google.com Published On :: Thu, 08 Dec 2016 12:53:36 +0000 By University of Illinois Extension In an era of increasing energy prices, many Americans insulate and seal up their homes during the winter months. Although this can result in savings on the monthly power bill, sealing the home can concentrate … Continue reading → Full Article Air Quality Health houseplants indoor air pollution indoor air quality VOCs
mp 12 symptoms of a back-to-front design process By feedproxy.google.com Published On :: Mon, 7 Jan 2019 07:41:11 GMT Everyday consumer products continue to frustrate people. The failure of companies to fully embrace UX is partly to blame, but there is also another reason -- one that is seldom discussed. Consumer product companies pay too much heed to their retail customers and, in so doing, they prevent the development team from getting first-hand knowledge of end users. Full Article
mp Talking to computers (part 1): Why is speech recognition so difficult? By feedproxy.google.com Published On :: Thu, 3 Jun 2019 08:31:15 GMT Although the performance of today's speech recognition systems is impressive, the experience for many is still one of errors, corrections, frustration and abandoning speech in favour of alternative interaction methods. We take a closer look at speech and find out why speech recognition is so difficult. Full Article
mp Talking to computers (part 2): VUI as an error recovery system By feedproxy.google.com Published On :: Mon, 1 Jul 2019 08:21:51 GMT I take a closer look at some unavoidable challenges to effective speech recognition, and I discuss why you may want to think twice before designing dialogue that is 'conversational' and 'natural'. I also offer five important questions that I think should form the basis of any VUI design kick-off meeting. Full Article
mp 5 Critical Lessons Learned Organizing WordCamp Ann Arbor for the Third Time By feedproxy.google.com Published On :: Tue, 24 Sep 2019 20:20:42 +0000 In early 2014 I had just gotten married and recently moved into a new home. With two major life events out of the way, I decided I was ready to lead a WordCamp. I originally planned to organize WordCamp Detroit. I was an organizer twice before and the event had missed a year and I […] The post 5 Critical Lessons Learned Organizing WordCamp Ann Arbor for the Third Time appeared first on Psychology of Web Design | 3.7 Blog. Full Article Ann Arbor Running an Agency WordPress
mp It’s A Living Mural for X-Games China & Innersect By feedproxy.google.com Published On :: Tue, 05 May 2020 23:56:39 +0000 It’s A Living Mural for X-Games China & Innersect AoiroStudioMay 05, 2020 I think Fabio and I are on a challenge to keep the ABDZ homepage in color tones of 'pastel visuals'. It's perfect because I stumbled across the new project from It's A Living aka Ricardo Gonzalez for X-Games China & Innersect 2019 in Shanghai, China. I don't know if you are familiar or not by Ricardo's distinct lettering style but it's just plain beautiful and vibrant. INNERSECT is the biggest street culture convention in China, a street fashion project founded by celebrity icon Edison Chen in 2017. Feast your eyes! About It’s A Living AKA Ricardo Gonzalez is an incredible artist who has worked through many collaborations and his lettering style is so unique. Make sure to check out his links. Personal Site Behance Full Article
mp 10 Best Restaurant Menu Plugins for WordPress (Compared) By www.isitwp.com Published On :: Fri, 24 Apr 2020 05:08:24 +0000 Want to add a food menu to your restaurant website? Publishing your restaurant menu on your website comes in handy especially if you’re providing an online restaurant reservation or online food delivery. That way your users can figure out the available food options without having to walk into your restaurant. In this article, we’ll show […] The post 10 Best Restaurant Menu Plugins for WordPress (Compared) appeared first on IsItWP - Free WordPress Theme Detector. Full Article WordPress Plugins food ordering restaurant menu plugins resturant website
mp 12 Best GoDaddy Alternatives for Domain & Web Hosting (2020) By www.isitwp.com Published On :: Fri, 01 May 2020 05:31:34 +0000 Are you looking for the best GoDaddy alternative for domain registration and web hosting? Without a doubt, Godaddy is one of the most popular names when it comes to registering domain names and hosting your business online. Over the last 22 years, GoDaddy has managed to establish a stronghold in the market. In this article, […] The post 12 Best GoDaddy Alternatives for Domain & Web Hosting (2020) appeared first on IsItWP - Free WordPress Theme Detector. Full Article Resources domain registration godaddy alternatives web hosting
mp 9 Best Staging Plugins for Your WordPress Website (Compared) By www.isitwp.com Published On :: Tue, 05 May 2020 07:06:53 +0000 Are you looking for a good staging plugin to test your experiments before it goes live? A staging site is a replica of your website where you can experiment with new features, plugins, and updates before you push them to your live website. That way you can find and fix bugs without having to worry […] The post 9 Best Staging Plugins for Your WordPress Website (Compared) appeared first on IsItWP - Free WordPress Theme Detector. Full Article WordPress Plugins best staging plugin best wordpress staging plugins
mp WPForms vs. Google Forms – Which One is Best? (Compared) By www.isitwp.com Published On :: Fri, 08 May 2020 14:16:23 +0000 Looking to build an online form on your WordPress site? Not sure whether you should use WPForms or Google Forms? Both WPForms and Google Forms are two great options for small and medium scale businesses. But when you dig deeper, you’ll find a few key differences between these 2 form builders. To help you find […] The post WPForms vs. Google Forms – Which One is Best? (Compared) appeared first on IsItWP - Free WordPress Theme Detector. Full Article WordPress Plugins form builders wpforms vs google forms wpforms vs google forms comparison
mp Using Funds from Disability Compensation and the GI Bill for Going Back to School By feedproxy.google.com Published On :: Mon, 11 Nov 2013 00:00:00 EST Receiving service-related disability compensation does not interfere with the funds veterans receive from the GI Bill, explains Adam. Full Article
mp Reestablishing a Social Life on Campus with Other Veterans and Civilians Post-TBI By feedproxy.google.com Published On :: Mon, 27 Jan 2014 00:00:00 EST Transitioning from military to civilian life can take time and can be tricky. Adam talks about how student veteran groups on college campuses can help vets reintegrate socially in their own way and time. Full Article
mp 7 Simple Ways to Get Even More Engaged Instagram Followers By dailyblogtips.com Published On :: Tue, 28 May 2019 19:47:50 +0000 Instagram is one of the most efficient and fastest growing social networks. Brands and businesses love it and leverage it to promote and market their products and services to billions of users worldwide. More and more brands are competing for declining customer attention whose span is now no more than a Goldfish’s at 8s. Hence, […] Original post: 7 Simple Ways to Get Even More Engaged Instagram Followers The post 7 Simple Ways to Get Even More Engaged Instagram Followers appeared first on Daily Blog Tips. Full Article Internet Marketing
mp Test or Meet at WordCamp San Francisco and Win a Plugin License! By wpengineer.com Published On :: Mon, 20 Oct 2014 06:12:30 +0000 Next week I will be at WordCamp San Francisco and a week later at the WooConf! Maybe one or antoher […] Full Article WPengineer Misc
mp Want to help the USPS and vets? Buy a 'Healing PTSD' stamp By feedproxy.google.com Published On :: Thursday, April 30, 2020 - 12:02pm Support two entities with the price of one. Full Article
mp “Landscapes & Waterscapes” Photography Competition By www.photocompete.com Published On :: Fri, 01 May 2020 07:45:24 +0000 Artwork may be mountains, hills, water bodies such as rivers, lakes, ponds and the sea, living elements of land cover including indigenous vegetation, human elements [...] The post “Landscapes & Waterscapes” Photography Competition appeared first on Photocompete. Full Article Art Contests Current Exhibition International Landscape
mp C/HA Artist Award Competition By www.photocompete.com Published On :: Sun, 03 May 2020 07:39:02 +0000 Theme: Debauchery Submit your best work expressing your view/perspective of what debauchery means to you. Solo exhibition and an accompanying Book during our Winter season. Image requirements: 10 [...] The post C/HA Artist Award Competition appeared first on Photocompete. Full Article Art Contests Current Exhibition International
mp ViewPoint Photo Competition 2020 By www.photocompete.com Published On :: Sat, 09 May 2020 06:57:26 +0000 Awards: Twelve winning images will be selected for exhibition at ViewPoint Gallery – one image will be exhibited monthly. The winning images will be professionally [...] The post ViewPoint Photo Competition 2020 appeared first on Photocompete. Full Article Art Contests Current Exhibition International
mp Judge Could Hold Up Trump Administration's Bid to Clear Flynn, Legal Experts say By feeds.drudge.com Published On :: Fri, 08 May 2020 20:51:52 -0400 The notoriously independent-minded federal judge who once said he was disgusted by the conduct of Michael Flynn could block the administration's bid to drop criminal charges against the former adviser to President Donald Trump, legal experts said. Full Article news
mp Trump Declares, 'I Learned a Lot from Nixon' By feeds.drudge.com Published On :: Sat, 09 May 2020 08:33:24 -0400 During an interview on "Fox and Friends," Trump explained why he chose not to go on a firing spree amid Special Counsel Robert Mueller's Russia investigation a la Nixon's Saturday Night Massacre during the Watergate scandal. "I learned a lot from Richard Nixon: Don't fire people," the President said. "I learned a lot. I study history, and the firing of everybody ... .I should've, in one way," he continued. "But I'm glad I didn't because look at the way it turned out." Full Article news
mp Roy Horn of 'Siegfried and Roy' Dies of COVID-19 Complications By feeds.drudge.com Published On :: Sat, 09 May 2020 10:32:26 -0400 Roy Horn, famed tiger handler and co-star of the magic duo known as Siegfried and Roy, died of complications from the coronavirus in a hospital in Las Vegas on Friday. He was 75 years old. "Today, the world has lost one of the greats of magic, but I have lost my best friend," Siegfried Fischbacher said in a statement. "From the moment we met, I knew Roy and I, together, would change the world." "There could be no Siegfried without Roy, and no Roy without Siegfried." This is a developing story. Please check back for updates. Full Article news
mp Intuition, Creative Freedom & Doing What You Love with Chris Ballew By feedproxy.google.com Published On :: Wed, 14 Aug 2019 13:15:04 +0000 Today’s episode is going to rock your world … pun fully intended because today’s guest is an actual rock star. You may remember a band called Presidents of the United States of America. They took the world by storm in 1995 with their self titled album, Presidents of the United States of America playing songs like Lump and Peaches. Yes, that’s right. My guest today is frontman Chris Ballew. Chris and I have been friends for years, including collaborating on a music video together and at least one live performance (gotta listen to find out ;). Of course we get into his musical journey, a meteoric rise to success, and then realizing something was missing. We take some deep dives into Chris’ creative process, including his method for capturing his small bits and later using those to write new works, including his new project Casper Babypants. In this episode: Consider what kind of artist you are and how you relate to other artists. For years Chris played in bands, but what he learned about himself is his work is actually solo. Don’t censor yourself while you’re creating. Get it out, no matter how crazy or ridiculous or unusual and then […] The post Intuition, Creative Freedom & Doing What You Love with Chris Ballew appeared first on Chase Jarvis Photography. Full Article chasejarvisLIVE Podcast art Caspar Babypants chris ballew creative process Inspiration music
mp Jump into Fear with Jeremy Cowart By feedproxy.google.com Published On :: Wed, 21 Aug 2019 13:00:45 +0000 Jeremy Cowart was named the “Most Influential Photographers on the Internet” by Huffington Post in 2014. He’s the founder of a global photography movement, Help-Portrait, to give back to those in need. As well as many photography projects bridging empathy and creativity into awareness and action. If you’ve been a long time listener / watcher of this show, you’ll recognize Jeremy from one of the first episodes nearly 10 years ago. Jeremy’s vision and ambition have not slowed down. Today on the show, we get into his new book I’m Possible and his biggest project to date, building a hotel where every aspect serves someone in need. We get into facing fears, overcoming doubt, and how to turn the seemingly impossible to possible. In this episode: The fear of having a dream that’s so big. Chasing a dream for a decade or lifetime. How do you take action and get paralyzed because it’s so big? How to chase curiosity despite your fear of starting something new? Whether you’re just starting out or you’re thinking about transitioning from something you love doing and are already good at…. Battling against our inner monologue pulling us away from the thing we know we […] The post Jump into Fear with Jeremy Cowart appeared first on Chase Jarvis Photography. Full Article chasejarvisLIVE Podcast creativity interview jeremy cowart Photographer The Purpose Hotel
mp Rethink Impossible with Colin O’Brady By feedproxy.google.com Published On :: Wed, 12 Feb 2020 14:15:58 +0000 Colin O’Brady is a world record holding explorer and one of the world’s top endurance athletes. Fresh out of college, Colin had a vast world of possibility in front of him when a tragic accident left him hospitalized. Unsure if he’d ever walk again, his injuries covered nearly 25% of his body, primarily damaging his legs and feet. Despite the odds, his mother encouraged him to dream big and he dared to set a seemingly impossible goal that set him on a path to rethink what’s possible. Fast forward to today, and Colin’s list of achievements is staggering. In this episode, we get into many of his harrowing adventures, including his solo, unsupported, unassisted crossing of Antartica. Even if you’re not a professional athlete or have any ambition to break world records, his story will resonate. We all need courage, a strong mindset, and pure grit to overcome obstacles, pursue big dreams, and do the seemingly impossible. A few highlights from our conversation: 1000 NOs paves the way to YES. How failure is only helping us forge and prepare us for the thing we are reaching for. The longest journey is 6 inches between your ears. Colin shares how he discovered mindset […] The post Rethink Impossible with Colin O’Brady appeared first on Chase Jarvis Photography. Full Article chasejarvisLIVE Podcast courage exploration fear grit mindset motivation world record
mp Concurrency & Multithreading in iOS By feedproxy.google.com Published On :: Tue, 25 Feb 2020 08:00:00 -0500 Concurrency is the notion of multiple things happening at the same time. This is generally achieved either via time-slicing, or truly in parallel if multiple CPU cores are available to the host operating system. We've all experienced a lack of concurrency, most likely in the form of an app freezing up when running a heavy task. UI freezes don't necessarily occur due to the absence of concurrency — they could just be symptoms of buggy software — but software that doesn't take advantage of all the computational power at its disposal is going to create these freezes whenever it needs to do something resource-intensive. If you've profiled an app hanging in this way, you'll probably see a report that looks like this: Anything related to file I/O, data processing, or networking usually warrants a background task (unless you have a very compelling excuse to halt the entire program). There aren't many reasons that these tasks should block your user from interacting with the rest of your application. Consider how much better the user experience of your app could be if instead, the profiler reported something like this: Analyzing an image, processing a document or a piece of audio, or writing a sizeable chunk of data to disk are examples of tasks that could benefit greatly from being delegated to background threads. Let's dig into how we can enforce such behavior into our iOS applications. A Brief History In the olden days, the maximum amount of work per CPU cycle that a computer could perform was determined by the clock speed. As processor designs became more compact, heat and physical constraints started becoming limiting factors for higher clock speeds. Consequentially, chip manufacturers started adding additional processor cores on each chip in order to increase total performance. By increasing the number of cores, a single chip could execute more CPU instructions per cycle without increasing its speed, size, or thermal output. There's just one problem... How can we take advantage of these extra cores? Multithreading. Multithreading is an implementation handled by the host operating system to allow the creation and usage of n amount of threads. Its main purpose is to provide simultaneous execution of two or more parts of a program to utilize all available CPU time. Multithreading is a powerful technique to have in a programmer's toolbelt, but it comes with its own set of responsibilities. A common misconception is that multithreading requires a multi-core processor, but this isn't the case — single-core CPUs are perfectly capable of working on many threads, but we'll take a look in a bit as to why threading is a problem in the first place. Before we dive in, let's look at the nuances of what concurrency and parallelism mean using a simple diagram: In the first situation presented above, we observe that tasks can run concurrently, but not in parallel. This is similar to having multiple conversations in a chatroom, and interleaving (context-switching) between them, but never truly conversing with two people at the same time. This is what we call concurrency. It is the illusion of multiple things happening at the same time when in reality, they're switching very quickly. Concurrency is about dealing with lots of things at the same time. Contrast this with the parallelism model, in which both tasks run simultaneously. Both execution models exhibit multithreading, which is the involvement of multiple threads working towards one common goal. Multithreading is a generalized technique for introducing a combination of concurrency and parallelism into your program. The Burden of Threads A modern multitasking operating system like iOS has hundreds of programs (or processes) running at any given moment. However, most of these programs are either system daemons or background processes that have very low memory footprint, so what is really needed is a way for individual applications to make use of the extra cores available. An application (process) can have many threads (sub-processes) operating on shared memory. Our goal is to be able to control these threads and use them to our advantage. Historically, introducing concurrency to an app has required the creation of one or more threads. Threads are low-level constructs that need to be managed manually. A quick skim through Apple's Threaded Programming Guide is all it takes to see how much complexity threaded code adds to a codebase. In addition to building an app, the developer has to: Responsibly create new threads, adjusting that number dynamically as system conditions change Manage them carefully, deallocating them from memory once they have finished executing Leverage synchronization mechanisms like mutexes, locks, and semaphores to orchestrate resource access between threads, adding even more overhead to application code Mitigate risks associated with coding an application that assumes most of the costs associated with creating and maintaining any threads it uses, and not the host OS This is unfortunate, as it adds enormous levels of complexity and risk without any guarantees of improved performance. Grand Central Dispatch iOS takes an asynchronous approach to solving the concurrency problem of managing threads. Asynchronous functions are common in most programming environments, and are often used to initiate tasks that might take a long time, like reading a file from the disk, or downloading a file from the web. When invoked, an asynchronous function executes some work behind the scenes to start a background task, but returns immediately, regardless of how long the original task might takes to actually complete. A core technology that iOS provides for starting tasks asynchronously is Grand Central Dispatch (or GCD for short). GCD abstracts away thread management code and moves it down to the system level, exposing a light API to define tasks and execute them on an appropriate dispatch queue. GCD takes care of all thread management and scheduling, providing a holistic approach to task management and execution, while also providing better efficiency than traditional threads. Let's take a look at the main components of GCD: What've we got here? Let's start from the left: DispatchQueue.main: The main thread, or the UI thread, is backed by a single serial queue. All tasks are executed in succession, so it is guaranteed that the order of execution is preserved. It is crucial that you ensure all UI updates are designated to this queue, and that you never run any blocking tasks on it. We want to ensure that the app's run loop (called CFRunLoop) is never blocked in order to maintain the highest framerate. Subsequently, the main queue has the highest priority, and any tasks pushed onto this queue will get executed immediately. DispatchQueue.global: A set of global concurrent queues, each of which manage their own pool of threads. Depending on the priority of your task, you can specify which specific queue to execute your task on, although you should resort to using default most of the time. Because tasks on these queues are executed concurrently, it doesn't guarantee preservation of the order in which tasks were queued. Notice how we're not dealing with individual threads anymore? We're dealing with queues which manage a pool of threads internally, and you will shortly see why queues are a much more sustainable approach to multhreading. Serial Queues: The Main Thread As an exercise, let's look at a snippet of code below, which gets fired when the user presses a button in the app. The expensive compute function can be anything. Let's pretend it is post-processing an image stored on the device. import UIKit class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { compute() } private func compute() -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } At first glance, this may look harmless, but if you run this inside of a real app, the UI will freeze completely until the loop is terminated, which will take... a while. We can prove it by profiling this task in Instruments. You can fire up the Time Profiler module of Instruments by going to Xcode > Open Developer Tool > Instruments in Xcode's menu options. Let's look at the Threads module of the profiler and see where the CPU usage is highest. We can see that the Main Thread is clearly at 100% capacity for almost 5 seconds. That's a non-trivial amount of time to block the UI. Looking at the call tree below the chart, we can see that the Main Thread is at 99.9% capacity for 4.43 seconds! Given that a serial queue works in a FIFO manner, tasks will always complete in the order in which they were inserted. Clearly the compute() method is the culprit here. Can you imagine clicking a button just to have the UI freeze up on you for that long? Background Threads How can we make this better? DispatchQueue.global() to the rescue! This is where background threads come in. Referring to the GCD architecture diagram above, we can see that anything that is not the Main Thread is a background thread in iOS. They can run alongside the Main Thread, leaving it fully unoccupied and ready to handle other UI events like scrolling, responding to user events, animating etc. Let's make a small change to our button click handler above: class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { DispatchQueue.global(qos: .userInitiated).async { [unowned self] in self.compute() } } private func compute() -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } Unless specified, a snippet of code will usually default to execute on the Main Queue, so in order to force it to execute on a different thread, we'll wrap our compute call inside of an asynchronous closure that gets submitted to the DispatchQueue.global queue. Keep in mind that we aren't really managing threads here. We're submitting tasks (in the form of closures or blocks) to the desired queue with the assumption that it is guaranteed to execute at some point in time. The queue decides which thread to allocate the task to, and it does all the hard work of assessing system requirements and managing the actual threads. This is the magic of Grand Central Dispatch. As the old adage goes, you can't improve what you can't measure. So we measured our truly terrible button click handler, and now that we've improved it, we'll measure it once again to get some concrete data with regards to performance. Looking at the profiler again, it's quite clear to us that this is a huge improvement. The task takes an identical amount of time, but this time, it's happening in the background without locking up the UI. Even though our app is doing the same amount of work, the perceived performance is much better because the user will be free to do other things while the app is processing. You may have noticed that we accessed a global queue of .userInitiated priority. This is an attribute we can use to give our tasks a sense of urgency. If we run the same task on a global queue of and pass it a qos attribute of background , iOS will think it's a utility task, and thus allocate fewer resources to execute it. So, while we don't have control over when our tasks get executed, we do have control over their priority. A Note on Main Thread vs. Main Queue You might be wondering why the Profiler shows "Main Thread" and why we're referring to it as the "Main Queue". If you refer back to the GCD architecture we described above, the Main Queue is solely responsible for managing the Main Thread. The Dispatch Queues section in the Concurrency Programming Guide says that "the main dispatch queue is a globally available serial queue that executes tasks on the application’s main thread. Because it runs on your application’s main thread, the main queue is often used as a key synchronization point for an application." The terms "execute on the Main Thread" and "execute on the Main Queue" can be used interchangeably. Concurrent Queues So far, our tasks have been executed exclusively in a serial manner. DispatchQueue.main is by default a serial queue, and DispatchQueue.global gives you four concurrent dispatch queues depending on the priority parameter you pass in. Let's say we want to take five images, and have our app process them all in parallel on background threads. How would we go about doing that? We can spin up a custom concurrent queue with an identifier of our choosing, and allocate those tasks there. All that's required is the .concurrent attribute during the construction of the queue. class ViewController: UIViewController { let queue = DispatchQueue(label: "com.app.concurrentQueue", attributes: .concurrent) let images: [UIImage] = [UIImage].init(repeating: UIImage(), count: 5) @IBAction func handleTap(_ sender: Any) { for img in images { queue.async { [unowned self] in self.compute(img) } } } private func compute(_ img: UIImage) -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } Running that through the profiler, we can see that the app is now spinning up 5 discrete threads to parallelize a for-loop. Parallelization of N Tasks So far, we've looked at pushing computationally expensive task(s) onto background threads without clogging up the UI thread. But what about executing parallel tasks with some restrictions? How can Spotify download multiple songs in parallel, while limiting the maximum number up to 3? We can go about this in a few ways, but this is a good time to explore another important construct in multithreaded programming: semaphores. Semaphores are signaling mechanisms. They are commonly used to control access to a shared resource. Imagine a scenario where a thread can lock access to a certain section of the code while it executes it, and unlocks after it's done to let other threads execute the said section of the code. You would see this type of behavior in database writes and reads, for example. What if you want only one thread writing to a database and preventing any reads during that time? This is a common concern in thread-safety called Readers-writer lock. Semaphores can be used to control concurrency in our app by allowing us to lock n number of threads. let kMaxConcurrent = 3 // Or 1 if you want strictly ordered downloads! let semaphore = DispatchSemaphore(value: kMaxConcurrent) let downloadQueue = DispatchQueue(label: "com.app.downloadQueue", attributes: .concurrent) class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { for i in 0..<15 { downloadQueue.async { [unowned self] in // Lock shared resource access semaphore.wait() // Expensive task self.download(i + 1) // Update the UI on the main thread, always! DispatchQueue.main.async { tableView.reloadData() // Release the lock semaphore.signal() } } } } func download(_ songId: Int) -> Void { var counter = 0 // Simulate semi-random download times. for _ in 0..<Int.random(in: 999999...10000000) { counter += songId } } } Notice how we've effectively restricted our download system to limit itself to k number of downloads. The moment one download finishes (or thread is done executing), it decrements the semaphore, allowing the managing queue to spawn another thread and start downloading another song. You can apply a similar pattern to database transactions when dealing with concurrent reads and writes. Semaphores usually aren't necessary for code like the one in our example, but they become more powerful when you need to enforce synchronous behavior whille consuming an asynchronous API. The above could would work just as well with a custom NSOperationQueue with a maxConcurrentOperationCount, but it's a worthwhile tangent regardless. Finer Control with OperationQueue GCD is great when you want to dispatch one-off tasks or closures into a queue in a 'set-it-and-forget-it' fashion, and it provides a very lightweight way of doing so. But what if we want to create a repeatable, structured, long-running task that produces associated state or data? And what if we want to model this chain of operations such that they can be cancelled, suspended and tracked, while still working with a closure-friendly API? Imagine an operation like this: This would be quite cumbersome to achieve with GCD. We want a more modular way of defining a group of tasks while maintaining readability and also exposing a greater amount of control. In this case, we can use Operation objects and queue them onto an OperationQueue, which is a high-level wrapper around DispatchQueue. Let's look at some of the benefits of using these abstractions and what they offer in comparison to the lower-level GCI API: You may want to create dependencies between tasks, and while you could do this via GCD, you're better off defining them concretely as Operation objects, or units of work, and pushing them onto your own queue. This would allow for maximum reusability since you may use the same pattern elsewhere in an application. The Operation and OperationQueue classes have a number of properties that can be observed, using KVO (Key Value Observing). This is another important benefit if you want to monitor the state of an operation or operation queue. Operations can be paused, resumed, and cancelled. Once you dispatch a task using Grand Central Dispatch, you no longer have control or insight into the execution of that task. The Operation API is more flexible in that respect, giving the developer control over the operation's life cycle. OperationQueue allows you to specify the maximum number of queued operations that can run simultaneously, giving you a finer degree of control over the concurrency aspects. The usage of Operation and OperationQueue could fill an entire blog post, but let's look at a quick example of what modeling dependencies looks like. (GCD can also create dependencies, but you're better off dividing up large tasks into a series of composable sub-tasks.) In order to create a chain of operations that depend on one another, we could do something like this: class ViewController: UIViewController { var queue = OperationQueue() var rawImage = UIImage? = nil let imageUrl = URL(string: "https://example.com/portrait.jpg")! @IBOutlet weak var imageView: UIImageView! let downloadOperation = BlockOperation { let image = Downloader.downloadImageWithURL(url: imageUrl) OperationQueue.main.async { self.rawImage = image } } let filterOperation = BlockOperation { let filteredImage = ImgProcessor.addGaussianBlur(self.rawImage) OperationQueue.main.async { self.imageView = filteredImage } } filterOperation.addDependency(downloadOperation) [downloadOperation, filterOperation].forEach { queue.addOperation($0) } } So why not opt for a higher level abstraction and avoid using GCD entirely? While GCD is ideal for inline asynchronous processing, Operation provides a more comprehensive, object-oriented model of computation for encapsulating all of the data around structured, repeatable tasks in an application. Developers should use the highest level of abstraction possible for any given problem, and for scheduling consistent, repeated work, that abstraction is Operation. Other times, it makes more sense to sprinkle in some GCD for one-off tasks or closures that we want to fire. We can mix both OperationQueue and GCD to get the best of both worlds. The Cost of Concurrency DispatchQueue and friends are meant to make it easier for the application developer to execute code concurrently. However, these technologies do not guarantee improvements to the efficiency or responsiveness in an application. It is up to you to use queues in a manner that is both effective and does not impose an undue burden on other resources. For example, it's totally viable to create 10,000 tasks and submit them to a queue, but doing so would allocate a nontrivial amount of memory and introduce a lot of overhead for the allocation and deallocation of operation blocks. This is the opposite of what you want! It's best to profile your app thoroughly to ensure that concurrency is enhancing your app's performance and not degrading it. We've talked about how concurrency comes at a cost in terms of complexity and allocation of system resources, but introducing concurrency also brings a host of other risks like: Deadlock: A situation where a thread locks a critical portion of the code and can halt the application's run loop entirely. In the context of GCD, you should be very careful when using the dispatchQueue.sync { } calls as you could easily get yourself in situations where two synchronous operations can get stuck waiting for each other. Priority Inversion: A condition where a lower priority task blocks a high priority task from executing, which effectively inverts their priorities. GCD allows for different levels of priority on its background queues, so this is quite easily a possibility. Producer-Consumer Problem: A race condition where one thread is creating a data resource while another thread is accessing it. This is a synchronization problem, and can be solved using locks, semaphores, serial queues, or a barrier dispatch if you're using concurrent queues in GCD. ...and many other sorts of locking and data-race conditions that are hard to debug! Thread safety is of the utmost concern when dealing with concurrency. Parting Thoughts + Further Reading If you've made it this far, I applaud you. Hopefully this article gives you a lay of the land when it comes to multithreading techniques on iOS, and how you can use some of them in your app. We didn't get to cover many of the lower-level constructs like locks, mutexes and how they help us achieve synchronization, nor did we get to dive into concrete examples of how concurrency can hurt your app. We'll save those for another day, but you can dig into some additional reading and videos if you're eager to dive deeper. Building Concurrent User Interfaces on iOS (WWDC 2012) Concurrency and Parallelism: Understanding I/O Apple's Official Concurrency Programming Guide Mutexes and Closure Capture in Swift Locks, Thread Safety, and Swift Advanced NSOperations (WWDC 2015) NSHipster: NSOperation Full Article Code
mp CLI Equivalents for Common MAMP PRO and Sequel Pro Tasks By feedproxy.google.com Published On :: Thu, 26 Mar 2020 00:00:00 -0400 Working on website front ends I sometimes use MAMP PRO to manage local hosts and Sequel Pro to manage databases. Living primarily in my text editor, a terminal, and a browser window, moving to these click-heavy dedicated apps can feel clunky. Happily, the tasks I have most frequently turned to those apps for —starting and stopping servers, creating new hosts, and importing, exporting, deleting, and creating databases— can be done from the command line. I still pull up MAMP PRO if I need to change a host's PHP version or work with its other more specialized settings, or Sequel Pro to quickly inspect a database, but for the most part I can stay on the keyboard and in my terminal. Here's how: Command Line MAMP PRO You can start and stop MAMP PRO's servers from the command line. You can even do this when the MAMP PRO desktop app isn't open. Note: MAMP PRO's menu icon will not change color to reflect the running/stopped status when the status is changed via the command line. Start the MAMP PRO servers: /Applications/MAMP PRO.app/Contents/MacOS/MAMP PRO cmd startServers Stop the MAMP PRO servers: /Applications/MAMP PRO.app/Contents/MacOS/MAMP PRO cmd stopServers Create a host (replace host_name and root_path): /Applications/MAMP PRO.app/Contents/MacOS/MAMP PRO cmd createHost host_name root_path MAMP PRO-friendly Command Line Sequel Pro Note: if you don't use MAMP PRO, just replace the /Applications/MAMP/Library/bin/mysql with mysql. In all of the following commands, replace username with your user name (locally this is likely root) and database_name with your database name. The -p (password) flag with no argument will trigger an interactive password prompt. This is more secure than including your password in the command itself (like -pYourPasswordHere). Of course, if you're using the default password root is not particular secure to begin with so you might just do -pYourPasswordHere. Setting the -h (host) flag to localhost or 127.0.0.1 tells mysql to look at what's on localhost. With the MAMP PRO servers running, that will be the MAMP PRO databases. # with the MAMP PRO servers running, these are equivalent: # /Applications/MAMP/Library/bin/mysql -h 127.0.0.1 other_options # and # /Applications/MAMP/Library/bin/mysql -h localhost other_options /Applications/MAMP/Library/bin/mysql mysql_options # enter. opens an interactive mysql session mysql> some command; # don't forget the semicolon mysql> exit; Create a local database # with the MAMP PRO servers running # replace `username` with your username, which is `root` by default /Applications/MAMP/Library/bin/mysql -h localhost -u username -p -e "create database database_name" or # with the MAMP PRO servers running # replace `username` (`root` by default) and `database_name` /Applications/MAMP/Library/bin/mysql -h localhost -u username -p # and then enter mysql> create database database_name; # don't forget the semicolon mysql> exit MAMP PRO's databases are stored in /Library/Application Support/appsolute/MAMP PRO/db so to confirm that it worked you can ls /Library/Application Support/appsolute/MAMP PRO/db # will output the available mysql versions. For example I have mysql56_2018-11-05_16-25-13 mysql57 # If it isn't clear which one you're after, open the main MAMP PRO and click # on the MySQL "servers and services" item. In my case it shows "Version: 5.7.26" # Now look in the relevant MySQL directory ls /Library/Application Support/appsolute/MAMP PRO/db/mysql57 # the newly created database should be in the list Delete a local database # with the MAMP PRO servers running # replace `username` (`root` by default) and `database_name` /Applications/MAMP/Library/bin/mysql -h localhost -u username -p -e "drop database database_name" Export a dump of a local database. Note that this uses mysqldump not mysql. # to export an uncompressed file # replace `username` (`root` by default) and `database_name` /Applications/MAMP/Library/bin/mysqldump -h localhost -u username -p database_name > the/output/path.sql # to export a compressed file # replace `username` (`root` by default) and `database_name` /Applications/MAMP/Library/bin/mysqldump -h localhost -u username -p database_name | gzip -c > the/output/path.gz Export a local dump from an external database over SSH. Note that this uses mysqldump not mysql. # replace `ssh-user`, `ssh_host`, `mysql_user`, `database_name`, and the output path # to end up with an uncompressed file ssh ssh_user@ssh_host "mysqldump -u mysql_user -p database_name | gzip -c" | gunzip > the/output/path.sql # to end up with a compressed file ssh ssh_user@ssh_host "mysqldump -u mysql_user -p database_name | gzip -c" > the/output/path.gz Import a local database dump into a local database # with the MAMP PRO servers running # replace `username` (`root` by default) and `database_name` /Applications/MAMP/Library/bin/mysql -h localhost -u username -p database_name < the/dump/path.sql Import a local database dump into a remote database over SSH. Use care with this one. But if you are doing it with Sequel Pro —maybe you are copying a Craft site's database from a production server to a QA server— you might as well be able to do it on the command line. ssh ssh_user@ssh_host "mysql -u username -p remote_database_name" < the/local/dump/path.sql For me, using the command line instead of the MAMP PRO and Sequel Pro GUI means less switching between keyboard and mouse, less opening up GUI features that aren't typically visible on my screen, and generally better DX. Give it a try! And while MAMP Pro's CLI is limited to the essentials, command line mysql of course knows no limits. If there's something else you use Sequel Pro for, you may be able to come up with a mysql CLI equivalent you like even better. Full Article Code Front-end Engineering Back-end Engineering
mp 10 Cool & Free Mobile Wallpapers By feedproxy.google.com Published On :: Wed, 26 Jul 2017 11:03:04 +0000 Guys, great news! Our friends at Freepik has released exclusively for s2o readers 10 Cool & Free Mobile Wallpapers in several awesome styles. They come in AI, EPS and jpg files. The wallpapers are easily resizable for any kind of mobile —or any other project ;)— so you can adapt them in a no time … 10 Cool & Free Mobile Wallpapers Read More » Full Article Freebies
mp First impressions of the Fuji X-Pro2 (and the Fujinon 100-400mm lens) By feedproxy.google.com Published On :: Wed, 16 Mar 2016 20:16:47 +0000 Fuji released their new flagship camera this month, the X-Pro2. It is the first X-series camera to feature a 24MP sensor (compared to 16MP before) and it has a very interesting hybrid optical & electronic view finder. When I first […] Full Article Hardware Thoughts